4.3 Lekcja 2
Certyfikat: |
Linux Essentials |
---|---|
Wersja: |
1.6 |
Temat: |
4 System operacyjny Linux |
Cel nauki: |
4.3 Gdzie są przechowywane dane ? |
Lekcja: |
2 z 2 |
Wstęp
Po zapoznaniu się z programami i ich plikami konfiguracyjnymi, w tej lekcji dowiemy się, jak wykonywać polecenia jako procesy. Zajmiemy się również komunikatami systemowymi, używaniem bufora pierścieniowego jądra oraz sposobem, w jaki systemd
i jego demon dziennika — journald
— zmieniły powszechne do tej pory logowanie systemowe.
Procesy
Za każdym razem, gdy użytkownik wydaje polecenie, uruchamiany jest program i generowany jest co najmniej jeden proces.
Procesy są zorganizowane hierarchicznie. Po załadowaniu jądra do pamięci podczas rozruchu systemu operacyjnego uruchamiany jest pierwszy proces, który z kolei uruchamia inne procesy, które z kolei mogą uruchamiać inne procesy itd. Każdy proces posiada unikalny identyfikator (PID
, Process Identifier
) i identyfikator procesu nadrzędnego (PPID
, Parent Process Identifier
). Numery procesów są dodatnimi liczbami całkowitymi, które są kolejno przypisywane poszczególnym procesom.
Dynamiczne eksplorowanie procesów: top
Możesz uzyskać dynamiczną listę wszystkich uruchomionych procesów za pomocą polecenia top
:
$ top top - 11:10:29 up 2:21, 1 user, load average: 0,11, 0,20, 0,14 Tasks: 73 total, 1 running, 72 sleeping, 0 stopped, 0 zombie %Cpu(s): 0,0 us, 0,3 sy, 0,0 ni, 99,7 id, 0,0 wa, 0,0 hi, 0,0 si, 0,0 st KiB Mem : 1020332 total, 909492 free, 38796 used, 72044 buff/cache KiB Swap: 1046524 total, 1046524 free, 0 used. 873264 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 436 carol 20 0 42696 3624 3060 R 0,7 0,4 0:00.30 top 4 root 20 0 0 0 0 S 0,3 0,0 0:00.12 kworker/0:0 399 root 20 0 95204 6748 5780 S 0,3 0,7 0:00.22 sshd 1 root 20 0 56872 6596 5208 S 0,0 0,6 0:01.29 systemd 2 root 20 0 0 0 0 S 0,0 0,0 0:00.00 kthreadd 3 root 20 0 0 0 0 S 0,0 0,0 0:00.02 ksoftirqd/0 5 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 kworker/0:0H 6 root 20 0 0 0 0 S 0,0 0,0 0:00.00 kworker/u2:0 7 root 20 0 0 0 0 S 0,0 0,0 0:00.08 rcu_sched 8 root 20 0 0 0 0 S 0,0 0,0 0:00.00 rcu_bh 9 root rt 0 0 0 0 S 0,0 0,0 0:00.00 migration/0 10 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 lru-add-drain (...)
Jak widać powyżej, argument top
może również dostarczyć informacji o zużyciu pamięci i procesora przez cały system, a także o każdym procesie.
Polecenie top
pozwala użytkownikowi na pewną interakcję.
Domyślnie dane wyjściowe są sortowane według procentu czasu procesora używanego przez każdy proces w kolejności malejącej. Zachowanie to można zmodyfikować, naciskając następujące klawisze wewnątrz top
:
M
-
Sortowanie według wykorzystania pamięci.
N
-
Sortowanie według numeru identyfikacyjnego procesu (
PID
,Process ID
) . T
-
Sortowanie według czasu trwania.
P
-
Sortowanie według procentu wykorzystania procesora.
Aby przełączać się między malejącą / rosnącą kolejnością, wystarczy nacisnąć klawisz R
.
Tip
|
Ładniejszą, bardziej wyszukaną i bardziej przyjazną dla użytkownika wersją |
Migawka procesów: ps
Innym, bardzo przydatnym poleceniem, aby uzyskać informacje o procesach, jest polecenie ps
. Podczas gdy top
dostarcza dynamicznych informacji, to ps
jest statyczne.
Wyjście ps
, wywołane bez opcji, jest całkiem jasne i odnosi się tylko do procesów znajdujących się w bieżącej powłoce:
$ ps PID TTY TIME CMD 2318 pts/0 00:00:00 bash 2443 pts/0 00:00:00 ps
Wyświetlane informacje obejmują identyfikator procesu (PID
), terminal, na którym proces jest uruchomiony (TTY
), czas procesora zajmowanego przez proces (TIME
) oraz polecenie, które uruchomiło proces (CMD
).
Użyteczną opcją dla ps
jest -f
, które pokazuje pełną listę:
$ ps -f UID PID PPID C STIME TTY TIME CMD carol 2318 1682 0 08:38 pts/1 00:00:00 bash carol 2443 2318 0 08:46 pts/1 00:00:00 ps -f
W połączeniu z innymi opcjami, -f
pokazuje relację między procesami nadrzędnymi i podrzędnymi:
$ ps -uf USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND carol 2318 0.0 0.1 21336 5140 pts/1 Ss 08:38 0:00 bash carol 2492 0.0 0.0 38304 3332 pts/1 R+ 08:51 0:00 \_ ps -uf carol 1780 0.0 0.1 21440 5412 pts/0 Ss 08:28 0:00 bash carol 2291 0.0 0.7 305352 28736 pts/0 Sl+ 08:35 0:00 \_ emacs index.en.adoc -nw (...)
Podobnie, polecenie ps
po wywołaniu z opcją -v
może pokazać procent wykorzystania pamięci:
$ ps -v PID TTY STAT TIME MAJFL TRS DRS RSS %MEM COMMAND 1163 tty2 Ssl+ 0:00 1 67 201224 5576 0.1 /usr/lib/gdm3/gdm-x-session (...) (...)
Note
|
Innym, atrakcyjnym wizualnie poleceniem, pokazującym hierarchię procesów jest polecenie |
Informacje i procesach w katalogu /proc
Poznaliśmy już system plików /proc
. Katalog /proc
zawiera ponumerowany podkatalog dla każdego działającego procesu w systemie (numer procesu to PID
procesu):
carol@debian:~# ls /proc 1 108 13 17 21 27 354 41 665 8 9 10 109 14 173 22 28 355 42 7 804 915 103 11 140 18 23 29 356 428 749 810 918 104 111 148 181 24 3 367 432 75 811 105 112 149 19 244 349 370 433 768 83 106 115 15 195 25 350 371 5 797 838 107 12 16 2 26 353 404 507 798 899 (...)
W ten sposób wszystkie informacje dotyczące konkretnego procesu znajdują się w jego katalogu. Wypiszmy zawartość pierwszego procesu, którego PID
wynosi 1
(dane wyjściowe zostały obcięte w celu zwiększenia czytelności):
# ls /proc/1/ attr cmdline environ io mem ns autogroup comm exe limits mountinfo numa_maps auxv coredump_filter fd loginuid mounts oom_adj ...
Na przykład możesz sprawdzić plik wykonywalny procesu:
# cat /proc/1/cmdline; echo /sbin/init
Jak widać, plik binarny, który rozpoczął hierarchię procesów, to /sbin/init
.
Note
|
Polecenia można łączyć średnikiem ( |
Obciążenie systemu
Każdy proces w systemie potencjalnie zużywa zasoby systemowe. Tak zwane obciążenie systemu (System Load) próbuje agregować całkowite obciążenie systemu w pojedynczy wskaźnik numeryczny. Możesz zobaczyć aktualne obciążenie za pomocą polecenia uptime
:
$ uptime 22:12:54 up 13 days, 20:26, 1 user, load average: 2.91, 1.59, 0.39
Trzy ostatnie cyfry pokazują średnie obciążenie systemu odpowiednio: w ciągu ostatniej minuty (2.91
), ostatnich pięciu minut (1.59
) i ostatnich piętnastu minut (0.39
).
Każda z tych liczb wskazuje, ile procesów czekało na zasoby procesora lub na zakończenie operacji wejścia / wyjścia. Oznacza to, że procesy te były gotowe do uruchomienia, gdyby otrzymały odpowiednie zasoby.
Dziennik systemu i komunikaty systemowe
Gdy tylko jądro i procesy zaczną się wykonywać i komunikować ze sobą, generowanych jest wiele informacji. Większość z nich jest przesyłana do plików, tzw. plików dziennika, plików logów lub po prostu logów.
Bez logowania wyszukiwanie zdarzeń na serwerze byłoby niezwykle trudne dla administratorów systemu. Dlatego ważne jest, aby rejestrować i obserwować wszystkie zdarzenia systemowe w sposób ustandaryzowany i scentralizowany. Poza tym dzienniki logów są krytyczne, jeśli chodzi nie tylko o rozwiązywanie problemów i bezpieczeństwo, ale także wiarygodne źródła danych do zrozumienia statystyk systemu i prognozowania przyszłych trendów.
Logowanie za pomocą demona syslog
Tradycyjnie komunikaty systemowe są zarządzane przez standardowe narzędzie rejestrujące - syslog - lub jedno z narzędzi pochodnych, takich jak syslog-ng lub rsyslog. Demon rejestrujący zbiera komunikaty z innych usług i programów, zapisuje je i przechowuje je w plikach dziennika, zwykle w katalogu /var/log
. Jednak niektóre usługi dbają o swoje własne dzienniki (np. serwer WWW Apache HTTPD). Podobnie jądro Linuxa używa bufora pierścieniowego w pamięci do przechowywania komunikatów dziennika.
Pliki logów w katalogu /var/log
Ponieważ dzienniki logów to dane, które zmieniają się w czasie, zwykle można je znaleźć w katalogu /var/log
.
Jeśli spojrzysz na katalog /var/log
, zdasz sobie sprawę, że nazwy dzienników są, do pewnego stopnia, dość oczywiste. Oto kilka przykładów:
/var/log/auth.log
-
Przechowuje informacje o uwierzytelnianiu.
/var/log/kern.log
-
Przechowuje informacje o jądrze.
/var/log/syslog
-
Przechowuje informacje o systemie.
/var/log/messages
-
Przechowuje dane o systemie i aplikacjach.
Note
|
Dokładna nazwa i zawartość plików dziennika może się różnić w zależności od dystrybucji systemu Linux. |
Dostęp do plików dziennika
Podczas przeglądania plików dziennika pamiętaj, aby być administratorem root (jeśli nie masz uprawnień do odczytu) i używaj opcji, takiej jak na przykład less
;
# less /var/log/messages Jun 4 18:22:48 debian liblogging-stdlog: [origin software="rsyslogd" swVersion="8.24.0" x-pid="285" x-info="http://www.rsyslog.com"] rsyslogd was HUPed Jun 29 16:57:10 debian kernel: [ 0.000000] Linux version 4.9.0-8-amd64 (debian-kernel@lists.debian.org) (gcc version 6.3.0 20170516 (Debian 6.3.0-18+deb9u1) ) #1 SMP Debian 4.9.130-2 (2018-10-27) Jun 29 16:57:10 debian kernel: [ 0.000000] Command line: BOOT_IMAGE=/boot/vmlinuz-4.9.0-8-amd64 root=/dev/sda1 ro quiet
Alternatywnie, możesz użyć polecenia tail
z przełącznikiem -f
, aby odczytać najnowsze komunikaty z pliku i dynamicznie wyświetlać nowe wiersze w miarę ich dołączania:
# tail -f /var/log/messages Jul 9 18:39:37 debian kernel: [ 2.350572] RAPL PMU: hw unit of domain psys 2^-0 Joules Jul 9 18:39:37 debian kernel: [ 2.512802] input: VirtualBox USB Tablet as /devices/pci0000:00/0000:00:06.0/usb1/1-1/1-1:1.0/0003:80EE:0021.0001/input/input7 Jul 9 18:39:37 debian kernel: [ 2.513861] Adding 1046524k swap on /dev/sda5. Priority:-1 extents:1 across:1046524k FS Jul 9 18:39:37 debian kernel: [ 2.519301] hid-generic 0003:80EE:0021.0001: input,hidraw0: USB HID v1.10 Mouse [VirtualBox USB Tablet] on usb-0000:00:06.0-1/input0 Jul 9 18:39:37 debian kernel: [ 2.623947] snd_intel8x0 0000:00:05.0: white list rate for 1028:0177 is 48000 Jul 9 18:39:37 debian kernel: [ 2.914805] IPv6: ADDRCONF(NETDEV_UP): enp0s3: link is not ready Jul 9 18:39:39 debian kernel: [ 4.937283] e1000: enp0s3 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: RX Jul 9 18:39:39 debian kernel: [ 4.938493] IPv6: ADDRCONF(NETDEV_CHANGE): enp0s3: link becomes ready Jul 9 18:39:40 debian kernel: [ 5.315603] random: crng init done Jul 9 18:39:40 debian kernel: [ 5.315608] random: 7 urandom warning(s) missed due to ratelimiting
Dane wyjściowe znajdziesz w następującym formacie:
-
Znak czasu
-
Nazwa hosta, z którego nadszedł komunikat
-
Nazwa programu / usługi, która wygenerowała komunikat
-
PID programu, który wygenerował komunikat
-
Opis akcji, która miała miejsce
Większość plików dziennika to zwykłe pliki tekstowe, ale kilka może zawierać dane binarne, jak ma to miejsce w przypadku /var/log/wtmp
, który przechowuje dane potrzebne do pomyślnego logowania. Polecenie file
dostarcza więcej informacji:
$ file /var/log/wtmp /var/log/wtmp: dBase III DBT, version number 0, next free block index 8
Takie pliki są zwykle odczytywane za pomocą specjalnych poleceń. Polecenie last
służy do interpretacji danych w /var/log/wtmp
:
$ last carol tty2 :0 Thu May 30 10:53 still logged in reboot system boot 4.9.0-9-amd64 Thu May 30 10:52 still running carol tty2 :0 Thu May 30 10:47 - crash (00:05) reboot system boot 4.9.0-9-amd64 Thu May 30 09:11 still running carol tty2 :0 Tue May 28 08:28 - 14:11 (05:42) reboot system boot 4.9.0-9-amd64 Tue May 28 08:27 - 14:11 (05:43) carol tty2 :0 Mon May 27 19:40 - 19:52 (00:11) reboot system boot 4.9.0-9-amd64 Mon May 27 19:38 - 19:52 (00:13) carol tty2 :0 Mon May 27 19:35 - down (00:03) reboot system boot 4.9.0-9-amd64 Mon May 27 19:34 - 19:38 (00:04)
Note
|
Podobnie jak |
Rotacja Logów
Pliki dziennika mogą się znacznie rozrosnąć w ciągu kilku tygodni lub miesięcy i zająć całe wolne miejsce na dysku. Aby temu zaradzić, używane jest narzędzie logrotate
, które implementuje rotację lub cykl logów. Dzięki zastosowaniu takiego rozwiązania pliki dziennika są zmieniane, przenoszone, archiwizowane i / lub kompresowane, czasami wysyłane pocztą e-mail do administratora systemu i ostatecznie usuwane, gdy osiągną określony wiek. Istnieje wiele konwencji nazywania tych rotowanych plików dziennika, jak na przykład dodawanie sufiksu z datą. Jednak powszechne jest zwykłe dodanie sufiksu z liczbą całkowitą:
# ls /var/log/apache2/ access.log error.log error.log.1 error.log.2.gz other_vhosts_access.log
Zwróć uwagę, że plik error.log.2.gz
został już skompresowany za pomocą narzędzia gzip
(stąd przyrostek .gz
).
Bufor pierścienia jądra (Kernel Ring)
Bufor pierścienia jądra (kernel ring buffer) to struktura danych o stałym rozmiarze, która rejestruje komunikaty jądra zarówno podczas procesu uruchamiania, jak i na żywo. Ważną funkcją tego bufora jest rejestrowanie wszystkich komunikatów jądra generowanych podczas startu systemu, kiedy syslog
nie jest jeszcze dostępny. Polecenie dmesg
wyświetla bufor pierścieniowy jądra, który wcześniej był również przechowywany w /var/log/dmesg
. Ze względu na rozszerzenie bufora pierścieniowego polecenie to jest zwykle używane w połączeniu z narzędziem filtrującym tekst grep
lub less
. Na przykład, aby wyszukać komunikaty rozruchowe:
$ dmesg | grep boot [ 0.000000] Command line: BOOT_IMAGE=/boot/vmlinuz-4.9.0-9-amd64 root=UUID=5216e1e4-ae0e-441f-b8f5-8061c0034c74 ro quiet [ 0.000000] smpboot: Allowing 1 CPUs, 0 hotplug CPUs [ 0.000000] Kernel command line: BOOT_IMAGE=/boot/vmlinuz-4.9.0-9-amd64 root=UUID=5216e1e4-ae0e-441f-b8f5-8061c0034c74 ro quiet [ 0.144986] AppArmor: AppArmor disabled by boot time parameter (...)
Note
|
Ponieważ wraz z upływem czasu bufor pierścienia jądra powiększa się o nowe komunikaty, zatem najstarsze wpisy po pewnym czasie zanikają. |
Dziennik systemowy: systemd-journald
Od 2015 roku systemd zastąpił SysV Init jako de facto menedżera systemu i usług w większości głównych dystrybucji Linuxa, dzięki czemu demon dziennika (journald) stał się standardowym składnikiem dziennika i w dużej mierze zastępuje Syslog w większości aspektów. Dane nie są już przechowywane w postaci zwykłego tekstu, ale w formie binarnej, więc do odczytywania dzienników niezbędne jest narzędzie journalctl
. Ponadto journald jest kompatybilny z syslogiem i może być także zintegrowany z syslog.
journalctl
to narzędzie używane do odczytywania i wysyłania zapytań do bazy danych dziennika systemd. Polecenie wywołane bez dodatkowych opcji wyświetla cały dziennik:
# journalctl -- Logs begin at Tue 2019-06-04 17:49:40 CEST, end at Tue 2019-06-04 18:13:10 CEST. -- jun 04 17:49:40 debian systemd-journald[339]: Runtime journal (/run/log/journal/) is 8.0M, max 159.6M, 151.6M free. jun 04 17:49:40 debian kernel: microcode: microcode updated early to revision 0xcc, date = 2019-04-01 Jun 04 17:49:40 debian kernel: Linux version 4.9.0-8-amd64 (debian-kernel@lists.debian.org) (gcc version 6.3.0 20170516 (Debian 6.3.0-18+deb9u1) ) Jun 04 17:49:40 debian kernel: Command line: BOOT_IMAGE=/boot/vmlinuz-4.9.0-8-amd64 root=/dev/sda1 ro quiet (...)
Jednakże, jeśli polecenie journalctl
zostanie wywołane z opcjami -k` lub --dmesg
, wówczas będzie to równoznaczne z użyciem polecenia dmesg
.
# journalctl -k [ 0.000000] Linux version 4.9.0-9-amd64 (debian-kernel@lists.debian.org) (gcc version 6.3.0 20170516 (Debian 6.3.0-18+deb9u1) ) #1 SMP Debian 4.9.168-1+deb9u2 (2019-05-13) [ 0.000000] Command line: BOOT_IMAGE=/boot/vmlinuz-4.9.0-9-amd64 root=UUID=5216e1e4-ae0e-441f-b8f5-8061c0034c74 ro quiet (...)
Inne interesujące opcje dla journalctl
to:
-b
,--boot
-
Wyświetla informacje o rozruchu systemu.
-u
-
Wyświetla komunikaty o określonej jednostce, przy czym jednostkę można ogólnie zdefiniować jako dowolny zasób zarządzany przez systemd. Na przykład
journalctl -u apache2.service
używany jest do odczytywania komunikatów o usłudzeapache2
na serwerze www. -f
-
Wyświetla najnowsze komunikaty w dzienniku i wyświetla nowe wpisy w miarę ich dołączania do dziennika - podobnie jak
tail -f
.
Ćwiczenia z przewodnikiem
-
Przyjrzyj się poniższej liście
top
i odpowiedz na następujące pytania:carol@debian:~$ top top - 13:39:16 up 31 min, 1 user, load average: 0.12, 0.15, 0.10 Tasks: 73 total, 2 running, 71 sleeping, 0 stopped, 0 zombie %Cpu(s): 1.1 us, 0.4 sy, 0.0 ni, 98.6 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st KiB Mem : 1020332 total, 698700 free, 170664 used, 150968 buff/cache KiB Swap: 1046524 total, 1046524 free, 0 used. 710956 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 605 nobody 20 0 1137620 132424 34256 S 6.3 13.0 1:47.24 ntopng 444 www-data 20 0 364780 4132 2572 S 0.3 0.4 0:00.44 apache2 734 root 20 0 95212 7004 6036 S 0.3 0.7 0:00.36 sshd 887 carol 20 0 46608 3680 3104 R 0.3 0.4 0:00.03 top 1 root 20 0 56988 6688 5240 S 0.0 0.7 0:00.42 systemd 2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd 3 root 20 0 0 0 0 S 0.0 0.0 0:00.09 ksoftirqd/0 4 root 20 0 0 0 0 S 0.0 0.0 0:00.87 kworker/0:0 (...)
-
Jakie procesy zostały uruchomione przez użytkownika
carol
? -
Który katalog wirtualny
/proc
należy wybrać, aby wyszukać dane dotyczące poleceniatop
? -
Jaki proces został uruchomiony jako pierwszy? Skąd to wiesz?
-
Wypełnij tabelę i określ, w którym obszarze wyjścia
top
można znaleźć następujące informacje:Informacja o … Obszar podsumowania Obszar zadań Pamięć
Swap
PID
Czas CPU
Polecenia
-
-
Które polecenie służy do odczytywania następujących dzienników binarnych?
-
/var/log/wtmp
-
/var/log/btmp
-
/run/log/journal/2a7d9730cd3142f4b15e20d6be631836/system.journal
-
-
Jakich poleceń użyłbyś w połączeniu z
grep
, aby uzyskać następujące informacje o Twoim systemie Linux?-
Kiedy system był ostatnio restartowany (
wtmp
) -
Jakie dyski twarde są zainstalowane (
kern.log
) -
Kiedy nastąpiło ostatnie logowanie do systemu (
auth.log
)
-
-
Jakich dwóch poleceń użyłbyś, aby wyświetlić bufor pierścienia jądra?
-
Wskaż, gdzie przynależą następujące komunikaty dziennika:
-
Jul 10 13:37:39 debian dbus[303]: [system] Successfully activated service 'org.freedesktop.nm_dispatcher'
/var/log/auth.log
/var/log/kern.log
/var/log/syslog
/var/log/messages
-
Jul 10 11:23:58 debian kernel: [ 1.923349] usbhid: USB HID core driver
/var/log/auth.log
/var/log/kern.log
/var/log/syslog
/var/log/messages
-
Jul 10 14:02:53 debian sudo: pam_unix(sudo:session): session opened for user root by carol(uid=0)
/var/log/auth.log
/var/log/kern.log
/var/log/syslog
/var/log/messages
-
Jul 10 11:23:58 debian NetworkManager[322]: <info> [1562750638.8672] NetworkManager (version 1.6.2) is starting…
/var/log/auth.log
/var/log/kern.log
/var/log/syslog
/var/log/messages
-
-
Jak
journalctl
zapyta o informacje o następujących komponentach?Jednostka Polecenie ssh
networking
rsyslog
cron
Ćwiczenia eksploracyjne
-
Ponownie spójrz na wyniki
top
z ćwiczeń z przewodnikiem i odpowiedz na następujące pytania:-
Jakie dwa kroki byś zrobił, żeby “zabić” serwer www z usługą apache ?
-
Jak możesz wyświetlić informacje o pamięci fizycznej i pamięci swap za pomocą pasków postępu (z podsumowania)?
-
Posortuj procesy według wykorzystania pamięci:
-
Teraz, gdy informacje o pamięci są wyświetlane na paskach postępu, a procesy są posortowane według wykorzystania pamięci, zapisz tę konfigurację, aby była używana jako domyślna, gdy następnym razem zostanie wydane polecenie
top
: -
Który plik przechowuje ustawienia konfiguracyjne
top
? Gdzie on się znajduje? Jak możesz udowodnić, że on istnieje?
-
-
Zapoznaj się z poleceniem
exec
w Bashu. Spróbuj zademonstrować jego funkcjonalność. Rozpoczynij sesję Bash, znajdź proces Bash za pomocą poleceniaps
, a następnie uruchomexec /bin/sh
i ponownie poszukaj procesu z tym samym PID. -
Wykonaj następujące kroki, aby poznać zdarzenia jądra i dynamiczne zarządzanie urządzeniami przez udev:
-
Podłącz napęd USB do komputera podczas pracy systemu Linux. Uruchom polecenie
dmesg
i zwróć uwagę na ostatnie linie. Jaka jest najmłodsza linia? -
Mając na uwadze dane wyjściowe z poprzedniego polecenia, uruchom
ls /dev/sd*
i upewnij się, że twój napęd USB pojawia się na liście. Jaki jest wynik? -
Teraz wyjmij napęd USB i ponownie uruchom ponownie
dmesg
. Jaka jest taraz ostatnia linijka? -
Uruchom ponownie
ls /dev/sd*
i upewnij się, że Twoje urządzenie USB zniknęło z listy. Jaki jest wynik?
-
Podsumowanie
W kontekście przechowywania danych, w tej lekcji omówiono następujące tematy: zarządzanie procesami oraz logowanie i komunikaty w systemie Linux.
Jeśli chodzi o zarządzanie procesami, nauczyliśmy się:
-
Programy tworzą procesy, a procesy istnieją w hierarchii.
-
Każdy proces ma unikalny identyfikator (
PID
) i identyfikator procesu nadrzędnego (PPID
). -
Polecenie
top
to bardzo przydatne polecenie do dynamicznego i interaktywnego sprawdzania uruchomionych procesów systemu. -
Polecenie
ps
może służyć do uzyskania migawki aktualnie uruchomionych procesów w systemie. -
Katalog
/proc
zawiera katalogi dla każdego działającego procesu w systemie, nazwane według odpowiedniego PID. -
Pojęcie średniego obciążenia systemu, ponieważ jest bardzo przydatne do sprawdzania wykorzystania lub przeciążenia procesora.
W przypadku logowania do systemu musimy pamiętać, że:
-
Dziennik to plik, w którym zapisywane są zdarzenia systemowe. Dzienniki są niezbędne do rozwiązywania problemów.
-
Logowanie odbywało się tradycyjnie przez usługi specjalne, takie jak syslog, syslog-ng lub rsyslog. Jednak niektóre programy używają własnych demonów logowania.
-
Ponieważ dzienniki są danymi zmiennymi, są przechowywane w katalogu
/var
i czasami ich nazwy wskazują ich zawartość (kern.log
,auth.log
, itd.) -
Większość dzienników to zwykłe pliki tekstowe i można je odczytać za pomocą dowolnego edytora tekstu, o ile masz odpowiednie uprawnienia. Jednak niektóre z nich są binarne i należy je odczytać za pomocą specjalnych poleceń.
-
Aby uniknąć problemów z miejscem na dysku, rotacja logów jest wykonywana przez narzędzie
logrotate
. -
Jeśli chodzi o jądro, używa ono cyklicznej struktury danych - bufora pierścieniowego - w którym przechowywane są komunikaty rozruchowe (stare komunikaty z czasem są usuwane).
-
Menedżer systemu i usług systemd zastąpił System V init praktycznie we wszystkich dystrybucjach Linuxa, a journald stał się standardową usługą logowania.
-
Aby odczytać dziennik systemowy systemd, niezbędny jest program
journalctl
.
Polecenia użyte w tej lekcji:
cat
-
Łączy lub wyświetla zawartość pliku.
dmesg
-
Wyświetla bufor pierścieniowy jądra.
echo
-
Wyświetla linię tekstu lub nową linię.
file
-
Określa typ pliku.
grep
-
Wyświetla linie pasujące do wzorca.
last
-
Wyświetla listę ostatnio zalogowanych użytkowników.
less
-
Wyświetla zawartość pliku strona po stronie.
ls
-
Wyświetla zawartość katalogu.
journalctl
-
Wysyła zapytanie do dziennika systemowego
systemd
. tail
-
Wyświetla ostatnie wiersze pliku.
Odpowiedzi do ćwiczeń z przewodnikiem
-
Przyjrzyj się poniższej liście
top
i odpowiedz na następujące pytania:carol@debian:~$ top top - 13:39:16 up 31 min, 1 user, load average: 0.12, 0.15, 0.10 Tasks: 73 total, 2 running, 71 sleeping, 0 stopped, 0 zombie %Cpu(s): 1.1 us, 0.4 sy, 0.0 ni, 98.6 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st KiB Mem : 1020332 total, 698700 free, 170664 used, 150968 buff/cache KiB Swap: 1046524 total, 1046524 free, 0 used. 710956 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 605 nobody 20 0 1137620 132424 34256 S 6.3 13.0 1:47.24 ntopng 444 www-data 20 0 364780 4132 2572 S 0.3 0.4 0:00.44 apache2 734 root 20 0 95212 7004 6036 S 0.3 0.7 0:00.36 sshd 887 carol 20 0 46608 3680 3104 R 0.3 0.4 0:00.03 top 1 root 20 0 56988 6688 5240 S 0.0 0.7 0:00.42 systemd 2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd 3 root 20 0 0 0 0 S 0.0 0.0 0:00.09 ksoftirqd/0 4 root 20 0 0 0 0 S 0.0 0.0 0:00.87 kworker/0:0 (...)
-
Jakie procesy zostały uruchomione przez użytkownika
carol
?Odpowiedź: Tylko jeden proces:
top
. -
Który katalog wirtualny
/proc
należy wybrać, aby wyszukać dane dotyczące poleceniatop
?Odpowiedź:
/proc/887
-
Jaki proces został uruchomiony jako pierwszy? Skąd to wiesz?
Odpowiedź: Pierwszy został uruchomiony proces
systemd
. Wiemy to, ponieważ jest to proces zPID
#1. -
Wypełnij tabelę i określ, w którym obszarze wyjścia
top
można znaleźć następujące informacje:Informacja o … Obszar podsumowania Obszar zadań Pamięć
Tak
Tak
Swap
Tak
Nie
PID
Nie
Tak
Czas CPU
Tak
Tak
Polecenia
Nie
Tak
-
-
Które polecenie służy do odczytywania następujących dzienników binarnych?
-
/var/log/wtmp
Odpowiedź:
last
-
/var/log/btmp
Odpowiedź:
lastb
-
/run/log/journal/2a7d9730cd3142f4b15e20d6be631836/system.journal
Odpowiedź:
journalctl
-
-
Jakich poleceń użyłbyś w połączeniu z
grep
, aby uzyskać następujące informacje o Twoim systemie Linux?-
Kiedy system był ostatnio restartowany (
wtmp
)Odpowiedź:
last
-
Jakie dyski twarde są zainstalowane (
kern.log
)Odpowiedź:
less /var/log/kern.log
-
Kiedy nastąpiło ostatnie logowanie do systemu (
auth.log
)Odpowiedź:
less /var/log/auth.log
-
-
Jakich dwóch poleceń użyłbyś, aby wyświetlić bufor pierścienia jądra?
dmesg
orazjournalctl -k
(lubjournalctl --dmesg
). -
Wskaż, gdzie przynależą następujące komunikaty dziennika:
-
Jul 10 13:37:39 debian dbus[303]: [system] Successfully activated service 'org.freedesktop.nm_dispatcher'
/var/log/auth.log
/var/log/kern.log
/var/log/syslog
X
/var/log/messages
-
Jul 10 11:23:58 debian kernel: [ 1.923349] usbhid: USB HID core driver
/var/log/auth.log
/var/log/kern.log
X
/var/log/syslog
/var/log/messages
X
Jul 10 14:02:53 debian sudo: pam_unix(sudo:session): session opened for user root by carol(uid=0)
/var/log/auth.log
X
/var/log/kern.log
/var/log/syslog
/var/log/messages
-
Jul 10 11:23:58 debian NetworkManager[322]: <info> [1562750638.8672] NetworkManager (version 1.6.2) is starting…
/var/log/auth.log
/var/log/kern.log
/var/log/syslog
/var/log/messages
X
-
-
Jak
journalctl
zapyta o informacje o następujących komponentach?Jednostka Polecenie ssh
journalctl -u ssh.service
networking
journalctl -u networking.service
rsyslog
journalctl -u rsyslog.service
cron
journalctl -u cron.service
Odpowiedzi do ćwiczeń eksploracyjnych
-
Ponownie spójrz na wyniki
top
z ćwiczeń z przewodnikiem i odpowiedz na następujące pytania:-
Jakie dwa kroki byś zrobił, żeby “zabić” serwer www z usługą apache ?
Najpierw, wciśnij
k
; a następnie podaj wartośćkill
. -
Jak możesz wyświetlić informacje o pamięci fizycznej i pamięci swap za pomocą pasków postępu (z podsumowania)?
Naciskając
m
raz lub dwa razy. -
Posortuj procesy według wykorzystania pamięci:
M
-
Teraz, gdy informacje o pamięci są wyświetlane na paskach postępu, a procesy są posortowane według wykorzystania pamięci, zapisz tę konfigurację, aby była używana jako domyślna, gdy następnym razem zostanie wydane polecenie
top
:W
-
Który plik przechowuje ustawienia konfiguracyjne
top
? Gdzie on się znajduje? Jak możesz udowodnić, że on istnieje?Ten plik to
~/.config/procps/toprc
i znajduje się on w katalogu domowym użytkownika (~
). Ponieważ jest to plik ukryty (znajduje się w katalogu, którego nazwa zaczyna się od kropki), więc jego istnienie możemy sprawdzić poleceniemls -a
(lista wszystkich plików). Plik ten można utworzyć naciskając kombinację klawiszy kbd:[Shift+W] będąc wtop
.
-
-
Zapoznaj się z poleceniem
exec
w Bashu. Spróbuj zademonstrować jego funkcjonalność. Rozpoczynij sesję Bash, znajdź proces Bash za pomocą poleceniaps
, a następnie uruchomexec /bin/sh
i ponownie poszukaj procesu z tym samym PID.exec
zastępuje proces innym poleceniem. W poniższym przykładzie widzimy, że proces Bash jest zastępowany przez/bin/sh
(w zamian/bin/sh
staje się procesem potomnym):$ echo $$ 19877 $ ps auxf | grep 19877 | head -1 carol 19877 0.0 0.0 7448 3984 pts/25 Ss 21:17 0:00 \_ bash $ exec /bin/sh sh-5.0$ ps auxf | grep 19877 | head -1 carol 19877 0.0 0.0 7448 3896 pts/25 Ss 21:17 0:00 \_ /bin/sh
-
Wykonaj następujące kroki, aby poznać zdarzenia jądra i dynamiczne zarządzanie urządzeniami przez udev:
-
Podłącz napęd USB do komputera podczas pracy systemu Linux. Uruchom polecenie
dmesg
i zwróć uwagę na ostatnie linie. Jaka jest najmłodsza linia?Powinieneś otrzymać coś podobnego do:
[ 1967.700468] sd 6:0:0:0: [sdb] Attached SCSI removable disk
. -
Mając na uwadze dane wyjściowe z poprzedniego polecenia, uruchom
ls /dev/sd*
i upewnij się, że twój napęd USB pojawia się na liście. Jaki jest wynik?W zależności od liczby urządzeń podłączonych do Twojego systemu, powinieneś otrzymać coś takiego jak:
/dev/sda /dev/sda1 /dev/sdb /dev/sdb1 /dev/sdb2
. W naszym przypadku znajdujemy nasz dysk USB (/dev/sdb
) i jego dwie partycje (/dev/sdb1
oraz/dev/sdb2
). -
Teraz wyjmij napęd USB i ponownie uruchom ponownie
dmesg
. Jaka jest taraz ostatnia linijka?Powinieneś otrzymać coś podobnego do:
[ 2458.881695] usb 1-9: USB disconnect, device number 6
. -
Uruchom ponownie
ls /dev/sd*
i upewnij się, że Twoje urządzenie USB zniknęło z listy. Jaki jest wynik?W naszym przypadku to:
/dev/sda /dev/sda1
.
-