Zrozumieć system plików /proc

ArticleCategory: [Choose a category, translators: do not translate this, see list below for available categories]

KernelCorner

AuthorImage:[Here we need a little image from you]

[Sandeep Grover]

TranslationInfo:[Author + translation history. mailto: or http://homepage]

original in en Sandeep Grover

en to pl Mateusz Mrozewski

AboutTheAuthor:[A small biography about the author]

Sandeep Grover pracuje dla Magma Design Automation, Indie -- najszybciej rozwijającej się firmie w dziedzinie EDA (Electronic Design Automation). W swoim wolnym czasie odkrywa szczegóły Linuksa i ma nadzieję jednego dnia wnieść swój wkład w jądro Linuksa!

Abstract:[Here you write a little summary]

Jądro Linuksa dostarcza mechanizm pozwalający na dostęp do swoich wewnętrznych struktur danych, a także na zmianę ustawień jądra podczas jego pracy, po poprzez system plików /proc. Omówimy tutaj system plików /proc dla architektury Intel x86, jednak podstawowe pojęcia pozostaną takie same dla Linuksa na każdej platformie.

ArticleIllustration:[One image that will end up at the top of the article]

[the proc filesystem]

ArticleBody:[The main part of the article]

/proc - wirtualny system plików

System plików /proc jest mechanizmem wykorzystywanym przez jądro i jego moduły do przesyłania informacji do procesów (stąd nazwa /proc). Ten pseudo system plików pozwala na współpracę z wewnętrznymi strukturami danych jądra, uzyskanie użytecznych informacji na temat procesów oraz na zmianę ustawień (poprzez modyfikację parametrów jądra) podczas pracy systemu. /proc jest przechowywany w pamięci, w przeciwieństwie do innych systemów plików, które są przechowywane na dysku. Jeśli otworzysz plik /proc/mounts (który wypisuje wszystkie zamontowane systemy plików, tak jak komenda "mount"), powinieneś zobaczyć następującą linię:


grep proc /proc/mounts
/proc /proc proc rw 0 0

/proc jest kontrolowany przez jądro i nie ma zasadniczo żadnych urządzeń. Ponieważ zawiera on głównie kontrolowane przez jądro informacje o stanie systemu, najbardziej logicznym miejscem na ich przechowywanie jest pamięć kontrolowana przez jądro. Wykonanie operacji 'ls -l' na katalogu /proc ukazuje, że większość plików ma rozmiar 0 bajtów; jednak gdy przeglądamy dany plik, możemy zobaczyć całkiem dużo informacji. Jak to jest możliwe? Dzieje się tak, ponieważ system plików /proc rejestruje się w warstwie wirtualnego systemu plików (VFS - Virtual File System). Gdy VFS wykonuje odwołanie do i-węzłów jego plików/katalogów, system plików /proc tworzy te pliki/katalogi na podstawie informacji z jądra.

Montowanie systemu plików /proc

Jeśli system plików /proc nie jest zamontowany w twoim systemie, możesz tego dokonać następującym poleceniem.

mount -t proc proc /proc

Powyższa komenda powinna zamontować twój system plików proc. Proszę przeczytać stronę podręcznika polecenia mount w celu uzyskania szczegółów.

Przeglądamy pliki /proc

Pliki /proc mogą być użyte do uzyskania informacji o stanie jądra, atrybutach komputera, stanie uruchomionych procesów, itp. Większość plików w katalogu /proc dostarcza najświeższy "rzut okiem" na fizyczne środowisko systemu. Pomimo, że pliki /proc są wirtualne, mogą być przeglądane przy pomocy dowolnego edytora plików, jak 'more', 'less' czy 'cat'. Kiedy dowolny edytor próbuje otworzyć wirtualny plik, plik ten jest tworzony na bieżąco z informacji z jądra. Przedstawię teraz interesujące wyniki jakie uzyskałem w moim systemie

$ ls -l /proc/cpuinfo -r--r--r-- 1 root root 0 Dec 25 11:01 /proc/cpuinfo

$ file /proc/cpuinfo
/proc/cpuinfo: empty

$ cat /proc/cpuinfo

processor       : 0
vendor_id       : GenuineIntel
cpu family      : 6
model           : 8
model name      : Pentium III (Coppermine)
stepping        : 6
cpu MHz         : 1000.119
cache size      : 256 KB
fdiv_bug        : no
hlt_bug         : no
sep_bug         : no
f00f_bug        : no
coma_bug        : no
fpu             : yes
fpu_exception   : yes
cpuid level     : 2
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca
cmov pat pse36 mmx fxsr xmm
bogomips        : 1998.85

processor       : 3
vendor_id       : GenuineIntel
cpu family      : 6
model           : 8
model name      : Pentium III (Coppermine)
stepping        : 6
cpu MHz         : 1000.119
cache size      : 256 KB
fdiv_bug        : no
hlt_bug         : no
sep_bug         : no
f00f_bug        : no
coma_bug        : no
fpu             : yes
fpu_exception   : yes
cpuid level     : 2
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca
cmov pat pse36 mmx fxsr xmm
bogomips        : 1992.29

To jest wynik dla dwuprocesorowej maszyny. Większość z powyższych informacji nie potrzebuje wyjaśnienia i dostarcza użytecznych informacji o sprzęcie, na którym uruchomiony jest system. Część z informacji w plikach /proc jest zakodowana, lecz istnieje dużo narzędzi, które interpretują zakodowane informacje i wyświetlają je w czytelnej formie. Niektóre z tych narzędzi to: 'top', 'ps', 'apm' itp.

Zdobywanie użytecznych informacji o jądrze i systemie


System plików /proc może być użyty do zebrania użytecznych informacji o systemie i działającym jądrze. Niektóre z ważnych plików zostały wypisane poniżej.

W katalogu /proc jest znacznie więcej plików niż wypisane powyżej. Zainteresowany czytelnik powinien przejrzeć każdy plik z katalogu /proc wykorzystując 'more' lub przeczytać [1], w celu uzyskania informacji o plikach znajdujących się w /proc. Sugeruję użycie 'more', a nie 'cat', zanim poznasz trochę system plików, ponieważ niektóre pliki (np. kcore) mogą być bardzo duże.

Informacje o uruchomionych procesach

System plików /proc może być wykorzystany do uzyskania informacji o każdym działającym procesie. W katalogu /proc jest kilka numerowych podkatalogów. Każdy numerowany katalog jest związany z id procesu (PID). W związku z tym dla każdego uruchomionego procesu, w katalogu /proc znajduje się podkatalog nazwany tak, jak jego PID. Wewnątrz tych podkatalogów znajdują się pliki dostarczające ważnych szczegółów o stanie i środowisku procesu. Spróbujmy znaleźć uruchomiony proces.

$ ps -aef | grep mozilla
root 32558 32425 8  22:53 pts/1  00:01:23  /usr/bin/mozilla
Powyższa komenda pokazuje, że jest uruchomiony proces mozilla z PID 32558. W związku z tym z katalogu /proc powinien być podkatalog 32558.

$ ls -l /proc/32558
total 0
-r--r--r--    1 root  root            0 Dec 25 22:59 cmdline
-r--r--r--    1 root  root            0 Dec 25 22:59 cpu
lrwxrwxrwx    1 root  root            0 Dec 25 22:59 cwd -> /proc/
-r--------    1 root  root            0 Dec 25 22:59 environ
lrwxrwxrwx    1 root  root            0 Dec 25 22:59 exe -> /usr/bin/mozilla*
dr-x------    2 root  root            0 Dec 25 22:59 fd/
-r--r--r--    1 root  root            0 Dec 25 22:59 maps
-rw-------    1 root  root            0 Dec 25 22:59 mem
-r--r--r--    1 root  root            0 Dec 25 22:59 mounts
lrwxrwxrwx    1 root  root            0 Dec 25 22:59 root -> //
-r--r--r--    1 root  root            0 Dec 25 22:59 stat
-r--r--r--    1 root  root            0 Dec 25 22:59 statm
-r--r--r--    1 root  root            0 Dec 25 22:59 status
Plik "cmdline" zawiera komendę użytą do uruchomienia procesu. Plik "environ" zawiera zmienne środowiskowe dla procesu. "status" zawiera informacje o statusie procesu, zawierające numer identyfikacyjny użytkownika (UID) oraz grupy (GID) dla użytkownika, który uruchomił proces, ID procesu-rodzica (PPID), oraz aktualny stan procesu, taki jak "Sleeping" (uśpiony) czy "Running" (działający). Każdy katalog procesu ma także kilka łączy symbolicznych. "cwd" jest łączem roboczego katalogu procesu, "exe" jest łączem do wykonywalnego programu uruchomionego procesu, "root" jest łączem do katalogu, który proces "widzi" jako swój katalog główny (zazwyczaj "/"). Katalog "fd" zawiera łącza do deskryptorów plików, z których korzysta proces. "cpu" istnieje tylko na jądrach Linuxa SMP. Zawiera on rodzielenie czasu procesu przez procesor.

/proc/self jest interesującym podkatalogiem, który ułatwia programowi użycie /proc do odszukania informacji o swoim procesie. Wpis /proc/self jest łączem symbolicznym do podkatalogu /proc odnoszącego się do procesu odczytującego katalog /proc.

Współpraca z jądrem poprzez /proc


Większość plików w katalogu /proc opisanych powyżej jest tylko do odczytu. Jednakże system plików /proc umożliwia interakcję z jądrem poprzez pliki do zapisu i odczytu w katalogu /proc. Zapis do tych plików może zmienić stan jądra i w związku z tym zmiany w tych plikach powinny być robione bardzo ostrożnie. Katalog /proc/sys zawiera wszystkie pliki, które możemy zapisywać i użyć do zmiany zachowania jądra.

/proc/sys/kernel - ten katalog zawiera informacje, które odzwierciedlają ogólne zachowanie jądra. /proc/sys/kernel/{domainname, hostname} zawierają domenę oraz nazwę hosta maszyny/sieci. Te pliki mogą być użyte do zmiany tych ustawień.

$ hostname
machinename.domainname.com

$ cat /proc/sys/kernel/domainname
domainname.com

$ cat /proc/sys/kernel/hostname
machinename

$ echo "new-machinename"  > /proc/sys/kernel/hostname

$ hostname
new-machinename.domainname.com

W związku z tym, poprzez modyfikację pliku wewnątrz katalogu /proc, możemy zmienić nazwę hosta. W katalogu /proc/sys/kernel/ istnieje o wiele więcej plików konfiguracyjnych. Wypisanie ich wszystkich tutaj jest niemożliwe, dlatego czytelnik powinien samodzielnie zajrzeć do tego katalogu.
Kolejnym konfiguracyjnym katalogiem jest /proc/sys/net. Pliki w tym katalogu mogą być użyte do zmiany ustawień sieciowych maszyny/sieci. Np. poprzez prostą modyfikację pliku możesz ukryć swój komputer w sieci.

$ echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
To ukryje twój komputer w sieci poprzez wyłączenie odpowiedzi na icmp_echos. Host nie będzie odpowiadał na pingi z innych hostów.

$ ping machinename.domainname.com
no answer from machinename.domainname.com
Aby ustawić to na domyślne zachowanie wykonaj
$ echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all
Jest dużo więcej podkatalogów wewnątrz /proc/sys, które można konfigurować w celu zmiany właściwości jądra. Zajrzyj do [1], [2] po szczegółowe informacje.

Wnioski

System plików /proc dostarcza interfejs do jądra oparty na plikach. Pomaga on w określaniu stanu i konfiguracji różnych urządzeń i procesów w systemie. Zrozumienie i wykorzystanie wiedzy o nim jest kluczem do najlepszego wykorzystania twojego Linuxa.

Bibliografia