<< Back to man.lupaworld.com


[ zurück ] [ Inhalt ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ 10 ] [ 11 ] [ 12 ] [ 13 ] [ 14 ] [ 15 ] [ A ] [ weiter ]

Debian-Referenz
Kapitel 8 - Debian-Tipps


8.1 Booten des Systems

Detaillierte Informationen über den Boot-Prompt (also die Eingabeaufforderung beim Systemstart) gibt es beim LDP BootPrompt-HOWTO.


8.1.1 "Ich habe das root-Passwort vergessen!" (1)

Sobald man Zugriff auf die Tastatur eines Rechners hat, kann das System gestartet werden und ein Login stattfinden, auch ohne das root-Passwort zu kennen. (Dies setzt allerdings voraus, dass keine zusätzlichen Schutzmaßnahmen ergriffen wurden, wie z.B. ein BIOS-Passwort oder eine Passwortabfrage durch lilo, was ein Booten des Systems verhindern würde.)

Dies ist ein Vorgehen, das keine externen Boot-Medien und Änderungen der BIOS-Einstellungen benötigt. Die Bezeichnung für die voreingestellte Boot-Option sei "Linux".

Sobald die lilo-Boot-Meldung boot: erscheint (auf einigen Systemen muss die Shift-Taste/Umschalt-Taste gedrückt werden, um einen automatischen Bootvorgang zu unterbrechen), ist folgendes einzugeben:

     boot: Linux init=/bin/sh

Das System startet nun den Kernel und daraufhin das Programm /bin/sh anstelle des üblichen init-Prozesses. Die nun erlangte Shell hat root-Privilegien. Da das Hauptverzeichnis / nur les- aber nicht schreibbar ist und viele während des üblichen Boot-Prozesses eingeklinkten Verzeichnisse nicht erreichbar sind, müssen diese nachträglich gemountet werden, um ein vernünftiges Arbeiten zu ermöglichen:

     init-2.03# mount -n -o remount,rw /
     init-2.03# mount -avt nonfs,noproc,nosmbfs
     init-2.03# cd /etc
     init-2.03# vi passwd
     init-2.03# vi shadow

(Wenn in der Datei /etc/passwd das zweite Datenfeld bei allen Einträgen ein "x" ist, dann benutzt das System shadow-Passwörter. In diesem Fall muss statt /etc/passwd die Datei /etc/shadow editiert werden.) Um das root-Passwort zurückzusetzen, muss das zweite Feld des root-Eintrags gelöscht werden. Nach einem Neustart ist das root-Passwort leer und kann neu vergeben werden. Wenn das System in den Runlevel 1 fährt, wird (zumindest bei Debian-Versionen nach Potato) ein Passwort benötigt.

Ein Editor im /bin/-Verzeichnis ist absolut empfehlenswert, für den Fall, dass der /usr/-Baum nicht erreichbar ist (siehe dazu auch Rettungseditoren, Abschnitt 11.2).

Für Notfälle hat sich außerdem sash (stand alone shell) bewährt. Wenn das System nicht mehr gebootet werden kann, geben Sie am lilo-Prompt folgendes ein:

     boot: Linux init=/bin/sash

Das Programm sash dient als Ersatz für sh, selbst wenn /bin/sh nicht nutzbar ist. Es ist statisch gelinkt und hat viele Standardbefehle eingebaut. (Wenn sash gestartet ist, wird "help" eine kurze Referenz anzeigen.)


8.1.2 "Ich habe das root-Passwort vergessen!" (2)

Starten Sie das System mit einer Rettungsdiskette/-CD. Sei /dev/hda3 die root-Partition. Dann kann die Passwortdatei editiert werden durch:

     # mkdir fixit
     # mount /dev/hda3 fixit
     # cd fixit/etc
     # vi shadow
     # vi passwd

Der Vorteil dieser Variante ist, dass ein eventuell vergebenes lilo-Passwort umgangen werden kann. Erforderlich ist allerdings, dass im BIOS die Einstellung für das Boot-Laufwerk manipuliert werden kann (falls es nicht schon entsprechend eingestellt ist).


8.1.3 Das System kann nicht gestartet werden

Dies ist kein Problem, selbst wenn Sie keine Boot-Diskette während der Installation angelegt haben. Wenn lilo defekt ist, können Sie die Boot-Disk des Debian-Installationsets verwenden und davon Ihr System booten. Wenn Ihre root-Partition /dev/hda12 ist und im Runlevel 3 gestartet werden soll, geben Sie folgendes am Boot-Prompt ein:

     boot: rescue root=/dev/hda12 3

Danach haben Sie ein fast vollständig funktionsfähiges System mit dem Kernel des Installationsmediums gestartet. (Es kann einige kleinere Probleme aufgrund fehlender Kerneleigenschaften oder Module geben.)

Vergleichen Sie Installation eines Pakets in ein nicht bootfähiges System, Abschnitt 6.3.6 wenn Sie ein defektes System haben.

Benötigen Sie eine angepasste Boot-Diskette, folgen Sie den Anweisungen in readme.txt auf der Rettungsdiskette.


8.1.4 Abschalten von X beim Booten

Dem Nachjagen von unstable/sid ist lustig, aber ein fehlerhaftes xdm, gdm, kdm und wdm, das während des Boot-Prozesses gestartet wird, kann sehr unangenehm sein.

Zuerst sollten Sie Zugang zu einer root-Shell erlangen, indem Sie folgendes am Boot-Prompt eingeben:

     boot: Linux vga=normal s

Hier steht Linux für das Kernel-Image das Sie starten; "vga=normal" stellt sicher, dass lilo im normalen VGA Modus startet und "s" (oder "S") ist der Parameter der an init weitergegeben wird und für Single-User-Modus steht. Geben Sie das root Passwort am Prompt ein.

Es gibt mehrere Möglichkeiten alle Daemonen die X starten zu deaktivieren:

Hier muss die Nummer in rc2.d dem Runlevel entsprechen, das in der /etc/inittab Datei angegeben wurde. ?dm bedeutet, dass das Kommando mehrfach ausgeführt wird, wobei es jeweils durch xdm, gdm, kdm und wdm ersetzt wird.

