Linux ohne Bildschirm - booten über die serielle Schnittstelle #

Bei der Durchsicht einiger älterer Rechner, die ich als Router bzw. Firewall nutzen wollte und dafür in den Keller stellen wollte, kam immer wieder das Problem auf, daß ich ein System habe, das eigentlich nur als reiner Server laufen soll, ich aber immer wieder einen Bildschirm und eine Tastatur im Keller brauchte, um das Ding zu warten (wenn z.B. das Netzwerk Probleme macht). Ein solches Setup nennt man auch "Headless". Außerdem gibt es auch Maschinen ganz ohne VGA-Ausgang, z.B. für EmbeddedLinux. Für die dürfte das hier auch interessant sein.

Ich versuche auf dieser Seite, mich durch den Boot-Prozeß zu hangeln: Zuerst startet ein Bootloader, der mir schon ggf. Meldungen auf die serielle Schnittstelle geben will, dann lade ich einen Kernel, der auch direkt auf der Schnittstelle seine Ausgaben macht und dann ändern wir unser Linux-System (z.B. ein MinimalesDebian) so, daß es über die serielle Konsole bedient werden kann und Bildschirm und Tastatur gar nicht mehr benutzt.

In den verschiedenen Schritten muss man jedem Programm, das auf die Schnittstelle zugreift, auch immer die Schnittstellen-Parameter angeben. Ich habe mich hier auf "38400 bps, 8N1" festgelegt und dies überall benutzt. Ein üblicher Wert sind auch 9600 bps. Wichtig ist eigentlich nur, daß man überall den gleichen Wert angibt, sonst gibts Zeichensalat.

Medium und Installationssystem #

Ich habe ein Bootmedium (Festplatte), von dem das System später booten soll. Um diese Anleitung rund zu machen auch für Systeme, die gar keinen Bildschirmanschluß haben, gehe ich davon aus, daß ich die Platte ausbaue und in einem anderen Fechner installiere.

Bootloader #

GRUB ist der Standard-Bootloader von Debian Linux seit Sarge. Er ist sehr flexibel und sehr angenehm zu konfigurieren. Deshalb habe ich mich entschieden, diesen zu installieren. Leider ist die Anleitung nicht sehr hilfreich für unseren speziellen Fall, d.h. wenn ich ein anderes als mein aktuell laufendes System aufsetzen möchte. Ich habe jedoch folgendes gemacht:

root-Partition einrichten und GRUB-Images kopieren #

Zuerst habe ich in meinem MinimalDebian das grub-Paket installiert. Dann habe ich innerhalb dieses Systems (mit chroot) mit folgendem Befehl die grub-image-Dateien an die richtige Stelle kopiert.

  cp -r /lib/grub/i386-pc /boot/grub

