Was passiert, wenn ich den Befehl cat /proc/cpuinfo ausführe?

Was passiert, wenn ich den Befehl cat /proc/cpuinfo ausführe?

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, /procdas 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 psist oft ein Pretty-Printer zum Durchlesen von Informationen /proc). Die meisten procfs-Implementierungen haben eine Datei oder ein Verzeichnis namens, /proc/123um 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 /procverschiedene Dateien mit Informationen zu Treibern erstellt. Diese Verwendung wird jedoch mittlerweile zugunsten von/sys, und /procentwickelt sich jetzt langsam weiter. Einträge wie /proc/busund /proc/fs/ext4bleiben 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 /procLinux sind:

  1. Dieproc(5)manpage;
  2. Das /procDateisystemimKernel-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.noist 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 /procEinträge erfolgt imfs/procVerzeichnis. 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.hKernel-Versionenbis zu 3,9Bereitstellung der Funktionen create_proc_entryund einiger Wrapper (insbesondere create_proc_read_entry) sowie Kernel-Versionen3.10 und höherGeben Sie stattdessen nur proc_createund proc_create_data(und einige mehr) an.

Wenn Sie /proc/cpuinfobeispielsweise 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 /procnur einige Textdaten ausgeben, gibt es Hilfsfunktionen, die das tun. Es gibt lediglich eineseq_operationsStruktur, und das wahre Fleisch ist in dercpuinfo_opDatenstruktur, 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 /procsind die prozessbezogenen Informationen in /proc/<PID>. Diese Einträge werden in registriertfs/proc/base.c, imtgid_base_stuffAnordnung; einige hier registrierte Funktionen sind in anderen Dateien definiert. Sehen wir uns einige Beispiele an, wie diese Einträge generiert werden:

Ein weiterer wichtiger Bereich von /procist /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_sysctlund 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/cpuinfoes 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, staterhalten wir den nächsten Hinweis darauf, dass etwas Besonderes an ist /proc/cpuinfo.

Lauf Nr. 1
$ 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/cpuinfoscheint 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 mountBefehl 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 /procum einen anderen Dateisystemtyp. Das ist unser Hinweis darauf, dass die Dateien darunter /procbesonders sind. Es sind nicht einfach nur gewöhnliche Dateien. Lassen Sie uns also ein paar weitere Informationen darüber finden, was das procDateisystem besonders macht.

Werfen Sie einen Blick auf mountdie 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 procdie 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 /procals 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 procaus irgendeinem Grund jedoch nicht mehr enthalten ist.NOTIZ:Ich bin nicht sicher, warum es entfernt wurde, da es sehr gut beschreibt, was /procist:

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.

verwandte Informationen