Nur der erste Weg ist "der eine wahre Weg" in Debian. Der letzte ist einfach, funktioniert aber nur in Debian und erfordert, dass der Display-Manager später mit dpkg-reconfigure gesetzt wird. Alles andere sind allgemeine Methoden um Daemonen zu deaktivieren.

Sie können immer noch X mit dem startx Kommando von einer beliebigen Konsole starten.


8.1.5 Weitere Tricks mit dem Boot-Prompt

Mittels des lilo-Boot-Prompts kann das System in einem beliebigen Runlevel gestartet werden. Details dazu finden sich im BootPrompt-HOWTO (LDP).

Soll das System im Runlevel 4 starten, verwenden Sie folgende Eingabe am lilo Boot-Prompt.

     boot: Linux 4

Wenn das System im normal funktionierendem Einzelnutzer-Modus gestartet werden soll und Sie das root Passwort kennen, so kann eins der folgenden Beispiele am lilo Boot-Prompt verwendet werden.

     boot: Linux S
     boot: Linux 1
     boot: Linux -s

Auch der benutzte Speicherbereich kann eingeschränkt werden. Das folgende Beispiel weist das System an, nur 48MB des verfügbaren Speichers zu belegen.

     boot: Linux mem=48M

Achtung: Wird an dieser Stelle mehr Speicher angegeben als vorhanden, wird der Kernel abstürzen. Wenn man mehr als 64 MB Speicher hat, kann es bei alten Kernels und/oder Mainboards passieren, dass das System nur 64MB nutzt. In diesem Fall kann man versuchen den ungenutzten Speicher mit mem=128M zu aktivieren. Äquivalent dazu ist ein Eintrag in der Datei /etc/lilo.conf.


8.1.6 Setzen von GRUB Boot-Parametern

GRUB ist ein neuer Boot-Manager des GNU Hurd Projekts und ist viel flexibler als Lilo aber handhabt die Boot-Parameter etwas anders.

     grub> find /vmlinuz
     grub> root (hd0,0)
     grub> kernel /vmlinuz root=/dev/hda1
     grub> initrd /initrd
     grub> boot

Sie müssen die Hurd Gerätenamen kennen:

     Hurd/GRUB           Linux               MSDOS/Windows
      (fd0)               /dev/fd0            A:
      (hd0,0)             /dev/hda1           C: (usually)
      (hd0,3)             /dev/hda4           F: (usually)
      (hd1,3)             /dev/hdb4           ?

Vergleichen Sie /usr/share/doc/grub/README.Debian und /usr/share/doc/grub-doc/html/ für Details.


8.2 Aufzeichnung von Aktivitäten


8.2.1 Aufzeichnen von Shell-Eingaben

Um ein Unix-artiges System gekonnt zu administrieren, sind mitunter knifflige oder raffinierte Aufgaben zu erledigen. Machen Sie sich deshalb mit den grundlegenden Konfigurationsaufgaben vertraut, so dass Sie im Notfall wissen, wo Sie Hand anlegen müssen. Fensterbasierte Konfigurations-Werkzeuge sind nett und bequem, nutzen aber nichts, wenn man versucht eine defekte X-Window-Konfiguration wieder herzustellen.

Die Aufzeichnung von Tastatur-Eingaben ist, insbesondere als root, hin und wieder nützlich.

Emacs: M-x shell startet die Aufzeichnung. ("M" steht hier für die Meta-Taste, meist Alt oder auch Esc.) C-x C-w schreibt die aufgezeichnete Sequenz in eine Datei.

Shell: Verwenden Sie das screen Kommando mit "^A H", wie in Konsolenumschaltung mit screen, Abschnitt 8.6.27 beschrieben oder dass script Kommando.

     $ script
     Script wurde gestartet, die Datei ist typescript
      ... irgendwelche Eingaben ...
      Strg-D
     $ col -bx <typescript >Sicherung
     $ vi Sicherung

Falls das script-Programm fehlt, kann diese Funktion mit der Shell simuliert werden:

     $ bash -i 2>&1 | tee typescript

8.2.2 X Aktivitäten aufzeichnen

Um den grafischen Bildschirm aufzunehmen, auch X-Terminals und andere beliebige Fenster, kann gimp benutzt werden. Alternativen sind xwd (xbase-clients), import (imagemagick) und scrot (scrot).


8.3 Kopieren und Archivieren eines Unterverzeichnis


8.3.1 Grundlegende Kommandos zum Kopieren eines Unterverzeichnis

Möchte man seine Verzeichnisstruktur neu arrangieren, verschiebt man den Inhalt inklusive Datei-Links wie folgt:

     Standardmethode:
     # cp -a /source/directory /dest/directory # erfordert GNU cp
     # (cd /source/directory && tar cf - . ) | \
             (cd /dest/directory && tar xvfp - )
     Wenn ein harter Link beteiligt ist, benötigt man eine pedantische
     Methode:
     # cd /Pfad/zum/alten/Verzeichnis
     # find . -depth -print0 | afio -p -xv -0a /neues/Verzeichnis
     Vom entfernten Rechner:
     # (cd /Quell/Verzeichnis && tar cf - . ) | \
             ssh user@host.dom (cd /Ziel/Verzeichnis && tar xvfp - )
     Wenn es keine Links gibt:
     # scp -pr user1@host1.dom:/Quell/Verzeichnis \
               user2@host2.dom:/Ziel/Verzeichnis

Hier gilt scp <==> rcp und ssh <==> rsh.

Die folgenden vergleichenden Informationen zum Kopieren eines kompletten Unterverzeichnis wurden von Manoj Srivastava srivasta@debian.org auf debian-user@lists.debian.org aufgeführt.


8.3.2 cp

Ursprünglich war das cp Programm für diesen Zweck nicht gut geeignet, da es keine symbolischen Links auflösen oder harte Links beibehalten konnte. Ein anderer Punkt waren spärliche (sparse) Dateien (Dateien mit Löchern).

Die GNU-Version von cp überwand zwar diese Probleme, doch auf nicht-GNU-Systemen kann es noch zu Schwierigkeiten kommen. Desweiteren kann cp keine kleinen, portablen Archive erzeugen.

     % cp -a . neuesverzeichnis

8.3.3 tar

