3.4    Alles virtuell? »/proc«

Unter /proc finden Sie auf jedem Linux-System ein virtuelles Pseudodateisystem, in dem sich sehr viele Informationen des Linux-Kernels finden und zum Teil auch verändern lassen. So gibt es dort beispielsweise Informationen zu allen Prozessen, die das Programm top aufbereitet zur Verfügung stellt, oder auch Informationen über den Speicher, das Netzwerk, Treiber und vieles andere mehr. In diesem Abschnitt stellen wir Ihnen ausgewählte Informationen zur Verfügung, sodass Sie einen umfassenden Überblick über Ihr System bekommen.

3.4.1    CPU

CPU-Informationen finden Sie in der virtuellen Datei /proc/cpuinfo, die Sie nicht mit einem Editor bearbeiten, sondern nur anzeigen können (siehe Listing 3.47). Wie allgemein üblich, beginnt die Nummerierung bei 0.

root@debian:~# cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 37
model name : Intel(R) Core(TM) i3 CPU M 390 @ 2.67GHz
stepping : 5
microcode : 0x2
cpu MHz : 933.000
cache size : 3072 KB
physical id : 0
siblings : 4
core id : 0
cpu cores : 2
apicid : 0
initial apicid : 0
fpu : yes
fpu_exception : yes
cpuid level : 11
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov \
pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lm \
constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf \
pni dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm pcid sse4_1 sse4_2 \
popcnt lahf_lm arat dtherm tpr_shadow vnmi flexpriority ept vpid
bogomips : 5319.90
clflush size : 64
cache_alignment : 64
address sizes : 36 bits physical, 48 bits virtual
power management:

ssse3 cx16 sse4_1 lahf_lm
[…]

Listing 3.47    CPU-Informationen

Vermutlich wussten Sie schon, welche CPU Ihr System verwendet, aber in der Ausgabe finden Sie darüber hinaus die Taktfrequenz, mit der der Prozessor momentan läuft, und, was besonders wichtig ist, welche Funktionen die CPU unterstützt. Diese Funktionen werden unter flags zusammengefasst. Interessant sind dabei insbesondere die folgenden ausgewählten Features:

[+] Die Ausgabe zeigt nur, welche Funktionen von der CPU insgesamt unterstützt werden, aber nicht, ob sie auch im BIOS des Computers eingeschaltet wurden:

3.4.2    RAM

Analog zur CPU-Information /proc/cpuinfo lassen sich Informationen zur Speichernutzung unter /proc/meminfo finden.

root@debian:~# cat /proc/meminfo
MemTotal: 7991496 kB
MemFree: 216068 kB
Buffers: 246168 kB
Cached: 4833504 kB
SwapCached: 128 kB
Active: 4519088 kB
Inactive: 2990956 kB

Listing 3.48    Speicherinformationen

[+] Insgesamt ist die Auflistung 42 Zeilen lang. Linux nutzt allen nicht gebrauchten Speicher für Buffers und Cached, dementsprechend niedrig ist der Wert für den freien Speicher MemFree. Wenn Sie aber die Werte von Buffers und Cached hinzuzählen, kommen Sie in diesem Fall auf über 5 GB verwendbaren Speicher.

Ein besonderes Augenmerk sollten Sie bei 32-Bit-Systemen auf die Werte von HighFree und LowFree werfen. Da der Kernel für seine Strukturen nur den Low-Memory-Bereich verwendet, können Sie eine »Speicher voll«-Meldung bekommen, obwohl noch ausreichend freier Platz im High-Memory-Bereich verfügbar ist. Listing 3.49 zeigt Ihnen eine Beispielausgabe eines 32-Bit-Systems:

root@debian:~# cat /proc/meminfo
[…]
HighTotal: 1179520 kB
HighFree: 55688 kB
LowTotal: 897368 kB
LowFree: 322108 kB
[…]

Listing 3.49    Speicherauslastung eines 32-Bit-Systems

Auch wenn es kaum noch 32-Bit-Systeme für den Serverbereich zu kaufen gibt, installieren immer noch einige Administratoren 32-Bit-Betriebssysteme auf 64-Bit-Systemen.

[+]  Irrglaube

Oft hört man, dass sich die Umstellung auf 64 Bit erst bei Speicher jenseits der 4 GB lohne, Fakt ist aber, dass die Begrenzung von Low- und High-Memory schon vorher stattfindet. Zusätzlich verarbeitet ein 64-Bit-System pro Prozessortakt die doppelte Menge an Daten, wenn es die verwendeten Programme erlauben.

3.4.3    Kernelkonfiguration

Von den im Buch verwendeten Distributionen bietet nur openSUSE eine virtuelle Datei namens /proc/config.gz, die die aktuelle Kernelkonfiguration enthält. Einen kurzen Ausschnitt aus der Datei sehen Sie in Listing 3.50. Mit diesen Informationen können Sie prüfen, mit welchen Optionen der laufende Kernel übersetzt wurde:

