Wie funktioniert / proc / *?


62

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 der Realität nicht existent zu sein, da das Ausführen filedarauf nur anzeigt, dass sie leer sind.

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

Wie funktionieren diese Dateien genau?

Antworten:


72

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 die Arbeit über FUSE in den Userland-Code verlagern, andere nur in Form eines Kernelmoduls ( natives ZFS ist aufgrund von Lizenzbeschränkungen ein bemerkenswertes Beispiel für letzteres), aber so oder so bleibt eine Kernelkomponente erhalten. Dies ist eine wichtige Grundvoraussetzung.

Wenn ein Programm will aus einer Datei lesen, wird es verschiedene Systembibliothek Anrufe ausgeben , die letztlich im Kern in Form eines am Ende open(), read(), close()Sequenz (möglicherweise mit seek()für eine gute Maßnahme geworfen). Der Kernel verwendet den angegebenen Pfad und Dateinamen und übersetzt diese über das Dateisystem und die Geräte-E / A-Ebene in physische Leseanforderungen (und in vielen Fällen auch in Schreibanforderungen - denken Sie beispielsweise an Zeitaktualisierungen) in einen zugrunde liegenden Speicher.

Diese Anforderungen müssen jedoch nicht speziell in physischen, dauerhaften Speicher übersetzt werden . Der Kernel-Vertrag sieht vor, dass durch das Ausgeben dieser bestimmten Systemaufrufe der Inhalt der betreffenden Datei bereitgestellt wird . Wo genau in unserem physischen Bereich die "Datei" existiert, ist zweitrangig.

Auf /procist in der Regel das montiert, was als bekannt ist procfs. Das ist ein spezieller Dateisystemtyp, aber da es sich um ein Dateisystem handelt, unterscheidet es sich nicht wirklich von z. B. 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 Kerneldatenstrukturen zurückgibt .

Die "Speicherschicht" ist in diesem Fall die Kerneldatenstruktur und procfsbietet eine saubere, bequeme Schnittstelle für den Zugriff auf diese. Denken Sie daran, dass das Mounten von procfs at /procnur eine Konvention ist. Sie können es genauso einfach an einer anderen Stelle anbringen. Tatsächlich geschieht dies manchmal, zum Beispiel in Chroot-Gefängnissen, wenn der dort ausgeführte Prozess aus irgendeinem Grund Zugriff auf / proc benötigt.

Das 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 wieder der procfs-Code.

Der besondere Grund für die fileRückkehr emptyist, dass viele der von procfs bereitgestellten Dateien eine Größe von 0 Byte aufweisen. Die 0-Byte-Größe ist wahrscheinlich eine Optimierung auf der Kernelseite (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 in jedem gelesenen Verzeichnis berechnen möglicherweise sehr teuer sein). Going durch die Kommentare zu dieser Antwort, die Sie auf Ihrem eigenes System , indem Sie durch strace oder ein ähnliches Werkzeug, überprüfen können fileausstellt zunächst einen stat()Anruf spezielle Dateien zu erkennen, und nimmt dann die Möglichkeit, falls die Dateigröße gemeldet als 0 , brechen Sie die Datei ab und melden Sie sie 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 Handbuchseite angegeben ist, die möglicherweise Nebenwirkungen hat. Das folgende Zitat stammt aus der BSD-Manpage 5.11 vom 17. Oktober 2011.

Normalerweise versucht file nur, den Typ der Argumentdateien zu lesen und zu bestimmen, die stat (2) als normale Dateien ausgibt. Dies verhindert Probleme, da das Lesen spezieller Dateien besondere Konsequenzen haben kann. Durch die Angabe der -sOption liest file auch Argumentdateien, die Block- oder Zeichenspezialdateien sind. Dies ist nützlich, um die Dateisystemtypen der Daten in unformatierten Festplattenpartitionen zu bestimmen, bei denen es sich um spezielle Blockdateien handelt. Diese Option bewirkt auch, dass die Datei die von stat (2) gemeldete Dateigröße ignoriert, da auf einigen Systemen eine Größe von Null für unformatierte Festplattenpartitionen gemeldet wird .