Das Archivierungsprogramm tar kann im Gegensatz zu cp mit symbolischen Links umgehen. Obwohl cpio mit speziellen Dateien umgehen kann, konnten ältere tar Versionen dies nicht.

Wenn tar auf mehrere harte Links einer Datei stößt, wird nur einmal die Datei in das Archiv kopiert; die Datei kann dann nur unter dem Namen der ursprünglichen Datei zurückgewonnen werden. cpio dagegen kopiert für jeden harten Link die komplette Datei in das Archiv, so dass sie unter jedem der Link-Namen wiedergeholt werden kann.

Das tar Kommando hat die Option für das Packen mit .bz2 Dateien zwischen Potato und Woody umbenannt. Empfohlen wird deshalb in Skripten die Option --bzip2 statt der Kurzform -I (Potato) oder -j (Woody).


8.3.4 pax

Hinter dem Namen pax (IEEE-Standard 1003.2-1992, Seiten 380–388 (Abschnitt 4.48) und Seiten 936–940 (Abschnitt E.4.48)) verbirgt sich ein multifunktionales POSIX-Werkzeug zum Austausch von portablen Archiven. pax liest und schreibt Archive, listet deren Inhalt auf, und kopiert Verzeichnishierarchien. pax arbeitet unabhängig von einem spezifischen Archivformat und unterstützt eine große Bandbreite an Formaten.

pax ist noch neu und es können noch Kinderkrankheiten auftreten.

     # apt-get install pax
     $ pax -rw -p e . newdir
      oder
     $ find . -depth  | pax -rw -p e  newdir

8.3.5 cpio

Das Kommando verwaltet die gleichnamigen Archive oder auch solche, die mit tar erstellt wurden. Das Archiv kann statt einer Datei auch eine Pipe oder ein Magnetband sein.

     $ find . -depth -print0 | cpio --null --sparse -pvd new-dir

8.3.6 afio

afio ersetzt cpio. Es liest dessen Archive schneller, unterstützt mehr Laufwerksoptionen, hat eine bessere Fehlerkorrektur und kann das Archiv auf mehrere Medien verteilen. Die Kompression mit afio ist zuverlässiger als die von tar und cpio. Am besten benutzt man afio in Backup-Skripts als "Archiv-Maschinerie".

     $ find . -depth -print0 | afio -px -0a new-dir

Ich mache alle meine Backups auf Band mit afio.


8.4 Differenzielles Backup und Datensynchronisation

Differenzielle Backups und Datensynchronisation kann mit verschiedenen Methoden implementiert werden:

Kombinationen einer dieser Methoden mit der Archivierungsmethode, die in Kopieren und Archivieren eines Unterverzeichnis, Abschnitt 8.3 beschrieben ist und den automatisierten Jobs in Terminplanung für Prozesse (cron, at), Abschnitt 8.6.26 bilden ein nettes Backup-System.

Ich werde drei einfach zu nutzende Hilfsmittel angeben.


8.4.1 Differenzielles Backup mit rdiff

rdiff-backup bietet ein nettes und einfaches Backup mit differenziellen Versionen für beliebige Dateitypen, inklusive symbolischen Links. Sichern des Großteils von ~/ nach /mnt/backup:

     $ rdiff-backup --include ~/tmp/keep --exclude ~/tmp  ~/ /mnt/backup

Wiederherstellen von drei Tage alten Daten aus diesem Archiv nach ~/old:

     $ rdiff-backup -r 3D /mnt/backup ~/old

Vergleichen Sie rdiff-backup(1).


8.4.2 Tägliches Backup mit pdumpfs

pdumpfs ist ein einfaches System zum täglichen Backup, ähnlich zu Plan9's dumpfs, das tägliche Schnappschüsse bewahrt. Man kann auf die letzten Schnappschüsse zu beliebiger Zeit zugreifen, um eine Datei eines bestimmten Tages wiederherzustellen. Führen Sie ein Backup Ihres Homeverzeichnisses mit pdumpfs und cron aus!

pdumpfs erstellt die Schnappschüsse YYYY/MM/DD im Zielverzeichnis. Alle Quelldateien werden in das Schnappschussverzeichnis kopiert, wenn pdumpfs das erste Mal gestartet wird. Beim zweiten und folgenden Male kopiert pdumpfs nur aktualisierte oder neu erstellte Dateien und speichert nicht geänderte Dateien als harte Links auf die Dateien vom Schnappschuss des letzten Tages, um Speicherplatz zu sparen.

     $ pdumpfs src-dir dest-dir [dest-basename]

Vergleichen Sie pdumpfs(8).


8.4.3 Regelmäßige differenzielle Backups mit RCS

Changetrack zeichnet Änderungen von textbasierten Konfigurationsdateien regelmäßig in RCS Archiven auf. Sehen Sie changetrack(1).

     # apt-get install changetrack
     # vi changetrack.conf

8.5 Wiederherstellen eines eingefrorenen Systems


8.5.1 Einen Prozess killen/beenden

top hilft außer Kontrolle geratene Prozesse zu identifizieren. `P' sortiert die Spalten nach CPU-Last, `M' nach Speicherverbrauch und `k' kann einen Prozess "abschießen". Alternativ kann das BSD-artige ps aux | less oder System V-artige ps -efH | less verwendet werden. Die System V-artige Syntax zeigt die IDs der Elternprozesse (PPID), die zum Killen von Zombie-Kindprozessen genutzt werden können.

Verwenden Sie kill zum Killen eines Prozesses mittels der Prozess-ID-Nummer (oder um ihm Signale zu senden). killall bewerkstelligt das selbe über den Namen des Programms. Oft verwendete Signale sind

      1: HUP,  Daemon neustarten
     15: TERM, normales Beenden
      9: KILL, erzwungenes Beenden

8.5.2 Alt-SysRq

Wenn der Kernel mit Unterstützung der "magischen SysRq-Taste" kompiliert wurde, kann das System mit etwas Glück auch aus dem totalen Nirwana geholt werden. Drücken von Alt-SysRq (SysRq ist oft mit "Druck" beschriftet) bei einem i386, gefolgt von einer der Tasten r 0 k e i s u b, aktiviert die Kernel-Notbremse.

