4.2 Hardware-/Systeminformationen ermitteln
 
Viele Einträge im /proc-Filesystem erlauben Ihnen, Informationen zur Hardware des Systems zu ermitteln. Das sind interessante Informationen für Systemadministratoren und auch für den Programmierer von Programmen. Hier einige häufig verwendete Einträge im Überblick.
Hinweis Bei diesem Buch handelt es sich nicht um ein Buch zur Erklärung von Hardware. Sollten Sie keinerlei Kenntnisse vom Innenleben Ihres PC haben, dann wäre zusätzliche Literatur recht sinnvoll.
|
4.2.1 CPU-Informationen – /proc/cpuinfo
 
/proc/cpuinfo beinhaltet Informationen zur CPU (Prozessor) oder zu den CPUs, die auf Ihrem System laufen. Ausgegeben wird dabei die Anzahl der Prozessoren. Ist der Wert von »processor« wie im Beispiel 0, so kann dies bedeuten, dass es sich um ein Single-Prozessor-System handelt.
Hinweis Auf SMP (Multi-CPU-Maschinen) ist der Wert von processor ... nicht direkt 0, sondern es wird für jeden Prozessor einzeln »processor, vendor_id« etc. angezeigt, weshalb »auf 0 gesetzt« nicht ganz korrekt ist.
|
Weitere Daten finden Sie zu der CPU-Familie, dem Modell, der Frequenz, der Revision und noch einigem mehr. Hierzu ein Ausschnitt aus meinem System:
$ cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 15
model : 2
model name : Intel(R) Pentium(R) 4 CPU 1.60GHz
stepping : 4
cpu MHz : 1594.865
cache size : 512 KB
fdiv_bug : no
hlt_bug : no
f00f_bug : no
coma_bug : no
fpu : yes
fpu_exception : yes
cpuid level : 2
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 sep mtrr pge mca cmov pat
pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm
bogomips : 3185.04
Oder aus dem System des Fachgutachters:
$ cat /proc/cpuinfo
processor : 0
vendor_id : AuthenticAMD
cpu family : 6
model : 8
model name : AMD Athlon(tm) XP 2000+
stepping : 0
cpu MHz : 1667.065
cache size : 256 KB
fdiv_bug : no
hlt_bug : no
f00f_bug : no
coma_bug : no
fpu : yes
fpu_exception : yes
cpuid level : 1
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 sep mtrr pge mca cmov pat
pse36 mmx fxsr sse syscall mmxext 3dnowext 3dnow
bogomips : 3301.37
avloops/sec : 824435500
Für mehr Informationen zur CPU sei die Dokumentation zu cpuid des Intel Architecture Software Developers Manual, Volume 2, empfohlen.
4.2.2 Geräteinformationen – /proc/devices
 
Hier sind Informationen zu allen verfügbaren Geräten (zeichen- und blockorientiert) wie der Festplatte, dem Diskettenlaufwerk, der seriellen und parallelen Schnittstelle usw. aufgelistet.
4.2.3 PCI-Bus – /proc/pci (nicht 2.6)
 
Die /proc/pci-Datei liefert eine umfangreiche Zusammenfassung der Geräte am PCI-Bus. Dies sind häufig Karten wie die Soundkarte, Netzwerkkarten oder fest eingebaute Geräte wie Modems auf dem Mainboard. Ebenfalls aufgelistet wird dabei die AGP-Grafikkarte. Das Auslesen des PCI-Busses oder der PCI-Busse wird häufiger zur Diagnose bei Problemen mit PCI-Karten verwendet.
4.2.4 Speicherauslastung – /proc/meminfo
 
(S. o. unter 4.1.) In dieser Pseudo-Datei kann der aktuelle Speicherstatus ausgelesen werden. Angezeigt werden der vorhandene und der belegte Speicher (sowohl der physikalische als auch der Swap-Speicher). Ebenfalls lässt sich ermitteln, wie viel davon für geteilten Speicher (Shared Memory), Puffer und Caches belegt ist, die der Kernel benutzt.
4.2.5 Weitere Hardware-Informationen zusammengefasst
 
