Wie funktioniert / proc / *?

9389
user2064000

Es gibt viele Dateien in /proc, wie /proc/cpuinfo, /proc/meminfo, /proc/devicesund so weiter, die, wenn sie geöffnet wird, Rückkehr Systeminformationen.

Diese Dateien scheinen in Wirklichkeit keine Existenz zu haben, da das Laufen filedarauf nur sagt, dass sie leer sind.

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

Wie funktionieren diese Dateien genau?

61

4 Antworten auf die Frage

72
a CVn

Es ist eigentlich ziemlich einfach, zumindest wenn Sie die Implementierungsdetails nicht benötigen.

Zunächst werden unter Linux alle Dateisysteme (ext2, ext3, btrfs, reiserfs, tmpfs, zfs, ...) im Kernel implementiert. Einige können über FUSE Arbeit an Userland-Code verlagern, andere nur in Form eines Kernel-Moduls ( natives ZFS) ist aufgrund von Lizenzbeschränkungen ein bemerkenswertes Beispiel für Letzteres), aber in beiden Fällen bleibt eine Kernelkomponente erhalten. Dies ist eine wichtige Grundlage.

Wenn ein Programm aus einer Datei lesen möchte, gibt es verschiedene Systembibliothekaufrufe aus, die schließlich in Form einer open(),, read()- close()Sequenz (eventuell mit einem seek()guten Einwurf) im Kernel enden . Der Kernel nimmt den angegebenen Pfad und Dateinamen an und übersetzt diese über das Dateisystem und die E / A-Ebene der Geräte in physische Leseanforderungen (und in vielen Fällen auch Schreibanforderungen - etwa Aktualisierungen) - in einen zugrunde liegenden Speicher.

Diese Anforderungen müssen jedoch nicht speziell in physischen, dauerhaften Speicher übersetzt werden . Der Vertrag des Kernels besagt, dass die Ausgabe der betreffenden Systemaufrufe den Inhalt der betreffenden Datei bereitstellt . Wo genau in unserem physischen Bereich die "Datei" existiert, ist zweitrangig.

Ein /procist in der Regel montiert, was bekannt ist procfs. Dies ist ein spezieller Dateisystemtyp, aber da es sich um ein Dateisystem handelt, unterscheidet es sich nicht wirklich von einem ext3Dateisystem, das irgendwo angehängt ist. Die Anforderung wird also an den procfs-Dateisystemtreibercode übergeben, der alle diese Dateien und Verzeichnisse kennt und bestimmte Informationen aus den Kernel-Datenstrukturen zurückgibt .

Die "Speicherebene" ist in diesem Fall die Kernel-Datenstruktur und procfsbietet eine saubere, bequeme Schnittstelle für den Zugriff auf diese. Denken Sie daran, dass das Einhängen von procfs /proceinfach eine Konvention ist. Sie könnten es genauso einfach anderswo montieren. In der Tat geschieht dies manchmal, beispielsweise in Chroot-Gefängnissen, wenn der Prozess, der dort ausgeführt wird, aus irgendeinem Grund Zugriff auf / proc benötigt.

Dies funktioniert genauso, wenn Sie einen Wert in eine Datei schreiben. auf Kernel - Ebene, übersetzt, die zu einer Reihe von open(), seek(), write(), close()Anrufen, die wieder in den Dateisystem - Treiber übergeben bekommen; in diesem speziellen Fall wiederum der procfs-Code.

Der besondere Grund für die fileRückkehr emptyist, dass viele der von procfs bereitgestellten Dateien mit einer Größe von 0 Byte verfügbar gemacht werden . Die 0-Byte-Größe ist wahrscheinlich eine Optimierung auf der Kernel-Seite (viele der Dateien in / proc sind dynamisch und können leicht in der Länge variieren, möglicherweise sogar von einem Lesevorgang zum nächsten), und die Länge jeder Datei wird für jedes gelesene Verzeichnis berechnet möglicherweise sehr teuer sein). Durch die Kommentare zu dieser Antwort, die Sie auf Ihrem eigenen System durch Ausführen von strace oder einem ähnlichen Tool überprüfen können, wird filezunächst ein stat()Aufruf zur Erkennung bestimmter Dateien ausgegeben. Anschließend wird die Gelegenheit genutzt, wenn die Dateigröße mit 0 angegeben wird, abbrechen und melden Sie die Datei als leer.

Dieses Verhalten ist tatsächlich dokumentiert und kann durch Angabe -soder --special-filesbeim fileAufruf außer Kraft gesetzt werden , obwohl dies auf der Manpage angegeben ist, die Nebenwirkungen haben kann. Das folgende Zitat stammt aus der Manpage BSD file 5.11 vom 17. Oktober 2011.