5
Wenn Sie es mit strace file /proc/versionoder betrachten ltrace -S /proc/version, ist die Optimierung eher gering. Es führt zuerst einen stat()Aufruf durch und stellt fest, dass die Größe 0 ist. Dadurch wird der Befehl übersprungen. open()Vorher werden jedoch mehrere Magic-Dateien geladen.
ott--

2
@ ott-- Das ist zwar eine merkwürdige Folge von Ereignissen, kann aber damit zusammenhängen, dass Sie mehrere Dateinamen übergeben können file. Auf diese Weise lädt file die Magic-Dateien vor und verarbeitet dann die Befehlszeile Parameter für Parameter. Anstatt das Laden der Magic-Datei in den Teil "Tun Sie dies, bevor Sie herausfinden, um welche Art von Datei es sich handelt" zu verschieben, würde dies die Komplexität erhöhen. Das Aufrufen stat()und Reagieren auf seinen Rückgabewert ist im Wesentlichen harmlos; Das Hinzufügen von Komplexität bei der Verfolgung zusätzlicher interner Zustandsrisiken, die zur Einführung von Fehlern führen.
ein Lebenslauf

@ ott-- Der Grund für die Meldung, dass die fileDatei leer ist, liegt darin stat, dass spezielle Dateien ( Named Pipes, Geräte usw.) erkannt und die Verarbeitung leerer Dateien beendet werden. file -s /proc/versionmeldet "ASCII-Text".
Gilles 'SO- hör auf böse zu sein'

4
@Gilles Das -sist für Block / Char-Spezialgeräte gedacht . Schließlich schaute ich auf die fileQuelle und am Ende von fsmagic.c sah ich diese Erklärung, warum es zurückkehrt, ASCII textanstatt 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

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

Sie können sehen, welche Festplatten gemountet sind 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 booten und sich dieses Verzeichnis auf Ihrer Festplatte ansehen, sehen Sie, dass es leer ist. Wenn Sie es unter Ihrem normalen Betriebssystem 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 Ihres Linux-Computers ein neues Dateisystem erstellt.

Mit anderen Worten, es ist nur ein Mittel, um über eine Datei- und Verzeichnistyp-Schnittstelle auf einfache Weise in die Eingeweide des Linux-Systems zu blättern. Wenn Sie sich eine Datei im /procVerzeichnis ansehen , sehen Sie direkt einen Speicherbereich im Linux-Kernel und sehen, was er sehen kann.

Die Ebenen im Dateisystem

Geben Sie hier eine Bildbeschreibung ein

Beispiele:

  • Darin /procbefindet sich ein Verzeichnis für jeden ausgeführten Prozess, das mit seiner Prozess-ID benannt ist. Diese Verzeichnisse enthalten Dateien mit nützlichen Informationen zu den Prozessen, z.
    • exe: Dies ist eine symbolische Verknüpfung zu der Datei auf der Festplatte, von der aus der Prozess gestartet wurde.
    • cwd: Dies ist eine symbolische Verknüpfung zum Arbeitsverzeichnis des Prozesses.
    • wchan: Gibt beim Lesen den wartenden Kanal zurück, auf dem der Prozess läuft.
    • maps: Gibt beim Lesen die Speicherzuordnungen des Prozesses zurück.
  • /proc/uptime Gibt die Betriebszeit als zwei durch ein Leerzeichen getrennte Dezimalwerte in Sekunden zurück:
    • Die Zeit, die seit dem Start des Kernels vergangen ist.
    • Die Zeit, die der Kernel im Leerlauf verbracht hat.
  • /proc/interrupts: 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 sich dieses Verzeichnis auf Ihrer Festplatte ansehen, sehen Sie, dass es leer ist." Dies ist nicht spezifisch für / proc, sondern allgemein für alle Einhängepunkte, an denen das zugrunde liegende Dateisystem nicht eingehängt wurde. Wenn Sie von derselben Boot-CD booten und so etwas tun mount -t procfs procfs /mnt/proc, wird der aktuell ausgeführte Kernel / proc angezeigt.