`r' stellt die Tastatur wieder her, nachdem beispielsweise X abgestürzt ist. `0' setzt den Level mit dem Fehlermeldungen auf der Konsole ausgegeben werden herunter. `k' (system attention key) killt alle Prozesse auf der aktuellen virtuellen Konsole. `t' beendet alle Prozesse des aktuellen Terminals außer init. `i' killt alle Prozesse außer init.

`S'ync, `u'mount und re`b'oot sind wirklich nur für den allerletzten Notfall.

Debian Standard Kernel sind, zur Zeit der dieses Dokument geschrieben wird, nicht mit dieser Option kompiliert. Es muss zur Nutzung dieser Taste ein neuer Kernel kompiliert werden. Detaillierte Informationen finden sich in /usr/share/doc/kernel-doc-version/Documentation/sysrq.txt.gz oder /usr/src/kernel-version/Documentation/sysrq.txt.gz.


8.6 Elegante kleine Kommandos zum Merken


8.6.1 Dateibetrachter

less ist der Standard-Dateibetrachter, der Textdateien seitenweise ausgibt. Hilfe bietet `h'. less kann mehr als dessen Urahn more. Es kann mit eval $(lesspipe) oder eval $(lessfile) in einer Shell-Startdatei überladen (erweitert) werden. Sehen Sie hierzu /usr/share/doc/lessf/LESSOPEN. Die Option -R erlaubt die Ausgabe von Sonderzeichen (raw characters) und schaltet die ANSI Farbsequenzen ein. Vergleichen Sie less(1).

w3m kann für einige Code-Systeme (EUC) eine Alternative sein.


8.6.2 Freier Speicher

free und top informieren über freien Speicher und dessen Verbrauch. Sorgen Sie sich nicht um die Größe des "used"-Eintrags in der zweite Datenzeile, sondern lesen Sie den Wert darunter ab (hier: 38792)

     $ free -k # für 256MB Hauptspeicher
                  total       used       free     shared    buffers cached
     Mem:        257136     230456      26680      45736     116136 75528
     -/+ buffers/cache:      38792     218344
     Swap:       264996          0     264996

Die präzise Menge an Hauptspeicher, die zur Verfügung steht, kann mit grep '^Memory' /var/log/dmesg bestätigt werden, was in diesem Fall "Memory: 256984k/262144k available (1652k kernel code, 412k reserved, 2944k data, 152k init)" ergibt.

     Total         = 262144k = 256M (1k=1024, 1M=1024k)
     Free to dmesg = 256984k = Total - kernel - reserved - data - init
     Free to shell = 257136k = Total - kernel - reserved - data

Etwa 5MB können nicht vom System verwendet werden, da der Kernel sie in Beschlag nimmt.


8.6.3 Setzen der Uhrzeit (BIOS)

     # date MMDDhhmmCCYY
     # hwclock --utc --systohc
     # hwclock --show

Dies setzt die Hardware-Uhr auf MM/DD hh:mm, CCYY. Dabei stehen die Kürzel für DD=Tag, MM=Monat, hh=Stunde, mm=Minute, CCYY=Jahr. Die Zeiten werden in lokaler Zeit ausgegeben, die Hardware-Uhr verwendet jedoch UTC als Zeitzone.


8.6.4 Setzen der Uhrzeit (NTP)

Referenz: Managing Accurate Date and Time HOWTO.


8.6.4.1 Setzen der Zeit bei permanenter Internet-Verbindung

Die Uhrzeit kann automatisch mit Hilfe eines Zeit-Servers korrekt gesetzt werden:

     # ntpdate server

Dies sollte in /etc/cron.daily/ verwendet werden, wenn man eine permanente Internet-Verbindung hat.


8.6.4.2 Setzen der Uhrzeit bei sporadischer Internet-Verbindung

Das Paket chrony hilft hier weiter.


8.6.5 Konsole-Eigenschaften wie den Bildschirmschoner steuern

Zum Deaktivieren des Bildschirmschoners sind folgende Kommandos geeignet:

Auf der Konsole:

     # setterm -powersave off

Start der kon2 (kanji) Konsole mit:

     # kon -SaveTime 0

Während X-Windows läuft:

     # xset s off
      oder
     # xset -dpms
      oder
     # xscreensaver-command -prefs

Lesen Sie die entsprechenden Handbuchseiten um zu erfahren, wie man andere Eigenschaften der Konsole steuert. Vergleichen Sie auch stty(1) zum Ändern und zur Ausgabe von Terminal-Line Einstellungen.


8.6.6 Durchsuchen von Datenbanken zur Systemverwaltung

Die glibc-Bibliothek ermöglicht das Durchsuchen von System-Datenbanken, nach beispielsweise passwd, group, hosts, services, protocols oder networks mittels getent(1).

     getent database [key ...]

8.6.7 Sound abstellen (beep)

Im Zweifelsfall kann man immer den Stecker des Lautsprechers herausziehen ;-) Für die Bash-Shell gilt:

     echo "set bell-style none">> ~/.inputrc

8.6.8 Fehlermeldungen auf der Konsole

Wenn übermäßig viele Fehlermeldungen die Konsole unbrauchbar werden lassen, sollte man zuerst in /etc/init.d/klogd nachsehen. Um das Warnlevel zu ändern kann man hier KLOGD="-c 3" setzen. Neustart des Daemons mit /etc/init.d/klogd restart aktiviert die neuen Werte. Alternativ kann dmesg -n3 benutzt werden.

Das Warnlevel schlüsselt sich wie folgt auf:

Wenn eine bestimmte unkritische Fehlermeldung oft auftritt, kann diese auch durch einen trivialen Kernelpatch unterbunden werden. (Siehe dazu das Beispiel shutup-abit-bp6 im Beispielverzeichnis.)

Auch ein Blick in /etc/syslog.conf kann hilfreich sein, um zu verstehen, welche Nachrichten auf der Konsole ausgegeben werden.


8.6.9 Setzen des korrekten Konsole-Typs

Die Konsole wird in Unix-artigen Systemen üblicherweise mit den Routinen aus der (n)curses-Bibliothek angesteuert. Dies erlaubt eine im Wesentlichen von der Terminal-Art unabhängige Ausgabe mit vernünftiger Update-Strategie. Siehe ncurses(3X) und terminfo(5).

Debian bietet eine ganze Reihe von Voreinstellungen:

     $ toe | less                  # alle Einträge
     $ toe /etc/terminfo/ | less   # Benutzer einstellbare Einträge

Die Auswahl kann durch Export der Umgebungsvariablen TERM aktiviert werden.

Wenn der terminfo-Eintrag für xterm mit einem xterm, das remote aufgerufen wird und das nicht auf Debian läuft, nicht funktioniert, kann der Terminaltyp von "xterm" auch auch eine der primitiveren Varianten, wie "xterm-r6", umgestellt werden. Sehen Sie /usr/share/doc/libncurses5/FAQ für weitere Informationen. Der kleinste gemeinsame Nenner für terminfo ist "dumb".


8.6.10 Die Konsole wiederherstellen

Ist der Bildschirm auf Grund von cat Binärdatei unleserlich (und sogar eingetippte Kommandos sind nicht sichtbar), so hilft:

     $ reset

8.6.11 Konvertieren einer Textdatei von DOS nach Unix

Eine DOS-Textdatei (Zeilenende von ^M^J), kann mit einem einzigen Kommando in eine Unix-Textdatei (Zeilenende = ^J) umgewandelt werden:

     # apt-get install sysutils
     $ dos2unix dosDatei

8.6.12 Ersetzung regulärer Ausdrücke

Alle Vorkommen des regulären Ausdrucks REGEX können durch TEXT in allen Dateien DATEIEN ersetzt werden durch:

     $ perl -i -p -e 's/REGEX/TEXT/g;' DATEIEN ...

-i zeigt an, dass die Orginaldateien bearbeitet werden, -p sorgt ausdrücklich für die Iteration über die Dateinamen. Wenn der reguläre Ausdruck kompliziert ist, kann man sich versichern, indem man die Originaldateien behält: Durch -i.bak anstelle von -i bleiben die Originale erhalten und bekommen die Endung .bak.


8.6.13 Bearbeiten einer Datei mittels eines Skripts

Das folgende Skript entfernt die Zeilen 5–10 und 16–20 ohne Umweg über eine temporäre Datei.

     #!/bin/bash
     ed $1 <<EOF
     16,20d
     5,10d
     w
     q
     EOF

Die ed-Kommandos sind die selben wie beim vi im Kommandomodus. Das Bearbeiten der Datei von hinten erleichtert die Arbeit.


8.6.14 Extrahieren von Unterschieden und Einbringen von Updates für Quelldateien

Die folgenden Kommandos bestimmen die Unterschiede zwischen zwei Quelldateien und erzeugen diff-Dateien Datei.patch0 und Datei.patch1 im "unified"-Stil:

     $ diff -u Datei.alt Datei.neu1 > Datei.patch0
     $ diff -u alt/Datei neu1/Datei > Datei.patch1

Die diff-Datei (alternativ wird sie auch patch-Datei genannt) wird verwendet, um Veränderungen zu beschreiben. Jeder der diese Datei erhält, kann diese Änderungen auf eine andere Datei wie folgt anwenden:

     $ patch -p0 Datei < Datei.patch0
     $ patch -p1 Datei < Datei.patch1

Wenn drei Versionen des Quellcodes vorliegen, können diese einfacher mit diff3 vermengt werden:

     $ diff3 -m Datei.meine Datei.alt Datei.deine > Datei

8.6.15 Eine große Datei in kleine zerlegen

     $ split -b 650m Datei   # in 650MB große Stücke trennen
     $ cat x* >großeDatei    # wieder zusammenfügen

8.6.16 Extrahieren von Daten aus Tabellen in Textdateien

Sei DPL der Name einer Textdatei, in welcher alle vorherigen Debian-Projektleiter mit Namen und Einführungsdatum, durch Freizeichen getrennt, aufgeführt sind.

     Ian     Murdock   August  1993
     Bruce   Perens    April   1996
     Ian     Jackson   Januar  1998
     Wichert Akkerman  Januar  1999
     Ben     Collins   April   2001
     Bdale   Garbee    April   2002
     Martin  Michlmayr März    2003

Awk wird oft benutzt, um Daten aus dieser Art von Datei zu extrahieren.

     $ awk '{ print $3 }' <DPL                   # Monat des Beginns
     August
     April
     Januar
     Januar
     April
     April
     März
     $ awk '($1=="Ian") { print }' <DPL          # Vorname Ian
     Ian     Murdock   August  1993
     Ian     Jackson   Januar  1998
     $ awk '($2=="Perens") { print $3,$4 }' <DPL # wann fing Perens an
     April 1996

Shells wie Bash sind ebenfalls in der Lage, Dateien dieser Art auszulesen:

     $ while read Vorname Nachname Monat Jahr; do 
         echo $Monat
       done <DPL
     ... selbe Ausgabe wie beim ersten Awk Beispiel

Das eingebaute read Kommando verwendet die Zeichen in $IFS (interne Feld-Separatoren), um Zeilen in Wörter aufzuteilen.

Wenn IFS auf ":" gesetzt wird, kann /etc/passwd leicht mit der Shell ausgelesen werden:

     $ altIFS="$IFS"   # alten Wert sichern
     $ IFS=":"
     $ while read Benutzer Passwort uid gid Zeilenrest; do
         if [ "$Benutzer" = "osamu" ]; then 
           echo "$Benutzer's ID ist $uid"
         fi
       done < /etc/passwd
     osamu's ID ist 1001
     $ IFS="$altIFS"   # Wert zurücksetzen

(Wenn Awk dazu verwendet wird, so wird der Spaltentrenner mit FS=":" angegeben.)

IFS wird auch von der Shell benutzt, um die Ergebnisse von Parameterauswertungen, Kommando-Substitutionen und arithmetischen Auswertungen aufzuteilen. Dies geschieht nicht innerhalb von doppelten oder einfachen Anführungszeichen. Der Standardwert von IFS sind die Werte <Freizeichen>, <Tabulator> und <neue Zeile>.

Man muss bei der Verwendung von IFS-Tricks vorsichtig sein. Eigenartige Dinge können geschehen, wenn die Shell Teile eines Skripts als Eingabe interpretiert.

     $ IFS=":,"                        # ":" und "," seien Feldtrenner
     $ echo IFS=$IFS,   IFS="$IFS"     # echo ist ein Bash Kommando
     IFS=  , IFS=:,
     $ date -R                         # nur eine Kommandoausgabe
     Sat, 23 Aug 2003 08:30:15 +0200
     $ echo $(date -R)                 # Untershell --> Eingabe der Haupt-Shell
     Sat  23 Aug 2003 08 30 36 +0200
     $ unset IFS                       # zurücksetzen von IFS auf den Standardwert
     $ echo $(date -R)
     Sat, 23 Aug 2003 08:30:50 +0200

8.6.17 Skript-Auszüge für Pipe-Kommandos

Hier folgen einige kleine lehrreiche Beispiele zur Verwendung von Pipes:

     find /usr | egrep -v "/usr/var|/usr/tmp|/usr/local"
                          # Finde alle Dateien unterhalb /usr 
                          # mit Ausnahme bestimmter Pfade
     xargs -n 1 Kommando  # Starte Kommando für alle Eingaben von stdin
     xargs -n 1 echo |    # Beliebige Leerzeichen werden zu Zeilenumbrüchen
     xargs echo      |    # alle Zeilen zu einer zusammenfassen
     grep -e Muster|     # Gebe Zeilen aus, die Muster 
                          # enthalten
     cut -d: -f3 -|       # gebe das dritte Feld aus, : sei Trenner  
                          # (z.B. für die Passwortdatei passwd)
     awk '{ print $3 }' | # extrahiere das dritte Feld, Freizeichen sei Trenner
     awk -F'\t' '{ print $3 }' |
                          # gib drittes Feld aus mit Tab als Trenner
     col -bx |            # Entferne Backspace und expandiere Tabs zu Leerzeichen
     expand -|            # expandiere Tabs zu Leerzeichen
     sort -u|             # Sortiere und entferne doppelte Einträge
     
     tr '\n' ' '|         # mehrere Zeilen zu einer zusammenfügen
     tr '\r' ''|          # CR entfernen
     tr 'A-Z' 'a-z'|      # Großbuchstaben in Kleinbuchstaben umwandeln
     sed 's/^/# /'|       # aus der Zeile einen Kommentar machen
     sed 's/\.ext//g'|    # Entferne .ext
     sed  -n -e 2p|       # zeige die zweite Zeile
     head -n 2 -|         # zeige die ersten beiden Zeilen
     tail -n 2 -|         # zeige die letzten beiden Zeilen

8.6.18 Skript-Auszüge zum Durchlaufen mehrerer Dateien

Die folgenden Möglichkeiten zum Durchlaufen aller auf *.ext passenden Dateien sind auch dann geeignet, wenn die Dateinamen Sonderzeichen wie Leerzeichen enthalten und bewirken alle dasselbe:


8.6.19 Kurze Perl-Skripte

Obwohl jedes Awk-Skript automatisch in ein Perl-Skript mittels a2p(1) umgeschrieben werden kann, sollten einzeilige Awk-Skripte am besten manuell nach Perl konvertiert werden. Zum Beispiel ist

     awk '($2=="1957") { print $3 }' |

äquivalent zu allen der folgenden Zeilen:

     perl -ne '@f=split; if ($f[1] eq "1957") { print "$f[2]\n"}' |
     perl -ne 'if ((@f=split)[1] eq "1957") { print "$f[2]\n"}' |
     perl -ne '@f=split; print $f[2] if ( $f[1]==1957 )' |
     perl -lane 'print $F[2] if $F[1] eq "1957"' |

Da alle Leerräume im perl-Argument in der obigen Zeile entfernt werden können und unter Ausnutzung der automatischen Umwandlung zwischen Zahlen und Zeichenketten in Perl kann auch folgendes verwendet werden:

     perl -lane 'print$F[2]if$F[1]eq+1957' |

Man vergleiche perlrun(1) für die Kommandozeilenoptionen. Für noch verrücktere Perl-Skripte wird auf http://perlgolf.sourceforge.net verwiesen.


8.6.20 Text oder ein Mailing-Listenarchiv aus einer Webseite extrahieren

Das folgende liest eine Webseite aus und schreibt die Ausgabe in eine Textdatei. Dies ist sehr nützlich, wenn man Konfigurationen aus dem Web kopieren will.

     $ lynx -dump http://www.adresse.de/info.html >Textdatei

links und w3m können hier auch verwendet werden, die Ergebnisse sich aber eventuell leicht unterschiedlich.

Falls ein Archiv einer Mailing-Liste geladen wird, kann munpack benutzt werden, um den MIME-Inhalt zu extrahieren.


8.6.21 Formatierte Ausgabe von Webseiten

Um eine Webseite zu drucken, kann diese in das PostScript-Format umgewandelt werden:

     $ apt-get install html2ps
     $ html2ps URL | lpr

Man vergleiche lpr/lpd, Abschnitt 3.6.1. Alternativ können auch das a2ps oder mpage Paket zum Erzeugen von PostScript-Dateien verwendet werden.


8.6.22 Formatierte Ausgabe einer Handbuchseite

The following will print a manual page into a PostScript file/printer.

     $ man -Tps some-manpage | lpr
     $ man -Tps some-manpage | mpage -2 | lpr

8.6.23 Merge two PostScript or PDF files

You can merge two PostScript or PDF files.

     $ gs -q -dNOPAUSE -dBATCH -sDEVICE=pswrite \
       -sOutputFile=bla.ps -f foo1.ps foo2.ps
     $ gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite \
       -sOutputFile=bla.pdf -f foo1.pdf foo2.pdf

8.6.24 Ausführungsdauer messen

Um die verschiedenen Zeiten, die mit einem Prozessablauf verbunden sind, anzuzeigen, kann time verwendet werden.

     # time some-command >/dev/null
     real    0m0.035s       # "Echte" Zeit
     user    0m0.000s       # Zeit in Benutzermodus
     sys     0m0.020s       # Zeit in Kernelmodus

8.6.25 nice-Befehl

Der nice-Befehl dient dazu, die Priorität eines Prozesses zu setzen. Dessen Verwandter renice (Paket bsdutils) ändert die Priorität eines bereits laufenden Prozesses. Letzteres kann auch aus top heraus geschehen. Ein nice-Wert von 19 bedeutet niedrigste Priorität - der Prozess ist langsam --, absteigend wird die Priorität erhöht. Kleinere Werte als 0 kann nur der Administrator setzen, -20 ist die höchste Priorität.

     # nice  -19 top                                         # sehr nett
     # nice --20 cdrecord -v -eject speed=2 dev=0,0 disk.img # sehr schnell

Manchmal kann ein sehr langsamer Prozess dem System mehr schaden als nützen, also ist Vorsicht geboten.


8.6.26 Terminplanung für Prozesse (cron, at)

Mit cron und at können zu bestimmten Terminen Befehle ausgeführt werden. Siehe at(1), crontab(5), crontab(8).

Die Tabelle für wiederkehrende Ausführung kann mit crontab -e bearbeitet werden. (Ein anderer Editor als vi kann mit der Umgebungsvariablen EDITOR festgelegt werden.) Beispiele einer crontab-Tabelle:

     # Verwende /bin/sh zur Ausführung, egal was passwd sagt
     SHELL=/bin/sh
     # Standardausgabe wird an `paul' geschickt.
     MAILTO=paul
     # Min Stunde TagDesMonats Monat TagDerWoche Befehl (Komma wird 'und')
     # starte um 00:05, jeden Tag
     5  0  *  * *   $HOME/bin/daily.job >> $HOME/tmp/out 2>&1
     # starte unm 14:15 am Monatsersten -- Ausgabe per Email an Paul
     15 14 1  * *   $HOME/bin/monthly
     # starte um 22:00 an Werktagen (1-5), schicke Email an Joe. % für Zeilenumbruch, letztes % für cc:
     0 22 *   * 1-5 mail -s "Es ist 10 Uhr" joe%Joe,%%Gute Nacht?%.%%
     23 */2 1 2 *   echo "Startet 23 Minuten nach 0 Uhr, 2 Uhr, 4 Uhr ..., am 1. Feb."
     5  4 *   * sun echo "Startet um 04:05 jeden Sonntag"
     # Startet um 03:40 an jedem ersten Montag des Monats
     40 3 1-7 * *   [ "$(date +%a)" == "Mon" ] && command -args

