= 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 ==

[http://www.gnu.org/software/grub/ 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
[http://www.gnu.org/software/grub/manual/grub.html 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|MinimalesDebian] 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ß!