Es gibt natürlich noch eine Menge mehr Informationen zur Hardware im /proc-Verzeichnis, die allerdings zum Teil auch von der Konfiguration des Systems abhängt. Hierzu eine kleine Zusammenfassung zu weiteren gängigen Einträgen im /proc-Verzeichnis.
Tabelle 4.1
Systeminformationen im /proc-Verzeichnis
Verzeichniseintrag
|
Bedeutung
|
/proc/dma
|
Liste von belegten DMA-Kanälen, die für einen Treiber reserviert sind, und der Name des Treibers
|
/proc/interrupts
|
Liste der benutzten Interrupts mit Anzahl der passierten Interrupts seit Systemstart, Typ des Interrupts und Angabe, durch welche Module dieser Interrupt verwendet wird
|
/proc/ioports
|
Eine Liste aller belegten IO-Ports für die Ein-/Ausgabe wie die Festplatte, Ethernet, Soundkarte, Modem, USB etc. (gemappte Hardware-Speicherbereiche finden sich in /proc/iomem).
|
/proc/stat
|
Allgemeine Informationen über den Status der Prozessoren. Diese Informationen werden vom Programm procinfo verwendet und übersichtlich aufgelistet.
|
/proc/uptime
|
Anzahl der Sekunden, seitdem das System gestartet ist, und wie lange davon die CPU mit dem Nichtstun (HLT) (Leerlaufzeit = engl. idle) verbracht hat
|
/proc/scsi/
|
Unterverzeichnis mit Informationen zu SCSI-Geräten
|
/proc/scsi/scsi
|
Sofern Sie eine SCSI-Schnittstelle besitzten, finden Sie hier eine Auflistung aller Geräte.
|
/proc/ide/
|
Unterverzeichnis mit Informationen zu IDE-Geräten
|
/proc/apm
|
Informationen zum Advanced Power Management (z. B. ein Text wie »AC offline« bedeutet, dass ein Notebook im Batteriebetrieb läuft)
|
/proc/mounts
|
Liste aller »gemounteten« Dateisysteme
|
/proc/net/
|
Unterverzeichnis zu Netzwerkinformationen
|
/proc/loadavg
|
Duchschnittliche Systemauslastung (eine Minute, drei Minuten, fünf Minuten, aktive Prozesse/Anzahl Prozesse, und zuletzt benutzte PID)
|
Das folgende Listing soll Ihnen jetzt demonstrieren, wie einfach es ist, aus dem System nützliche Informationen zur Hardware ausgeben zu lassen. Das Beispiel stellt eine einfache Schnittstelle dar, die es zu erweitern gilt. Damit haben Sie schon die Grundlage für ein Systemprogramm zur Hand. Sollte es ein Konsolenprogramm werden, dann müssten Sie die Ausgabe benutzerfreundlich anpassen; ebenfalls dann, wenn Sie nur einzelne Informationen ausgeben wollen. Natürlich können Sie über das Programm auch ein grafisches Frontend ziehen. Denn auch die Systemprogramme von KDE oder GNOME machen nichts anderes, als die Daten aus dem /proc-Filesystem zu lesen und entsprechend auszugeben.
/* myinfo.c */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#define BUF 4096 /* Anpassen */
enum {
CPU, DEV, DMA, INT, IOP, MEM, PCI, VERS, SCSI, EXIT
};
static const char *info[] = {
"/proc/cpuinfo", "/proc/devices", "/proc/dma",
"/proc/interrupts", "/proc/ioports", "/proc/meminfo",
"/proc/pci", "/proc/version", "/proc/scsi/scsi"
};
static void get_info (const int inf) {
FILE *fp;
char buffer[BUF];
size_t bytes_read;
if((fp = fopen(info[inf], "r")) == NULL) {
perror("fopen()");
return;
}
bytes_read = fread (buffer, 1, sizeof (buffer), fp);
fclose (fp);
if (bytes_read == 0 || bytes_read == sizeof (buffer))
return;
buffer[bytes_read] = '\0';
printf("%s",buffer);
printf("Weiter mit ENTER");
getchar();
return;
}
int main (void) {
int auswahl;
do {
printf("Wozu benötigen Sie Informationen?\n\n");
printf("-%d- Prozessor\n", CPU);
printf("-%d- Geräte\n", DEV);
printf("-%d- DMA\n", DMA);
printf("-%d- Interrupts\n", INT);
printf("-%d- I/O-Ports\n", IOP);
printf("-%d- Speicher\n", MEM);
printf("-%d- PCI-Bus\n", PCI);
printf("-%d- Version\n", VERS);
printf("-%d- SCSI\n", SCSI);
printf("-%d- Programmende\n", EXIT);
printf("\nIhre Auswahl : ");
do{ scanf("%d",&auswahl); } while(getchar() != '\n');
switch(auswahl) {
case CPU : get_info(CPU); break;
case DEV : get_info(DEV); break;
case DMA : get_info(DMA); break;
case INT : get_info(INT); break;
case IOP : get_info(IOP); break;
case MEM : get_info(MEM); break;
case PCI : get_info(PCI); break;
case VERS: get_info(VERS); break;
case SCSI: get_info(SCSI); break;
case EXIT: printf("Bye\n"); break;
default : printf("Falsche Eingabe?\n");
}
} while(auswahl != EXIT);
return EXIT_SUCCESS;
}
Das Programm im Einsatz:
$ gcc -o myinfo myinfo.c
$ ./myinfo
Wozu benötigen Sie Informationen?
-0- Prozessor
-1- Geräte
-2- DMA
-3- Interrupts
-4- I/O-Ports
-5- Speicher
-6- PCI-Bus
-7- Version
-8- SCSI
-9- Programmende
Ihre Auswahl : 8
Attached devices:
Host: scsi0 Channel: 00 Id: 00 Lun: 00
Vendor: TOSHIBA Model: DVD-ROM SD-R2102 Rev: 1316
Type: CD-ROM ANSI SCSI revision: 02
Weiter mit ENTER
...
Hinweis Fragen zum Löschen des Bildschirms in einem Terminal finden Sie im entsprechenden Kapitel (Terminal I/O).
|
|