Um einen Befehl zur einmaligen Ausführung zu terminieren dient at

     $ echo 'command -args'| at 3:40 monday

8.6.27 Konsolenumschaltung mit screen

Mit screen kann man mehrere virtuelle Terminals auf einer einzigen Konsole starten, jedes mit einer eigenen interaktiven Shell. Selbst wenn man immer zwischen virtuellen Terminals umschalten kann oder mehrere xterm-Fenster offen hält, sollte man sich screen wegen seiner vielfältigen Möglichkeiten anschauen. Dazu gehören


8.6.27.1 Beispiel für einen Fernzugriff

Wenn man sich häufig mit einem VT100-Terminal-Programm über ein Netzwerk auf einem PC einwählt, wird man das Sitzungsmanagement mit screen sicherlich nützlich finden.

  1. Angenommen man ist über eine Telefonverbindung eingeloggt, eine screen-Sitzung ist gestartet und man hat einen längeren Text mit einem Editor geschrieben. Aus irgendwelchen Gründen, muss man jetzt die Verbindung unterbrechen.
  2. Durch Drücken von ^A d wird die aktuelle Sitzung gesichert. (Noch schneller geht es mit ^A DD, dann wird sogar gleich der Logout für einen vorgenommen.)
  3. Wenn man sich später wieder einwählt kann man mit screen -r die Sitzung holen, und screen wird die Sitzung so restaurieren, wie sie verlassen wurde.

