# Das /proc-Dateisystem

Das `/proc`-Verzeichnis ist kein wirkliches Dateisystem, sondern eine Schnittstelle zum Kernel. Die Dateien, die in diesem Verzeichnis liegen, benutzen keinen Speicherplatz auf der Platte, sind aber trotzdem les- und in manchen Fällen auch beschreibbar.

Seinen Namen trägt dieses Verzeichnis daher, daß es für jeden laufenden Prozess ein Unterverzeichnis bereithält, das Informationen über diesen Prozess zur Verfügung stellt. Das Unterverzeichnis trägt als Namen die ProzeßID (PID) des jeweiligen Prozesses. Es enthält unter anderem folgende Dateien:

- `cmdline`
  Die Kommandozeile, mit der der Prozeß gestartet wurde, mit allen verwendeten Parametern.
- `cwd`
  (current working directory) Ein symbolischer Link auf das Verzeichnis, das beim Aufruf des Prozesses das aktuelle Arbeitsverzeichnis war.
- `environ`
  Die komplette Umgebung des Prozesses (Variablen, Funktionen usw) sofern er eine Umgebung hat.
- `exe`
  Ein symbolischer Link auf das aufgerufene Programm, daß den Prozeß ausmacht.
- `root`
  Ein symbolischer Link auf das Verzeichnis, das für den Prozeß das Wurzelverzeichnis darstellt.

Daneben finden sich weitere Informationen zu den verwendeten Ressourcen (Speicher, Libraries) und ein Unterverzeichnis fd, das die File-Descriptoren aller vom Prozeß verwendeten Dateien enthält.

Diese Information wird beispielsweise von den Programmen verwertet, die Prozeß-Informationen ausgeben.

Was aber für uns im Zusammenhang mit Hardware wesentlich wichtiger ist, ist die Möglichkeit, im /proc-Verzeichnis auf bestimmte Informationen zuzugreifen, die hardwarerelevant sind.

### Die Hardwareparameter im /proc-Verzeichnis

Wie schon aus der Seite Hardwareparameter hervorgegangen ist, benötigen wir, um bestimmte Hardware anzusprechen, Einstellungen, die sowohl auf der Hardwareseite vorgenommen sein müssen, als auch dem Betriebssystem bekannt sein müssen. Um festzustellen, welche dieser Parameter Linux welcher Hardware zuweist bietet uns das `/proc`-Verzeichnis mehrere Dateien, die diese Information beinhalten. Nochmal zur Erinnerung: Es handelt sich hierbei nicht um reale Dateien, sondern um Schnittstellen zum Kernel. Es sind also keine statischen Informationen sondern die gegenwärtigen Informationen des Kernels, welche Parameter von welcher Hardware benutzt werden. Diese Dateien sind hervorragende Diagnosewerkzeuge, die bei der Fehlersuche meist gute Dienste leisten. Ihr Inhalt ist mit Programmen wie cat oder less einsehbar.

Für die Hardware-Parameter spielen folgende Dateien im `/proc`-Verzeichnis eine Rolle:

`/proc/interrupts`
  Zeigt eine Liste der im Augenblick benötigten IRQ-Kanäle an, zusammen mit der Information, wer diese IRQs benutzt (wem sie zugewiesen sind) und wie oft die jeweiligen IRQs schon ausgelöst wurden.
`/proc/ioports`
  Zeigt eine Liste der IO-Adressen an, die gegenwärtig in Benutzung sind und die Information, wem sie zugeordnet sind. Die Adressen werden als Adressbereich angegeben, der zeigt, wie breit der Zugriff auf eine solche Adresse ist. Die Angabe

        0170-0177 : ide1

  zeigt etwa, daß auf die zweite IDE-Schnittstelle mit 8 Bit Breite (170-177=8 Bit) zugegriffen wird. (Es handelt sich hier um die Zugriffsbreite auf den Controller, nicht auf die Daten!).
`/proc/dma`
  Hier finden wir die Angabe der benutzten DMA-Kanäle zusammen mit der Information, wer sie benutzt.
`/proc/iomem`
  Hier werden uns die Speicherbereiche der verschiedenen Speicherarten angezeigt. Dazu zählen neben dem normalen Arbeitsspeicher (System RAM) auch die Bereiche Bildschirmspeicher der Graphikkarte (Video RAM) und die jeweiligen ROMs der Hauptplatine (System ROM) und der Erweiterungskarten (z.B. Video ROM), sowie der Speicher des PCI-Systems, in dem die Bus-Informationen abgelegt sind. Diese Angaben sind als Adressbereiche (Startadresse - Endadresse) angegeben.

### Andere Hardwareinformationen im /proc-Verzeichnis

Neben den verwendeten Hardwareparametern finden sich im `/proc` Verzeichnis noch einige andere interessante Informationen über die verwendete Hardware, die für Diagnosezwecke sehr brauchbar sind. Dazu zählen die Dateien:

`/proc/cpuinfo`
  Alle Informationen, die der Kernel über den/die verwendeten Prozessor(en) hat, sind hier nachzulesen. Dazu zählen Prozessortyp und -modell, Taktrate, Cache-Größe und viele Angaben über mögliche Prozessorbugs.