Normalerweise versucht file nur, den Typ der Argumentdateien zu lesen und zu bestimmen, bei denen stat (2) Berichte gewöhnliche Dateien sind. Dadurch werden Probleme vermieden, da das Lesen spezieller Dateien besondere Konsequenzen haben kann. Durch die Angabe der -sOption werden in der Datei auch Argumentdateien gelesen, bei denen es sich um Block- oder Zeichendateien handelt. Dies ist nützlich, um die Dateisystemtypen der Daten in RAW-Partitionen zu ermitteln, bei denen es sich um spezielle Blockdateien handelt. Diese Option bewirkt auch, dass die Datei die von stat (2) gemeldete Dateigröße ignoriert, da sie auf einigen Systemen eine Nullgröße für unformatierte Festplattenpartitionen meldet.

Wenn Sie es mit "strace file / proc / version" oder "ltrace -S / proc / version" betrachten, ist die Optimierung eher gering. Es führt zuerst einen `stat ()` - Aufruf aus und stellt fest, dass die Größe 0 ist, sodass `open ()` übersprungen wird - vorher laden jedoch mehrere magische Dateien. ott-- vor 10 Jahren 5
@ ott-- Das ist in der Tat eine ungerade Folge von Ereignissen, aber ** kann ** damit zusammenhängen, dass Sie mehrere Dateinamen an `file` übergeben können. Auf diese Weise lädt file die magischen Dateien vor und verarbeitet dann die Befehlszeilenparameter für Parameter. Statt das Laden der magischen Datei in den Ordner "Verschieben" zu verschieben, tun Sie dies, bevor Sie versuchen herauszufinden, welche Art von Datei * diese * bestimmte Datei "Teil des Codes ist, was die Komplexität erhöhen würde. Das Aufrufen von "stat ()" und das Ausführen seines Rückgabewerts ist im Wesentlichen harmlos. Zusätzliche Komplexität bei der Überwachung zusätzlicher interner Zustandsrisiken durch das Einfügen von Fehlern. a CVn vor 10 Jahren 2
@ ott-- Der Grund, warum "file" "Datei ist leer" meldet, ist, weil "stat" aufgerufen wird, um spezielle Dateien (Named Pipes, Devices, ...) zu ermitteln, und die Gelegenheit dazu genutzt wird, um die Verarbeitung leerer Dateien zu beenden. `file -s / proc / version` meldet" ASCII-Text ". Gilles vor 10 Jahren 0
@Gilles Das `-s` ist für Block / Char-Spezialgeräte gedacht. Schließlich habe ich mir die Quelle der Datei angesehen, und am Ende von fsmagic.c sah ich diese Erklärung, warum sie anstelle von `empty` 'ASCII-Text' zurückgibt:` Wenn stat () uns sagt, dass die Datei eine Länge von null hat, hier melden Da die Datei leer ist, können wir die gesamte Arbeit beim Öffnen und Lesen der Datei überspringen. Wenn jedoch die Option -s angegeben wurde, überspringen wir diese Optimierung, da stat () auf einigen Systemen eine Nullgröße für unformatierte Festplattenpartitionen meldet.` ott-- vor 10 Jahren 4
15
stderr

In diesem Verzeichnis können Sie steuern, wie der Kernel Geräte anzeigt, Kerneleinstellungen anpassen, Geräte zum Kernel hinzufügen und sie wieder entfernen. In diesem Verzeichnis können Sie die Speichernutzung und die E / A- Statistiken direkt anzeigen .

Sie können sehen, welche Festplatten gemountet und welche Dateisysteme verwendet werden. Kurz gesagt, jeder einzelne Aspekt Ihres Linux-Systems kann in diesem Verzeichnis untersucht werden, wenn Sie wissen, wonach Sie suchen müssen.

Das /procVerzeichnis ist kein normales Verzeichnis. Wenn Sie von einer Boot-CD aus booten und das Verzeichnis auf Ihrer Festplatte betrachten, wird das Verzeichnis leer angezeigt. Wenn Sie es unter Ihrem normalen System betrachten, kann es ziemlich groß sein. Es scheint jedoch keinen Festplattenspeicher zu belegen. Dies liegt daran, dass es sich um ein virtuelles Dateisystem handelt.

Da das /procDateisystem ein virtuelles Dateisystem ist und sich im Arbeitsspeicher befindet, /procwird bei jedem Neustart des Linux-Computers ein neues Dateisystem erstellt.

Mit anderen Worten, es ist nur ein Mittel, um über eine Datei- und Verzeichnisschnittstelle den Kern des Linux-Systems zu erkennen und zu stöbern. Wenn Sie eine Datei im /procVerzeichnis anzeigen, sehen Sie direkt auf einen Speicherbereich im Linux-Kernel und sehen, was dort angezeigt wird.

Die Schichten im Dateisystem