8.6.27.2 Typische screen-Befehle

Wenn der screen-Prozess gestartet ist, reicht dieser alle Tastatureingaben an das aktuelle Fenster, bis auf die Kommandosequenz, die auf ^A voreingestellt ist. Alle screen-Befehle beginnen mit ^A und werden dann von einem einzelnen Buchstaben gefolgt (ggf. folgen dann die Parameter). Beispiele für Befehle:

     ^A ?     Hilfe (Tastaturbelegung)
     ^A c     Neues Fenster und wechsele dorthin
     ^A n     Gehe zum nächsten Fenster
     ^A p     Gehe zum vorherigen Fenster
     ^A 0     Gehe zum Fenster Nummer 0
     ^A w     Zeige eine Liste der Fenster
     ^A a     Gebe das ^A an die Applikation weiter
     ^A h     Hardcopy des Fensters in Datei
     ^A H     Starte/Beende Protokoll des aktuellen Fensters in eine Datei
     ^A ^X    Sichere das Terminal mit einem Passwort
     ^A d     Aktuelle Sitzung vom Terminal abmelden
     ^A DD    Vom Terminal abmelden und Logout

Dies ist nur eine kleine Auswahl der Befehle, die das mächtige screen unterstützt. Siehe screen(1) für weitere Details.