ein Lebenslauf

5

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

Im einfachsten Fall können Sie mit den normalen Methoden zum Lesen und Schreiben von Dateien mit dem Kernel kommunizieren, anstatt den Kernel direkt aufzurufen. Dies steht im Einklang mit der Unix-Philosophie "Alles ist eine Datei".

Die Dateien in /procexistieren physisch nirgendwo, aber der Kernel reagiert auf die Dateien, die Sie dort lesen und schreiben, und anstatt in den Speicher zu schreiben, meldet er Informationen oder führt etwas aus.

In ähnlicher Weise sind die Dateien in /devnicht wirklich Dateien im herkömmlichen Sinne (obwohl auf einigen Systemen die Dateien /devtatsächlich auf der Festplatte vorhanden sein können, haben sie nicht viel zu bieten, außer auf welches Gerät sie sich beziehen) - sie ermöglichen es Ihnen, zu sprechen auf ein Gerät mit der normalen Unix-Datei-E / A-API - oder auf alles, was es verwendet, wie z. B. Shells


1
Es ist eher * nix ähnlich, dass nur eine Datei gesichert werden kann. Da Zugriffssteuerungslisten im Dateisystem bestehen bleiben, ist es praktisch, privilegierte Ressourcen mit dem allgemeinen Mechanismus zu sichern, der bereits vom Dateisystemtreiber bereitgestellt wird. Dies vereinfacht die Implementierung von Tools, die auf Kernelstrukturen zugreifen, und ermöglicht deren Ausführung ohne erhöhte Berechtigungen, indem stattdessen die virtuellen Dateien des Proc-Dateisystems gelesen werden.
Pekka

3

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

/procist ein virtuelles Dateisystem. Wenn Sie dies tun ls -l /proc/stat, werden Sie zum Beispiel feststellen, dass es eine Größe von 0 Bytes hat, aber wenn Sie "cat / proc / stat" tun, werden Sie einige Inhalte in der Datei sehen.

Wenn ls -l /procSie a ausführen, sehen Sie viele Verzeichnisse mit nur Zahlen. Diese Nummern repräsentieren 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. Beispielsweise liest der Befehl free 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.

2
Das klingt für mich eher nach "Wie verwende ich, was in / proc ist?" anstatt "wie funktioniert / proc?" Nützliche Informationen, aber nicht unbedingt die Beantwortung dieser speziellen Frage .
einen Lebenslauf vom

Jede Datei in / proc enthält Laufzeitinformationen, dh, wenn Sie cat / proc / meminfo im Kernel ausführen, wird eine Funktion zum Generieren des Dateiinhalts ausgeführt.
Shailesh

3

Minimal lauffähiges Beispiel

Der beste Weg, um diese Dinge zu verstehen, besteht meiner Meinung nach darin, tatsächlich damit herumzuspielen. Hier ist ein Kernel-Modul, das einen procfs-Eintrag erstellt:

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");

und dann interagieren wir damit als:

insmod procfs.ko
cat /proc/lkmc_procfs

und das ergibt die Ausgabe:

abcd

Aus diesem Beispiel geht klar hervor, procdass wir mit Dateien beliebige "dateibezogene Systemaufrufe" wie open, readund implementieren können llseek.

Diese Systemaufrufe können dann für eine beliebige Kommunikation mit dem Kernel verwendet werden.

Daher müssen diese Dateien nichts mit tatsächlichen Dateien in Dateisystemen zu tun haben, und das ist bei fast allen der Fall.

In unserem kleinen Beispiel zum Beispiel erstellen wir einfach eine unbrauchbare Datei, für die readimmer ein Wert zurückgegeben wird abcd\n.

Hier ist mein vollautomatisches QEMU + Buildroot-Setup zum einfachen und sicheren Erstellen und Spielen mit diesem Kernel-Modul:

Einige andere ähnliche Schnittstellen umfassen:

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.