(Dies geschieht in einem normalen System durch "grub-install" zusammen mit der Installation des GRUB-Bootblocks. Da wir dies aber gleich von Hand machen müssen, müssen wir auch dieses Image-Verzeichnis von Hand anlegen.) Danach habe ich die Festplatte des zukünftigen Routers (die ich über einen USB-Konverter als /dev/sdb eingebunden hatte, gelöscht, eine Partition eingerichtet, diese mit ext3 formatiert und das Verzeichnis mit meiner Installation daraufkopiert.

eigentlichen GRUB-Bootblock installieren #

Dann habe ich (nicht im chroot-Jail) mit der sog. grub-shell grub folgende Befehle eingegeben:

  grub> device (hd0) /dev/sdb

Hiermit sage ich grub, daß er die grub-Bezeichnung (hd0) dem angegebenen Device zuordnen soll (und nicht mehr der automatisch gefundenen ersten Festplatte meines Installationsrechners. Es ist wichtig, daß diese grub-Bezeichnung die ist, die später im Router-System der Festplatte zugeodnet wird: (hd0) steht normalerweise für die Platte, die man unter Linux /dev/hda nennt.

  grub> root (hd0,0)

Hiermit sage ich grub, das ich später von der angegebenen Partition (die zweite 0 steht für das, was Linux Partition 1, also hda1 nennt) die GRUB-Images und die GRUB-Konfigurationsdatei menu.lst laden möchte.

  grub> setup (hd0)

Jetzt wird der Bootloader auf die Platte geschrieben (hoffentlich auf die richtige... Besser ein Rettungssystem in der Nähe haben, wenn einem sein Installationsrechner wichtig ist).

  grub> quit

Puffer leeren und fertig!

Konfigurieren #

Möglichkeit 1: Von Hand

Auf der Boot-Festplatte muss man eine Datei /boot/grub/menu.lst anlegen. Diese ist eine normale GRUB-Konfigurationsdatei. Eine einfache Konfiguration für unsere Anwendung sieht z.B. so aus:

  # Erste serielle Schnittstelle mit 38400 bps einrichten
  serial --unit=0 --speed=38400
  # und diese als Terminal benutzen
  terminal serial
  # 5 Sekunden warten, bevor der erste angegebene Eintrag automatisch lädt
  # timeout 5
  title           Debian GNU/Linux
  root            (hd0,0)
  kernel          /boot/vmlinuz-2.6.8-2-386 root=/dev/hda1 ro console=ttyS0,38400n8 reboot=bios
  initrd          /boot/initrd.img-2.6.8-2-386
  # savedefault
  boot
  title           Debian GNU/Linux (recovery)
  root            (hd0,0)
  kernel          /boot/vmlinuz-2.6.8-2-386 root=/dev/hda1 ro console=ttyS0,38400n8 reboot=bios single
  initrd          /boot/initrd.img-2.6.8-2-386
  boot

Jetzt sollte der Kernel vorschriftsmäßig booten.

Möglichkeit 2: update-grub

Wer normale Debian-Kernelpakete benutzt, kann diese Datei auch vom Debian-Paketmanager automatisch anpassen lassen, wie dies auch in normalen Debian-Systemen üblich ist. Wenn man nun z.B. ein neues Kernel-Paket installiert, wird automatisch ein passender Eintrag in das Bootmenü aufgenommen. Warum sollte man ohne Bildschirm nicht den gleichen Komfort wie sonst auch geniessen?!?

Hierzu ruft man update-grub auf. In diesem Falle muss darauf geachtet werden, daß danach die obersten beiden Zeilen obiger menu.lst in die automatisch erzeugte Datei eingefügt werden, damit GRUB richtig arbeitet und die Kerneloptionen console=ttyS0,38400n8 reboot=bios an die "# kopt=..."-Zeile angehangen werden. Diese machen den eigentlichen Unterschied des headless-Systems aus. Nach Änderung der kopt-Zeile nochmals update-grub starten, damit die Änderungen in die eigentlichen Kernel-Einträge übernommen werden.

Kernel #

Das wichtigste, das wir beachten müssen, ist die Kerneloption console=ttyS0,38400n8, wie oben angegeben. Hierdurch wird dem Kernel begreiflich gemacht, daß wir nur auf der seriellen Schnittstelle mit ihm kommunizieren wollen. Eine weitere Option, die ich benutzt habe, ist reboot=bios. Dies scheint nicht immer nötig zu sein, ist aber wohl z.B. bei Geräten wichtig, die überhaupt keinen Tastaturanschluß haben. Schaden kann es wohl nicht.

Login #

In die Datei /etc/inittab gehört diese Zeile, damit ein getty auf der seriellen Schnittstelle startet, das ggf. ein Login erlaubt:

  T0:2345:respawn:/sbin/getty -L ttyS0 38400 vt100

Anpassungen am System #

Die Einträge in der inittab, die die normalen Terminals betreffen, sind sinnlos und können auskommentiert werden. Ansonsten sollte man auf einem Headless-System natürlich keinen X-Server installieren... Weitere Anpassungen waren bei mir nicht nötig.

Zugriff #

So - nun kann man über einen Laptop und ein Nullmodemkabel (ein gekreuztes serielles Kabel) jederzeit auf den Router im Keller zugreifen, die Bootmeldungen ansehen, um Fehler zu finden und sich sogar einloggen. :-) Hierzu gibt es AFAIK unter Linux auf der Konsole nur das Programm minicom. Viel Spaß!

Add new attachment

Only authorized users are allowed to upload new attachments.
« This page (revision-3) was last changed on 13-Apr-2007 18:35 by PeterHormanns