#
# Automatically generated file; DO NOT EDIT.
# Linux/x86_64 3.11.10 Kernel Configuration
#
CONFIG_64BIT=y
CONFIG_X86_64=y
CONFIG_X86=y
CONFIG_INSTRUCTION_DECODER=y
CONFIG_OUTPUT_FORMAT="elf64-x86-64"
CONFIG_ARCH_DEFCONFIG="arch/x86/configs/x86_64_defconfig"
CONFIG_LOCKDEP_SUPPORT=y
CONFIG_STACKTRACE_SUPPORT=y
CONFIG_HAVE_LATENCYTOP_SUPPORT=y
CONFIG_MMU=y
[…]

Listing 3.50    Auszug aus der Datei »config.gz«

3.4.4    Kernelparameter

Die Parameter, mit denen der aktuell laufende Kernel gestartet wurde, finden Sie unter /proc/cmdline:

centos# cat /proc/cmdline
BOOT_IMAGE=/vmlinuz-3.10.0-327.22.2.el7.x86_64 root=/dev/mapper/centos_centos-root \
ro crashkernel=auto rd.lvm.lv=centos_centos/root rd.lvm.lv=centos_centos/swap rhgb \
quiet LANG=en_US.UTF-8

opensuse# cat /proc/cmdline
BOOT_IMAGE=/boot/vmlinuz-4.1.27-27-default root=UUID=0f4f79aa-7544-44b0-a8b7-\
d1f1947cd24f resume=/dev/disk/by-uuid/54c1a2e0-c4d6-4850-b639-7a5af8ef4339 \
splash=silent quiet showopts

debian# cat /proc/cmdline
BOOT_IMAGE=/boot/vmlinuz-3.16.0-4-amd64 root=UUID=eac6da17-314e-43c0-956f-\
379457a505fa ro quiet

ubuntu:# cat /proc/cmdline
BOOT_IMAGE=/vmlinuz-4.4.0-31-generic root=/dev/mapper/ubuntu--vg-root ro

Listing 3.51    Standard-Kernelparameter aller verwendeten Distributionen

3.4.5    Gemountete Dateisysteme

Der Kernel muss natürlich auch wissen, welche Dateisysteme aktuell eingebunden sind. Diese Information wird in der virtuellen Datei /proc/mounts zur Verfügung gestellt. Sie ist aber auch als Ausgabe des mount-Kommandos oder in der Datei /etc/mtab zu finden:

opensuse:~ # grep mapper /proc/mounts
/dev/mapper/system-root / ext4 rw,relatime,data=ordered 0 0

opensuse:~ # mount -v | grep mapper
/dev/mapper/system-root on / type ext4 (rw,relatime,data=ordered)

opensuse:~ # grep mapper /etc/mtab
/dev/mapper/system-root / ext4 rw,relatime,data=ordered 0 0

Listing 3.52    Gemountete Dateisysteme

3.4.6    Prozessinformationen

Im Verzeichnis /proc finden Sie für jeden auf Ihrem Linux-System laufenden Prozess ein Unterverzeichnis unter dem Namen der Prozess-ID. Diese Informationen werden von vielen Tools benutzt.

Als Beispiele seien hier ps (»process stats«) und lsof (»list open files«) genannt.

root@debian:~# ls /proc/26803
attr coredump_filter io mountstats pagemap stat
autogroup cpuset limits net personality statm
auxv cwd loginuid ns root status
cgroup environ maps numa_maps sched syscall
clear_refs exe mem oom_adj sessionid task
cmdline fd mountinfo oom_score smaps wchan
comm fdinfo mounts oom_score_adj stack

Listing 3.53    Prozessinformationen eines Prozesses

File Descriptors finden Sie für jeden Prozess im Unterverzeichnis fd. Dort sind symbolische Links für jede benutzte Datei zu finden. In Listing 3.54 ist es der PDF-Betrachter okular, der eine Datei geöffnet hat:

root@debian:~# ls -l /proc/26803/fd
total 0
lr-x------ 1 dirk dirk 64 Aug 17 17:42 0 -> pipe:[10146]
l-wx------ 1 dirk dirk 64 Aug 17 17:42 1 -> /home/dirk/.xsession-errors
lr-x------ 1 dirk dirk 64 Aug 17 17:42 10 -> anon_inode:inotify
lr-x------ 1 dirk dirk 64 Aug 17 17:42 11 -> /home/dirk/Downloads/Anleitung.pdf
l-wx------ 1 dirk dirk 64 Aug 17 17:42 2 -> /home/dirk/.xsession-errors
lrwx------ 1 dirk dirk 64 Aug 17 17:42 3 -> anon_inode:[eventfd]
lr-x------ 1 dirk dirk 64 Aug 17 17:42 4 -> pipe:[185471]
l-wx------ 1 dirk dirk 64 Aug 17 17:42 5 -> pipe:[185471]
lrwx------ 1 dirk dirk 64 Aug 17 17:42 6 -> socket:[185472]
lrwx------ 1 dirk dirk 64 Aug 17 17:42 7 -> socket:[185194]
lrwx------ 1 dirk dirk 64 Aug 17 17:42 8 -> socket:[185195]
lr-x------ 1 dirk dirk 64 Aug 17 17:42 9 -> /var/tmp/kdecache-dirk/ksycoca4

