To jest naprawdę dość proste, przynajmniej jeśli nie potrzebujesz szczegółów implementacji.
Po pierwsze, w systemie Linux wszystkie systemy plików (ext2, ext3, btrfs, reiserfs, tmpfs, zfs, ...) są zaimplementowane w jądrze. Niektórzy mogą odciążyć pracę do kodu użytkownika przez FUSE, a niektórzy przychodzą tylko w formie modułu jądra ( natywny ZFS jest godnym uwagi przykładem tego ostatniego z powodu ograniczeń licencyjnych), ale tak czy inaczej pozostaje komponent jądra. To ważna podstawa.
Gdy program chce czytać z pliku, wyda różne połączenia bibliotecznych system, który ostatecznie kończy się w jądrze w postaci emulsji open()
, read()
, close()
sekwencja (ewentualnie z seek()
rzucony w środek na dobre). Jądro pobiera podaną ścieżkę i nazwę pliku, a poprzez system plików i warstwę we / wy urządzenia przekłada je na żądania odczytu fizycznego (w wielu przypadkach także żądania zapisu - pomyśl na przykład aktualizacje atime) do niektórych bazowych pamięci.
Jednak nie musi tłumaczyć tych żądań konkretnie na fizyczne, trwałe przechowywanie . Umowa jądra polega na tym, że wydanie tego konkretnego zestawu wywołań systemowych zapewni zawartość danego pliku . Gdzie dokładnie w naszym fizycznym królestwie istnieje „plik”, ma on drugorzędne znaczenie.
Na /proc
zwykle montowane jest tak zwane procfs
. Jest to specjalny typ systemu plików, ale ponieważ jest to system plików, tak naprawdę nie różni się od np. ext3
Zamontowanego gdzieś systemu plików. Tak więc żądanie jest przekazywane do kodu sterownika systemu plików procfs, który zna wszystkie te pliki i katalogi i zwraca określone informacje ze struktur danych jądra .
„Warstwa pamięci” w tym przypadku to struktury danych jądra i procfs
zapewnia czysty, wygodny interfejs dostępu do nich. Pamiętaj, że montowanie procfs w /proc
to po prostu konwencja; równie łatwo możesz zamontować go gdzie indziej. W rzeczywistości czasami tak się dzieje, na przykład w więzieniach chroot, gdy działający tam proces z jakiegoś powodu potrzebuje dostępu do / proc.
Działa tak samo, jeśli zapisujesz wartość do jakiegoś pliku; na poziomie jądra, które przekłada się na serię open()
, seek()
, write()
, close()
zaproszeń, które ponownie przejdzie do sterownika systemu plików; ponownie, w tym konkretnym przypadku, kod procfs.
Szczególnym powodem file
powrotu empty
jest to, że wiele plików ujawnionych przez procfs ma rozmiar 0 bajtów. Rozmiar 0 bajtów jest prawdopodobnie optymalizacją po stronie jądra (wiele plików w / proc jest dynamicznych i może łatwo różnić się długością, być może nawet od jednego odczytu do następnego, a obliczenie długości każdego pliku w każdym czytanym katalogu potencjalnie być bardzo drogie). Przechodząc od komentarzy do tej odpowiedzi, które można zweryfikować we własnym systemie, uruchamiając strace lub podobne narzędzie, file
najpierw wydaje stat()
wywołanie w celu wykrycia specjalnych plików, a następnie korzysta z okazji, jeśli rozmiar pliku jest zgłaszany jako 0 , przerwij i zgłoś plik jako pusty.
Takie zachowanie jest właściwie udokumentowane i mogą być zastąpione przez podanie -s
lub --special-files
na file
pw, choć jak wynika z ręcznym strony, które mogą mieć skutki uboczne. Cytat poniżej pochodzi ze strony podręcznika użytkownika BSD 5.11 z dnia 17 października 2011 r.
Zwykle plik próbuje jedynie odczytać i określić typ plików argumentów, które raporty stat (2) są zwykłymi plikami. Zapobiega to problemom, ponieważ odczytywanie plików specjalnych może mieć szczególne konsekwencje. Podanie -s
opcji powoduje, że plik odczytuje również pliki argumentów, które są plikami specjalnymi blokowymi lub znakowymi. Jest to przydatne do określania typów systemów plików danych na surowych partycjach dysku, które są blokowymi plikami specjalnymi. Ta opcja powoduje również, że plik ignoruje rozmiar pliku zgłoszony przez stat (2), ponieważ w niektórych systemach zgłasza zerowy rozmiar partycji dysku surowego.
strace file /proc/version
lubltrace -S /proc/version
, optymalizacja jest raczej niewielka.stat()
Najpierw wykonuje wywołanie i stwierdza, że rozmiar wynosi 0, pomijając w ten sposóbopen()
- ale wcześniej ładuje kilka magicznych plików.file
. W ten sposób plik wstępnie ładuje magiczne pliki, a następnie przetwarza parametr wiersza poleceń parametr po parametrze; zamiast przenosić ładowanie magicznego pliku do „zrób to tuż przed próbą ustalenia, jakiego rodzaju plik ten konkretny” jest częścią kodu, co zwiększyłoby złożoność. Wywoływaniestat()
i działanie na podstawie wartości zwrotnej jest w zasadzie nieszkodliwe; zwiększanie złożoności w śledzeniu dodatkowych ryzyk stanu wewnętrznego, wprowadzających błędy.file
jest to, że „plik jest pusty”, ponieważ wywołujestat
wykrywanie plików specjalnych (nazwanych potoków, urządzeń,…) i korzysta z okazji, aby zatrzymać przetwarzanie pustych plików.file -s /proc/version
zgłasza „tekst ASCII”.-s
Jest przeznaczony dla urządzeń specjalnych block / char. W końcu spojrzałem nafile
źródło i na końcu fsmagic.c zobaczyłem to wyjaśnienie, dlaczego powracaASCII text
zamiastempty
:If stat() tells us the file has zero length, report here that the file is empty, so we can skip all the work of opening and reading the file. But if the -s option has been given, we skip this optimization, since on some systems, stat() reports zero size for raw disk partitions.
W tym katalogu możesz kontrolować sposób wyświetlania urządzeń przez jądro, dostosowywać ustawienia jądra, dodawać urządzenia do jądra i usuwać je ponownie. W tym katalogu możesz bezpośrednio zobaczyć wykorzystanie pamięci i statystyki we / wy .
Możesz zobaczyć, które dyski są zamontowane i jakie systemy plików są używane. Krótko mówiąc, każdy aspekt twojego systemu Linux może być zbadany z tego katalogu, jeśli wiesz, czego szukać.
/proc
Katalog nie jest normalnym katalogiem. Jeśli chcesz uruchomić komputer z rozruchowej płyty CD i spojrzeć na ten katalog na dysku twardym, zobaczysz, że jest on pusty. Kiedy patrzysz na to w normalnym systemie, może być dość duży. Wydaje się jednak, że nie wykorzystuje miejsca na dysku twardym. Wynika to z faktu, że jest to wirtualny system plików.Ponieważ
/proc
system plików jest wirtualnym systemem plików i znajduje się w pamięci, nowy/proc
system plików jest tworzony przy każdym ponownym uruchomieniu komputera z systemem Linux.Innymi słowy, jest to po prostu sposób łatwego podglądania i szturchania wnętrzności systemu Linux za pomocą interfejsu typu pliku i katalogu. Kiedy patrzysz na plik w
/proc
katalogu, patrzysz bezpośrednio na zakres pamięci w jądrze Linuksa i widzisz, co może zobaczyć.Warstwy w systemie plików
Przykłady:
/proc
znajduje się katalog dla każdego uruchomionego procesu, nazwany jego identyfikatorem procesu. Te katalogi zawierają pliki zawierające przydatne informacje o procesach, takie jak:exe
: który jest dowiązaniem symbolicznym do pliku na dysku, z którego proces został uruchomiony.cwd
: który jest dowiązaniem symbolicznym do katalogu roboczego procesu.wchan
: która, po odczytaniu, zwraca kanał oczekiwania, na którym trwa proces.maps
: która po odczytaniu zwraca mapy pamięci procesu./proc/uptime
zwraca uptime jako dwie wartości dziesiętne w sekundach, oddzielone spacją:/proc/interrupts
: Aby uzyskać informacje dotyczące przerwań./proc/modules
: Aby uzyskać listę modułów.Aby uzyskać bardziej szczegółowe informacje, zobacz man proc lub kernel.org .
źródło
mount -t procfs procfs /mnt/proc
, zobaczysz aktualnie działające jądro / proc.Masz rację, to nie są prawdziwe pliki.
Mówiąc najprościej, jest to sposób na rozmowę z jądrem przy użyciu normalnych metod odczytu i zapisu plików, zamiast bezpośredniego wywoływania jądra. Jest to zgodne z filozofią Unixa „wszystko jest plikiem”.
Pliki
/proc
nie istnieją nigdzie fizycznie, ale jądro reaguje na pliki, które tam odczytujesz i zapisujesz, i zamiast zapisywać w pamięci, zgłasza informacje lub coś robi.Podobnie pliki w
/dev
rzeczywistości nie są plikami w tradycyjnym znaczeniu (chociaż w niektórych systemach pliki/dev
mogą faktycznie istnieć na dysku, nie będą miały do nich wiele poza urządzeniem, do którego się odnoszą) - umożliwiają rozmowę do urządzenia używającego normalnego interfejsu API we / wy pliku Unix - lub czegokolwiek, co go używa, takiego jak powłokiźródło
W
/proc
katalogu znajdują się dwa typy treści, pierwszy numerowany katalog, a drugi to plik informacji o systemie./proc
to wirtualny system plików. Na przykład, jeśli to zrobiszls -l /proc/stat
, zauważysz, że ma on rozmiar 0 bajtów, ale jeśli wykonasz „cat / proc / stat”, zobaczysz trochę zawartości w pliku.Zrób
ls -l /proc
, a zobaczysz wiele katalogów zawierających tylko liczby. Liczby te reprezentują identyfikatory procesu (PID). Pliki w tym ponumerowanym katalogu odpowiadają procesowi z tym konkretnym PID.Niektóre pliki, które są dostępne pod
/proc
, zawierają informacje o systemie, takie jak cpuinfo, meminfo i loadavg.Niektóre polecenia Linuksa odczytują informacje z tych
/proc
plików i wyświetlają je. Na przykład polecenie wolne odczytuje informacje z pamięci z/proc/meminfo
pliku, formatuje je i wyświetla.Aby dowiedzieć się więcej o poszczególnych
/proc
plikach, wykonaj „man 5 FILENAME”.źródło
Minimalny możliwy do uruchomienia przykład
Moim zdaniem najlepszym sposobem na zrozumienie tych rzeczy jest zabawa, więc oto moduł jądra, który tworzy wpis procfs:
myprocfs.c
a następnie wchodzimy w interakcję z nim jako:
i to daje wynik:
Z tym przykładzie wyraźnie widać, że
proc
pliki pozwalają nam realizować dowolne „plik” związanych z wywołań systemowych, takich jakopen
,read
illseek
.Te wywołania systemowe mogą być następnie wykorzystane do arbitralnej komunikacji z jądrem.
Dlatego te pliki nie muszą mieć nic wspólnego z rzeczywistymi plikami w systemach plików i tak jest w przypadku prawie wszystkich z nich.
Na przykład w naszym małym przykładzie po prostu tworzymy bezużyteczny plik, do którego
read
zawsze wracaabcd\n
.Oto moja w pełni zautomatyzowana konfiguracja QEMU + Buildroot, aby łatwo i bezpiecznie budować i grać z tym modułem jądra:
Niektóre inne podobne interfejsy obejmują:
debugfs oferuje zasadniczo ten sam interfejs, ale wskazuje na mniej stabilny interfejs API, oto przykład .
urządzenia znakowe są również bardzo podobne, ale pliki są tworzone za pomocą
mknod
np .: https://unix.stackexchange.com/questions/37829/how-do-character-device-or-character-special-files-work/371758# 371758sysfs jest kolejną bardziej ograniczoną opcją, więcej informacji można znaleźć w tej odpowiedzi: https://unix.stackexchange.com/questions/4884/what-is-the-difference-between-procfs-and-sysfs/382315#382315
źródło