8.6.27.3 Backspace und/oder Strg-H in einer screen Sitzung

Wenn die Backspace- oder Strg-H-Taste während einer screen-Sitzung nicht funktionieren, muss die Zeile

     bindkey -k kb stuff "\177"

in der Datei /etc/screenrc auskommentiert ("#") werden.


8.6.27.4 screen-Äquivalent unter X

Siehe Paket xmove und dort xmove(1).


8.6.28 Grundlagen - Prüfung des Netzwerks

Installiere um die grundlegenden Funktionen des Netzwerks zu überprüfen netkit-ping, traceroute, dnsutils, ipchains (für 2.2 Kernel), iptables (für 2.4 Kernel), und das net-tools Paket und führe folgende Sequenz aus:

     $ ping yahoo.com            # teste Internetverbindung
     $ traceroute yahoo.com      # tracen der IP-Pakete
     $ ifconfig                  # testen der host-Konfiguration
     $ route -n                  # testen der routing-Konfiguration
     $ dig [@dns-server.com] host.dom [{a|mx|any}] |less
           # teste host.dom DNS-Einträge am dns-server.com 
           # und suche dort nach {mx|any} Eintrag
     $ ipchains  -L -n |less     # teste packet-Filter (2.2 kernel)
     $ iptables -L -n |less      # teste packet-Filter (2.4 kernel)
     $ netstat -a                # Finde alle offenen Ports
     $ netstat -l --inet         # Finde alle auf Eingabe wartenden Ports
     $ netstat -ln --tcp         # Ebenso (TCP, numerisch) Ports