Listing 3.54    Geöffnete Dateien des PDF-Betrachters

Weiterhin finden Sie unterhalb des Unterverzeichnisses mit der Prozess-ID die virtuelle Datei environ, die das Environment enthält, mit dem der Prozess gestartet wurde.

Beachten Sie bitte, dass die einzelnen Shell-Variablen durch den »Null Character« getrennt sind und dass Sie die Ausgabe vor der Sichtung umformatieren müssen. Das kann das Programm tr (»translate or delete characters«) erledigen, wie Listing 3.55 zeigt:

root@debian:~# tr "\0" "\n" < /proc/26803/environ
KDE_FULL_SESSION=true
DM_CONTROL=/var/run/xdmctl
GS_LIB=/home/dirk/.fonts
USER=dirk
LANGUAGE=en_US:en
[…]

Listing 3.55    Lesbarer Inhalt von »environ«

Weiterhin findet sich in der virtuellen Datei cmdline der Aufruf des Programms mit allen verwendeten Parametern. Auch hier wird der »Null Character« zur Trennung benutzt:

root@debian:~# tr "\0" "\n" < /proc/26803/cmdline
/usr/bin/okular
--icon
okular
-caption
Okular

Listing 3.56    Lesbarer Inhalt von »cmdline«

3.4.7    Netzwerk

Die das Netzwerk betreffenden Informationen – Netzwerkkarten, Protokolle, Module etc. – sind sehr vielfältig und liegen in einigen Hundert Dateien unterhalb von /proc/net und /proc/sys/net. Wir können im Rahmen dieses Buches leider nicht alle Dateien beschreiben.

Fast alle Parameter rund um TCP (Transmission Control Protocol) lassen sich dynamisch verändern. So können Sie beispielsweise durch das in Listing 3.57 gezeigte Beispiel das Routing auf Ihrem System einschalten:

root@debian:~# echo "1" > /proc/sys/net/ipv4/ip_forward

Listing 3.57    Routing einschalten

Unterhalb von /proc/sys/net/ipv4/conf finden Sie zu jeder Netzwerkkarte die IPv4 betreffenden Konfigurationen:

root@debian:~# ls /proc/sys/net/ipv4/conf
all default eth0 lo sit0 wlan0

Listing 3.58    Netzwerkkarten unterhalb von IPv4

Einen Sonderfall nehmen dabei die Verzeichnisse all und default ein. Mit ihnen können Sie Optionen setzen, die für alle Netzwerkkarten gelten sollen (all), bzw. Optionen, die für neue Netzwerkkarten gelten sollen (default).

3.4.8    Änderungen dauerhaft speichern

Wie eingangs erwähnt wurde, ist /proc ein virtuelles Dateisystem. Das bedeutet insbesondere, dass Änderungen, die Sie dort vornehmen, einen Neustart des Systems nicht überstehen.

Dauerhafte Konfigurationen sollten also in der Datei /etc/sysctl.conf vorgenommen werden. Hier können alle Kerneleinträge aufgenommen werden, die unterhalb von /proc/sys angezeigt werden.

Wie Sie in Listing 3.59 sehen, ist die Syntax nahezu selbsterklärend. Eine Besonderheit gibt es jedoch: Wenn Sie den Pfad zum Parameter gefunden haben, entfernen Sie das /proc/sys/ und ersetzen einfach alle Slashes durch Punkte, dann haben Sie den Variablennamen für die /etc/sysctl.conf. Aus /proc/sys/net/ipv4/ip_forward wird somit net.ipv4.ip_forward:

root@debian:~# grep ip_forward /etc/sysctl.conf
net.ipv4.ip_forward=1

Listing 3.59    Das Forwarding in der Datei »sysctl.conf« dauerhaft eintragen

Mit dem Kommando sysctl -p können Sie alle Einstellungen, die Sie vorgenommen haben, sofort und ohne Neustart übernehmen.

Das Kommando sysctl -a zeigt Ihnen die aktuellen Werte aller knapp 1.000 änderbaren Parameter an.

3.4.9    Abschlussbemerkung

Durch das Studieren der Dateien unterhalb von /proc können Sie sehr viel über Ihr laufendes System erfahren. Im Normalfall werden Sie jedoch vermutlich Tools verwenden, die Ihnen die Daten aufbereitet darstellen. Mit jeder neuen Kernelversion kommen neue Parameter hinzu und alte Parameter fallen weg. Einen umfassenden Überblick können Sie nur bekommen, wenn Sie die Kerneldokumentation direkt lesen.