Beispiele:

  • Im Inneren /procbefindet sich für jeden laufenden Prozess ein Verzeichnis, das mit seiner Prozess-ID benannt ist. Diese Verzeichnisse enthalten Dateien, die nützliche Informationen zu den Prozessen enthalten, z.
    • exe: Dies ist ein symbolischer Link zu der Datei auf der Festplatte, von der aus der Prozess gestartet wurde.
    • cwd: Dies ist ein symbolischer Link zum Arbeitsverzeichnis des Prozesses.
    • wchan: was beim Lesen den wartenden Kanal zurückgibt, in dem der Prozess läuft.
    • maps: die beim Lesen die Speicherzuordnungen des Prozesses zurückgibt.
  • /proc/uptime Gibt die Betriebszeit in Sekunden als zwei Dezimalwerte zurück, getrennt durch ein Leerzeichen:
    • die Zeit seit dem Start des Kernels.
    • die Zeit, die der Kernel im Leerlauf war.
  • /proc/interrupts: Für Informationen zu Interrupts.
  • /proc/modules: Für eine Liste von Modulen.

Weitere Informationen finden Sie unter man proc oder kernel.org .

* "Wenn Sie von einer Boot-CD booten und das Verzeichnis auf Ihrer Festplatte betrachten würden, würden Sie es als leer ansehen." * Dies ist nicht spezifisch für / proc, es ist allgemein für jeden Mount-Punkt, an dem sich das zugrunde liegende Dateisystem befindet wurde nicht montiert. Wenn Sie von derselben Boot-CD booten und so etwas wie `mount -t procfs procfs / mnt / proc` tun, wird das aktuell ausgeführte Kernel / proc angezeigt. a CVn vor 10 Jahren 0
5
LawrenceC

Sie haben Recht, es handelt sich nicht um echte Dateien.

Einfach ausgedrückt, ist es eine Möglichkeit, mit dem Kernel zu sprechen, indem Sie die normalen Methoden zum Lesen und Schreiben von Dateien verwenden, anstatt den Kernel direkt aufzurufen. Dies entspricht der Unix-Philosophie "Alles ist eine Datei".

Die Dateien in /procsind nicht physisch vorhanden, aber der Kernel reagiert auf die Dateien, die Sie dort lesen und schreiben. Statt in den Speicher zu schreiben, meldet er Informationen oder tut etwas.

In ähnlicher Weise sind die Dateien im /deveigentlichen Sinne keine Dateien (obwohl auf manchen Systemen die Dateien /devtatsächlich auf der Festplatte vorhanden sind, haben sie nicht viel anderes als das Gerät, auf das sie sich beziehen) - sie ermöglichen es Ihnen, zu sprechen auf ein Gerät, das die normale Unix-Datei-E / A-API verwendet - oder irgendetwas, das es verwendet, z. B. Shells

Es ist mehr wie bei * nix, dass nur eine Datei gesichert werden kann. Da Zugriffssteuerungslisten im Dateisystem beibehalten werden, ist es zweckmäßig, privilegierte Ressourcen mithilfe des allgemeinen Mechanismus zu schützen, der bereits vom Dateisystemtreiber bereitgestellt wird. Dies vereinfacht die Implementierung von Tools, die auf Kernelstrukturen zugreifen, und ermöglicht das Ausführen ohne erhöhte Berechtigungen, indem sie stattdessen aus den virtuellen Dateien des proc-Dateisystems liest. Pekka vor 10 Jahren 1
3
Shailesh

Innerhalb des /procVerzeichnisses gibt es zwei Arten von Inhalten, das erste nummerierte Verzeichnis und das zweite eine Systeminformationsdatei.

/procist ein virtuelles Dateisystem. Wenn Sie dies tun ls -l /proc/stat, werden Sie z. B. feststellen, dass die Größe 0 Byte beträgt. Wenn Sie jedoch „cat / proc / stat“ ausführen, wird in der Datei etwas Inhalt angezeigt.

Machen Sie ein ls -l /procund Sie sehen viele Verzeichnisse mit nur Zahlen. Diese Zahlen stehen für die Prozess-IDs (PIDs). Die Dateien in diesem nummerierten Verzeichnis entsprechen dem Prozess mit dieser bestimmten PID.

Einige Dateien, die unter verfügbar sind /proc, enthalten Systeminformationen wie cpuinfo, meminfo und loadavg.

Einige Linux-Befehle lesen die Informationen aus diesen /procDateien und zeigen sie an. Der Befehl free liest beispielsweise die Speicherinformationen aus der /proc/meminfoDatei, formatiert sie und zeigt sie an.

Um mehr über die einzelnen /procDateien zu erfahren, führen Sie „man 5 FILENAME“ aus.

/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. 
Das klingt für mich eher nach "wie benutze ich was in / proc?" anstatt "wie funktioniert / proc?". Nützliche Informationen, die jedoch nicht unbedingt diese spezielle Frage beantworten müssen. a CVn vor 10 Jahren 2
Jede Datei in / proc enthält Informationen zur Laufzeit, was bedeutet, dass beim cat / proc / meminfo-Teil des Kernels eine Funktion ausgeführt wird, die den Dateiinhalt generiert. Shailesh vor 10 Jahren 0