8.6.29 Email aus dem lokalen Spooler leiten (flush)

Um Email aus dem lokalen Spooler weiterzuleiten:

     # exim -q    # wartende Email anstoßen
     # exim -qf   # alle Emails weiterleiten
     # exim -qff  # dasselbe, auch Email mit Status 'frozen' wird weitergeleitet

-qff wäre wohl die bessere Wahl in dem Skript /etc/ppp/ip-up.d/exim.


8.6.30 'Frozen' Email aus dem lokalen Spooler entfernen

Um nicht weiter vermittelbare Email aus dem lokalen Spooler zu entfernen und eine Fehlermeldung zurückzugeben dient:

     # exim -Mg `mailq | grep frozen | awk '{ print $3 }'`

8.6.31 Redeliver mbox contents

You need to manually deliver mails to the sorted mailboxes in your home directory from /var/mail/username if your home directory became full and procmail failed. After making disk space in the home directory, run:

     # /etc/init.d/exim stop
     # formail -s procmail </var/mail/username
     # /etc/init.d/exim start

8.6.32 Dateiinhalte zurücksetzen

Um eine Datei zurückzusetzen, z.B. ein Log-Datei, sollte nicht rm benutzt werden, da diese Dateien im Sekundenrhythmus geschrieben werden. Sicherer ist:

     $ :>dateiname

8.6.33 Dummy-Dateien

Die folgenden Befehle erzeugen leere Dateien beliebiger Größe:

     $ dd if=/dev/zero    of=dateiname bs=1k count=5 # 5KB große, aber leere Datei
     $ dd if=/dev/urandom of=dateiname bs=1m count=7 # 7MB mit Zufallsinhalt
     $ touch dateiname #erzeuge 0B Datei (wenn sie existiert, setze mtime neu)

8.6.34 chroot

Wenn man neben seiner Debian-Distribution noch eine andere installiert hat (dies kann auch jede andere Distribution sein), z.B. auf der Partition /dev/hda1, dann kann dieses zweite System mit dem aktuellen Kernel ohne Warmstart gestartet werden.

     # mount /dev/hda1 /mnt/target
      ... dies nimmt an, dass das zweite System auf /dev/hda1 liegt
     # chroot /mnt/target
      ... Jetzt wird der Inhalt von /dev/hda1 als root-Verzeichnis betrachtet
     # mount proc /proc              # reine Vorsicht
      ... Ausgeführte Befehle stammen nun von  /dev/hda1

So kann man verschiedene Stabilitätszweige (stable/testing/unstable) auf einer Maschine testen. Eine weitere Möglichkeit wäre, ein fremdes System per NFS zu mounten und chroot auf dieses neu gemountete Verzeichnis anzuwenden.

Ein auf chroot basierendes System kann leicht mit debootstrap (in Woody) erzeugt werden.

     # mkdir potatochroot
     # debootstrap potato potatochroot
     # chroot potatochroot
     # apt-setup # set-up /etc/apt/sources.list

Es gibt ein ausgefeilteres chroot-Paket, pbuilder. Es erzeugt eine chroot-Umgebung und stellt ein Debian-Paket in dieser Sandbox zusammen. So kann man Paketabhängigkeiten definieren, erkennen und aufzulösen.

See http://www.debian.org/releases/stable/i386/ch-preparing#s-linux-upgrade


8.6.35 How to check hard links

You can check whether two files are the same file with two hard links by:

      
     $ ls -li file1 file2

8.6.36 Ein Festplatten-Image mounten

Wenn file.img ein Festplatten-Image enthält und die Quellfestplatte eine Konfiguration wie xxxx = (Byte/Sektor) * (Sektor/Zylinder) hat, dann kann dieses Image mit dem folgenden Befehl nach /mnt gemountet werden:

     # mount -o loop,offset=xxxx file.img /mnt

Die meisten Festplatten haben 512 bytes/Sektor


8.6.37 Samba

Grundlagen um auf Windows-Dateien zuzugreifen:

     # mount -t smbfs -o username=myname,uid=my_uid,gid=my_gid \
             //server/share /mnt/smb  # freigegebene Windows-Laufwerke mounten
     # smbmount //server/share /mnt/smb \
             -o "username=myname,uid=my_uid,gid=my_gid"
     # smbclient -L 192.168.1.2 # Freigaben anzeigen

Die Netzwerk-Nachbarschaft kann angezeigt werden mit:

     # smbclient -N -L eigene_IP_Adresse | less
     # nmblookup -T "*"

8.6.38 Utilities for foreign filesystems

Many foreign filesystems have Linux kernel support, and can thus be accessed simply by mounting the devices containing the filesystems. For certain filesystems, there are also a few specialized tools to access the filesystems without mounting the devices. This is accomplished with user-space programs so that kernel filesystem support is not needed.

In order to create and check an MS-DOS FAT filesystem, dosfstools is useful.


8.7 Typical mistakes to be noted

Here are few examples of dangerous actions. The negative impacts will be enhanced if you are using privileged account: root.


8.7.1 rm -rf .*

In "rm -rf .*", ".*" expands to include "." and "..", and if you happen to have privileges to write to the parent directory then you'll end up removing all directories next to your current directory as well.


8.7.2 rm /etc/passwd

Loss of some important files such as /etc/passwd through your stupidity is tough. The Debian system makes regular backups of them in /var/backups. When you restore these files, you may manually have to set the proper permissions.

     # cp /var/backups/passwd /etc/passwd
     # chmod 644 /etc/passwd

See also Wiederherstellung von Paketauswahldaten, Abschnitt 6.3.4.


[ zurück ] [ Inhalt ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ 10 ] [ 11 ] [ 12 ] [ 13 ] [ 14 ] [ 15 ] [ A ] [ weiter ]

Debian-Referenz

CVS, Mon 3. Apr 2005, 22:57:58 UTC

Osamu Aoki osamu@debian.org
Übersetzer: Jens Seidel tux-master@web.de
Autoren, Abschnitt A.1