Jak działa / proc / *?

62

Istnieje wiele plików /proc, takich jak /proc/cpuinfo, /proc/meminfo, /proc/devicesi tak dalej, które po otwarciu systemu informacji powrotny.

Wydaje się, że te pliki w rzeczywistości nie istnieją, ponieważ uruchamianie fileich oznacza tylko, że są puste.

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

Jak dokładnie działają te pliki?

user2064000
źródło

Odpowiedzi:

72

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 /proczwykle 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. ext3Zamontowanego 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 procfszapewnia czysty, wygodny interfejs dostępu do nich. Pamiętaj, że montowanie procfs w /procto 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 filepowrotu emptyjest 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, filenajpierw 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 -slub --special-filesna filepw, 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 -sopcji 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.

CVn
źródło
5
Kiedy patrzysz na to za pomocą strace file /proc/versionlub ltrace -S /proc/version, optymalizacja jest raczej niewielka. stat()Najpierw wykonuje wywołanie i stwierdza, że ​​rozmiar wynosi 0, pomijając w ten sposób open()- ale wcześniej ładuje kilka magicznych plików.
ott--
2
@ ott-- To rzeczywiście dziwna sekwencja zdarzeń, ale może to być związane z faktem, że możesz przekazać wiele nazw 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ływanie stat()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.
CVn
@ ott-- Właściwie przyczyną filejest to, że „plik jest pusty”, ponieważ wywołuje statwykrywanie plików specjalnych (nazwanych potoków, urządzeń,…) i korzysta z okazji, aby zatrzymać przetwarzanie pustych plików. file -s /proc/versionzgłasza „tekst ASCII”.
Gilles
4
@Gilles -sJest przeznaczony dla urządzeń specjalnych block / char. W końcu spojrzałem na fileźródło i na końcu fsmagic.c zobaczyłem to wyjaśnienie, dlaczego powraca ASCII textzamiast empty: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.
ott
15

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ć.

/procKatalog 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ż /procsystem plików jest wirtualnym systemem plików i znajduje się w pamięci, nowy /procsystem 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 /prockatalogu, patrzysz bezpośrednio na zakres pamięci w jądrze Linuksa i widzisz, co może zobaczyć.

Warstwy w systemie plików

Wpisz opis zdjęcia tutaj

Przykłady:

  • Wewnątrz /procznajduje 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ą:
    • ilość czasu od uruchomienia jądra.
    • czas bezczynności jądra.
  • /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 .

stderr
źródło
„Jeśli chcesz uruchomić komputer z płyty rozruchowej i spojrzeć na ten katalog na dysku twardym, zobaczysz, że jest pusty.” Nie jest to specyficzne dla / proc, ogólnie dotyczy każdego punktu podłączenia, w którym nie zamontowano bazowego systemu plików. Jeśli uruchomisz system z tej samej płyty CD i zrobisz coś podobnego mount -t procfs procfs /mnt/proc, zobaczysz aktualnie działające jądro / proc.
CVn
5

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 /procnie 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 /devrzeczywistości nie są plikami w tradycyjnym znaczeniu (chociaż w niektórych systemach pliki /devmogą 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

LawrenceC
źródło
1
Bardziej przypomina * nix, że można zabezpieczyć tylko plik. Ponieważ listy kontroli dostępu są utrwalone w systemie plików, wygodnie jest zabezpieczyć uprzywilejowane zasoby za pomocą wspólnego mechanizmu już dostarczonego przez sterownik systemu plików. Upraszcza to implementację narzędzi, które uzyskują dostęp do struktur jądra i pozwala im działać bez podwyższonych uprawnień, zamiast odczytując pliki wirtualne systemu plików proc.
Pekka
3

W /prockatalogu znajdują się dwa typy treści, pierwszy numerowany katalog, a drugi to plik informacji o systemie.

/procto wirtualny system plików. Na przykład, jeśli to zrobisz ls -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 /procplików i wyświetlają je. Na przykład polecenie wolne odczytuje informacje z pamięci z /proc/meminfopliku, formatuje je i wyświetla.

Aby dowiedzieć się więcej o poszczególnych /procplikach, wykonaj „man 5 FILENAME”.

/proc/cmdline – Kernel command line
/proc/cpuinfo – Information about the processors.
/proc/devices – List of device drivers configured into the currently running kernel.
/proc/dma – Shows which DMA channels are being used at the moment.
/proc/fb – Frame Buffer devices.
/proc/filesystems – File systems supported by the kernel.
/proc/interrupts – Number of interrupts per IRQ on architecture.
/proc/iomem – This file shows the current map of the system’s memory for its various devices
/proc/ioports – provides a list of currently registered port regions used for input or output communication with a device
/proc/loadavg – Contains load average of the system
The first three columns measure CPU utilization of the last 1, 5, and 10 minute periods.
The fourth column shows the number of currently running processes and the total number of processes.
The last column displays the last process ID used.
/proc/locks – Displays the files currently locked by the kernel
Sample line:
1: POSIX ADVISORY WRITE 14375 08:03:114727 0 EOF
/proc/meminfo – Current utilization of primary memory on the system
/proc/misc – This file lists miscellaneous drivers registered on the miscellaneous major device, which is number 10
/proc/modules – Displays a list of all modules that have been loaded by the system
/proc/mounts – This file provides a quick list of all mounts in use by the system
/proc/partitions – Very detailed information on the various partitions currently available to the system
/proc/pci – Full listing of every PCI device on your system
/proc/stat – Keeps track of a variety of different statistics about the system since it was last restarted
/proc/swap – Measures swap space and its utilization
/proc/uptime – Contains information about uptime of the system
/proc/version – Version of the Linux kernel, gcc, name of the Linux flavor installed.
Shailesh
źródło
2
To brzmi bardziej jak „jak korzystać z tego, co jest w / proc?” zamiast „jak działa / proc?”. Przydatne informacje, ale niekoniecznie odpowiadające na to konkretne pytanie .
CVn
Każdy plik w / proc jest informacją o środowisku wykonawczym, co oznacza, że ​​kiedy cat / proc / meminfo część jądra uruchamia funkcję, która generuje zawartość pliku.
Shailesh
3

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

#include <linux/debugfs.h>
#include <linux/module.h>
#include <linux/proc_fs.h>
#include <linux/seq_file.h> /* seq_read, seq_lseek, single_open, single_release */
#include <uapi/linux/stat.h> /* S_IRUSR */

static const char *filename = "lkmc_procfs";

static int show(struct seq_file *m, void *v)
{
    seq_printf(m, "abcd\n");
    return 0;
}

static int open(struct inode *inode, struct  file *file)
{
    return single_open(file, show, NULL);
}

static const struct file_operations fops = {
    .llseek = seq_lseek,
    .open = open,
    .owner = THIS_MODULE,
    .read = seq_read,
    .release = single_release,
};

static int myinit(void)
{
    proc_create(filename, 0, NULL, &fops);
    return 0;
}

static void myexit(void)
{
    remove_proc_entry(filename, NULL);
}

module_init(myinit)
module_exit(myexit)
MODULE_LICENSE("GPL");

a następnie wchodzimy w interakcję z nim jako:

insmod procfs.ko
cat /proc/lkmc_procfs

i to daje wynik:

abcd

Z tym przykładzie wyraźnie widać, że procpliki pozwalają nam realizować dowolne „plik” związanych z wywołań systemowych, takich jak open, readi llseek.

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 readzawsze wraca abcd\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ą:

Ciro Santilli
źródło