Co się dzieje, gdy piszę cat /proc/cpuinfo
. Czy to nazwany potok (lub coś innego) do systemu operacyjnego, który odczytuje informacje o procesorze w locie i generuje ten tekst za każdym razem, gdy go nazywam?
filesystems
kernel
proc
slm
źródło
źródło
Odpowiedzi:
Ilekroć czytasz plik poniżej
/proc
, wywołuje to pewien kod w jądrze, który oblicza tekst do odczytania jako zawartość pliku. Fakt, że treść jest generowana w locie, wyjaśnia, dlaczego prawie wszystkie pliki zgłaszają swój czas jak teraz, a ich rozmiar zgłaszany jest jako 0 - tutaj powinieneś przeczytać 0 jako „nie wiem”. W przeciwieństwie do zwykłych systemów plików, system plików, który jest zamontowany/proc
, zwany procfs , nie ładuje danych z dysku lub innego nośnika pamięci (takiego jak FAT, ext2, zfs,…) lub przez sieć (jak NFS, Samba,…) i nie wywołuje kodu użytkownika (w przeciwieństwie do FUSE ).Procfs jest obecny w większości jednorożców spoza BSD. Rozpoczął swoje życie w Bell Labs AT&T w 8 edycji UNIX jako sposób na raportowanie informacji o procesach (i
ps
często jest ładną drukarką do odczytu informacji/proc
). Większość implementacji procfs ma plik lub katalog wywoływany w/proc/123
celu raportowania informacji o procesie za pomocą PID 123. Linux rozszerza system plików proc o wiele więcej pozycji, które raportują stan systemu, w tym twój przykład/proc/cpuinfo
.W przeszłości Linux
/proc
uzyskiwał różne pliki, które dostarczają informacji o sterownikach, ale to użycie jest obecnie przestarzałe na korzyść/sys
i/proc
rozwija się powoli. Wpisy lubią/proc/bus
i/proc/fs/ext4
pozostają tam, gdzie są dla kompatybilności wstecznej, ale tworzone są nowsze podobne interfejsy/sys
. W tej odpowiedzi skupię się na Linuksie.Twój pierwszy i drugi punkt wejścia do dokumentacji
/proc
na temat systemu Linux to:proc(5)
strona podręcznika ;/proc
plików w dokumentacji jądra .Twoim trzecim punktem wejścia, gdy dokumentacja go nie obejmuje, jest czytanie źródła . Możesz pobrać źródło na swój komputer, ale jest to ogromny program, a LXR , odnośnik do Linuksa, jest dużą pomocą. (Istnieje wiele wariantów LXR; ten, na którym działa,
lxr.linux.no
jest zdecydowanie najładniejszy, ale niestety strona często nie działa.) Wymagana jest niewielka znajomość C, ale nie musisz być programistą, aby wyśledzić tajemniczą wartość .Podstawowa obsługa
/proc
wpisów znajduje się wfs/proc
katalogu. Każdy kierowca może zarejestrować wpisy w/proc
(choć jak wskazano powyżej, jest to obecnie nieaktualne na korzyść/sys
), więc jeśli nie znajdziesz tego, czego szukaszfs/proc
, poszukaj wszędzie. Funkcje wywoływania sterowników zadeklarowane winclude/linux/proc_fs.h
. Wersje jądra do 3.9 zapewniają funkcjecreate_proc_entry
i niektóre opakowania (szczególniecreate_proc_read_entry
), a wersje jądra 3.10 i nowsze zapewniają tylkoproc_create
iproc_create_data
(i kilka innych).Biorąc
/proc/cpuinfo
jako przykład, poszukiwanie"cpuinfo"
prowadzi do połączenia sięproc_create("cpuinfo, …")
wfs/proc/cpuinfo.c
. Widać, że kod jest w zasadzie kodem wzorcowym: ponieważ większość plików/proc
po prostu zrzuca niektóre dane tekstowe, istnieją do tego funkcje pomocnicze. Jest tylkoseq_operations
struktura, a prawdziwe mięso znajduje się wcpuinfo_op
strukturze danych, która jest zależna od architektury, zwykle zdefiniowana warch/<architecture>/kernel/setup.c
(lub czasem innym pliku). Biorąc za przykład x86, jesteśmy do tego doprowadzeniarch/x86/kernel/cpu/proc.c
. Tam główną funkcją jestshow_cpuinfo
, który drukuje żądaną zawartość pliku; reszta infrastruktury służy do dostarczania danych do procesu odczytu z żądaną prędkością. Możesz zobaczyć dane gromadzone w locie z danych w różnych zmiennych w jądrze, w tym kilka liczb obliczanych w locie, takich jak częstotliwość procesora .Duża część
/proc
to informacje o poszczególnych procesach w/proc/<PID>
. Wpisy te są zarejestrowanefs/proc/base.c
wtgid_base_stuff
tablicy ; niektóre zarejestrowane tutaj funkcje są zdefiniowane w innych plikach. Spójrzmy na kilka przykładów generowania tych wpisów:cmdline
jest generowany przezproc_pid_cmdline
w tym samym pliku. Lokalizuje te dane w procesie i drukuje je.clear_refs
, w przeciwieństwie do wpisów, które widzieliśmy do tej pory, jest zapisywalny, ale nieczytelny. Dlategoproc_clear_refs_operations
struktury definiująclear_refs_write
funkcję, ale nie funkcję odczytu.cwd
jest zadeklarowanym przezproc_cwd_link
, dowiązaniem symbolicznym (nieco magicznym), który wyszukuje bieżący katalog procesu i zwraca go jako treść linku.fd
jest podkatalogiem. Operacje na samym katalogu są zdefiniowane wproc_fd_operations
strukturze danych (są one kafelkami, z wyjątkiem funkcji, która wylicza wpisyproc_readfd
, która wylicza otwarte pliki procesu), podczas gdy operacje na wpisach są w `proc_fd_inode_operations .Innym ważnym obszarem
/proc
znaczy/proc/sys
, co jest bezpośrednim interfejsemsysctl
. Odczytywanie z pozycji w tej hierarchii zwraca wartość odpowiedniej wartości sysctl, a zapisywanie ustawia wartość sysctl. Punkty wejścia dla sysctl znajdują się wfs/proc/proc_sysctl.c
. Sysctls mają własny system rejestracjiregister_sysctl
i znajomych.źródło
Kiedy próbujesz uzyskać wgląd w to, jaka magia dzieje się za kulisami, twoim najlepszym przyjacielem jest
strace
. Nauka obsługi tego narzędzia jest jedną z najlepszych rzeczy, które możesz zrobić, aby lepiej zrozumieć, co dzieje się za kulisami szalonej magii.Z powyższych danych wyjściowych widać, że
/proc/cpuinfo
jest to zwykły plik, a przynajmniej wydaje się być jednym. Więc zagłębmy się głębiej.Głębsze nurkowanie
# 1 - z ls ..Patrząc na sam plik, wydaje się, że jest to „tylko plik”.
Ale przyjrzyj się bliżej. Otrzymujemy naszą pierwszą wskazówkę, że jest ona specjalna, zwróć uwagę, że rozmiar pliku to 0 bajtów.
# 2 - ze stat ..Jeśli teraz spojrzymy na plik za pomocą
uruchom numer 1 uruchom # 2stat
, możemy uzyskać następną wskazówkę, że jest w tym coś wyjątkowego/proc/cpuinfo
.Zwróć uwagę na czasy dostępu, modyfikacji i zmiany? Zmieniają się przy każdym dostępie. Jest to bardzo niezwykłe, że wszystkie 3 zmieniłyby się w ten sposób. Chyba że edytowano atrybuty znacznika czasu pliku zwykle pozostają takie same.
# 3 - z plikiem ..Jeszcze jedna wskazówka, że ten plik nie jest zwykłym plikiem:
Gdyby to był jakiś przejaw nazwanego potoku, wyglądałby podobnie do jednego z tych plików:
Jeśli dotkniemy
# 4 - z uchwytem ..emptyfile
,/proc/cpuinfo
wygląda bardziej jak plik niż rura:W tym momencie musimy zrobić krok do tyłu i nieco pomniejszyć. Patrzymy na konkretny plik, ale być może powinniśmy spojrzeć na system plików, w którym znajduje się ten plik. I do tego możemy użyć
mount
polecenia.OK, więc typ systemu plików jest typu
proc
. Więc/proc
jest inny typ systemu plików, to nasza wskazówka, że pliki poniżej/proc
są wyjątkowe. To nie tylko twoja seria plików młyna. Dowiedzmy się więc więcej o tym, co czyniproc
system plików wyjątkowym.Spojrzenie na
mount
stronę podręcznika użytkownika:A jeśli spojrzymy na
proc
stronę manuala:Nieco dalej na tej samej stronie podręcznika:
U dołu strony podręcznika znajduje się odniesienie do dokumentu jądra, który można znaleźć tutaj, zatytułowanego: THE / proc FILESYSTEM . Cytowanie z tego dokumentu:
Wnioski
Czego się tutaj nauczyliśmy? Biorąc pod uwagę, że
/proc
jest to określane jako pseudo system plików, a także „interfejs do wewnętrznych struktur danych”, prawdopodobnie bezpiecznie jest założyć, że elementy w nim nie są rzeczywistymi plikami, ale raczej manifestacjami stworzonymi tak, aby wyglądały jak pliki, ale tak naprawdę nie są.Zakończę ten cytat, który podobno był w poprzedniej wersji
man 5 proc
z około 2004 roku, ale z jakiegokolwiek powodu nie jest już uwzględniony. UWAGA: Nie jestem pewien, dlaczego został usunięty, ponieważ bardzo ładnie opisuje, co/proc
to jest:Źródło: pseudo-system plików proc
Bibliografia
źródło
strace -o catcpuproc.txt cat /proc/cpuinfo
Odpowiedź udzielona przez @slm jest bardzo wyczerpująca, ale myślę, że prostsze wyjaśnienie może pochodzić ze zmiany perspektywy.
W codziennym użytkowaniu możemy myśleć o plikach jako o rzeczach fizycznych, tj. fragmenty danych przechowywane na niektórych urządzeniach. To sprawia, że pliki takie jak / proc / cpuinfo są bardzo tajemnicze i mylące. Wszystko to jednak ma sens, jeśli myślimy o plikach jako interfejsie ; sposób wysyłania danych do i z niektórych programów.
Programy, które wysyłają i odbierają dane w ten sposób, to systemy plików lub sterowniki (w zależności od sposobu zdefiniowania tych terminów, które mogą być zbyt szerokie lub zbyt wąskie). Ważne jest to, że niektóre z tych programów używają urządzenia sprzętowego do przechowywania i pobierania danych wysyłanych przez ten interfejs; ale nie wszystko.
Niektóre przykłady systemów plików, które nie korzystają z urządzenia pamięci masowej (przynajmniej bezpośrednio):
System operacyjny Plan9 ( http://en.wikipedia.org/wiki/Plan_9_from_Bell_Labs ) jest ekstremalnym przykładem użycia plików jako ogólnego interfejsu programistycznego.
źródło