1 Systemdiagnose
Transcrição
1 Systemdiagnose
Systemdiagnose 1 Systemdiagnose In diesem Kapitel lernen Sie · die Fähigkeit, viele detaillierte Informationen über das System und die Hardware zu finden, unter anderem, wie Sie herausfinden, welche Chipsätze Komponenten wie Grafikkarten und Netzwerkkarten enthalten und was Sie zu deren Konfiguration benötigen. · Kerneleigenschaften zur Laufzeit zu beeinflussen. · Kernel-Laufzeitvariablen flüchtig und dauerhaft zu setzen. · IDE-Festplattenzugriffe zu optimieren. · SCSI-Geräte im laufenden Betrieb hinzuzufügen/zu entfernen. 1.1 Das /proc-Dateisystem 1.1.1 Das Verzeichnis /proc Im Linux-Kernel wird eine besondere Schnittstelle für die Anzeige der KernelLaufzeit-Parameter benutzt. Die Schnittstelle besteht aus einem Pseudo-Dateisystem, dem proc-Dateisystem (gemountet im Verzeichnis /proc). In diesem Dateisystem finden sich alle möglichen Dateien, die Kernel-Parameter oder Kernel-Tabellen und Strukturen beinhalten. „Pseudo-Dateisystem“ bedeutet dabei, dass dahinter kein physikalisches Gerät, vielmehr werden die Inhalte „Dateien“ beim Lesen direkt vom Kernel geliefert. Viele UNIX-Administrationsprogramme nutzen die Informationen aus dem /proc-Dateisystem. Das /proc-Dateisystem ist einzigartig unter den Betriebssystemen, denn damit kann man nicht nur richtig gut in den Kern und in die Hardware hineinschauen, sondern auch Kernel-Parameter zur Laufzeit verändern. Sehr ausführliche Dokumentation findet man in der Kernel-Dokumentation /usr/src/linux/Documentation/filesystems/proc.txt oder in der Man-Page man 5 proc. Beispiele für /proc-Dateien: interrupts ist eine Liste der benutzten Interrupts. ioports ist eine Liste der belegten IO-Ports. 8 ✎ 1.1 Das /proc-Dateisystem dma ist eine Liste der belegten DMA-Kanäle. devices beinhaltet Informationen, welche Geräte-Treiber im Kernel geladen sind. Die Zahl vor dem Treiber repräsentiert die Major-Number , also die Treiber-Nummer des Geräte-Treibers. Will man Gerätedateien für dieses Gerät mit mknod anlegen, so muss man diesem unter anderem diese Treibernummer angeben. pci hat Informationen über die PCI-Geräte im System. Ab Kernel 2.6 ist diese Datei nicht mehr vorhanden; dafür sind ähnliche Informationen in der Datei /proc/bus/pci/devices zu finden . cpuinfo enthält den Typ/Geschwindigkeit des Prozessors. mounts (LPI 2: 203.1) (LPI 2: 209.2) liefert eine stets aktuelle Liste der zur Zeit gemounteten Dateisysteme (und ändert sich immer beim Aufruf eines mountbzw. umount-Kommandos). Dies ist besonders dann nützlich, wenn das RootFilesystem nur read-only gemountet ist, und dadurch die eigentlich dafür zuständige Datei /etc/mtab nicht den aktuellen Zustand repräsentieren kann. Das Format der Datei ist mit dem der Datei /etc/fstab identisch, nur dass hier die letzten beiden Spalten (die für fsck bzw. dump zuständig sind) keine Bedeutung haben und stets als 0 angegeben werden. Dokumentation zu dieser Datei findet man mittels man mount und man fstab. partitions ist eine Liste aller Partitionen aller Platten, die der Kernel kennt. Die Zahlen vor dem Gerätenamen sind die Major-Number, die Minor-Number der Gerätedatei und die Partitionsgröße. tty/driver/serial zeigt den Zustand der seriellen Schnittstellen an. sys/dev/parport/parportSchnittstellen-Nummer/ enthält Konfigurationen zu den parallelen Schnittstellen. Besonders interessant ist hier die Datei irq, die den der Schnittstelle zugewiesenen IRQ enthält (-1 bedeutet, dass die Schnittstelle keinen IRQ belegt). Beachten Sie dabei, dass das Modul parport_pc geladen sein muss, damit dies im /proc-Dateisystem erscheint. sys/dev/cdrom/info zeigt Informationen über die eingebauten CD-Laufwerke an. driver/rtc steht für „Real Time Clock“ und überwacht die Echtzeituhr des Systems. Interessant ist hier der Batteriestatus! loadavg zeigt den Durchschnittswert der Systemlast. uptime zeigt an, wie lange das System schon läuft. Tipp: Eine übersichtlichere und deutlich lesbarere Variante zu /proc/pci bzw. /proc/bus/pci/devices liefert das Kommando lspci 9 Systemdiagnose $ lspci 00:00.0 Host bridge: Acer Laboratories Inc. [ALi] M1541 (rev 04) 00:01.0 PCI bridge: Acer Laboratories Inc. [ALi] M5243 (rev 04) 00:07.0 ISA bridge: Acer Laboratories Inc. [ALi] M1533 PCI to ISA Bridge [Aladdin IV] (rev c3) 00:08.0 Ethernet controller: Realtek Semiconductor Co. RTL-8139 (rev 10) 00:09.0 SCSI storage controller: Symbios Logic Inc. 53c810 (rev 23) 00:0a.0 SCSI storage controller: Symbios Logic Inc. 53c810 (rev 02) 00:0f.0 IDE interface: Acer Laboratories Inc. [ALi] M5229 IDE (rev c2) 01:00.0 VGA compatible controller: ATI Technologies 3D Rage IIC AGP (rev 7a) Dieses Kommando ist nützlich, um herauszufinden, welchen Chipsatz eine neue Netzwerkkarte, die Grafikkarte oder der SCSI-Controller hat. Damit fällt es leicht, das passende Kernel-Treibermodul zu finden, da die Module auch nach dem Chipsatz benannt sind, und nicht nach dem Kartennamen. Tipp: Eine sehr gute Übersicht über Geräte, IRQs, I/O-Ports und DMA-Kanäle liefert der Befehl lsdev (LPI 2: 201.5): $ lsdev Device DMA IRQ I/O Ports -----------------------------------------------53c7,8xx 9 10 cascade 4 2 dma 0080-008f dma1 0000-001f dma2 00c0-00df eth0 11 dc00-dcff fpu 13 00f0-00ff ide0 14 01f0-01f7 03f6-03f6 ffa0-ffa7 ide1 15 0170-0177 0376-0376 ffa8-ffaf keyboard 1 0060-006f ncr53c7,8xx d400-d47f d800-d87f pic1 0020-003f pic2 00a0-00bf rtc 8 0070-007f serial 3 02f8-02ff 03f8-03ff timer 0 0040-005f vga+ 03c0-03df Tipp: 10 Auch procinfo liefert eine Übersicht über das System: 1.1 Das /proc-Dateisystem # procinfo Linux 2.6.18-8.el5 ([email protected]) (gcc 4.1.1 20070105) #1 SMP Thu Mar 15 19:57:35 EDT 2007 1CPU [localhost] Memory: Mem: Swap: Total 483096 618492 Bootup: Mon Dec user : nice : system: idle : steal : uptime: irq 0: irq 1: irq 3: irq 4: irq 5: irq 6: irq 7: irq 8: irq 9: irq 10: 1.1.2 Used 446592 0 Free 36504 618492 1 14:40:40 2008 0:03:23.46 0:00:00.11 0:00:46.49 20:36:09.71 0:00:00.00 20:40:06.57 74421046 10 4 5 1 6 0 1 1 0 0.3% 0.0% 0.1% 99.7% 0.0% Shared 0 Buffers 77876 Load average: 0.00 0.00 0.00 1/81 5225 page page swap swap in : out: in : out: 0 0 0 0 context : 3840907 timer i8042 floppy [2] parport0 rtc acpi MPU401 UART irq 11: irq 12: irq 14: irq 15: irq169: irq177: irq185: irq193: irq201: irq209: 1 118 34099 667903 25548 0 0 0 0 23915 i8042 ide0 ide1 eth0 ohci_hcd:usb1 ohci_hcd:usb2 ohci_hcd:usb3 ehci_hcd:usb4 SiS SI7012, eth1 Das Verzeichnis /proc/net/ Einige Kernel-Netzwerk-Tabellen befinden sich im Verzeichnis /proc/net/. ✎ Beispiele /proc/net/-Dateien: dev Tabelle der Netzwerk-Devices mit Statistiken arp die ARP-Tabelle route die Routing-Tabelle ip_masquerade enthält eine Übersicht, über alle Verbindungen, die der Rechner über IP-Masquerading weiterleitet (existiert ab Kernel 2.6 nicht mehr). 11 Systemdiagnose 1.1.3 Das Verzeichnis /proc/sys/ Das /proc/sys/-Verzeichnis enthält zwei Arten von Pseudodateien: • Normale Dateien, die Statusinformationen ausgeben, wie alle, die wir oben schon kennengelernt haben. Diese sind nur lesbar. • Kernelparameter-Dateien. Diese repräsentieren die Werte von Kernelvariablen, etwa die maximal mögliche Anzahl an geöffneten Dateien, das IP-Forwarding, etc. In diese Dateien kann auch vom Systemadministrator geschrieben werden. Dadurch lässt sich der Wert dieser Variablen ändern. Dies ist jedoch ein flüchtiger Zustand. Beim nächsten Neustart sind die Einstellungen zurückgesetzt. Abhilfe schafft bei RedHat und Debian das Utility sysctl (Konfigurationsdatei /etc/sysctl.conf), mit dem sich diese Einstellungen dauerhaft konfigurieren lassen. Auch SuSE verwendet mittlerweile sysctl mit der zusätzlichen Konfigurationsdatei /etc/sysconfig/sysctl. Allgemeine Kernel-Parameter regeln die allgemeinen Eigenschaften des Kernels. Beispiele: ✎ fs/ Dieses Unterverzeichnis enthält Parameter, die Dateisysteme betreffen. fs/file-max enthält die maximale Anzahl geöffneter Dateien, die der Kernel verwaltet. Beispiel: # cat /proc/sys/fs/file-max 4096 # echo 8192 > /proc/sys/fs/file-max # cat /proc/sys/fs/file-max 8192 kernel In diesem Unterverzeichnis kann man das Verhalten des Kernels wie etwa Scheduling, Speicherverwaltung oder Kernelausgaben beeinflussen (LPI 2: 201.1). kernel/panic Steht hier eine 0, dann bleibt der Kernel beim Systemabsturz in einer Panic-Schleife; ungleich 0 bedeutet, dass der Kernel nach so vielen Sekunden automatisch das System wieder hochfahren soll. kernel/version enthält die Kernel-Version. 12 ✎ 1.1 Das /proc-Dateisystem kernel/ctrl-alt-del Ist diese Variable 0, so wird ein Signal an den init-Prozess weitergeleitet, so dass dieser elegant das System herunterfahren kann. (Siehe entsprechende Zeile in /etc/inittab.) Ist diese Variable 1, so macht der Kernel bei dieser Tastenkombination einen unbarmherzigen Reboot, ohne die PlattenCaches auf die Platte zurückzuschreiben. vm/ In diesem Unterverzeichnis befinden sich Kernelparameter zur Speicherverwaltung. Ab Kernel-Version 2.6 gibt es eine Datei namens swappiness. Sie enthält eine Zahl zwischen 0 und 100. Höhere Werte führen dazu, dass das System versucht, so viel wie möglich an passiven Prozessen auszulagern, so dass mehr Speicher für laufende Anwendungen frei wird. Niedrigere Werte führen dazu, dass mehr Anwendungen im Speicher gehalten werden, auch wenn sie sich im Ruhezustand befinden. ✎ Beispiel: # cat /proc/sys/vm/swappiness 60 # echo 50 > /proc/sys/vm/swappiness # cat /proc/sys/vm/swappiness 50 IP-Kern-Parameter befinden sich in den /proc/sys/net/ipv4/-Dateien. ✎ Beispiele: ip_forward Das IP-Forwarding (Routing) ist bei „1“ eingeschaltet und bei „0“ ausgeschaltet. Das bedeutet, dass, bei aktiviertem IP-Forwarding, Pakete von einer Netzwerkschnittstelle auf die andere durchgeleitet werden. tcp_syncookies bietet, wenn es aktiviert ist, Schutz gegen das Überfluten des Rechners mit Verbindungsaufbau-Paketen (SYN-Flooding ). Soll aktiviert sein. ip_always_defrag defragmentiert IP-Pakete immer. Ist auf jeden Fall bei einer Firewall notwendig. Da die Quell- und Zieladressen sowie Ports, nach denen ja gefiltert wird, nur im Header des Pakets und damit im ersten Fragment stehen, so muss man, um über ein fragmentiertes Paket zu entscheiden, dieses erst defragmentieren. Diese Datei existiert ab Kernel 2.6 nicht mehr. conf/Schnittstelle/rp_filter aktiviert für die angegebene Schnittstelle den Schutz gegen IP-Spoofing, also den Schutz vor vorgetäuschten IP-Adressen. Soll aktiviert sein. 13 Systemdiagnose conf/Schnittstelle/accept_redirects legt fest, ob die Schnittstelle ICMP-Redirects unterstützt. Dies wird meist nur für Angriffe ausgenutzt und soll daher deaktiviert sein. conf/Schnittstelle/accept_source_route lässt auf dieser Schnittstelle SourceRouting zu, das heißt, dass der Absender eines Paketes festlegt, welchen Weg das Paket nimmt. Auch das ist heute fast nur für Angriffe nützlich und soll daher deaktiviert sein. 1.1.4 Die Prozessnummern-Verzeichnisse sind direkte Unterverzeichnisse von /proc/ (LPI 2: 201.5) in der Gestalt /proc/Prozessnummer/ In diesen Verzeichnissen findet man alle Informationen über einen laufenden Prozess. Inhalte: cmdline Die Kommandozeile des Programmaufrufs environ Die Umgebungsvariablen des Prozesses cwd Das aktuelle Verzeichnis des Prozesses mem Speicherverbrauch des Prozesses exe Die ausführbare Datei, die den Prozess erzeugt hat root Verknüpfung auf das root-Verzeichnis des Prozesses Achtung: Manchmal sperrt man aus Sicherheitsgründen Prozesse, die ein Sicherheitsrisiko darstellen, in einen Sandkasten, also einem kleinen Root-Dateisystem, ein, damit sie am System keinen Schaden anrichten können. Diesen Sandkasten kann man mit dem Befehl chroot erzeugen und deswegen nennt man das in der Fachsprache chroot-Umgebung . In dieser darf jedoch kein /proc-Dateisystem gemountet werden, denn mit /proc/1/root/ kann man das ursprüngliche Root-Verzeichnis zurückerhalten. Damit kann das unter Umständen eine Sicherheitslücke darstellen. 1.2 Kernel-Variablen dauerhaft verankern Bei SuSE, RedHat und Debian findet das Utility sysctl (LPI 2: 204.2) Verwendung, das beim Hochfahren des Systems die Kernel-Variablen auf die in der Datei /etc/sysctl.conf angegebenen Werte setzt: 14 ! 1.3 IDE- und SCSI-Geräte überwachen und steuern ✎ Beispieldatei für einen Router/Firewall: /etc/sysctl.conf # IP-Spoofing verhindern net.ipv4.conf.all.rp_filter = 1 # ICMP-redirects verhindern net.ipv4.conf.all.accept_redirects = 0 # Source-Routing deaktivieren net.ipv4.conf.all.accept_source_route = 0 # IP-Forwarding aktivieren net.ipv4.ip_forward = 1 # IP-Pakete immer defragmentieren (f. Paketfilter-Firwall notwendig) # Nicht möglich, wenn Masquerading betrieben wird # Ab Kernel 2.6 nicht mehr vorhanden # net.ipv4.ip_always_defrag = 1 # TCP SYN Cookie-Schutz aktivieren net.ipv4.tcp_syncookies= 1 Anstatt der umständlichen Schleifen kann man hier einfach das Schlüsselwort all verwenden. Tipp: Hat man zur Laufzeit des Systems etwas an dieser Konfigurationsdatei verändert, so kann man mit # sysctl -p die aktuelle Konfiguration aktivieren. 1.3 IDE- und SCSI-Geräte überwachen und steuern 1.3.1 IDE-Geräte Informationen über IDE-Geräte findet man unter /proc/ide/Gerät/: cache Größe des Hardware-Cache capacity Kapazität der Platte 15 Systemdiagnose geometry Hard-/Softwaregeometrie der Platte model Modell-Bezeichnung settings Festplattenparameter 1.3.2 Festplatten-Tuning bedeutet, dass man an einigen Parametern der Festplatte herumschrauben kann. Dies kann jedoch unter Umständen fatale Folgen haben (Datenverlust), falls nicht von fachkundiger Hand durchgeführt. Hier beschränken wir uns auf ungefährliche Optimierungen. Das Utility hdparm manipuliert die Festplatten-Laufzeit-Parameter (LPI 2: 204.2: hdparm). Hier die Benutzung anhand einiger Beispiele: Geräteinformationen: # hdparm -i /dev/hda /dev/hda: Model=ST320423A, FwRev=3.02, SerialNo=7EJ0Y17L Config= HardSect NotMFM HdSw>15uSec Fixed DTR>10Mbs RotSpdTol>.5% RawCHS=16383/16/63, TrkSize=0, SectSize=0, ECCbytes=4 BuffType=unknown, BuffSize=512kB, MaxMultSect=32, MultSect=32 CurCHS=16383/16/63, CurSects=16514064, LBA=yes, LBAsects=40011300 IORDY=on/off, tPIO=min:240,w/IORDY:120, tDMA=min:120,rec:120 PIO modes: pio0 pio1 pio2 pio3 pio4 DMA modes: mdma0 mdma1 mdma2 udma0 udma1 udma2 udma3 *udma4 Hier kann man einiges an Informationen entnehmen: Die Platte unterstützt LBA, Ultra DMA 4, das gerade aktiv ist. Es gibt folgende Arten der Datenübertragung zwischen Festplatte und Hauptspeicher: Programmed IO Die PIO-Modi 0–5 benutzen die CPU als Teil des Datenübertragungsweges und verbrauchen daher Rechenzeit. Die maximalen Datenübertragungsgeschwindigkeiten reichen von 3,3 MB/s (PIO 0) bis 16,6 MB/s (PIO 5). Direct Memory Access bedeutet, dass die Festplatte ohne Zutun der CPU die Daten in den Hauptspeicher überträgt. Es existieren die Spielarten MDMA (Multiword DMA) und UDMA (Ultra DMA). Ersteres spielt heute 16 ✎ 1.3 IDE- und SCSI-Geräte überwachen und steuern eine untergeordnete Rolle, während fast alle modernen Platten Ultra DMA beherrschen. Derzeit existieren die Ultra DMA-Modi 0–5. Die maximalen Datenübertragungsgeschwindigkeiten reichen von 16,7 MB/s (UDMA 0) bis 100 MB/s (UDMA 5). DMA-Modus aktivieren/deaktivieren: # hdparm -d 1 /dev/hda # hdparm -d 0 /dev/hda # DMA aktivieren # DMA deaktivieren Sollte die Platte kein DMA unterstützen, fällt sie automatisch in den vorigen Modus zurück. Ultra DMA-Modus aktivieren Die Festlegung des Übertragungsmodus erfolgt mit dem Argument -X und einer darauffolgenden Zahl, die den Übertragungsmodus bestimmt: Modus PIO-0 PIO-1 PIO-2 PIO-3 PIO-4 ✎ Zahl 8 (0+8) 9 (1+8) 10 (2+8) 11 (3+8) 12 (4+8) Modus MDMA-0 MDMA-1 MDMA-2 Zahl 32 (0+32) 33 (1+32) 34 (2+32) Modus UDMA-0 UDMA-1 UDMA-2 UDMA-3 UDMA-4 UDMA-5 Zahl 64 (0+64) 65 (1+64) 66 (2+64) 67 (3+64) 68 (4+64) 69 (5+64) Beispiel: Aktivieren des UDMA-5 auf der ersten IDE-Platte im System: # hdparm -d 1 -X 69 /dev/hda /dev/hda: setting using_dma to 1 (on) setting xfermode to 69 (UltraDMA mode5) using_dma = 1 (on) Multisektormodus (IDE-Blockmode) aktivieren Moderne IDE-Festplatten haben zumeist die Fähigkeit, nicht nur einen Sektor zu 512 Bytes, sondern gleich mehrere Sektoren hintereinander in einem Zug zu übertragen. Da bei größeren Dateien auf der Platte meist die Daten auf hintereinanderliegenden Sektoren abgelegt sind, beschleunigt das den Dateizugriff erheblich. Um den Multisektormodus zu aktivieren, müssen Sie zuerst herausfinden, wieviele Sektoren die Platte pro Zugriff gleichzeitig übertragen kann: 17 Systemdiagnose # hdparm -i /dev/hda /dev/hda: Model=FUJITSU MHT2040AT, FwRev=009A, SerialNo=NN67T3813W96 Config= HardSect NotMFM HdSw>15uSec Fixed DTR>10Mbs RawCHS=16383/16/63, TrkSize=0, SectSize=0, ECCbytes=4 BuffType=DualPortCache, BuffSize=2048kB, MaxMultSect=16, MultSect=off ... Im dargestellten Beispiel sehen Sie, dass die Platte Multisektormodus mit 16 Sektoren gleichzeitig beherrscht. Im Beispiel aktivieren Sie den Multisektormodus wie folgt: # hdparm -m 16 /dev/hda /dev/hda: setting multcount to 16 multcount = 16 (on) Datentransferrate testen: # hdparm -Tt /dev/hda /dev/hda: Timing buffer-cache reads: Timing buffered disk reads: 128 MB in 2.40 seconds = 53.33 MB/sec 64 MB in 3.40 seconds = 18.82 MB/sec Die Kommunikation zwischen Plattencontroller und Rechner erfolgt hier mit 53 MB pro Sekunde, der effektive Datentransfer beim Lesen von der Platte ist rund 19 MB pro Sekunde. Plattenmotor abschalten: Nach einer gewissen Zeit der Inaktivität kann man den Plattenmotor ruhen lassen. Er fährt dann erst beim nächsten Zugriff wieder hoch. Dies ist vor allem bei Laptops nützlich, um Batterie zu sparen: # hdparm -S 180 /dev/hda1 Hier schalten wir den Plattenmotor nach 15 Minuten = 180 mal 5 Sekunden ab. Werte von 1 bis 240 sind möglich. Für längere Zeiten siehe die Man-Page von hdparm. Man kann den Plattenmotor mit 18