![Was passiert, wenn ich den Befehl cat /proc/cpuinfo ausführe?](https://rvso.com/image/52103/Was%20passiert%2C%20wenn%20ich%20den%20Befehl%20cat%20%2Fproc%2Fcpuinfo%20ausf%C3%BChre%3F.png)
Was passiert, wenn ich schreibe cat /proc/cpuinfo
? Ist das eine benannte Pipe (oder etwas anderes) zum Betriebssystem, die die CPU-Informationen im laufenden Betrieb liest und diesen Text jedes Mal generiert, wenn ich sie aufrufe?
Antwort1
Wenn Sie eine Datei unter lesen /proc
, wird im Kernel ein Code aufgerufen, der den zu lesenden Text als Dateiinhalt berechnet. Die Tatsache, dass der Inhalt im laufenden Betrieb generiert wird, erklärt, warum für fast alle Dateien die Zeitangabe jetzt und die Größe 0 ist – hier sollten Sie 0 als „weiß nicht“ lesen. Im Gegensatz zu normalen Dateisystemen ist das auf gemountete Dateisystem, /proc
das alsprocfs, lädt keine Daten von einer Festplatte oder einem anderen Speichermedium (wie FAT, ext2, zfs, …) oder über das Netzwerk (wie NFS, Samba, …) und ruft keinen Benutzercode auf (im Gegensatz zuSICHERUNG).
Procfs ist in den meisten Nicht-BSD-Unices vorhanden. Es begann sein Leben in den Bell Labs von AT&T imUNIX 8. Ausgabeals Möglichkeit, Informationen über Prozesse zu melden (und ps
ist oft ein Pretty-Printer zum Durchlesen von Informationen /proc
). Die meisten procfs-Implementierungen haben eine Datei oder ein Verzeichnis namens, /proc/123
um Informationen über den Prozess mit PID 123 zu melden. Linux erweitert das proc-Dateisystem um viele weitere Einträge, die den Status des Systems melden, einschließlich Ihres Beispiels /proc/cpuinfo
.
In der Vergangenheit wurden in Linux /proc
verschiedene Dateien mit Informationen zu Treibern erstellt. Diese Verwendung wird jedoch mittlerweile zugunsten von/sys
, und /proc
entwickelt sich jetzt langsam weiter. Einträge wie /proc/bus
und /proc/fs/ext4
bleiben aus Gründen der Abwärtskompatibilität dort, wo sie sind, aber neuere ähnliche Schnittstellen werden unter erstellt /sys
. In dieser Antwort konzentriere ich mich auf Linux.
Ihr erster und zweiter Einstiegspunkt für die Dokumentation zu /proc
Linux sind:
- Die
proc(5)
manpage; - Das
/proc
DateisystemimKernel-Dokumentation.
Ihr dritter Einstiegspunkt, wenn die Dokumentation ihn nicht abdeckt, istLesen der Quelle. Sie können die Quelle auf Ihren Computer herunterladen, aber das ist ein riesiges Programm, undLXR, die Linux-Querverweisfunktion, ist eine große Hilfe. (Es gibt viele Varianten von LXR; die auf laufende lxr.linux.no
ist bei weitem die beste, aber leider ist die Site oft down.) Ein wenig C-Kenntnisse sind erforderlich, aber Sie müssen kein Programmierer sein, um einen mysteriösen Wert aufzuspüren.
Die Kernbearbeitung der /proc
Einträge erfolgt imfs/proc
Verzeichnis. Jeder Treiber kann Einträge in registrieren /proc
(obwohl dies, wie oben angegeben, mittlerweile zugunsten von veraltet ist /sys
). Wenn Sie also in nicht finden, wonach Sie suchen fs/proc
, suchen Sie woanders. Treiber rufen Funktionen auf, die in deklariert sind.include/linux/proc_fs.h
Kernel-Versionenbis zu 3,9Bereitstellung der Funktionen create_proc_entry
und einiger Wrapper (insbesondere create_proc_read_entry
) sowie Kernel-Versionen3.10 und höherGeben Sie stattdessen nur proc_create
und proc_create_data
(und einige mehr) an.
Wenn Sie /proc/cpuinfo
beispielsweise nach suchen, "cpuinfo"
gelangen Sie zum Aufruf von proc_create("cpuinfo, …")
infs/proc/cpuinfo.c
. Sie können sehen, dass der Code ziemlich viel Standardcode ist: Da die meisten Dateien /proc
nur einige Textdaten ausgeben, gibt es Hilfsfunktionen, die das tun. Es gibt lediglich eineseq_operations
Struktur, und das wahre Fleisch ist in dercpuinfo_op
Datenstruktur, die architekturabhängig ist und normalerweise in einer arch/<architecture>/kernel/setup.c
(oder manchmal einer anderen) Datei definiert ist. Am Beispiel von x86 kommen wir zuarch/x86/kernel/cpu/proc.c
. Dort ist die Hauptfunktion show_cpuinfo
, die den gewünschten Dateiinhalt ausgibt; der Rest der Infrastruktur dient dazu, die Daten in der angeforderten Geschwindigkeit an den Lesevorgang weiterzuleiten. Sie können sehen, wie die Daten im laufenden Betrieb aus Daten in verschiedenen Variablen im Kernel zusammengestellt werden, einschließlich einiger im laufenden Betrieb berechneter Zahlen wie:die CPU-Frequenz.
Ein großer Teil von /proc
sind die prozessbezogenen Informationen in /proc/<PID>
. Diese Einträge werden in registriertfs/proc/base.c
, imtgid_base_stuff
Anordnung; einige hier registrierte Funktionen sind in anderen Dateien definiert. Sehen wir uns einige Beispiele an, wie diese Einträge generiert werden:
cmdline
wird erzeugt durchproc_pid_cmdline
in derselben Datei. Dabei werden die Daten lokalisiert und ausgedruckt.clear_refs
ist im Gegensatz zu den Einträgen, die wir bisher gesehen haben, schreibbar, aber nicht lesbar. Daher ist derproc_clear_refs_operations
Strukturen definiert eineclear_refs_write
Funktion, aber keine Lesefunktion.cwd
ist ein symbolischer Link (ein leicht magischer), deklariert durchproc_cwd_link
, welchesucht das aktuelle Verzeichnis des Prozessesund gibt es als Linkinhalt zurück.fd
ist ein Unterverzeichnis. Die Operationen auf dem Verzeichnis selbst werden definiert inproc_fd_operations
Datenstruktur (sie sind Standardtexte, mit Ausnahme der Funktion, die die Einträge aufzählt,proc_readfd
, das die offenen Dateien des Prozesses auflistet), während Operationen an den Einträgen in`proc_fd_inode_operations.
Ein weiterer wichtiger Bereich von /proc
ist /proc/sys
, eine direkte Schnittstelle zusysctl
. Das Lesen eines Eintrags in dieser Hierarchie gibt den Wert des entsprechenden Sysctl-Werts zurück, und das Schreiben setzt den Sysctl-Wert. Die Einstiegspunkte für Sysctl befinden sich infs/proc/proc_sysctl.c
. Sysctls haben ein eigenes Registrierungssystem mitregister_sysctl
und Freunde.
Antwort2
Wenn Sie versuchen, einen Einblick in die Magie zu gewinnen, die hinter den Kulissen passiert, ist Ihr bester Freund strace
. Das Erlernen der Bedienung dieses Werkzeugs ist eines der besten Dinge, die Sie tun können, um ein besseres Verständnis für die verrückte Magie zu bekommen, die hinter den Kulissen passiert.
$ strace -s 200 -m strace.log cat /proc/cpuinfo
...
read(3, "processor\t: 0\nvendor_id\t: GenuineIntel\ncpu family\t: 6\nmodel\t\t: 37\nmodel name\t: Intel(R) Core(TM) i5 CPU M 560 @ 2.67GHz\nstepping\t: 5\nmicrocode\t: 0x4\ncpu MHz\t\t: 1199.000\ncache size\t: 3072 KB\nphy"..., 65536) = 3464
write(1, "processor\t: 0\nvendor_id\t: GenuineIntel\ncpu family\t: 6\nmodel\t\t: 37\nmodel name\t: Intel(R) Core(TM) i5 CPU M 560 @ 2.67GHz\nstepping\t: 5\nmicrocode\t: 0x4\ncpu MHz\t\t: 1199.000\ncache size\t: 3072 KB\nphy"..., 3464) = 3464
read(3, "", 65536) = 0
close(3) = 0
...
Aus der obigen Ausgabe können Sie ersehen, dass /proc/cpuinfo
es sich nur um eine normale Datei handelt oder zumindest so aussieht. Sehen wir uns das also genauer an.
Tiefer eintauchen
#1- mit ls..Wenn man sich die Datei selbst ansieht, scheint es sich „nur um eine Datei“ zu handeln.
$ ls -l /proc/cpuinfo
-r--r--r--. 1 root root 0 Mar 26 22:45 /proc/cpuinfo
Aber schauen Sie genauer hin. Wir erhalten einen ersten Hinweis darauf, dass es sich um eine Besonderheit handelt. Beachten Sie, dass die Dateigröße 0 Byte beträgt.
#2- mit Stat..Wenn wir uns die Datei jetzt mit ansehen, stat
erhalten wir den nächsten Hinweis darauf, dass etwas Besonderes an ist /proc/cpuinfo
.
$ stat /proc/cpuinfo
File: ‘/proc/cpuinfo’
Size: 0 Blocks: 0 IO Block: 1024 regular empty file
Device: 3h/3dInode: 4026532023 Links: 1
Access: (0444/-r--r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Context: system_u:object_r:proc_t:s0
Access: 2014-03-26 22:46:18.390753719 -0400
Modify: 2014-03-26 22:46:18.390753719 -0400
Change: 2014-03-26 22:46:18.390753719 -0400
Birth: -
Lauf Nr. 2
$ stat /proc/cpuinfo
File: ‘/proc/cpuinfo’
Size: 0 Blocks: 0 IO Block: 1024 regular empty file
Device: 3h/3dInode: 4026532023 Links: 1
Access: (0444/-r--r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Context: system_u:object_r:proc_t:s0
Access: 2014-03-26 22:46:19.945753704 -0400
Modify: 2014-03-26 22:46:19.945753704 -0400
Change: 2014-03-26 22:46:19.945753704 -0400
Birth: -
Beachten Sie die Zugriffs-, Änderungs- und Änderungszeiten? Sie ändern sich bei jedem Zugriff. Es ist höchst ungewöhnlich, dass sich alle drei auf diese Weise ändern. Sofern sie nicht bearbeitet werden, bleiben die Zeitstempelattribute einer Datei normalerweise gleich.
#3- mit Datei..Noch ein Hinweis darauf, dass diese Datei alles andere als eine normale Datei ist:
$ file /proc/cpuinfo
/proc/cpuinfo: empty
Wenn es sich um eine Manifestation einer benannten Pipe handeln würde, würde es ähnlich einer dieser Dateien aussehen:
$ ls -l /dev/initctl /dev/zero
prw-------. 1 root root 0 Mar 26 20:09 /dev/initctl
crw-rw-rw-. 1 root root 1, 5 Mar 27 00:39 /dev/zero
$ file /dev/initctl /dev/zero
/dev/initctl: fifo (named pipe)
/dev/zero: character special
Wenn wir ein berühren emptyfile
, /proc/cpuinfo
scheint es eher einer Datei als einer Pipe zu ähneln:
$ touch emptyfile
$ ls -l emptyfile
-rw-rw-r--. 1 saml saml 0 Mar 27 07:40 emptyfile
$ file emptyfile
emptyfile: empty
#4- mit Halterung..
An diesem Punkt müssen wir also einen Schritt zurückgehen und etwas herauszoomen. Wir betrachten eine bestimmte Datei, aber vielleicht sollten wir uns das Dateisystem ansehen, in dem sich diese Datei befindet. Und dafür können wir den mount
Befehl verwenden.
$ mount | grep " /proc "
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
OK, der Dateisystemtyp ist also vom Typ proc
. Es handelt sich also /proc
um einen anderen Dateisystemtyp. Das ist unser Hinweis darauf, dass die Dateien darunter /proc
besonders sind. Es sind nicht einfach nur gewöhnliche Dateien. Lassen Sie uns also ein paar weitere Informationen darüber finden, was das proc
Dateisystem besonders macht.
Werfen Sie einen Blick auf mount
die Manpage von :
Das Proc-Dateisystem ist keinem speziellen Gerät zugeordnet und beim Mounten kann anstelle einer Gerätespezifikation ein beliebiges Schlüsselwort wie „proc“ verwendet werden. (Die übliche Wahl „none“ ist weniger erfolgreich: Die Fehlermeldung „none busy“ von umount kann verwirrend sein.)
Und wenn wir einen Blick auf proc
die Manpage von werfen:
Das Proc-Dateisystem ist ein Pseudodateisystem, das als Schnittstelle zu Kernel-Datenstrukturen verwendet wird. Es wird normalerweise unter /proc eingebunden. Der Großteil davon ist schreibgeschützt, aber einige Dateien erlauben die Änderung von Kernelvariablen.
Etwas weiter unten in derselben Manpage:
/proc/cpuinfo
Dies ist eine Sammlung von CPU- und Systemarchitektur-abhängigen Elementen, für jede unterstützte Architektur eine andere Liste. Zwei häufige Einträge sind Prozessor, der die CPU-Nummer angibt, und Bogomips, eine Systemkonstante, die während der Kernel-Initialisierung berechnet wird. SMP-Maschinen haben Informationen für jede CPU. Der Befehl lscpu(1) sammelt seine Informationen aus dieser Datei.
Unten auf der Manpage befindet sich ein Verweis auf ein Kernel-Dokument mit dem Titel:Das /proc-Dateisystem. Zitat aus diesem Dokument:
Das Proc-Dateisystem dient als Schnittstelle zu internen Datenstrukturen im Kernel. Es kann verwendet werden, um Informationen über das System abzurufen und bestimmte Kernel-Parameter zur Laufzeit zu ändern (sysctl).
Schlussfolgerungen
Was haben wir also hier gelernt? Nun, da es /proc
als Pseudodateisystem und auch als „Schnittstelle zu internen Datenstrukturen“ bezeichnet wird, kann man wohl davon ausgehen, dass die darin enthaltenen ElementenichtEs handelt sich dabei lediglich um Manifestationen, die wie Dateien aussehen, aber keine sind.
Ich schließe mit diesem Zitat, das offenbar in einer früheren Version aus dem Jahr 2004 enthalten war, man 5 proc
aus irgendeinem Grund jedoch nicht mehr enthalten ist.NOTIZ:Ich bin nicht sicher, warum es entfernt wurde, da es sehr gut beschreibt, was /proc
ist:
Das Verzeichnis /proc auf GNU/Linux-Systemen stellt eine dateisystemähnliche Schnittstelle zum Kernel bereit. Dies ermöglicht Anwendungen und Benutzern, mithilfe normaler E/A-Vorgänge des Dateisystems Informationen aus dem Kernel abzurufen und Werte im Kernel festzulegen.
Das Proc-Dateisystem wird manchmal als Pseudodateisystem für Prozessinformationen bezeichnet. Es enthält keine „echten“ Dateien, sondern Laufzeitsysteminformationen (z. B. Systemspeicher, eingebundene Geräte, Hardwarekonfiguration usw.). Aus diesem Grund kann es als Kontroll- und Informationszentrum für den Kernel betrachtet werden. Tatsächlich sind viele Systemdienstprogramme einfach Aufrufe von Dateien in diesem Verzeichnis. Beispielsweise ist der Befehl lsmod, der die vom Kernel geladenen Module auflistet, im Grunde dasselbe wie „cat /proc/modules“, während lspci, das an den PCI-Bus des Systems angeschlossene Geräte auflistet, dasselbe ist wie „cat /proc/pci“. Durch Ändern von Dateien in diesem Verzeichnis können Sie Kernelparameter ändern, während das System läuft.
Quelle: Das Proc-Pseudodateisystem
Verweise
Antwort3
Die Antwort von @slm ist sehr umfassend, aber ich denke, dass sich durch einen Perspektivwechsel eine einfachere Erklärung ergeben könnte.
Im Alltag können wir uns Dateien als physische Dinge vorstellen, also als Datenblöcke, die auf einem Gerät gespeichert sind. Das macht Dateien wie /proc/cpuinfo sehr mysteriös und verwirrend. Allerdings ergibt das alles einen Sinn, wenn wir uns Dateien alsSchnittstelle; eine Möglichkeit, Daten in ein Programm hinein und aus einem Programm heraus zu senden.
Die Programme, die auf diese Weise Daten senden und empfangen, sind Dateisysteme oder Treiber (je nachdem, wie Sie diese Begriffe definieren, kann dies eine zu breite oder zu enge Definition sein). Der wichtige Punkt ist, dassmanchedieser Programme verwenden ein Hardwaregerät zum Speichern und Abrufen der über diese Schnittstelle gesendeten Daten; aber nicht alle.
Einige Beispiele für Dateisysteme, dienichtein Speichergerät verwenden (zumindest direkt) sind:
- Dateisysteme, die nachgeschlagene oder berechnete Daten verwenden. Proc ist ein Beispiel, da es Daten von verschiedenen Kernelmodulen erhält. Ein extremes Beispiel ist πfs ( github.com/philipl/pifs )
- Alle FUSE-Dateisysteme, die die Daten mit einem regulären Userspace-Programm verarbeiten
- Dateisysteme, die die Daten eines anderen Dateisystems im laufenden Betrieb transformieren, beispielsweise durch Verschlüsselung, Komprimierung oder sogar Audio-Transkodierung (khenriks.github.io/mp3fs/)
Das Plan9-Betriebssystem (http://en.wikipedia.org/wiki/Plan_9_von_Bell_Labs) ist ein extremes Beispiel für die Verwendung von Dateien als allgemeine Programmierschnittstelle.