Jak działa Linux: podręcznik administratora 9788328309838, 9781593275679 [PDF]


128 24 5MB

Polish Pages [461] Year 2015

Report DMCA / Copyright

DOWNLOAD PDF FILE

Table of contents :
Spis treści
Podziękowania
Wstęp
Kto powinien przeczytać tę książkę?
Wymagania
Jak czytać tę książkę?
Ćwiczenia
Podział tej książki
Co nowego w drugim wydaniu?
Kilka słów o terminologii
1. Informacje ogólne
1.1. Poziomy i warstwy abstrakcji w systemie Linux
1.2. Sprzęt: pamięć operacyjna
1.3. Jądro systemu
1.3.1. Zarządzanie procesami
1.3.2. Zarządzanie pamięcią
1.3.3. Sterowniki urządzeń i zarządzanie urządzeniami
1.3.4. Wywołania systemowe
1.4. Przestrzeń użytkownika
1.5. Użytkownicy
1.6. Spojrzenie w przyszłość
2. Podstawowe polecenia i hierarchia katalogów
2.1. Powłoka Bourne’a: /bin/sh
2.2. Korzystanie z powłoki
2.2.1. Okno powłoki
2.2.2. Polecenie cat
2.2.3. Standardowe wejście i wyjście
2.3. Podstawowe polecenia
2.3.1. Polecenie ls
2.3.2. Polecenie cp
2.3.3. Polecenie mv
2.3.4. Polecenie touch
2.3.5. Polecenie rm
2.3.6. Polecenie echo
2.4. Polecenia działające na katalogach
2.4.1. Polecenie cd
2.4.2. Polecenie mkdir
2.4.3. Polecenie rmdir
2.4.4. Rozwijanie nazw (nazwy wieloznaczne)
2.5. Polecenia pośredniczące
2.5.1. grep
2.5.2. Polecenie less
2.5.3. Polecenie pwd
2.5.4. Polecenie diff
2.5.5. Polecenie file
2.5.6. Polecenia find i locate
2.5.7. Polecenia head i tail
2.5.8. Polecenie sort
2.6. Zmienianie hasła i powłoki
2.7. Pliki z kropką
2.8. Zmienne środowiskowe i powłoki
2.9. Ścieżka poleceń
2.10. Znaki specjalne
2.11. Edycja wiersza poleceń
2.12. Edytory tekstu
2.13. Uzyskiwanie pomocy
2.14. Wejście i wyjście powłoki
2.14.1. Standardowy strumień błędów
2.14.2. Przekierowywanie standardowego wejścia
2.15. Prawidłowe odczytywanie komunikatów o błędach
2.15.1. Anatomia uniksowych komunikatów o błędach
2.15.2. Typowe błędy
2.16. Przeglądanie procesów i manipulowanie nimi
2.16.1. Opcje polecenia
2.16.2. Przerywanie działania procesów
2.16.3. Kontrola zadań
2.16.4. Procesy działające w tle
2.17. Tryby plików i uprawnienia
2.17.1. Modyfikowanie uprawnień
2.17.2. Dowiązania symboliczne
2.17.3. Tworzenie dowiązań symbolicznych
2.18. Archiwizowanie i kompresowanie plików
2.18.1. Program gzip
2.18.2. Program tar
2.18.3. Archiwa skompresowane (.tar.gz)
2.18.4. Program zcat
2.18.5. Inne narzędzia kompresujące
2.19. Hierarchia katalogów
2.19.1. Pozostałe katalogi główne
2.19.2. Katalog /usr
2.19.3. Umiejscowienie jądra systemu
2.20. Uruchamianie poleceń przez superużytkownika
2.20.1. Polecenie sudo
2.20.2. Plik /etc/sudoers
2.21. Podsumowanie
3. Urządzenia
3.1. Pliki urządzeń
3.2. Ścieżka urządzeń sysfs
3.3. Polecenie dd i urządzenia
3.4. Podsumowanie nazewnictwa urządzeń
3.4.1. Dyski twarde — /dev/sd*
3.4.2. Napędy CD i DVD: /dev/sr*
3.4.3. Dyski twarde PATA: /dev/hd*
3.4.4. Terminale: /dev/tty*, /dev/pts/* i /dev/tty
3.4.5. Porty szeregowe — /dev/ttyS*
3.4.6. Porty równoległe — /dev/lp0 i /dev/lp1
3.4.7. Urządzenia audio — /dev/dsp, /dev/audio, /dev/snd/* i inne
3.4.8. Tworzenie plików urządzeń
3.5. System udev
3.5.1. System plików devtmpfs
3.5.2. Konfiguracja i działanie procesu udevd
3.5.3. Program udevadm
3.5.4. Monitorowanie urządzeń
3.6. Szczegóły: SCSI i jądro Linuksa
3.6.1. Pamięci masowe USB i protokół SCSI
3.6.2. SCSI i ATA
3.6.3. Ogólne urządzenia SCSI
3.6.4. Wiele metod dostępu do jednego urządzenia
4. Dyski i systemy plików
4.1. Partycjonowanie urządzeń dyskowych
4.1.1. Przeglądanie tablicy partycji
4.1.2. Modyfikowanie tablicy partycji
4.1.3. Geometria dysku i partycji
4.1.4. Dyski SSD
4.2. Systemy plików
4.2.1. Typy systemów plików
4.2.2. Tworzenie systemu plików
4.2.3. Montowanie systemu plików
4.2.4. Identyfikator UUID systemu plików
4.2.5. Buforowanie dysku i systemu plików
4.2.6. Opcje montowania systemów plików
4.2.7. Ponownie montowanie systemu plików
4.2.8. Tabela systemów plików /etc/fstab
4.2.9. Rozwiązania konkurencyjne dla pliku /etc/fstab
4.2.10. Pojemność systemu plików
4.2.11. Sprawdzanie i naprawianie systemów plików
4.2.12. Systemy plików o specjalnym znaczeniu
4.3. Przestrzeń wymiany
4.3.1. Wykorzystywanie partycji jako przestrzeni wymiany
4.3.2. Wykorzystywanie pliku jako przestrzeni wymiany
4.3.3. Jak wielkiej przestrzeni wymiany potrzebuję?
4.4. Spojrzenie w przyszłość: dyski i przestrzeń użytkownika
4.5. Tradycyjny system plików
4.5.1. Przeglądanie szczegółów węzłów inode
4.5.2. Praca z systemami plików w przestrzeni użytkownika
4.5.3. Ewolucja systemów plików
5. Jak uruchamia się Linux?
5.1. Komunikaty rozruchowe
5.2. Inicjowanie jądra i opcje rozruchu
5.3. Parametry jądra
5.4. Programy rozruchowe
5.4.1. Zadania programu rozruchowego
5.4.2. Przegląd programów rozruchowych
5.5. Wprowadzenie do programu GRUB
5.5.1. Przeszukiwanie urządzeń i partycji za pomocą wiersza poleceń programu GRUB
5.5.2. Konfigurowanie programu GRUB
5.5.3. Instalowanie programu GRUB
5.6. Problemy z bezpiecznym rozruchem UEFI
5.7. Ładowanie innych systemów operacyjnych
5.8. Szczegóły programu rozruchowego
5.8.1. Rozruch MBR
5.8.2. Rozruch UEFI
5.8.3. Jak działa GRUB?
6. Uruchamianie przestrzeni użytkownika
6.1. Wprowadzenie do procesu init
6.2. Poziomy uruchomienia System V
6.3. Identyfikowanie rodzaju procesu init
6.4. systemd
6.4.1. Jednostki i typy jednostek
6.4.2. Zależności systemd
6.4.3. Konfiguracja systemd
6.4.4. Praca z systemd
6.4.5. Dodawanie jednostek systemd
6.4.6. Śledzenie i synchronizacja procesów systemd
6.4.7. Uruchamianie na żądanie i zrównoleglanie zasobów
6.4.8. Zgodność systemd z System V
6.4.9. Programy pomocnicze systemd
6.5. Upstart
6.5.1. Procedura inicjowania procesu Upstart
6.5.2. Zadania w procesie Upstart
6.5.3. Konfiguracja Upstart
6.5.4. Działanie procesu Upstart
6.5.5. Protokoły procesu Upstart
6.5.6. Poziomy uruchomienia procesu Upstart i zgodność z System V
6.6. Proces init System V
6.6.1. Proces init w stylu System V: sekwencja poleceń rozruchowych
6.6.2. Farma dowiązań procesu init w stylu System V
6.6.3. run-parts
6.6.4. Sterowanie procesem init w stylu System V
6.7. Wyłączanie systemu
6.8. Początkowy system plików w pamięci RAM
6.9. Rozruch awaryjny i tryb pojedynczego użytkownika
7. Konfiguracja systemu: rejestrowanie, czas systemowy, zadania wsadowe i użytkownicy
7.1. Struktura katalogu /etc
7.2. Rejestrowanie dzienników systemowych
7.2.1. Rejestrator systemowy
7.2.2. Pliki konfiguracyjne
7.3. Pliki związane z zarządzaniem użytkownikami
7.3.1. Plik /etc/passwd
7.3.2. Użytkownicy specjalni
7.3.3. Plik /etc/shadow
7.3.4. Manipulowanie użytkownikami i hasłami
7.3.5. Praca z grupami
7.4. Programy getty i login
7.5. Ustawianie czasu
7.5.1. Reprezentacja czasu jądra i strefy czasowe
7.5.2. Czas sieciowy
7.6. Planowanie powtarzalnych zadań w programie cron
7.6.1. Instalowanie plików crontab
7.6.2. Systemowe pliki crontab
7.6.3. Przyszłość narzędzia cron
7.7. Planowanie jednorazowych zadań w programie at
7.8. Identyfikatory użytkowników i przełączanie ich
7.8.1. Prawo właściciela procesu, efektywny identyfikator użytkownika, rzeczywisty identyfikator użytkownika i zapisany identyfikator użytkownika
7.9. Identyfikowanie i uwierzytelnianie użytkowników
7.9.1. Użycie bibliotek do uzyskiwania informacji o użytkownikach
7.10. System PAM
7.10.1. Konfiguracja systemu PAM
7.10.2. Uwagi dotyczące systemu PAM
7.10.3. System PAM i hasła
7.11. Spojrzenie w przyszłość
8. Wykorzystanie procesów i zasobów
8.1. Śledzenie procesów
8.2. Wyszukiwanie otwartych plików programem lsof
8.2.1. Analizowanie danych wyjściowych polecenia lsof
8.2.2. Użycie polecenia lsof
8.3. Śledzenie działania programu i wywołań systemowych
8.3.1. Polecenie strace
8.3.2. Polecenie ltrace
8.4. Wątki
8.4.1. Procesy jednowątkowe i wielowątkowe
8.4.2. Wyświetlanie wątków
8.5. Wprowadzenie do monitorowania zasobów
8.6. Pomiar czasu procesora
8.7. Nadawanie procesom priorytetów
8.8. Średnie obciążenia
8.8.1. Użycie polecenia uptime
8.8.2. Wysokie obciążenia
8.9. Pamięć
8.9.1. Zasady działania pamięci
8.9.2. Błędy stron
8.10. Monitorowanie wydajności procesora i pamięci za pomocą polecenia vmstat
8.11. Monitorowanie operacji wejścia-wyjścia
8.11.1. Użycie narzędzia iostat
8.11.2. Wykorzystanie i monitorowanie urządzeń
— narzędzie iotop
8.12. Monitorowanie poszczególnych procesów za pomocą narzędzia pidstat
8.13. Dodatkowe zagadnienia
9. Sieć i jej konfiguracja
9.1. Podstawy dotyczące sieci
9.1.1. Pakiety
9.2. Warstwy sieciowe
9.3. Warstwa internetowa
9.3.1. Wyświetlanie adresu IP używanego komputera
9.3.2. Podsieci
9.3.3. Typowe maski podsieci i notacja CIDR
9.4. Trasy i tabela routingu jądra
9.4.1. Brama domyślna
9.5. Podstawowe narzędzia protokołu ICMP i systemu DNS
9.5.1. ping
9.5.2. Program traceroute
9.5.3. DNS i host
9.6. Warstwa fizyczna i Ethernet
9.7. Interfejsy sieciowe jądra
9.8. Wprowadzenie do konfiguracji interfejsów sieciowych
9.8.1. Ręczne dodawanie i usuwanie tras
9.9. Konfiguracja sieci aktywowana podczas rozruchu
9.10. Problemy z konfiguracją sieci ręczną i aktywowaną podczas rozruchu
9.11. Menedżery konfiguracji sieciowych
9.11.1. Działanie narzędzia NetworkManager
9.11.2. Interakcja z narzędziem NetworkManager
9.11.3. Konfiguracja narzędzia NetworkManager
9.12. Rozpoznawanie nazw hostów
9.12.1. Plik /etc/hosts
9.12.2. Plik resolv.conf
9.12.3. Buforowanie i system DNS bez konfiguracji
9.12.4. Plik /etc/nsswitch.conf
9.13. Host lokalny
9.14. Warstwa transportowa: protokoły TCP i UDP oraz usługi
9.14.1. Porty TCP i połączenia
9.14.2. Ustanawianie połączeń TCP
9.14.3. Numery portów i plik /etc/services
9.14.4. Właściwości protokołu TCP
9.14.5. Protokół UDP
9.15. Ponowna analiza prostej sieci lokalnej
9.16. Protokół DHCP
9.16.1. Klient DHCP w systemie Linux
9.16.2. Serwery DHCP w systemie Linux
9.17. Konfigurowanie systemu Linux jako routera
9.17.1. Łącza internetowe
9.18. Sieci prywatne
9.19. Translacja adresów sieciowych (maskarada IP)
9.20. Routery i system Linux
9.21. Zapory sieciowe
9.21.1. Podstawy dotyczące linuksowych zapór sieciowych
9.21.2. Konfigurowanie reguł zapory sieciowej
9.21.3. Strategie tworzenia zapór sieciowych
9.22. Ethernet, IP i ARP
9.23. Ethernet bezprzewodowy
9.23.1. iw
9.23.2. Zabezpieczenia sieci bezprzewodowych
9.24. Podsumowanie
10. Usługi i aplikacje sieciowe
10.1. Podstawy usług
10.1.1. Dokładniejsza analiza
10.2. Serwery sieciowe
10.3. Secure Shell (SSH)
10.3.1. Serwer SSHD
10.3.2. Klient SSH
10.4. Demony inetd i xinetd
10.4.1. Wrapper TCP: tcpd, /etc/hosts.allow, /etc/hosts.deny
10.5. Narzędzia diagnostyczne
10.5.1. lsof
10.5.2. tcpdump
10.5.3. netcat
10.5.4. Skanowanie portów
10.6. Zdalne wywoływanie procedur (RPC)
10.7. Zabezpieczenie sieci
10.7.1. Typowe słabości
10.7.2. Źródła danych o zabezpieczeniach
10.8. Spojrzenie w przyszłość
10.9. Gniazda: sposób komunikacji procesów z siecią
10.10. Gniazda domenowe systemu Unix
10.10.1. Korzyści dla projektantów
10.10.2. Wyszczególnianie gniazd domenowych systemu Unix
11. Wprowadzenie do skryptów powłoki
11.1. Podstawy skryptów powłoki
11.1.1. Ograniczenia skryptów powłoki
11.2. Cudzysłowy i literały
11.2.1. Literały
11.2.2. Pojedyncze cudzysłowy
11.2.3. Podwójne cudzysłowy
11.2.4. Przekazywanie literału w postaci znaku pojedynczego cudzysłowu
11.3. Zmienne specjalne
11.3.1. Pojedyncze argumenty: $1, $2…
11.3.2. Liczba argumentów: $#
11.3.3. Wszystkie argumenty: $@
11.3.4. Nazwa skryptu: $0
11.3.5. Identyfikator procesu: $$
11.3.6. Kod wyjścia: $?
11.4. Kody wyjścia
11.5. Wyrażenia warunkowe
11.5.1. Obsługa list pustych parametrów
11.5.2. Użycie innych poleceń do testów
11.5.3. Słowo kluczowe elif
11.5.4. Konstrukcje logiczne && i ||
11.5.5. Sprawdzanie warunków
11.5.6. Porównywanie ciągów znaków instrukcją case
11.6. Pętle
11.6.1. Pętle for
11.6.2. Pętle while
11.7. Podmiana poleceń
11.8. Zarządzanie plikami tymczasowymi
11.9. Dokumenty miejscowe
11.10. Ważne narzędzia skryptów powłoki
11.10.1. Polecenie basename
11.10.2. Polecenie awk
11.10.3. Polecenie sed
11.10.4. Polecenie xargs
11.10.5. Polecenie expr
11.10.6. Polecenie exec
11.11. Podpowłoki
11.12. Włączanie do skryptów innych plików
11.13. Pobieranie danych od użytkowników
11.14. Kiedy (nie)używać skryptów powłoki?
12. Przenoszenie plików w sieci
12.1. Szybkie wykonywanie kopii
12.2. rsync
12.2.1. Podstawy dotyczące narzędzia rsync
12.2.2. Tworzenie dokładnych kopii struktury katalogów
12.2.3. Jak używać końcowego ukośnika?
12.2.4. Pomijanie plików i katalogów
12.2.5. Integralność transferu, sumy kontrolne i tryby informacyjne
12.2.6. Kompresja
12.2.7. Ograniczanie przepustowości
12.2.8. Przesyłanie plików do naszego komputera
12.2.9. Więcej informacji o programie rsync
12.3. Wprowadzenie do współużytkowania plików
12.4. Współużytkowanie plików za pomocą pakietu Samba
12.4.1. Konfigurowanie serwera
12.4.2. Kontrola dostępu do serwera
12.4.3. Hasła
12.4.4. Uruchamianie serwera
12.4.5. Diagnostyka i pliki dziennika
12.4.6. Konfigurowanie udziału plikowego
12.4.7. Katalogi domowe
12.4.8. Współużytkowanie drukarek
12.4.9. Korzystanie z klientów Samby
12.4.10. Dostęp do plików jako klient
12.5. Klienty NFS
12.6. Dodatkowe ograniczenia i opcje sieciowych usług plikowych
13. Środowiska użytkowników
13.1. Wytyczne dotyczące tworzenia plików uruchomieniowych
13.2. Kiedy należy modyfikować pliki uruchomieniowe?
13.3. Elementy plików uruchamiających powłokę
13.3.1. Ścieżka wyszukiwania poleceń
13.3.2. Ścieżka stron podręcznika man
13.3.3. Symbol zachęty
13.3.4. Aliasy
13.3.5. Maska uprawnień
13.4. Kolejność plików uruchomieniowych i przykłady
13.4.1. Powłoka bash
13.4.2. Powłoka tcsh
13.5. Domyślne ustawienia użytkownika
13.5.1. Domyślne ustawienia powłoki
13.5.2. Edytor
13.5.3. Program stronicujący
13.6. Pułapki w plikach uruchomieniowych
13.7. Dalsze informacje
14. Ogólny przegląd interfejsów użytkownika systemu Linux
14.1. Komponenty interfejsów użytkownika
14.1.1. Menedżery okien
14.1.2. Pakiety narzędziowe
14.1.3. Środowiska interfejsów użytkownika
14.1.4. Aplikacje
14.2. System X Window System
14.2.1. Menedżery wyświetlaczy
14.2.2. Przezroczystość sieci
14.3. Eksplorowanie klientów serwera X
14.3.1. Zdarzenia serwera X
14.3.2. Ustawianie preferencji i dane wejściowe serwera X
14.4. Przyszłość serwera X
14.5. Usługa D-Bus
14.5.1. Instancja sesji i instancja systemowa
14.5.2. Monitorowanie komunikatów usługi D-Bus
14.6. Drukowanie
14.6.1. CUPS
14.6.2. Konwersja formatów i filtry wydruku
14.7. Inne zagadnienia związane z interfejsami użytkownika
15. Narzędzia programistyczne
15.1. Kompilator języka C
15.1.1. Wiele plików źródłowych
15.1.2. Pliki i katalogi nagłówkowe
15.1.3. Konsolidacja z bibliotekami
15.1.4. Biblioteki współużytkowane
15.2. Narzędzie make
15.2.1. Przykładowy plik Makefile
15.2.2. Wbudowane reguły
15.2.3. Końcowe budowanie programu
15.2.4. Aktualizowanie
15.2.5. Argumenty i opcje wiersza poleceń
15.2.6. Standardowe makra i zmienne
15.2.7. Typowe cele kompilacji
15.2.8. Organizowanie pliku Makefile
15.3. Debuggery
15.4. Lex i Yacc
15.5. Języki skryptowe
15.5.1. Python
15.5.2. Perl
15.5.3. Pozostałe języki skryptowe
15.6. Java
15.7. Spojrzenie w przyszłość: kompilowanie pakietów
16. Wprowadzenie do kompilowania oprogramowania z kodu źródłowego C
16.1. Systemy do tworzenia oprogramowania
16.2. Rozpakowywanie pakietów kodu źródłowego języka C
16.2.1. Od czego zacząć?
16.3. GNU autoconf
16.3.1. Przykład użycia systemu GNU autoconf
16.3.2. Instalacja za pomocą narzędzia do tworzenia pakietów
16.3.3. Opcje skryptu configure
16.3.4. Zmienne środowiskowe
16.3.5. Cele tworzone przez system autoconf
16.3.6. Pliki dziennika systemu autoconf
16.3.7. pkg-config
16.4. Praktyki instalacyjne
16.4.1. Gdzie instalować?
16.5. Stosowanie poprawek
16.6. Rozwiązywanie problemów z kompilowaniem i instalowaniem
16.6.1. Częste błędy
16.7. Spojrzenie w przyszłość
17. Budowanie na fundamentach
17.1. Serwery WWW i aplikacje internetowe
17.2. Bazy danych
17.2.1. Typy baz danych
17.3. Wirtualizacja
17.4. Obliczenia rozproszone i na żądanie
17.5. Systemy wbudowane
17.6. Końcowe uwagi
Bibliografia
Skorowidz
Papiere empfehlen

Jak działa Linux: podręcznik administratora
 9788328309838, 9781593275679 [PDF]

  • 0 0 0
  • Gefällt Ihnen dieses papier und der download? Sie können Ihre eigene PDF-Datei in wenigen Minuten kostenlos online veröffentlichen! Anmelden
Datei wird geladen, bitte warten...
Zitiervorschau

Tytuł oryginału: How Linux Works: What Every Superuser Should Know, Second Edition Tłumaczenie: Wojciech Moch i Piotr Pilch na podstawie „Jak działa Linux” w tłumaczeniu Wojciecha Mocha ISBN: 978-83-283-0983-8 Copyright © 2015 by Brian Ward. Title of English-language original: How Linux Works, 2nd Edition, ISBN 978-1-59327-567-9, published by No Starch Press. Polish-language edition copyright © 2015 by Helion SA. All rights reserved. All rights reserved. No part of this book may be reproduced or transmitted in any form or by any means, electronic or mechanical, including photocopying, recording or by any information storage retrieval system, without permission from the Publisher. Wszelkie prawa zastrzeżone. Nieautoryzowane rozpowszechnianie całości lub fragmentu niniejszej publikacji w jakiejkolwiek postaci jest zabronione. Wykonywanie kopii metodą kserograficzną, fotograficzną, a także kopiowanie książki na nośniku filmowym, magnetycznym lub innym powoduje naruszenie praw autorskich niniejszej publikacji. Wszystkie znaki występujące w tekście są zastrzeżonymi znakami firmowymi bądź towarowymi ich właścicieli. Autor oraz Wydawnictwo HELION dołożyli wszelkich starań, by zawarte w tej książce informacje były kompletne i rzetelne. Nie biorą jednak żadnej odpowiedzialności ani za ich wykorzystanie, ani za związane z tym ewentualne naruszenie praw patentowych lub autorskich. Autor oraz Wydawnictwo HELION nie ponoszą również żadnej odpowiedzialności za ewentualne szkody wynikłe z wykorzystania informacji zawartych w książce. Wydawnictwo HELION ul. Kościuszki 1c, 44-100 GLIWICE tel. 32 231 22 19, 32 230 98 63 e-mail: [email protected] WWW: http://helion.pl (księgarnia internetowa, katalog książek) Drogi Czytelniku! Jeżeli chcesz ocenić tę książkę, zajrzyj pod adres http://helion.pl/user/opinie/jakli2_ebook Możesz tam wpisać swoje uwagi, spostrzeżenia, recenzję.

 Poleć książkę na Facebook.com  Kup w wersji papierowej  Oceń książkę

 Księgarnia internetowa  Lubię to! » Nasza społeczność

Pochwały dotyczące pierwszego wydania „Znakomity zasób wiedzy. Na około 450 stronach książki omówiono wszystkie podstawy.” — eWeek „Zdecydowanie poleciłbym tę książkę osobom, które interesują się systemem Linux, ale nie zdobyły doświadczenia pozwalającego im na poznanie wewnętrznych mechanizmów systemu operacyjnego.” — O’ReillyNet „Jedna z najlepszych książek wprowadzających dla osób poznających system Linux, którą napisano z myślą o użytkowniku zaawansowanym. Ocena: pięć gwiazdek.” — OpenSource-Book-Reviews.com „Książka odnosi sukces w sposób godny podziwu dzięki swojej strukturze i poziomowi oferowanych szczegółów technicznych.” — Kickstart News „Jest to bardzo odmienne wprowadzenie do systemu Linux. W książce pozbawionej efekciarstwa skoncentrowano się na wierszu poleceń, a także zajęto bardziej wewnętrznymi mechanizmami niż interfejsami graficznymi, które zajmują miejsce znanych narzędzi dla systemu Microsoft Windows.” — TechBookReport.com „W książce udało się dobrze objaśnić podstawy działania systemu Linux.” — Hosting Resolve

Spis treści PODZIĘKOWANIA ................................................................................... 17 WSTĘP . ..................................................................................................... 19 Kto powinien przeczytać tę książkę? . .......................................................................19 Wymagania . ..............................................................................................................20 Jak czytać tę książkę? . ...............................................................................................20 Ćwiczenia . ................................................................................................................21 Podział tej książki . ....................................................................................................21 Co nowego w drugim wydaniu? . ..............................................................................22 Kilka słów o terminologii . .........................................................................................22 1 INFORMACJE OGÓLNE ............................................................................. 23 1.1. Poziomy i warstwy abstrakcji w systemie Linux .......................................................24 1.2. Sprzęt: pamięć operacyjna . ......................................................................................26 1.3. Jądro systemu ............................................................................................................26 1.3.1. Zarządzanie procesami . .............................................................................27 1.3.2. Zarządzanie pamięcią ..................................................................................28 1.3.3. Sterowniki urządzeń i zarządzanie urządzeniami ........................................29 1.3.4. Wywołania systemowe . .............................................................................29 1.4. Przestrzeń użytkownika . ..........................................................................................30 1.5. Użytkownicy .............................................................................................................32 1.6. Spojrzenie w przyszłość ............................................................................................33

2 PODSTAWOWE POLECENIA I HIERARCHIA KATALOGÓW ...................... 35 2.1. Powłoka Bourne’a: /bin/sh . ...................................................................................... 36 2.2. Korzystanie z powłoki . ............................................................................................ 37 2.2.1. Okno powłoki . .......................................................................................... 37 2.2.2. Polecenie cat . ............................................................................................ 37 2.2.3. Standardowe wejście i wyjście . ................................................................. 38 2.3. Podstawowe polecenia . ........................................................................................... 39 2.3.1. Polecenie ls . ............................................................................................... 39 2.3.2. Polecenie cp . ............................................................................................. 40 2.3.3. Polecenie mv . ............................................................................................ 40 2.3.4. Polecenie touch . ........................................................................................ 40 2.3.5. Polecenie rm . ............................................................................................. 41 2.3.6. Polecenie echo . ......................................................................................... 41 2.4. Polecenia działające na katalogach . .......................................................................... 41 2.4.1. Polecenie cd . ............................................................................................. 42 2.4.2. Polecenie mkdir . ........................................................................................ 42 2.4.3. Polecenie rmdir . ........................................................................................ 42 2.4.4. Rozwijanie nazw (nazwy wieloznaczne) . ................................................... 42 2.5. Polecenia pośredniczące . ......................................................................................... 44 2.5.1. grep . .......................................................................................................... 44 2.5.2. Polecenie less . ........................................................................................... 45 2.5.3. Polecenie pwd . .......................................................................................... 45 2.5.4. Polecenie diff . ............................................................................................ 46 2.5.5. Polecenie file . ............................................................................................. 46 2.5.6. Polecenia find i locate . ............................................................................... 46 2.5.7. Polecenia head i tail . .................................................................................. 47 2.5.8. Polecenie sort . ........................................................................................... 47 2.6. Zmienianie hasła i powłoki . ..................................................................................... 47 2.7. Pliki z kropką . .......................................................................................................... 47 2.8. Zmienne środowiskowe i powłoki . ......................................................................... 48 2.9. Ścieżka poleceń . ...................................................................................................... 49 2.10. Znaki specjalne . ....................................................................................................... 50 2.11. Edycja wiersza poleceń . ........................................................................................... 50 2.12. Edytory tekstu .......................................................................................................... 51 2.13. Uzyskiwanie pomocy . .............................................................................................. 52 2.14. Wejście i wyjście powłoki . ....................................................................................... 54 2.14.1. Standardowy strumień błędów . ................................................................ 55 2.14.2. Przekierowywanie standardowego wejścia . .............................................. 56 2.15. Prawidłowe odczytywanie komunikatów o błędach . .............................................. 56 2.15.1. Anatomia uniksowych komunikatów o błędach . ....................................... 56 2.15.2. Typowe błędy . ........................................................................................... 57 2.16. Przeglądanie procesów i manipulowanie nimi . ........................................................ 59 2.16.1. Opcje polecenia . ........................................................................................ 59 2.16.2. Przerywanie działania procesów . .............................................................. 60

6

Spis treści

2.17.

2.18.

2.19.

2.20. 2.21.

2.16.3. Kontrola zadań ............................................................................................61 2.16.4. Procesy działające w tle . ............................................................................61 Tryby plików i uprawnienia . .....................................................................................62 2.17.1. Modyfikowanie uprawnień ..........................................................................64 2.17.2. Dowiązania symboliczne . ...........................................................................65 2.17.3. Tworzenie dowiązań symbolicznych ..........................................................66 Archiwizowanie i kompresowanie plików ................................................................67 2.18.1. Program gzip ...............................................................................................67 2.18.2. Program tar .................................................................................................67 2.18.3. Archiwa skompresowane (.tar.gz) ..............................................................69 2.18.4. Program zcat ...............................................................................................69 2.18.5. Inne narzędzia kompresujące . ....................................................................70 Hierarchia katalogów ................................................................................................70 2.19.1. Pozostałe katalogi główne . .........................................................................72 2.19.2. Katalog /usr . ...............................................................................................73 2.19.3. Umiejscowienie jądra systemu ....................................................................73 Uruchamianie poleceń przez superużytkownika ......................................................74 2.20.1. Polecenie sudo . ..........................................................................................74 2.20.2. Plik /etc/sudoers . ........................................................................................74 Podsumowanie . ........................................................................................................75

3 URZĄDZENIA . ......................................................................................... 77 3.1. Pliki urządzeń ............................................................................................................78 3.2. Ścieżka urządzeń sysfs ...............................................................................................79 3.3. Polecenie dd i urządzenia . ........................................................................................81 3.4. Podsumowanie nazewnictwa urządzeń ....................................................................82 3.4.1. Dyski twarde — /dev/sd* ............................................................................82 3.4.2. Napędy CD i DVD: /dev/sr* .......................................................................83 3.4.3. Dyski twarde PATA: /dev/hd* . ...................................................................84 3.4.4. Terminale: /dev/tty*, /dev/pts/* i /dev/tty ...................................................84 3.4.5. Porty szeregowe — /dev/ttyS* ...................................................................85 3.4.6. Porty równoległe — /dev/lp0 i /dev/lp1 . ....................................................85 3.4.7. Urządzenia audio — /dev/dsp, /dev/audio, /dev/snd/* i inne ......................86 3.4.8. Tworzenie plików urządzeń .......................................................................86 3.5. System udev ..............................................................................................................87 3.5.1. System plików devtmpfs . ...........................................................................87 3.5.2. Konfiguracja i działanie procesu udevd . .....................................................88 3.5.3. Program udevadm .......................................................................................90 3.5.4. Monitorowanie urządzeń ............................................................................91 3.6. Szczegóły: SCSI i jądro Linuksa . ...............................................................................92 3.6.1. Pamięci masowe USB i protokół SCSI ........................................................95 3.6.2. SCSI i ATA . .................................................................................................96 3.6.3. Ogólne urządzenia SCSI ..............................................................................97 3.6.4. Wiele metod dostępu do jednego urządzenia .............................................98

Spis treści

7

4 DYSKI I SYSTEMY PLIKÓW ...................................................................... 99 4.1. Partycjonowanie urządzeń dyskowych . ................................................................. 102 4.1.1. Przeglądanie tablicy partycji . .................................................................... 102 4.1.2. Modyfikowanie tablicy partycji . ............................................................... 104 4.1.3. Geometria dysku i partycji . ...................................................................... 105 4.1.4. Dyski SSD . ............................................................................................... 107 4.2. Systemy plików . ..................................................................................................... 107 4.2.1. Typy systemów plików . ........................................................................... 108 4.2.2. Tworzenie systemu plików . .................................................................... 109 4.2.3. Montowanie systemu plików . .................................................................. 110 4.2.4. Identyfikator UUID systemu plików . ....................................................... 112 4.2.5. Buforowanie dysku i systemu plików . ..................................................... 113 4.2.6. Opcje montowania systemów plików . .................................................... 114 4.2.7. Ponownie montowanie systemu plików . ................................................. 115 4.2.8. Tabela systemów plików /etc/fstab . ........................................................ 116 4.2.9. Rozwiązania konkurencyjne dla pliku /etc/fstab . ..................................... 118 4.2.10. Pojemność systemu plików . .................................................................... 118 4.2.11. Sprawdzanie i naprawianie systemów plików . ........................................ 119 4.2.12. Systemy plików o specjalnym znaczeniu . ................................................ 122 4.3. Przestrzeń wymiany . ............................................................................................. 123 4.3.1. Wykorzystywanie partycji jako przestrzeni wymiany . ............................. 123 4.3.2. Wykorzystywanie pliku jako przestrzeni wymiany . ................................. 124 4.3.3. Jak wielkiej przestrzeni wymiany potrzebuję? . ........................................ 124 4.4. Spojrzenie w przyszłość: dyski i przestrzeń użytkownika . .................................... 125 4.5. Tradycyjny system plików . .................................................................................... 126 4.5.1. Przeglądanie szczegółów węzłów inode . ................................................ 128 4.5.2. Praca z systemami plików w przestrzeni użytkownika . .......................... 130 4.5.3. Ewolucja systemów plików . .................................................................... 130 5 JAK URUCHAMIA SIĘ LINUX? ............................................................... 133 5.1. Komunikaty rozruchowe . ...................................................................................... 134 5.2. Inicjowanie jądra i opcje rozruchu . ........................................................................ 135 5.3. Parametry jądra . .................................................................................................... 136 5.4. Programy rozruchowe . ......................................................................................... 137 5.4.1. Zadania programu rozruchowego . .......................................................... 138 5.4.2. Przegląd programów rozruchowych . ...................................................... 138 5.5. Wprowadzenie do programu GRUB . .................................................................... 139 5.5.1. Przeszukiwanie urządzeń i partycji za pomocą wiersza poleceń programu GRUB . ..................................................................................... 142 5.5.2. Konfigurowanie programu GRUB . .......................................................... 144 5.5.3. Instalowanie programu GRUB . ................................................................ 146 5.6. Problemy z bezpiecznym rozruchem UEFI . .......................................................... 148 5.7. Ładowanie innych systemów operacyjnych . .......................................................... 149

8

Spis treści

5.8.

Szczegóły programu rozruchowego .......................................................................150 5.8.1. Rozruch MBR . ..........................................................................................150 5.8.2. Rozruch UEFI . ..........................................................................................150 5.8.3. Jak działa GRUB? . .....................................................................................151

6 URUCHAMIANIE PRZESTRZENI UŻYTKOWNIKA ................................. 153 6.1. Wprowadzenie do procesu init . .............................................................................154 6.2. Poziomy uruchomienia System V . ..........................................................................155 6.3. Identyfikowanie rodzaju procesu init . ....................................................................156 6.4. systemd ...................................................................................................................156 6.4.1. Jednostki i typy jednostek . .......................................................................157 6.4.2. Zależności systemd ...................................................................................158 6.4.3. Konfiguracja systemd . ..............................................................................160 6.4.4. Praca z systemd .........................................................................................163 6.4.5. Dodawanie jednostek systemd .................................................................166 6.4.6. Śledzenie i synchronizacja procesów systemd ..........................................167 6.4.7. Uruchamianie na żądanie i zrównoleglanie zasobów ................................168 6.4.8. Zgodność systemd z System V ..................................................................173 6.4.9. Programy pomocnicze systemd ................................................................173 6.5. Upstart ....................................................................................................................174 6.5.1. Procedura inicjowania procesu Upstart ....................................................175 6.5.2. Zadania w procesie Upstart . ....................................................................176 6.5.3. Konfiguracja Upstart . ...............................................................................178 6.5.4. Działanie procesu Upstart . .......................................................................183 6.5.5. Protokoły procesu Upstart .......................................................................184 6.5.6. Poziomy uruchomienia procesu Upstart i zgodność z System V ..............185 6.6. Proces init System V ................................................................................................186 6.6.1. Proces init w stylu System V: sekwencja poleceń rozruchowych .............188 6.6.2. Farma dowiązań procesu init w stylu System V ........................................189 6.6.3. run-parts . .................................................................................................190 6.6.4. Sterowanie procesem init w stylu System V .............................................191 6.7. Wyłączanie systemu . ..............................................................................................192 6.8. Początkowy system plików w pamięci RAM ...........................................................193 6.9. Rozruch awaryjny i tryb pojedynczego użytkownika ..............................................195 7 KONFIGURACJA SYSTEMU: REJESTROWANIE, CZAS SYSTEMOWY, ZADANIA WSADOWE I UŻYTKOWNICY ................ 197 7.1. Struktura katalogu /etc . ..........................................................................................198 7.2. Rejestrowanie dzienników systemowych ...............................................................199 7.2.1. Rejestrator systemowy .............................................................................199 7.2.2. Pliki konfiguracyjne . ..................................................................................199 7.3. Pliki związane z zarządzaniem użytkownikami .......................................................202 7.3.1. Plik /etc/passwd . .......................................................................................202 7.3.2. Użytkownicy specjalni . .............................................................................203

Spis treści

9

7.3.3. Plik /etc/shadow . ..................................................................................... 204 7.3.4. Manipulowanie użytkownikami i hasłami . ................................................ 204 7.3.5. Praca z grupami . ...................................................................................... 205 7.4. Programy getty i login . ........................................................................................... 206 7.5. Ustawianie czasu . .................................................................................................. 206 7.5.1. Reprezentacja czasu jądra i strefy czasowe . ............................................ 207 7.5.2. Czas sieciowy . ......................................................................................... 208 7.6. Planowanie powtarzalnych zadań w programie cron . ........................................... 209 7.6.1. Instalowanie plików crontab . ................................................................... 210 7.6.2. Systemowe pliki crontab . ........................................................................ 210 7.6.3. Przyszłość narzędzia cron . ...................................................................... 211 7.7. Planowanie jednorazowych zadań w programie at . .............................................. 211 7.8. Identyfikatory użytkowników i przełączanie ich . ................................................... 212 7.8.1. Prawo właściciela procesu, efektywny identyfikator użytkownika, rzeczywisty identyfikator użytkownika i zapisany identyfikator użytkownika . .. 212 7.9. Identyfikowanie i uwierzytelnianie użytkowników . ............................................... 215 7.9.1. Użycie bibliotek do uzyskiwania informacji o użytkownikach . ................ 216 7.10. System PAM . ......................................................................................................... 217 7.10.1. Konfiguracja systemu PAM . ..................................................................... 217 7.10.2. Uwagi dotyczące systemu PAM . ............................................................. 221 7.10.3. System PAM i hasła . ................................................................................. 222 7.11. Spojrzenie w przyszłość . ....................................................................................... 223 8 WYKORZYSTANIE PROCESÓW I ZASOBÓW .......................................... 225 8.1. Śledzenie procesów . .............................................................................................. 226 8.2. Wyszukiwanie otwartych plików programem lsof . ............................................... 226 8.2.1. Analizowanie danych wyjściowych polecenia lsof . .................................. 227 8.2.2. Użycie polecenia lsof . .............................................................................. 228 8.3. Śledzenie działania programu i wywołań systemowych . ....................................... 228 8.3.1. Polecenie strace . ...................................................................................... 229 8.3.2. Polecenie ltrace . ...................................................................................... 230 8.4. Wątki . .................................................................................................................... 231 8.4.1. Procesy jednowątkowe i wielowątkowe . ................................................ 231 8.4.2. Wyświetlanie wątków . ............................................................................ 231 8.5. Wprowadzenie do monitorowania zasobów . ....................................................... 233 8.6. Pomiar czasu procesora . ....................................................................................... 233 8.7. Nadawanie procesom priorytetów . ...................................................................... 234 8.8. Średnie obciążenia . ................................................................................................ 235 8.8.1. Użycie polecenia uptime . ........................................................................ 235 8.8.2. Wysokie obciążenia . ................................................................................ 236 8.9. Pamięć . .................................................................................................................. 237 8.9.1. Zasady działania pamięci . ......................................................................... 237 8.9.2. Błędy stron . ............................................................................................. 238 8.10. Monitorowanie wydajności procesora i pamięci za pomocą polecenia vmstat ...... 239

10

Spis treści

8.11. Monitorowanie operacji wejścia-wyjścia .................................................................241 8.11.1. Użycie narzędzia iostat .............................................................................241 8.11.2. Wykorzystanie i monitorowanie urządzeń wejścia-wyjścia dla poszczególnych procesów — narzędzie iotop ....................................243 8.12. Monitorowanie poszczególnych procesów za pomocą narzędzia pidstat ..............244 8.13. Dodatkowe zagadnienia . ........................................................................................244 9 SIEĆ I JEJ KONFIGURACJA ..................................................................... 247 9.1. Podstawy dotyczące sieci . ......................................................................................248 9.1.1. Pakiety . .....................................................................................................248 9.2. Warstwy sieciowe . .................................................................................................249 9.3. Warstwa internetowa . ...........................................................................................250 9.3.1. Wyświetlanie adresu IP używanego komputera ........................................252 9.3.2. Podsieci . ...................................................................................................252 9.3.3. Typowe maski podsieci i notacja CIDR .....................................................253 9.4. Trasy i tabela routingu jądra . ..................................................................................254 9.4.1. Brama domyślna . ......................................................................................255 9.5. Podstawowe narzędzia protokołu ICMP i systemu DNS .......................................256 9.5.1. ping . ..........................................................................................................256 9.5.2. Program traceroute ..................................................................................257 9.5.3. DNS i host .................................................................................................258 9.6. Warstwa fizyczna i Ethernet . ..................................................................................258 9.7. Interfejsy sieciowe jądra . ........................................................................................259 9.8. Wprowadzenie do konfiguracji interfejsów sieciowych ..........................................260 9.8.1. Ręczne dodawanie i usuwanie tras . ..........................................................261 9.9. Konfiguracja sieci aktywowana podczas rozruchu ..................................................261 9.10. Problemy z konfiguracją sieci ręczną i aktywowaną podczas rozruchu ..................262 9.11. Menedżery konfiguracji sieciowych . .......................................................................263 9.11.1. Działanie narzędzia NetworkManager ......................................................263 9.11.2. Interakcja z narzędziem NetworkManager ...............................................264 9.11.3. Konfiguracja narzędzia NetworkManager .................................................265 9.12. Rozpoznawanie nazw hostów . ...............................................................................267 9.12.1. Plik /etc/hosts . ..........................................................................................268 9.12.2. Plik resolv.conf . ........................................................................................268 9.12.3. Buforowanie i system DNS bez konfiguracji .............................................268 9.12.4. Plik /etc/nsswitch.conf . .............................................................................269 9.13. Host lokalny . ..........................................................................................................270 9.14. Warstwa transportowa: protokoły TCP i UDP oraz usługi ....................................271 9.14.1. Porty TCP i połączenia . ............................................................................271 9.14.2. Ustanawianie połączeń TCP .....................................................................272 9.14.3. Numery portów i plik /etc/services ..........................................................273 9.14.4. Właściwości protokołu TCP .....................................................................273 9.14.5. Protokół UDP ...........................................................................................274 9.15. Ponowna analiza prostej sieci lokalnej . ...................................................................276

Spis treści

11

9.16. Protokół DHCP . .................................................................................................... 276 9.16.1. Klient DHCP w systemie Linux . .............................................................. 277 9.16.2. Serwery DHCP w systemie Linux . .......................................................... 277 9.17. Konfigurowanie systemu Linux jako routera . ........................................................ 277 9.17.1. Łącza internetowe . .................................................................................. 279 9.18. Sieci prywatne . ...................................................................................................... 279 9.19. Translacja adresów sieciowych (maskarada IP) . .................................................... 280 9.20. Routery i system Linux . ......................................................................................... 282 9.21. Zapory sieciowe . ................................................................................................... 283 9.21.1. Podstawy dotyczące linuksowych zapór sieciowych . .............................. 283 9.21.2. Konfigurowanie reguł zapory sieciowej . .................................................. 285 9.21.3. Strategie tworzenia zapór sieciowych . .................................................... 287 9.22. Ethernet, IP i ARP . ................................................................................................. 289 9.23. Ethernet bezprzewodowy . .................................................................................... 291 9.23.1. iw . ............................................................................................................ 292 9.23.2. Zabezpieczenia sieci bezprzewodowych . ............................................... 293 9.24. Podsumowanie . ..................................................................................................... 293 10 USŁUGI I APLIKACJE SIECIOWE ............................................................. 295 10.1. Podstawy usług . ..................................................................................................... 296 10.1.1. Dokładniejsza analiza . .............................................................................. 296 10.2. Serwery sieciowe . ................................................................................................. 298 10.3. Secure Shell (SSH) . ................................................................................................ 299 10.3.1. Serwer SSHD . ......................................................................................... 300 10.3.2. Klient SSH . ............................................................................................... 303 10.4. Demony inetd i xinetd . .......................................................................................... 305 10.4.1. Wrapper TCP: tcpd, /etc/hosts.allow, /etc/hosts.deny . .......................... 306 10.5. Narzędzia diagnostyczne . ...................................................................................... 306 10.5.1. lsof . .......................................................................................................... 306 10.5.2. tcpdump . ................................................................................................. 308 10.5.3. netcat . ...................................................................................................... 310 10.5.4. Skanowanie portów . ................................................................................ 310 10.6. Zdalne wywoływanie procedur (RPC) . ................................................................. 311 10.7. Zabezpieczenie sieci . ............................................................................................. 312 10.7.1. Typowe słabości . ..................................................................................... 314 10.7.2. Źródła danych o zabezpieczeniach . ......................................................... 314 10.8. Spojrzenie w przyszłość . ....................................................................................... 315 10.9. Gniazda: sposób komunikacji procesów z siecią . .................................................. 315 10.10. Gniazda domenowe systemu Unix . ....................................................................... 317 10.10.1. Korzyści dla projektantów . ...................................................................... 317 10.10.2. Wyszczególnianie gniazd domenowych systemu Unix . ........................... 318

12

Spis treści

11 WPROWADZENIE DO SKRYPTÓW POWŁOKI ......................................... 319 11.1. Podstawy skryptów powłoki . .................................................................................319 11.1.1. Ograniczenia skryptów powłoki ...............................................................320 11.2. Cudzysłowy i literały . .............................................................................................321 11.2.1. Literały ......................................................................................................321 11.2.2. Pojedyncze cudzysłowy . ..........................................................................322 11.2.3. Podwójne cudzysłowy . .............................................................................323 11.2.4. Przekazywanie literału w postaci znaku pojedynczego cudzysłowu .........323 11.3. Zmienne specjalne . ................................................................................................324 11.3.1. Pojedyncze argumenty: $1, $2… . ............................................................324 11.3.2. Liczba argumentów: $# . ..........................................................................325 11.3.3. Wszystkie argumenty: $@ . ......................................................................325 11.3.4. Nazwa skryptu: $0 . ..................................................................................326 11.3.5. Identyfikator procesu: $$ . ........................................................................326 11.3.6. Kod wyjścia: $? . ........................................................................................327 11.4. Kody wyjścia . ..........................................................................................................327 11.5. Wyrażenia warunkowe . .........................................................................................328 11.5.1. Obsługa list pustych parametrów .............................................................329 11.5.2. Użycie innych poleceń do testów .............................................................329 11.5.3. Słowo kluczowe elif . ................................................................................329 11.5.4. Konstrukcje logiczne && i || . ..................................................................330 11.5.5. Sprawdzanie warunków . ..........................................................................330 11.5.6. Porównywanie ciągów znaków instrukcją case ........................................333 11.6. Pętle . ......................................................................................................................334 11.6.1. Pętle for . ..................................................................................................334 11.6.2. Pętle while . ...............................................................................................335 11.7. Podmiana poleceń ...................................................................................................336 11.8. Zarządzanie plikami tymczasowymi ........................................................................337 11.9. Dokumenty miejscowe . .........................................................................................338 11.10. Ważne narzędzia skryptów powłoki . .....................................................................338 11.10.1. Polecenie basename . ................................................................................339 11.10.2. Polecenie awk . .........................................................................................339 11.10.3. Polecenie sed . ..........................................................................................340 11.10.4. Polecenie xargs . .......................................................................................341 11.10.5. Polecenie expr . ........................................................................................342 11.10.6. Polecenie exec . ........................................................................................342 11.11. Podpowłoki .............................................................................................................342 11.12. Włączanie do skryptów innych plików . ..................................................................343 11.13. Pobieranie danych od użytkowników .....................................................................344 11.14. Kiedy (nie)używać skryptów powłoki? ....................................................................344

Spis treści

13

12 PRZENOSZENIE PLIKÓW W SIECI .......................................................... 345 12.1. Szybkie wykonywanie kopii . .................................................................................. 345 12.2. rsync . ..................................................................................................................... 346 12.2.1. Podstawy dotyczące narzędzia rsync . ..................................................... 346 12.2.2. Tworzenie dokładnych kopii struktury katalogów . ................................. 348 12.2.3. Jak używać końcowego ukośnika? . .......................................................... 348 12.2.4. Pomijanie plików i katalogów . ................................................................. 350 12.2.5. Integralność transferu, sumy kontrolne i tryby informacyjne . ................. 351 12.2.6. Kompresja . .............................................................................................. 352 12.2.7. Ograniczanie przepustowości . ................................................................ 352 12.2.8. Przesyłanie plików do naszego komputera . ............................................ 352 12.2.9. Więcej informacji o programie rsync . ...................................................... 353 12.3. Wprowadzenie do współużytkowania plików . ...................................................... 353 12.4. Współużytkowanie plików za pomocą pakietu Samba . ......................................... 354 12.4.1. Konfigurowanie serwera . ........................................................................ 354 12.4.2. Kontrola dostępu do serwera . ................................................................. 355 12.4.3. Hasła . ....................................................................................................... 356 12.4.4. Uruchamianie serwera . ........................................................................... 358 12.4.5. Diagnostyka i pliki dziennika . ................................................................... 358 12.4.6. Konfigurowanie udziału plikowego . ......................................................... 358 12.4.7. Katalogi domowe . .................................................................................... 359 12.4.8. Współużytkowanie drukarek . .................................................................. 359 12.4.9. Korzystanie z klientów Samby . ................................................................ 360 12.4.10. Dostęp do plików jako klient . .................................................................. 361 12.5. Klienty NFS . ........................................................................................................... 362 12.6. Dodatkowe ograniczenia i opcje sieciowych usług plikowych . ............................. 363 13 ŚRODOWISKA UŻYTKOWNIKÓW .......................................................... 365 13.1. Wytyczne dotyczące tworzenia plików uruchomieniowych . ................................ 366 13.2. Kiedy należy modyfikować pliki uruchomieniowe? . ............................................... 366 13.3. Elementy plików uruchamiających powłokę . ........................................................ 367 13.3.1. Ścieżka wyszukiwania poleceń . ............................................................... 367 13.3.2. Ścieżka stron podręcznika man . .............................................................. 368 13.3.3. Symbol zachęty . ....................................................................................... 369 13.3.4. Aliasy . ....................................................................................................... 370 13.3.5. Maska uprawnień . .................................................................................... 370 13.4. Kolejność plików uruchomieniowych i przykłady . ................................................. 371 13.4.1. Powłoka bash . ......................................................................................... 371 13.4.2. Powłoka tcsh . .......................................................................................... 374 13.5. Domyślne ustawienia użytkownika . ....................................................................... 375 13.5.1. Domyślne ustawienia powłoki . ................................................................ 375 13.5.2. Edytor . ..................................................................................................... 376 13.5.3. Program stronicujący . .............................................................................. 376

14

Spis treści

13.6. Pułapki w plikach uruchomieniowych .....................................................................376 13.7. Dalsze informacje . ..................................................................................................377 14 OGÓLNY PRZEGLĄD INTERFEJSÓW UŻYTKOWNIKA SYSTEMU LINUX . ................................................................................... 379 14.1. Komponenty interfejsów użytkownika ...................................................................380 14.1.1. Menedżery okien . ....................................................................................380 14.1.2. Pakiety narzędziowe . ...............................................................................381 14.1.3. Środowiska interfejsów użytkownika ........................................................381 14.1.4. Aplikacje . ..................................................................................................382 14.2. System X Window System . ....................................................................................382 14.2.1. Menedżery wyświetlaczy . ........................................................................383 14.2.2. Przezroczystość sieci . ..............................................................................383 14.3. Eksplorowanie klientów serwera X ........................................................................384 14.3.1. Zdarzenia serwera X . ..............................................................................384 14.3.2. Ustawianie preferencji i dane wejściowe serwera X ................................385 14.4. Przyszłość serwera X ..............................................................................................388 14.5. Usługa D-Bus ..........................................................................................................389 14.5.1. Instancja sesji i instancja systemowa ..........................................................389 14.5.2. Monitorowanie komunikatów usługi D-Bus ..............................................390 14.6. Drukowanie . ..........................................................................................................390 14.6.1. CUPS . .......................................................................................................391 14.6.2. Konwersja formatów i filtry wydruku .......................................................392 14.7. Inne zagadnienia związane z interfejsami użytkownika ...........................................392 15 NARZĘDZIA PROGRAMISTYCZNE ........................................................ 393 15.1. Kompilator języka C ................................................................................................394 15.1.1. Wiele plików źródłowych .........................................................................395 15.1.2. Pliki i katalogi nagłówkowe .......................................................................396 15.1.3. Konsolidacja z bibliotekami . .....................................................................398 15.1.4. Biblioteki współużytkowane .....................................................................399 15.2. Narzędzie make ......................................................................................................403 15.2.1. Przykładowy plik Makefile . .......................................................................404 15.2.2. Wbudowane reguły . .................................................................................405 15.2.3. Końcowe budowanie programu ................................................................406 15.2.4. Aktualizowanie . ........................................................................................406 15.2.5. Argumenty i opcje wiersza poleceń ..........................................................407 15.2.6. Standardowe makra i zmienne . ................................................................408 15.2.7. Typowe cele kompilacji . ...........................................................................408 15.2.8. Organizowanie pliku Makefile . .................................................................409 15.3. Debuggery ...............................................................................................................411 15.4. Lex i Yacc . ..............................................................................................................412

Spis treści

15

15.5. Języki skryptowe . .................................................................................................. 412 15.5.1. Python . .................................................................................................... 413 15.5.2. Perl . ......................................................................................................... 414 15.5.3. Pozostałe języki skryptowe . .................................................................... 414 15.6. Java . ........................................................................................................................ 415 15.7. Spojrzenie w przyszłość: kompilowanie pakietów . ............................................... 416 16 WPROWADZENIE DO KOMPILOWANIA OPROGRAMOWANIA Z KODU ŹRÓDŁOWEGO C ...................................................................... 417 16.1. Systemy do tworzenia oprogramowania . .............................................................. 418 16.2. Rozpakowywanie pakietów kodu źródłowego języka C . ...................................... 419 16.2.1. Od czego zacząć? . ................................................................................... 420 16.3. GNU autoconf . ...................................................................................................... 420 16.3.1. Przykład użycia systemu GNU autoconf . ................................................ 421 16.3.2. Instalacja za pomocą narzędzia do tworzenia pakietów . ......................... 422 16.3.3. Opcje skryptu configure . ......................................................................... 423 16.3.4. Zmienne środowiskowe . ......................................................................... 424 16.3.5. Cele tworzone przez system autoconf . .................................................. 425 16.3.6. Pliki dziennika systemu autoconf . ............................................................ 426 16.3.7. pkg-config . ............................................................................................... 426 16.4. Praktyki instalacyjne . .............................................................................................. 428 16.4.1. Gdzie instalować? . ................................................................................... 428 16.5. Stosowanie poprawek . .......................................................................................... 429 16.6. Rozwiązywanie problemów z kompilowaniem i instalowaniem . .......................... 430 16.6.1. Częste błędy . ........................................................................................... 431 16.7. Spojrzenie w przyszłość . ....................................................................................... 433 17 BUDOWANIE NA FUNDAMENTACH ..................................................... 435 17.1. Serwery WWW i aplikacje internetowe . ............................................................... 435 17.2. Bazy danych . .......................................................................................................... 436 17.2.1. Typy baz danych . ..................................................................................... 437 17.3. Wirtualizacja . ......................................................................................................... 437 17.4. Obliczenia rozproszone i na żądanie . .................................................................... 438 17.5. Systemy wbudowane . ............................................................................................ 438 17.6. Końcowe uwagi . .................................................................................................... 440 BIBLIOGRAFIA . ...................................................................................... 441 SKOROWIDZ . ......................................................................................... 445

16

Spis treści

Podziękowania Podziękować muszę wszystkim, którzy pracowali przy pierwszym wydaniu tej książki: Jamesowi Duncanowi, Douglasowi N. Arnoldowi, Billowi Fennerowi, Kenowi Hornsteinowi, Scottowi Dicksonowi, Danowi Ehrlichowi, Feliksowi Lee, Scottowi Schwartzowi, Gregory’emu P. Smithowi, Danowi Sully’emu, Karolowi Juradowowi i Ginie Steele. Jeżeli chodzi o drugie wydanie, to szczególnie chciałbym podziękować Jordiemu Gutierrezowi Hromoso za doskonałą techniczną korektę mojej pracy. Jego wskazówki i poprawki okazały się nie do przecenienia. Dziękuję też Dominique Poulain oraz Donaldowi Karonowi za wszystkie uwagi do wczesnych wersji książki, a także Hsinju Hesiehowi za współpracę nad kolejnymi wersjami tekstu. Na koniec chciałby też podziękować moim redaktorom: Billowi Pollockowi, Laurieli Chun, Serene Yang, Alison Law oraz wszystkim pracownikom wydawnictwa No Starch Press za świetną pracę związaną z przygotowaniem nowego wydania tej książki.

18

Rozdział

Wstęp NAPISAŁEM

TĘ KSIĄŻKĘ, PONIEWAŻ UWAŻAM, ŻE KAŻDY POWI-

NIEN WIEDZIEĆ, JAK DZIAŁA JEGO KOMPUTER.

MUSIMY PORA-

DZIĆ SOBIE ZE ZMUSZENIEM NASZEGO OPROGRAMOWANIA

do robienia tego, czego sobie życzymy (z oczywistym ograniczeniem do jego rzeczywistych możliwości). Kluczem do takiej władzy jest poznanie podstaw działania i funkcjonowania oprogramowania. Właśnie temu poświęciłem całą tę książkę. Nie chcę, żeby ktokolwiek musiał znowu walczyć ze swoim komputerem. Linux jest doskonałą platformą do nauki, ponieważ nie próbuje niczego przed nami ukrywać. Konfiguracja większości elementów systemu zapisana jest w plikach tekstowych, których zawartość możemy łatwo przeczytać. Trudne jest tu tylko rozpoznanie, które części odpowiadają za poszczególne funkcje i jak się ze sobą wiążą.

Kto powinien przeczytać tę książkę? Twoje zainteresowanie sposobem działania Linuksa może wynikać z wielu różnych powodów. W środowisku zawodowców osoby zawiadujące serwerami muszą znać niemal wszystko to, co będę opisywał w książce. Architekci i programiści tworzący oprogramowanie dla Linuksa również powinni opanować ten materiał, żeby jak

najlepiej wykorzystać system operacyjny. Badacze oraz studenci często sami korzystają z różnych systemów linuksowych, a książka ta pomoże im zrozumieć, dlaczego został on skonfigurowany w ten, a nie inny sposób. No i oczywiście nie można zapomnieć o majsterkowiczach, którzy po prostu lubią grzebać w swoich komputerach, szukając zabawy, zysku albo obu tych rzeczy. Chcesz się dowiedzieć, dlaczego pewne rzeczy działają, a inne nie? Chcesz zobaczyć, co się stanie, gdy przestawisz pewne rzeczy w systemie? Jeżeli tak, zapewne jesteś majsterkowiczem.

Wymagania Choć Linux jest uwielbiany przez programistów, wcale nie musisz być jednym z nich, żeby zacząć czytać tę książkę. Dobrze byłoby jednak mieć pewne podstawowe informacje o działaniu komputera. Oznacza to, że musisz sprawnie poruszać się w GUI (szczególnie obsługiwać instalator i interfejs ustawień Twojej dystrybucji Luniksa) i wiedzieć, czym są pliki oraz katalogi (foldery). Przygotuj się też na konieczność czytania dodatkowej dokumentacji swojego systemu oraz szukania w sieci WWW. Jak już wspominałem wcześniej, najważniejsze jest to, żeby mieć ochotę na grzebanie w swoim komputerze.

Jak czytać tę książkę? Gromadzenie odpowiedniej wiedzy jest prawdziwym wyzwaniem, niezależnie od dziedziny techniki. Jednak wyjaśnienia metod działania oprogramowania mogą stać się naprawdę skomplikowane. Zbyt wiele detali może przytłaczać i utrudniać rozpoznanie tych naprawdę ważnych elementów (mózg człowieka nie jest w stanie przetwarzać zbyt wielu nowych pojęć jednocześnie), ale z drugiej strony, zbyt mało szczegółów sprawia, że czytelnik nie potrafi odpowiednio zinterpretować materiału. Większość rozdziałów starałem się zaplanować tak, żeby najpierw wspomnieć o najważniejszych sprawach, czyli podstawowych informacjach, które są niezbędne w dalszej części. W niektórych miejscach stosowałem uproszczenia, żeby nie rozpraszać za bardzo. Dalej w rozdziale podawałem coraz więcej szczegółów, a szczególnie dużo umieściłem na samym końcu każdego rozdziału. Czy wszystkie te informacje będą Ci od razu potrzebne? Zdążyłem się już przekonać, że w większości przypadków tak nie będzie. Jeżeli te wszystkie dodatkowe szczegóły dotyczące poznanego właśnie materiału zaczną Cię przerastać, nie wahaj się od razu przejść do następnego rozdziału albo po prostu zrobić sobie przerwę. Te wszystkie informacje nigdzie nie uciekną.

20

Wstęp

Ćwiczenia Niezależnie od tego, w jakiej kolejności będziesz czytać rozdziały tej książki, warto mieć przed sobą komputer z systemem Linux, najlepiej taki, z którym możesz bezstresowo eksperymentować. Możesz zacząć taką zabawę od wirtualnej instalacji, wykorzystując oprogramowanie VirtualBox i z jego pomocą wypróbować materiały z tej książki. W takim systemie musisz mieć uprawnienia superużytkownika (ang. root), choć przez większość czasu możesz pracować na koncie zwykłego użytkownika. Zazwyczaj praca będzie odbywać się w oknie wiersza poleceń, terminala albo w sesji zdalnej. Jeżeli jeszcze nie zdarzyło Ci się pracować w takim środowisku, nie obawiaj się, bo w rozdziale 2. dowiesz się wszystkiego, co niezbędne. Polecenia będą prezentowane w następujący sposób: $ ls / [jakieś dane wyjściowe]

Wprowadź tekst wyróżniony pogrubieniem, natomiast tekst bez takiego wyróżniania zostanie wypisany w odpowiedzi przez Twoją maszynę. Znak zachęty w postaci dolara ($) oznacza, że używasz konta zwykłego użytkownika. Jeżeli zamiast dolara zobaczysz krzyżyk (#), to znak, że trzeba się przełączyć na konto superużytkownika (więcej na ten temat w rozdziale 2.).

Podział tej książki Rozdziały tej książki pogrupowałem w trzech głównych częściach. Pierwsza część jest wprowadzeniem, które ma dać ogólny wgląd w system i zawiera pierwsze doświadczenia z narzędziami, których będziesz używać podczas pracy z Linuksem. Następnie dokładniej zbadamy każdą część tego systemu, od systemów zarządzania urządzeniami, przez konfigurację sieci, a skończymy na ogólnym porządku, w jakim uruchamia się system operacyjny. Na zakończenie przyjrzymy się w szczegółach elementom działającego systemu, nabierzemy podstawowych umiejętności w jego obsłudze i poznamy kilka narzędzi stosowanych przez programistów. W większości początkowych rozdziałów, z wyjątkiem rozdziału 2., opisuję właściwie wyłącznie jądro systemu, ale w dalszej części książki przejdę powoli do przestrzeni użytkownika. (Jeżeli nie wiesz, o czym mówię, wszystkiego dowiesz się już w rozdziale 1.). Prezentowany tu materiał powinien być jak najbardziej niezależny od dystrybucji. Po tej deklaracji muszę jednak przyznać, że opisywanie wszystkich możliwych wariantów oprogramowania systemowego byłoby zbyt trudne, dlatego skoncentrowałem się na dwóch rodzinach dystrybucji systemu: Debian (w tym również Ubuntu) oraz RHEL/Fedora/CentOs. Koncentruję się również na instalacjach serwerowych oraz dla komputerów biurkowych. Oczywiście wiele tych

Wstęp

21

informacji bezpośrednio przenosi się do systemów osadzonych, takich jak Android lub OpenWRT, ale sprawdzenie, czym wyróżniają się te platformy pozostawiam już czytelnikom.

Co nowego w drugim wydaniu? W pierwszym wydaniu koncentrowałem się przede wszystkim na elementach systemu wspierających pracę użytkownika. Chciałem opisać, jak działają poszczególne części systemu i jak można je uruchomić. W tamtych czasach naprawdę niełatwo było zainstalować i skonfigurować wiele elementów Linuksa. Na szczęście dzisiaj nie ma już takich problemów, co zawdzięczamy ciężkiej pracy ludzi tworzących oprogramowanie i przygotowujących dystrybucje Linuksa. Pozwoliło mi to pominąć część starego i zapewne nie tak istotnego już materiału (takiego jak dokładny opis systemu drukowania), a w zamian zająć się dokładniejszym omówieniem roli jądra Linuksa w każdej dystrybucji. Z pewnością pracujesz z jądrem systemu częściej, niż może Ci się wydawać, dlatego starałem się wyjaśnić, gdzie dokładnie się to dzieje. Wiele informacji podawanych w pierwszym wydaniu książki zmieniło się przez te wszystkie lata, dlatego z uwagą przejrzałem je wszystkie, poszukując miejsc wymagających zaktualizowania. Szczególnie interesujące są tematy uruchamiania systemu oraz obsługi urządzeń. Starałem się też tak przeorganizować tekst, żeby dopasować go do zainteresowań i potrzeb dzisiejszych czytelników. Nie zmienił się jedynie rozmiar książki. Chcę przekazać materiał, który pozwoli na szybką naukę i jednocześnie objaśni co bardziej skomplikowane elementy. Nie chciałem jednak, żeby do czytania tej książki konieczna była wcześniejsza wizyta na siłowni. Jeżeli zagłębisz się w jakiś ważny temat, na pewno nie będziesz mieć problemów z wyszukaniem i zrozumieniem dodatkowych szczegółów. Pominąłem też część informacji historycznych, które znalazły się w pierwszym wydaniu książki. Chodziło mi o odpowiednie skoncentrowanie się na właściwym temacie. Jeżeli interesuje Cię system Linux oraz jego historyczne powiązanie z Uniksem, zachęcam do lektury książki Petera H. Salusa The Daemon, the Gnu, and the Penguin (Reed Media Services, 2008), świetnie opisującej proces ewolucji używanego przez nas oprogramowania.

Kilka słów o terminologii Nadal toczą się debaty na temat nazw niektórych elementów systemów operacyjnych. Nawet sama nazwa „Linux” wzbudza kontrowersje. Powinna brzmieć po prostu „Linux” czy raczej „GNU/Linux”, tak żeby informować o zawartych w systemie elementach z projektu GNU? W całej książce starałem się używać najpowszechniej stosowanych i najmniej udziwnionych nazw.

22

Wstęp

1 Informacje ogólne NA PIERWSZY RZUT OKA NOWOCZESNY SYSTEM OPERACYJNY, TAKI JAK LINUX, JEST BARDZO SKOMPLIKOWANY, PONIEWAŻ SKŁADA SIĘ Z ZAWROTNEJ LICZBY DZIAŁAJĄCYCH JEDNOCZEŚNIE

i komunikujących się elementów. Przykładowo serwer WWW może wymieniać dane z serwerem bazy danych, który z kolei może wykorzystywać współdzieloną bibliotekę używaną też przez wiele innych programów. Ale jak to wszystko naprawdę działa? Najskuteczniejszą metodą zrozumienia mechanizmów rządzących systemem operacyjnym jest wykorzystanie abstrakcji, czyli ładnej nazwy dla prostego ignorowania większości szczegółów. Jadąc samochodem, zazwyczaj nie musisz zastanawiać się nad takimi detalami jak śruby mocujące silnik pod maską albo ludzie zajmujący się konserwacją drogi, po której się poruszasz. Jeżeli w samochodzie jesteś tylko pasażerem, musisz wiedzieć tylko, co to urządzenie robi (transportuje Cię w jakieś miejsce) oraz jak z niego skorzystać (jak otworzyć drzwi albo zapiąć pasy bezpieczeństwa). Jeżeli jednak masz zamiar kierować samochodem, musisz wiedzieć już znacznie więcej. Musisz nauczyć się posługiwania elementami sterującymi (takimi jak kierownica lub pedał gazu) i wiedzieć, co robić w sytuacji awaryjnej. Załóżmy na przykład, że droga, po której jedziemy, jest bardzo wyboista. W tych okolicznościach ogólną abstrakcję „samochód toczy się po drodze” można podzielić na trzy części: samochód, droga i sposób naszej jazdy. Pozwala to na wyizolowanie istoty problemu: jeżeli droga jest wyboista, za dyskomfort nie możesz winić ani

samochodu, ani swojego stylu jazdy. W takiej sytuacji lepiej dowiedzieć się, dlaczego nawierzchnia drogi tak bardzo się popsuła, a jeżeli droga jest nowa, dlaczego robotnicy wykonali tak fatalną pracę. Twórcy oprogramowania wykorzystują abstrakcje jako narzędzia do tworzenia systemu operacyjnego oraz działających w nim aplikacji. Istnieje wiele pojęć pozwalających na opisanie takich abstrakcyjnych podziałów w oprogramowaniu komputerowym; są to podsystemy, moduły lub pakiety. W tym rozdziale używał będę jednak pojęcia komponent, ponieważ wydaje mi się najprostsze. Tworząc komponent programowy, programiści zazwyczaj nie myślą o wewnętrznych strukturach innych komponentów, ale za to rozmyślają o tym, czego mogą używać inne komponenty oraz jak można z nich skorzystać. W tym rozdziale zaprezentuję ogólny przegląd komponentów, z których składa się system operacyjny Linux. Co prawda, każdy z nich składa się z wielu drobnych szczegółów technicznych, ale na razie będziemy te szczegóły ignorować i skoncentrujemy się na roli poszczególnych komponentów w ramach całego systemu.

1.1. Poziomy i warstwy abstrakcji w systemie Linux Wykorzystanie abstrakcji do podziału systemów komputerowych na komponenty sprawia, że całość jest łatwiejsza do zrozumienia, ale bez odpowiedniej organizacji na nic się nie przyda. Poszczególne komponenty trzeba pogrupować na warstwy lub poziomy. Warstwa lub poziom to sposób klasyfikacji (albo grupowania) komponentów, zależny od tego, gdzie dany komponent znajduje się pomiędzy sprzętem a użytkownikiem. Przeglądarki internetowe albo gry znajdują się w najwyższej warstwie, natomiast najniższą warstwę stanowi pamięć zamontowana fizycznie w komputerze, czyli same zera i jedynki. System operacyjny zajmuje większość warstw znajdujących się pomiędzy tymi dwoma. System Linux składa się z trzech głównych poziomów. Na rysunku 1.1 przedstawiłem te poziomy wraz z wybranymi komponentami, które się w nich znajdują. Sprzęt jest podstawą całości. Do sprzętu można zaliczyć zarówno pamięć, jak i jeden lub kilka procesorów (CPU) wykonujących różne obliczenia oraz odczytujących i zapisujących dane w pamięci. Takie urządzenia jak dyski i karty sieciowe również zaliczane są do sprzętu. Piętro wyżej znajduje się jądro (ang. kernel) stanowiące główny element systemu operacyjnego. Jądro jest oprogramowaniem rezydującym w pamięci komputera, które steruje pracą procesora. Jądro zajmuje się obsługą sprzętu i działa jako główny interfejs pomiędzy sprzętem a działającymi w komputerze programami. Procesy — działające programy zarządzane przez jądro systemu — wspólnie składają się na najwyższy poziom systemu operacyjnego, czyli przestrzeń użytkownika. (Dokładniejszym terminem opisującym proces byłby proces użytkownika i to niezależnie od tego, czy użytkownik wchodzi w jakąkolwiek interakcję z danym procesem. Przykładowo każdy serwer WWW działa jako jeden z procesów użytkownika).

24

Rozdział 1

Rysunek 1.1. Ogólna organizacja systemu Linux Istnieje poważna różnica między procesami działającymi jako procesy jądra i procesy użytkownika. Jądro pracuje w trybie jądra (ang. kernel mode), natomiast procesy użytkownika działają w trybie użytkownika (ang. user mode). Kod działający w trybie jądra ma nieograniczony dostęp do procesora oraz pamięci głównej. To bardzo użyteczny, ale i niebezpieczny przywilej pozwalający procesom jądra na łatwe uszkodzenie całego systemu. Obszar, do którego dostęp ma jedynie jądro systemu, nazywany jest przestrzenią jądra (ang. kernel space). Z drugiej strony, tryb użytkownika ogranicza procesom dostęp do (zazwyczaj bardzo ograniczonego) podzbioru pamięci i bezpiecznych poleceń procesora. Przestrzeń użytkownika (ang. user space) odnosi się do tych części pamięci operacyjnej, do których dostęp mają procesy użytkownika. Jeżeli dany proces wykona nieprawidłową operację, jej konsekwencje są ograniczone i mogą zostać usunięte przez jądro systemu. Oznacza to, że w przypadku błędu w przeglądarce nie musimy się obawiać o naukowe obliczenia wykonywane w tle od kilku dni. Teoretycznie źle działający proces użytkownika nie jest w stanie wyrządzić poważnych szkód w systemie operacyjnym. W rzeczywistości zależy to od definicji „poważnej szkody” oraz konkretnych uprawnień, jakie taki proces może mieć, ponieważ niektórym procesom pozwala się na więcej niż innym. Czy na przykład proces użytkownika może całkowicie zniszczyć dane zapisane na dysku? Owszem, jeżeli ma odpowiednie uprawnienia, a to można uznać za bardzo niebezpieczne działanie. Oczywiście istnieją mechanizmy zabezpieczające przed takimi sytuacjami, a większość procesów nie ma uprawnień, żeby siać aż takie zniszczenia.

Informacje ogólne

25

1.2. Sprzęt: pamięć operacyjna Spośród wszystkich elementów sprzętowych komputera pamięć operacyjna jest chyba elementem najważniejszym. W swojej najprostszej postaci pamięć jest tylko gigantycznym zbiorem przechowującym zera i jedynki. Każde z tych zer i każda jedynka nazywane są bitami. To właśnie w tym miejscu przechowywane są jądro i procesy użytkownika — one również są jedynie zbiorami zer i jedynek. Wszystkie sygnały wejścia i wyjścia z urządzeń peryferyjnych przepływają przez pamięć operacyjną, a zatem i one są jedynie zbiorem bitów. Sam procesor jest tylko elementem pracującym na pamięci. Odczytuje on instrukcje oraz dane z pamięci, a następnie zapisuje do niej dane wynikowe. W odniesieniu do pamięci, procesów, jądra i innych elementów systemu komputerowego często pojawia się pojęcie stanu. W ścisłym znaczeniu stan jest określonym ułożeniem bitów. Przykładowo dla czterech bitów w pamięci wartości 0110, 0001 i 1011 oznaczają trzy różne stany. Jeżeli przyjmiemy, że pojedynczy proces może składać się z milionów bitów pamięci, podczas dyskusji o stanie procesu zwykle łatwiej stosować jakieś abstrakcyjne pojęcie. Zamiast opisywać stan za pomocą pojedynczych bitów, mówimy o tym, co proces w danym momencie robił lub robi. Możemy na przykład powiedzieć, że „proces oczekuje na wejście” albo „proces wykonuje drugi etap procedury uruchomieniowej”. UWAGA

Zazwyczaj o stanie mówi się z wykorzystaniem pojęć abstrakcyjnych, a nie faktycznych bitów, dlatego pojęcie obrazu (ang. image) odnosi się do fizycznego ułożenia bitów w pamięci.

1.3. Jądro systemu Dlaczego ciągle mówimy o pamięci operacyjnej i stanach? Po prostu niemal wszystko, co robi jądro systemu, wiąże się z pamięcią komputera. Jednym z zadań jądra jest dzielenie pamięci na wiele części, dlatego cały czas musi ono przechowywać informację o stanie każdej z tych części. Każdy proces otrzymuje swoją porcję pamięci, a jądro systemu musi zapewnić procesom wyłączność na przydzieloną im pamięć. Zadaniem jądra systemu jest zarządzanie zadaniami w czterech głównych obszarach systemowych. Oto one. Procesy — jądro musi określić, który z procesów może w danym momencie korzystać z procesora. Pamięć — jądro musi odpowiednio zarządzać pamięcią, przydzielać ją poszczególnym procesom, wyznaczać części współdzielone przez procesy i organizować wolną pamięć. Sterowniki urządzeń — jądro działa jako interfejs pomiędzy sprzętem (na przykład dyskiem) a procesami. Zazwyczaj operowanie urządzeniami to zadanie jądra.

26

Rozdział 1

Wywołania systemowe — procesy zwykle komunikują się z jądrem za pomocą wywołań systemowych. Teraz pokrótce omówię każdy z tych obszarów. UWAGA

Jeżeli interesują Cię szczegóły działania jądra systemu, polecam lekturę dwóch dobrych książek: pierwsza to dziewiąte wydanie Operating System Concepts, autorstwa Abrahama Silberschatza, Petera B. Galvina i Grega Gagne’go (Wiley, 2012), a druga to trzecie wydanie Systemy operacyjne autorstwa Andrew S. Tanenbauma (Helion, 2010).

1.3.1. Zarządzanie procesami Zarządzanie procesami to ogół zadań związanych z uruchamianiem, wstrzymywaniem, ponownym uruchamianiem i kończeniem pracy procesów. Koncepcje związane z uruchamianiem i kończeniem procesu są względnie proste, ale już opisanie, w jaki sposób proces wykorzystuje procesor w trakcie swojej normalnej pracy, jest zdecydowanie bardziej skomplikowane. W każdym nowoczesnym systemie operacyjnym wiele procesów może działać „jednocześnie”. Przykładowo w tym samym momencie na swoim komputerze możesz mieć uruchomioną przeglądarkę stron WWW i arkusz kalkulacyjny. Niestety nie wszystko wygląda tutaj tak, jak można by się spodziewać. Poszczególne procesy kryjące się za aplikacjami zazwyczaj nie pracują dokładnie w tym samym czasie. Załóżmy, że dysponujemy systemem z jednordzeniowym procesorem. Z takiego procesora może korzystać wiele różnych procesów, ale tylko jeden z nich będzie w danym momencie rzeczywiście wykonywany przez ten procesor. W praktyce każdy proces używa procesora przez pewien krótki czas, a potem wstrzymuje swoją pracę. Następnie kolejny proces zaczyna używać procesora, co trwa ułamek sekundy, po czym przez następny ułamek sekundy z procesora może korzystać kolejny proces i tak dalej. Operacja przekazania kontroli nad procesorem od jednego procesu do drugiego nazywana jest przełączaniem kontekstu (ang. context switch). Każdy taki wycinek czasu (ang. time slice) pozwala procesowi na wykonanie całkiem sporej ilości obliczeń i rzeczywiście większość procesów może zakończyć swoje aktualne prace w ramach pojedynczego wycinka. A dzięki temu, że wycinki czasu są tak małe, ludzie nie są w stanie ich zauważyć, przez co system sprawia wrażenie, jakby działało w nim jednocześnie wiele różnych procesów — to cecha nazywana wielozadaniowością (ang. multitasking). Za przełączanie kontekstów odpowiedzialne jest jądro systemu. Aby lepiej poznać zasadę działania tego mechanizmu, wyobraźmy sobie sytuację, w której proces działa w trybie użytkownika i właśnie zakończył się przydzielony mu wycinek czasu. W tym momencie wykonywane są opisane niżej operacje. 1. W reakcji na sygnał z wewnętrznego zegara procesor (rzeczywisty sprzęt) przerywa pracę aktualnego procesu, przełącza się w tryb jądra i przekazuje kontrolę do jądra systemu.

Informacje ogólne

27

2. Jądro systemu zapisuje aktualny stan procesora w pamięci, co pozwoli mu

później wznowić pracę procesu, który właśnie został przerwany. 3. Jądro wykonuje wszelkie zadania, jakie mogły się pojawić w trakcie

zakończonego właśnie wycinka czasu, takie jak zbieranie danych z wejść lub wyjść lub wykonywanie operacji wejścia i wyjścia. 4. Teraz jądro jest gotowe do wznowienia pracy kolejnego procesu. Zaczyna ono analizę listy procesów działających aktualnie w systemie i wybiera z niej jeden proces. 5. Jądro przygotowuje pamięć do pracy nowego procesu, a następnie odtwarza stan procesora. 6. Jądro informuje procesor, jak długo będzie trwał wycinek czasu przydzielony wznawianemu procesowi. 7. Jądro przełącza procesor w tryb użytkownika i przekazuje kontrolę nad

procesorem wznawianemu procesowi. Operacja przełączania kontekstu odpowiada na pytanie, kiedy działa jądro systemu? Okazuje się, że działa ono pomiędzy wycinkami czasu przydzielanymi procesom, w trakcie przełączania kontekstów. W przypadku systemu wieloprocesorowego całość nieco się komplikuje, ponieważ jądro nie musi już zrzekać się kontroli nad procesorem w celu wznowienia pracy dowolnego procesu na innym procesorze. Mimo to, jądro zwalnia każdy z procesorów dostępnych w systemie w celu jak najlepszego wykorzystania wszystkich dostępnych zasobów. Oczywiście może też wykorzystać kilka prostych sztuczek, żeby przejąć na swoje potrzeby nieco więcej czasu procesora.

1.3.2. Zarządzanie pamięcią Ze względu na to, że jądro systemu musi zarządzań pamięcią podczas przełączania kontekstu, musi przejąć też złożone zadania związane z ogólnym zarządzaniem pamięcią systemu. Całość jest tak skomplikowana, ponieważ jądro musi zapewnić zachowanie następujących warunków. Jądro musi mieć własną, prywatną przestrzeń w pamięci, do której nie mają dostępu procesy użytkownika. Każdy proces użytkownika musi otrzymać własny wycinek pamięci. Żaden z procesów użytkownika nie może uzyskać dostępu do prywatnej pamięci innego procesu. Procesy użytkownika mogą współdzielić pamięć. Część pamięci procesu użytkownika może być pamięcią tylko do odczytu. System może wykorzystywać więcej pamięci niż fizycznie zainstalowana, używając zamiennie przestrzeni na dysku twardym. Na szczęście jądro systemu może skorzystać z pomocy. W nowoczesnych procesorach znajduje się specjalny moduł zarządzania pamięcią (MMU — ang.

28

Rozdział 1

Memory Management Unit), który pozwala na korzystanie ze schematu dostępu do pamięci nazywanego pamięcią wirtualną (ang. virtual memory). Podczas wykorzystania pamięci wirtualnej procesor nie adresuje jej bezpośrednio, podając fizyczny adres w sprzętowym układzie scalonym. W takiej konfiguracji jądro przygotowuje każdy proces tak, jakby sam miał do swojej dyspozycji całą maszynę. Gdy proces próbuje uzyskać dostęp do przydzielonej mu pamięci, moduł MMU przechwytuje taką próbę i wykorzystuje mechanizm mapowania adresów, żeby przekształcić lokalizację w pamięci procesu na fizyczną lokalizację w pamięci komputera. Oczywiście jądro systemu musi odpowiednio zainicjować, a potem ciągle aktualizować zawartość mapy adresów. Przykładowo podczas przełączania kontekstów jądro musi zmienić aktualną mapę, dopasowując ją do wznawianego właśnie procesu. UWAGA

Implementacja mapy adresów pamięci nazywana jest tablicą stron (ang. page table). Więcej informacji na temat działania pamięci komputera znajdziesz w rozdziale 8.

1.3.3. Sterowniki urządzeń i zarządzanie urządzeniami Zadania jądra w odniesieniu do urządzeń pracujących w komputerze są bardzo proste. Dostęp do każdego urządzenia możliwy jest jedynie w trybie jądra, ponieważ niewłaściwa ich obsługa (na przykład proces użytkownika proszący o wyłączenie zasilania) może doprowadzić do zablokowania komputera. Inny problem stanowi fakt, że poszczególne urządzenia bardzo rzadko korzystają z tego samego interfejsu programowania, nawet jeżeli mają takie same zadania. Przykładem mogą być karty sieciowe. Z tego właśnie powodu sterowniki tradycyjnie już budowane są jako część jądra i starają się zaprezentować procesom użytkownika jednolity interfejs, żeby ułatwić pracę twórcom aplikacji.

1.3.4. Wywołania systemowe Istnieje też kilka innych rodzajów funkcji udostępnianych przez jądro procesom użytkownika. Przykładowo wywołania systemowe (ang. system calls) spełniają określone zadania, których procesy użytkownika nie są w stanie wykonać dobrze lub nie mogą ich wykonać w ogóle. Przykładem takich wywołań systemowych mogą być operacje związane z otwieraniem, odczytywaniem i zapisywaniem plików. Dwa wywołania systemowe — fork() i exec() — są szczególnie istotne przy poznawaniu sposobu uruchamiania procesów w systemie. fork() — gdy dany proces wywołuje funkcję fork(), jądro systemu tworzy niemal identyczną kopię tego procesu. exec() — gdy proces wywołuje funkcję exec(program), jądro systemu uruchamia program, który zastępuje aktualny proces. W systemach linuksowych wszystkie procesy użytkownika z wyjątkiem procesu init (więcej o nim w rozdziale 6.) powstają w wyniku wywołania systemowego fork(). Dodatkowo, w większości przypadków wywoływana jest funkcja exec() Informacje ogólne

29

pozwalająca na uruchomienie nowego programu bez tworzenia kopii istniejącego już procesu. Bardzo prostym przykładem mogą być programy uruchamiane w wierszu poleceń, takie jak polecenie ls wyświetlające zawartość katalogu. Po wprowadzeniu polecenia ls w oknie terminala działająca w nim powłoka wywołuje funkcję fork() w celu utworzenia nowego procesu powłoki, a następnie ta nowa kopia procesu wywołuje funkcję exec(ls), uruchamiając tym samym program ls. Na rysunku 1.2 można zobaczyć schemat interakcji procesów i wywołań systemowych niezbędnych do uruchomienia takiego programu jak ls.

Rysunek 1.2. Uruchamianie nowego procesu UWAGA

Wywołania systemowe są zazwyczaj wyróżniane za pomocą nawiasów. W poprzednim przykładzie z rysunku 1.2 proces proszący jądro o utworzenie nowego procesu musi skorzystać z wywołania systemowego fork(). Taki zapis wywodzi się ze sposobu zapisywania wywołań funkcji w języku C. Nie musisz znać tego języka w celu poznania zawartości tej książki. Wystarczy zapamiętać, że wywołanie systemowe jest formą interakcji między procesem a jądrem systemu. Dodatkowo w tej książce będę upraszczał niektóre grupy wywołań systemowych. Przykładowo zapis exec() odnosić się będzie do całej grupy wywołań systemowych wykonujących podobne zadania, ale różniących się drobnymi szczegółami. Jądro obsługuje też procesy użytkownika, udostępniając im funkcje inne niż tradycyjne wywołania systemowe, takie jak pseudourządzenia (ang. pseudodevices). Dla procesu użytkownika pseudourządzenie wygląda jak normalne urządzenie, ale istnieje wyłącznie w postaci oprogramowania. W związku z tym takie urządzenia nie muszą znajdować się w samym jądrze, ale ze względów praktycznych zazwyczaj się je tam umieszcza. Przykładowo urządzenie do generowania liczb losowych (/dev/random) zaimplementowane jako proces użytkownika nie zapewniałoby odpowiedniego poziomu bezpieczeństwa.

UWAGA

Pod względem technicznym proces użytkownika, który chce skorzystać z pseudourządzenia, musi użyć wywołań systemowych, żeby to urządzenie otworzyć. Oznacza to, że procesy nie mogą całkowicie unikać korzystania z tych wywołań.

1.4. Przestrzeń użytkownika Jak już wspominałem wcześniej, pamięć komputera przygotowywana przez jądro na potrzeby procesów użytkownika nazywana jest przestrzenią użytkownika (ang. user space). Ze względu na to, że proces jest jedynie stanem (lub obrazem)

30

Rozdział 1

w pamięci, przestrzeń użytkownika opisuje w pamięci całą kolekcję działających w niej procesów. Większość faktycznych działań w systemach Linux wykonywana jest w przestrzeni użytkownika. Co prawda, z punktu widzenia jądra systemu wszystkie procesy są sobie równe, jednak mogą one wykonywać różne zadania na rzecz użytkowników. Istnieje ogólna struktura poziomów (warstw) opisująca rodzaje komponentów systemu reprezentowanych przez procesy. Na rysunku 1.3 przedstawiłem przykładowy zestaw komponentów współpracujących w ramach systemu. Podstawowe usługi zlokalizowane są na dolnym poziomie (najbliżej jądra), usługi pomocnicze znajdują się na środkowym poziomie, a na samej górze umieszczone są aplikacje, z którymi styka się użytkownik. Oczywiście rysunek 1.3 został bardzo uproszczony, ponieważ przedstawiłem na nim zaledwie sześć komponentów, ale już tutaj widać, że komponenty umieszczone na górze znajdują się najbliżej użytkownika (interfejs użytkownika i przeglądarka WWW). Wśród komponentów wymieniam serwer pocztowy, z którego korzysta przeglądarka, natomiast na samym dole umieściłem kilka niewielkich elementów systemu. Najniższy poziom najczęściej składa się z niewielkich komponentów, które wykonują proste, nieskomplikowane zadania. Poziom środkowy zwykle zawiera większe komponenty, takie jak serwery poczty, wydruku lub baz danych. I w końcu komponenty z najwyższego poziomu wykonują złożone zadania, które użytkownik często sam kontroluje. Każdy komponent może też korzystać z innych komponentów. Zazwyczaj gdy jeden komponent chce użyć innego, ten drugi znajduje się albo na tym samym, albo na niższym poziomie. Pamiętaj, że rysunek 1.3 jest tylko ogólnym przybliżeniem ułożenia komponentów w przestrzeni użytkownika. W rzeczywistości w przestrzeni użytkownika nie ma żadnych reguł. Przykładowo większość aplikacji i usług zapisuje komunikaty diagnostyczne nazywane protokołami (ang. logs). Zazwyczaj programy wykorzystują do tego standardową usługę syslog, ale część może samodzielnie wykonywać zadania związane z protokołowaniem.

Rysunek 1.3. Rodzaje procesów i ich interakcje

Informacje ogólne

31

Co więcej, kategoryzacja części komponentów z przestrzeni użytkownika jest bardzo kłopotliwa. Komponenty serwerowe, takie jak serwery WWW lub baz danych, można traktować jak aplikacje bardzo wysokiego poziomu, ponieważ wykonywane przez nie zadania są tak złożone, że na rysunku 1.3 powinny się znaleźć na najwyższym poziomie. Mimo to, aplikacje użytkownika mogą używać tych serwerów w celu wykonywania zadań, którymi nie chcą się zajmować samodzielnie, w związku z czym należałoby je umieścić na środkowym poziomie.

1.5. Użytkownicy Jądro Linuksa obsługuje tradycyjną koncepcję użytkownika systemu Unix. Użytkownik (ang. user) jest encją, która może uruchamiać procesy i być właścicielem plików. Każdemu użytkownikowi przypisana jest też nazwa użytkownika (ang. username). Przykładowo w dowolnym systemie może istnieć użytkownik o nazwie marian. Jądro systemu nie rozpoznaje użytkowników po nazwach, ale identyfikuje za pomocą specjalnych liczbowych identyfikatorów o nazwie userid. (W rozdziale 7. opowiem, w jaki sposób nazwy użytkownika wiązane są z ich identyfikatorami). Użytkownicy istnieją w systemie głównie po to, żeby wyznaczać uprawnienia i ich granice. Każdy proces w przestrzeni użytkownika ma swojego właściciela (ang. owner), dlatego mówi się, że procesy uruchamiane są jako dany użytkownik. Użytkownik może kończyć lub zmieniać zachowanie swoich własnych procesów (w pewnych granicach), ale nie może w żaden sposób wpływać na procesy innych użytkowników. Oprócz tego użytkownicy mogą być właścicielami plików i decydować o tym, czy chcą się nimi dzielić z innymi użytkownikami. W systemie Linux zazwyczaj zdefiniowanych jest kilku użytkowników, oprócz tych przypisanych konkretnym osobom korzystającym z tego systemu. Więcej na ten temat przeczytasz w rozdziale 3., a tutaj zaznaczę, że najważniejszy użytkownik nosi nazwę root. Ten właśnie użytkownik stanowi wyjątek od opisywanych wcześniej reguł, ponieważ może zakończyć lub zmodyfikować proces dowolnego użytkownika oraz odczytywać zawartość każdego pliku w systemie. Z tego właśnie powodu root znany jest też jako superużytkownik (ang. superuser). Mówi się, że osoba pracująca w systemie jako użytkownik root ma uprawnienia roota (ang. root access) i jest administratorem tradycyjnego systemu uniksowego. UWAGA

32

Praca z uprawnieniami superużytkownika może być niebezpieczna. Naprawdę trudne może być identyfikowanie i poprawianie ewentualnych błędów, ponieważ system pozwoli na wykonanie każdej operacji, nawet jeżeli może ona uszkodzić system. Z tego powodu projektanci systemów starają się jak najbardziej ograniczyć konieczność używania konta root, na przykład nie wymagają go do przełączania się w laptopie pomiędzy różnymi sieciami bezprzewodowymi. Musisz też pamiętać, że mimo swoich ogromnych uprawnień, użytkownik root nadal działa w trybie użytkownika systemu operacyjnego, a nie w trybie jądra.

Rozdział 1

Grupy są zbiorami użytkowników. Podstawowym zadaniem grup jest umożliwianie współdzielenia plików między użytkownikami należącymi do jednej grupy.

1.6. Spojrzenie w przyszłość Na razie zaprezentowałem elementy niezbędne do działania systemu Linux. Procesy użytkownika tworzą środowisko, z którym możesz wchodzić w bezpośrednią interakcję, natomiast jądro systemu zajmuje się obsługą procesów i sprzętu. Zarówno jądro, jak i wszystkie procesy przechowywane są w pamięci. To bardzo cenne informacje, ale nie poznasz tajników Linuksa, czytając wyłącznie o samych procesach. Powoli trzeba zacząć brudzić sobie ręce. Następny rozdział zacznę od zaprezentowania kilku podstaw związanych z przestrzenią użytkownika. Przy okazji poznasz ważne części systemu, o których nawet nie wspomniałem w tym rozdziale, czyli dyski, pliki i tym podobne. W końcu wszystkie te programy i dane musimy gdzieś zapisywać.

Informacje ogólne

33

34

Rozdział 1

Podstawowe Rąlecenia i hierarchia�talogów � ':!Vo NINI



ROZDZIAŁ JEST PRZEWODNIKIEM PO FOLECENIACH

DZIACH UNIKSA, KTÓRE MUSIMY POZNAĆ, ZANIM ZAJ---�, ____ MY

SIĘ POZOSTAŁYMI TEMATAMI. PRAWDOPODOBNIE WIELU

czytelników będzie już zaznajomionych z większą częścią tego podstawowego materiału, zalecałbym jednak choćby przekartkować zawartość rozdziału, żeby upewnić się, że nic nie umknęło; szczególnie zależy mi na materiale dotyczącym hierarchii katalogów z podrozdziału 2.19. Tylko dlaczego polecenia Uniksa? Czy ta książka nie ma opisywać działania Linuksa? Oczywiście, ale przecież Linux jest jedną z odmian Uniksa. W tym roz­ dziale słowo "Unix" będzie pojawiało się znacznie częściej niż "Linux", ponieważ wiele zawartych tutaj informacji można bezpośrednio zastosować w innych sys­ temach uniksowych, takich jak Solaris lub BSD. Bardzo się starałem, żeby nie opisywać zbyt wielu rozszerzeń interfejsu występujących tylko w Linuksie. Wynikało to nie tylko z tego, że chciałem przedstawić jak najlepiej podstawy innych systemów operacyjnych, ale także z tego, że takie rozszerzenia bardzo często są wyjątkowo niestabilne. Znajomość niezmiennego rdzenia systemu pozwoli bardzo szybko dostosować się do nowych wydań systemu Linux.

UWAGA

2.1.

Więcej informacji na temat Uniksa przeznaczonych dla początkujących znajdziesz w książkach Linux. Wprowadzenie do wiersza poleceń (Helion, 2015), Unix for the impatient (Addison-Wesley Professional, 1995) oraz UNIX. Wprowadzenie (Helion, 2002).

Powłoka Bourne'a: /bin/sh Powłoka jest jednym z najważniejszych elementów systemu uniksowego. Jest ona

programem uruchamiającym różne polecenia. Przykładowo jednym z zadań powłoki jest uruchamianie poleceń wpisanych przez użytkownika. Powłoki służą też za małe środowiska programistyczne. Programiści uniksowi często rozbijają zadania programów na mniejsze części, a powłoce zlecają zarządzanie tymi zada­ niami i odbieranie wyników ich działania. Tak naprawdę wiele ważnych elementów systemu to łe skrypty powłoki, obom pracującym czyli pliki tekstowe zawierające same polecenia powł 1. wcześniej w systemie MS-DOS skrypty powłoki m� prz minać znane im pliki ! nacznie potężniejszym .bat. Trzeba jednak zaznaczyć, że skrypty pow narzędziem. W rozdziale 11. przedstawię krótki � ')-odnik po skryptach powłoki, dlatego można przeczytać go w dowolnym ��e po lekturze tego rozdziału. W dalszej części książki dowiesz s� �na manipulować poleceniami za pomocą powłoki. Jedną z najprzyje� ch cech powłoki jest to, że w przy­ padku popełnienia jakiegoś błędu mo� sprawdzić, jakie polecenie wpisywaliśmy, skorygować ewentualne pomyłk �chomić polecenie jeszcze raz. 'tfniksa, choć wszystkie one zapożyczają wiele Istnieje wiele różnych � me'a, czyli !bin/sh., która została przygotowana funkcji z tak zwanej powł� dla wczesnych wersji Un � laboratoriach Bell Labs. Jak przekonasz się w tej książce, każdy syst� urfiksowy do prawidłowego działania wymaga powłoki Bourne'a. System L" orzysta z rozbudowanej wersji tej powłoki nazywanej bash, czyli Bou� a� "n shell. Jest ona domyślną powłoką w większości dystrybucji Linuks iast nazwa !bin/sh jest najczęściej tylko dowiązaniem do właściwej powłoki. Uruchamiając przykłady podawane w tej książce, należy posługiwać się powłoką bash.



%�

� -.



��



UWAGA

36

jeżeli podczas czytania tego rozdziału korzystasz z konta uniksowego na serwerze, na którym nie posiadasz uprawnień administratora, to możesz nie mieć dostępu do powłoki bash. W takim przypadku możesz zmienić aktywną powłokę poleceniem chsh albo poprosić o pomoc administratora.

Rozdziat 2

2.2.

Korzystanie z powłoki W czasie instalowania Linuksa należy skonfigurować hasło superużytkownika (ang. root password), a także przygotować konto przynajmniej jednego zwykłego użyt­ kownika. Na potrzeby tego rozdziału wystarczy załogować się na konto zwykłego użytkownika.

2.2.1. Okno powłoki Pierwszą czynnością, jaką musisz wykonać po zalogowaniu, jest wywołanie okna powłoki (często nazywanego oknem terminala). W interfejsach graficznych, takich jak Gnome lub Unity z Ubuntu, najłatwiej można to zrobić, otwierając program terminala, który w nowym oknie sam uruchomi powłokę. Po uruchomieniu okna powłoki w jego górnej części znajduje się symbol zachęty, najczęściej zakończony znakiem dolara ($). W systemie Ubuntu taki symbol z ęty zwykle ma postać �ląda tak: [nazwa@ nazwa@host:ścieżka$, natomiast w dystrybucji Fedo � host .1cieżka]$. Jeżeli znasz system Windows, z w ś ą zauważysz, że okno powłoki jest bardzo podobne do wiersza pole��ys� u Windows. Aplikacja o nazwie Terminal w systemie OS X jest w za t samym, co okno powłoki w Linuksie. W tej książce omówię wiele poleceń, ,� � można wpisywać do wiersza pole­ aku dolara ($), który w powłoce jest ceń powłoki. Wszystkie zaczynają s� takie polecenie (wpisz tylko pogru­ znakiem zachęty. Przykładowo biony tekst, pomijając znak clo Yciśnij klawisz t:nter:

� � e

� wrĄ1&rz

n

$ echo Witaj świecie. UWAGA



�� �{Y

---�---

Wiele polecelt pou;l.Q \i rJtezentowanych w tej książce zaczyna się od znaku krzy­ żyka (#). Taki ia należy wprowadzać jako superużytkownik (root), ponie­ waż zwykle _ gają one zachowania szczególnej ostrożności.

:_�� �

Pr



raz wpisać poniższe polecenie:

$ cat /etc/passwd

Folecenie to wypisuje zawartość systemowego pliku /etc/passwd i powraca do wiersza poleceń powłoki. Na razie nie musisz wiedzieć, jakie są zadania tego pliku. Więcej informacji na jego temat znajdziesz w rozdziale 7.

2.2.2. Polecenie cat Folecenie c at doskonale nadaje się na początkowy przykład, ponieważ jest jednym z najprostszych poleceń uniksowych. Wypisuje ono jedynie zawartość jednego lub kilku plików. Jego składnia jest następująca:

Podstawowe polecenia i hierarchia katalogów

37

$ cat p l ikl p l ik2 ...

Folecenie po uruchomieniu wypisuje na ekranie po kolei zawartość plików plikl, plik2 oraz wszystkich pozostałych plików podanych w parametrach pole­

cenia i kończy swoje działanie. Folecenie nazwane zostało cat, ponieważ wykonuje konkatenację podczas wypisywania zawartości kilku plików.

2.2.3. Standardowe wejście i wyjście Wykorzystamy teraz polecenie cat, żeby pokrótce przyjrzeć się uniksowemu wejściu i wyjściu (ang. l/0). W Uniksie procesy wykorzystują strumienie wejścia i wyjścia, żeby odczytywać i zapisywać dane. Każdy proces może odczytać dane ze strumienia wejściowego i zapisać je do strumienia wyjściowego. Strumienie są bardzo elastycznym narzędziem. Przykładowo źródłem strumienia wejściowego mogą być plik, urządzenie, terminal, a nawet strumień wyJ�iowy innego procesu. �nie cat (bez nazw Aby zobaczyć, jak działa strumieł1 wejściowy, wpis dniego przykładu nie plików) i naciśnij klawisz Enter. W przeciwieństwie� po pojawia się tutaj ponownie symbol zachęty, poi ���ogram cat nadal działa. Teraz możesz wpisać jakikolwiek tekst (ni dnego znaczenia). Po naciały wpisany wcześniej wiersz śnięciu klawiszaEnterpolecenie cat pow tekstu. Gdy już znudzi Ci się taka z�� żesz nacisnąć w pustym wierszu klawisze Ctrl+D, a program cat za woje działanie i pojawi się symbol \.....) zachęty. Powodem, dla którego progr�t przyjął takie interaktywne zachowanie, jest jego współpraca ze strumi��ywołując ten program, nie podaliśmy nazwy pliku wejściowego, dlategfJ'J'B amiast korzystać ze strumienia związanego z pli­ kiem, zaczął odczyt ć �ze strumienia standardowego wej.ścia (ang. standard input) podanego m e�jądro Linuksa. W tym przypadku standardowe wejście było połączo e inalem, w którym został uruchomiony program cat.



� � �

� ��





UWAGA

�� Nie należ1J4.._ �� lawiszy Ctrl+D i Ctrl+C. Naciśniecie Ctrl+D w pustym wier­

szu ozn�niec wpisów standardowego wej.ścia, co często powoduje również zakończenie pracy programu. Klawisze Ctrl +C wymuszają zakończenie pracy programu niezależnie od jego aktualnego stanu. Standardowe wyj.ście (ang. standard output) działa na podobnej zasadzie. Jądro przekazuje każdemu procesowi strumień standardowego wyjścia, do którego może on zapisywać swoje dane wyjściowe. Folecenie cat zawsze wypisuje swoje dane na standardowe wyjście. Po uruchomieniu programu cat w terminalu standardowe wyjście zostało połączone z oknem terminala i dlatego zobaczyliśmy teksty wypi­ sywane przez program. Standardowe wejście i wyjście często opisywane są skrótami stdin oraz stdout. Wiele poleceń działa podobnie do programu cat, jeżeli nie określisz pliku wej­ ściowego, to program będzie czytał ze standardowego wejścia. W przypadku wyj-

38

Rozdziat 2

ścia nie jest to już takie oczywiste. Niektóre polecenia (w tym i cat) przekazują dane wyłącznie na standardowe wyjście, ale inne mają specjalne opcje pozwalające na wysłanie ich bezpośrednio do pliku. Istnieje też trzeci standardowy strumień wejścia-wyjścia nazywany standardo­ wym strumieniem błędów (ang. standard error). Więcej informacji na jego temat podam w punkcie 2.14.1. Jedną z najlepszych cech standardowych strumieni jest to, że można łatwo zmusić je do odczytywania i zapisywania danych w miejsca innych niż okno ter­ minala, o czym będę opowiadał w podrozdziale 2.14. Tam dowiesz się, jak można podłączać strumienie do plików lub do innych procesów.

2.3.

Podstawowe polecenia Przedstawię teraz kilka kolejnych polecel1 uniksowych.�iększość z poniższych programów może pobierać wiele parametrów, a niektó�'iSh posiadają tak wiele opcji i formatów, że wypisywanie ich wszystkich �� i: y zbyt wielkiego sensu. Poniżej znajduje się bardzo uproszczona lis �el1. Na razie nie są nam potrzebne żadne szczegóły.

��



'()-......" � 2.3.1. Polecenie ls L7 'Folecenie wypisuje zawartość k�. Domyślnie wypisywana jest zawartość l

s

aktualnego katalogu. Polecenie� �owoduje wyświetlenie dokładnej (długiej) informacji o zawartości k��tomiast polecenie l s -F powoduje wyświetle­ nie dodatkowo informacj� pliku (więcej na temat typów plików i uprawnie­ niach podawanych w le�olumnie powiem w podrozdziale 2.17). Oto przykład �i