`/proc/devices`
  Eine Liste der block- und zeichenorientierten Geräte, die der Kernel aktuell unterstützt. Neben der jeweiligen Angabe des Gerätenamens finden wir hier auch die verwendete Major-Number.
`/proc/partitions`
  Eine Liste aller dem System bekannten Plattenpartitionen, mitsamt Major- und Minornummern. Je nachdem, ob der Kernel das devfs Dateisystem unterstützt oder nicht, werden die Angaben in der Form

        major minor  #blocks  name
         3     0   16617888 hda
         3     1    1028128 hda1

  (alte Darstellung) oder

        major minor  #blocks  name
         3     0   19925880 ide/host0/bus0/target0/lun0/disc
         3     1    4200966 ide/host0/bus0/target0/lun0/part1

  (neue Darstellung bei Verwendung von devfs) angezeigt.
`/proc/pci`
  Informationen, die der Scan des PCI-Busses ergeben haben. Hier finden sich Informationen über alle am System angeschlossenen PCI-Geräte. Auch der AGP-Bus (der in Wahrheit nur ein extra PCI-Bus mit nur einem Steckplatz ist) ist hier angegeben zusammen mit allen gefundenen Karten.

### Kernel- und Softwareinformationen im /proc-Verzeichnis

Neben der Hardware-Information hält das `/proc`-Verzeichnis auch noch einige Details über den Kernel selbst und seine Fähigkeiten zur Verfügung, sowie Informationen über aktuelle Systemzustände. Dazu zählen:

`/proc/cmdline`
  Die Kommandozeile, mit der der Kernel selbst gestartet wurde. Hier sind auch die entsprechenden Kernelparameter nachzulesen, die beim Booten mitgegeben wurden. Außerdem ist der Dateiname des aktuellen Kernels genannt.
`/proc/filesystems`
  Eine Liste aller Dateisystemtypen, die der Kernel im Augenblick kennt.
`/proc/meminfo`
  Informationen über die gegenwärtige Auslastung des Arbeitsspeichers.
`/proc/modules`
  Eine Liste der aktuell geladenen Kernel-Module.
`/proc/mounts`
  Eine Liste aller gemounteter Dateisysteme. Hier finden sich auch die Dateisysteme, die mit der Option -n gemountet wurden und so weder in der Datei `/etc/mtab` stehen, noch durch den Befehl df anzeigbar sind.
`/proc/version`
  Die aktuelle Kernelversion.

### Weitere wichtige Unterverzeichnisse in /proc

Neben den besprochenen Dateien finden sich auch noch eine Menge Unterverzeichnisse im `/proc`-Verzeichnis, die weitere Informationen über angeschlossene Geräte und Kernelfeatures enthalten. Dazu zählen insbesondere:

`/proc/bus`
  Informationen über die gefundenen Bussysteme (PCI, USB, ...)
`/proc/ide`
  Informationen über IDE-Geräte und -Schnittstellen.
`/proc/scsi`
  Informationen über SCSI-Geräte und Schnittstellen.
`/proc/net`
  Informationen über netzwerk-relevante Einstellungen. Hier finden wir beispielsweise die Routing-Tabellen und die ARP-Informationen, die der Kernel im Augenblick besitzt.

### Aktive Veränderungsmöglichkeiten unter /proc/sys

Bisher haben wir das `/proc` Verzeichnis nur benutzt, um uns Informationen über bestimmte Kerneleigenschaften geben zu lassen. Im Verzeichnis `/proc/sys` können wir aber auch die Einstellungen bestimmter Kernelfähigkeiten verändern. Das geschieht dadurch, daß wir die gewünschten Werte in die Dateien schreiben, statt sie nur zu lesen. In der Regel handelt es sich hierbei aber nur um Dateien, die einzelne Werte enthalten, meist eine 1 oder 0, die ein "wahr" oder "falsch" repräsentieren.

Ein einfaches Beispiel für diese Fähigkeit ist die Einstellung, ob unser Kernel in der Lage ist, als Router zu arbeiten oder nicht. Ein Router ist ein Rechner, der einzelne Netzwerkpakete von einer Netzschnittstelle zu einer anderen weitergibt. Ob diese Fähigkeit aktiviert ist oder nicht, erfahren wir, wenn wir uns den Inhalt der Datei `/proc/sys/net/ipv4/ip_forward` ansehen. Wir schreiben also

      cat /proc/sys/net/ipv4/ip_forward

Als Ausgabe bekommen wir eine 0, was soviel bedeutet, wie "Nein". Jetzt wollen wir unseren Kernel routing-fähig machen. Dazu schreiben wir eine 1 in diese Datei hinein. Dazu bedienen wir uns nicht eines Editors, sondern einfach des Befehls echo Dieser Befehl gibt etwas auf die Standard-Ausgabe aus, was wir aber dann in die gewünschte Datei umleiten:

      echo 1 > /proc/sys/net/ipv4/ip_forward

Und schon ist der Kernel in der Lage zu routen.

An diesem Beispiel wird klar, daß das `/proc`-Verzeichnis auch zur Veränderung der Kerneleigenschaften geeignet ist. Im Großen und Ganzen sind alle Einstellungen unter `/proc/sys` auf diese Weise variierbar.