Per GRUB über Netzwerk booten

Supportdatenbank (fhassel_grub_net)
Bezieht sich auf

SuSE Linux: Versionen ab 8.1

Anliegen

Sie möchten mit Hilfe des Bootmanagers GRUB die für das Booten notwendigen Dateien über das Netzwerk laden.

Vorgehen

Die folgende Kurzanleitung wendet sich eher an erfahrene Anwender. Insbesondere der Umgang mit rpm, tar, dem Kompilieren von Quellpaketen und der Konfiguration von Netzwerkdiensten sollte bekannt sein, ebenso Grundkenntnisse des Bootloaders GRUB (vgl. dazu "Der Bootmanager GRUB" (http://sdb.suse.de/de/sdb/html/fhassel_grub_overview.html)).

Als Anwendungsbeispiel wird das Laden der Linuxinstallation bzw. des Rettungssystems über das Netz genommen. Hierbei wird ein Client-Rechner mit Hilfe einer GRUB-Bootdiskette gestartet. Die zum Booten von Linux benötigten Dateien (kernel, initrd) werden von GRUB mit dem tftp-Protokoll, alle weiteren Dateien per ftp oder nfs von einem Server-Rechner übertragen.

Ebenso wäre natürlich möglich, ein Linux-Betriebssystem zu laden und den Client Rechner als Diskless Client zu betreiben. Letztere Konfiguration würde allerdings den Rahmen dieses Artikels sprengen.

Schritt 1: Neukompilieren des GRUB-Pakets

GRUB ist defaultmässig ohne Netzwerkkartensupport kompiliert. Daher muss es zunächst neu kompiliert werden. Dazu installieren Sie bitte zunächst aus dem Verzeichnis /suse/src von der DVD oder CD (bei der Professional Version auf CD 7, bei der Personal Version CD 3 zu finden) das GRUB Quell-Paket mit Hilfe des rpm-Kommandos.

rpm -Uhv /media/cdrom/suse/src/grub-0.92-69.src.rpm 
Im Verzeichnis /usr/src/packages/SOURCES/ finden Sie dann ein tar-ball, in dessen Datei netboot/README.netboot die Parameter zum Kompilieren der Unterstützung für die einzelnen Netzwerkkarten zu finden ist. Um diese Datei in das Verzeichnis /tmp zu extrahieren, können Sie sich an folgendem Beispiel orientieren (bitte die Versionsnummer des GRUB-Pakets anpassen):
tar -xOjf /usr/src/packages/SOURCES/grub-0.92.tar.bz2 grub-*/netboot/README.netboot >/tmp/README.netboot
Für eine Intel Ethernet Pro 100 z. B. wird der Parameter "--enable-eepro100" gebraucht. Es empfiehlt sich, nur die Treiber zu aktivieren, die wirklich gebraucht werden, da zu viele einkompilierte Netzwerkkartentreiber GRUB zum Abstürzen bringen können.

Editieren Sie das spec-File, welches Sie unter /usr/src/packages/SPECS/grub.spec finden, mit einem Ascii-Editor Ihrer Wahl. Fügen den Parameter für die Unterstützung Ihrer Netzwerkkarte hinzu. Dies kann dann folgendermassen aussehen:

%build
%ifarch x86_64
  export CC='cc -m32'
  CFLAGS="$CFLAGS $RPM_OPT_FLAGS -DNDEBUG -W -Wall -Wpointer-arith -fno-asynchronous-unwind-tables"  ./configure \
  --prefix=/usr --infodir=%{_infodir} --mandir=%{_mandir} --datadir=/usr/lib/grub \
  --disable-auto-linux-mem-opt --enable-diskless --enable-eepro100
%else
  CFLAGS="$CFLAGS $RPM_OPT_FLAGS -DNDEBUG -W -Wall -Wpointer-arith" ./configure \
  --prefix=/usr --infodir=%{_infodir} --mandir=%{_mandir} --datadir=/usr/lib/grub \ 
  --disable-auto-linux-mem-opt --enable-diskless --enable-eepro100
%endif  
make
Oben in diesem Spec File erhöhen Sie noch die Release-Nummer, z. B.:
Release:      70
Dann das Spec File speichern und das Paket neu kompilieren:
rpm -bb /usr/src/packages/SPECS/grub.spec
und installieren:
rpm -Uhv /usr/src/packages/RPMS/i386/grub-0.92-70.i386.rpm
Erstellen Sie sich auf folgende einfache Art und Weise eine GRUB-Bootdiskette:
cd /usr/lib/grub/
dd if=stage1 of=/dev/fd0
dd if=stage2 of=/dev/fd0 seek=1
Durch diese Befehle werden die erste sowie die zweite Stufe des GRUB blockweise direkt auf eine Diskette geschrieben.

Schritt 2: Konfiguration der Netzwerkdienste

GRUB unterstützt das Laden von Dateien über das Netzwerk mit Hilfe des tftp-Protokolls. Installieren Sie dazu auf Ihrem Linux-Server das Paket atftp. Erstellen Sie das Verzeichnis /tftpboot, in welchem der tftp-Server seine Dateien bereitstellt, und kopieren Sie von der ersten Installations-CD bzw. DVD den Kernel (Datei boot/loader/linux) und die Initrd (Datei boot/loader/initrd) in dies Verzeichnis hinein. Zum Aktivieren des tftp-Servers editieren Sie die Datei /etc/inetd.conf: Fügen Sie folgenden Eintrag hinzu:
tftp dgram udp wait nobody /usr/sbin/tcpd /usr/sbin/atftpd /tftpboot
Die Installation bzw. das Laden des Rescue-Systems kann per ftp oder per nfs erfolgen. Im Folgenden sei die Konfiguration eines ftp-Servers beschrieben. Installieren Sie die Pakete vsftpd und ftpdir. Zum Aktivieren des ftp-Servers editieren Sie die Datei /etc/inetd.conf: Entkommentieren Sie den Eintrag
ftp stream tcp nowait root /usr/sbin/tcpd vsftpd
Aktivieren Sie den inted mit dem Aufruf
rcinetd start
Falls der inetd beim Booten automatisch starten soll, so können Sie dies mit dem Befehl insserv inetd oder mit Hilfe des Runleveleditors erreichen. Weitere Hinweise zur Konfiguration von Serverdiensten finden Sie im Administrationshandbuch.

Um die SuSE Installations-Dateien freizugeben, kopiert man den Inhalt der CDs bzw. der DVD in das Verzeichnis /srv/ftp/pub oder in ein Unterverzeichnis. Alternativ kann auch einfach die DVD oder die erste CD unter den Mountpoint /srv/ftp/pub eingehangen werden:

mount -t iso9660 -o ro /dev/cdrom /srv/ftp/pub/

Schritt 3: Ausprobieren der GRUB-Bootdiskette am Client Rechner

Starten Sie den Client Rechner mit der GRUB-Bootdiskette. Es erscheint eine Art Eingabeaufforderung:
grub >
Teilen Sie GRUB die IP-Adresse des Client-Rechners, die Netmask sowie die Adresse des Servers mit:
grub > ifconfig --address=192.168.0.2 --mask=255.255.255.0 --server=192.168.0.1
Achten Sie auf die Schreibweise (adress ist nicht address)!
Falls auf dem Server Rechner ein DHCP-, BOOTP- oder RARP-Server läuft, können Sie die IP-Adresse alternativ auch automatisch zuweisen lassen. Bei DHCP zum Beispiel mit dem Befehl
grub > dhcp
Teilen Sie im nächsten Schritt GRUB mit, dass die Bootdateien über das Netz geladen werden sollen (nd bedeutet "network drive"):
grub > root (nd)
Als nächstes wird der Kernel geladen. Dem linuxrc wird mit Hilfe eines weitereren Parameters die Installationsquelle mitgeteilt:
grub > kernel /linux install=ftp://192.168.0.1/pub/
Der Kernel linux wird aus dem Hauptverzeichnis des tftp-Servers geladen, die Installationsdateien per ftp, in diesem Fall aus dem Verzeichnis /pub vom Server mit der IP 192.168.0.1.

Falls anstelle der Installation das SuSE Rescue System geladen werden sollen, so hängen Sie an die Zeile den Parameter rescue=1 an. Falls die Dateien per nfs geladen werden sollen, wäre die Syntax install=nfs://server/verzeichnis/. Tipp zum Starten der Installation: Bei manchen Netzwerkkarten mag zum Starten des linuxrc das explizite Laden des Netzwerkkartenmoduls notwendig sein. Fügen Sie in diesem Fall den Parameter insmod=Modulname hinzu, wobei für Modulname das entsprechende Kernelmodul einzusetzten ist. Beispiel für eine Intel EtherExpress PRO/100:

grub > kernel /linux insmod=e100 install=ftp://192.168.0.1/pub/
Weitere Parameter zur Installation finden Sie, wenn das Paket linuxrc installiert ist, in der Datei usr/share/doc/packages/linuxrc/linuxrc.html.

Nach dem Kernel wird die Initrd geladen:

grub > initrd /initrd
Das System wird schließlich gebootet mit dem Aufruf
grub > boot
Wenn alles richtig konfiguriert ist, sollte nun die Installation bzw. das Rescue-System starten!

Schritt 4: Vereinfachung des Bootvorgangs des Clients durch Anlegen eines Menüs

Damit nicht alle Aufrufe einzeln eingegeben werden müssen, kann ein ansprechendes Menü über das Netz geladen werden. Kopieren Sie dazu auf dem Server die Datei /boot/message sowie die Datei /boot/grub/menu.lst in das Verzeichnis /tftpboot, so dass diese von GRUB über das tftp-Protokoll geladen werden können. Passen Sie die Datei /tftpboot/menu.lst analog zu folgendem Beispiel auf Ihre Gegebenheiten an:
gfxmenu (nd)/message
color white/blue black/light-gray
default 1
timeout 8

title SuSE Linux Installation
   kernel (nd)/linux insmod=e100 install=ftp://192.168.0.1/pub/
   initrd (nd)/initrd
title SuSE Linux Rescue System
   kernel (nd)/linux insmod=e100 install=ftp://192.168.0.1/pub/ rescue=1 
   initrd (nd)/initrd
title Booting from local hard disk
   root (hd0)
   chainloader +1
Booten Sie den Client mit der GRUB Bootdiskette und konfigurieren Sie das Netzwerk durch Eingabe des gewohnten ifconfig-Befehls:
grub > ifconfig --address=192.168.0.2 --mask=255.255.255.0 --server=192.168.0.1
oder durch:
grub > dhcp
Das Menü wird geladen durch die Eingabe von
grub > configfile (nd)/menu.lst
Nun haben Sie das gewohnte SuSE Bootmenü vor sich, mit dessen Hilfe Sie bequem Ihre Auswahl treffen können.

Schritt 5: Weitere Vereinfachung des Bootvorgangs

Eine weitere Vereinfachung stellt das Abspeichern des Menüs auf die Diskette dar, so dass das Menü automatisch geladen wird und jede Tipparbeit beim Booten entfällt. Das Erstellen der Bootdiskette ist nun ein wenig aufwendiger. Zunächst muss ein Dateisystem auf der Diskette angelegt werden:
erde:~ # mke2fs -m 0 /dev/fd0
Die Diskette wird nun gemountet, so dass die erforderlichen Bootdateien kopiert werden können:
erde:~ # mount /media/floppy/
erde:~ # cp /usr/lib/grub/stage1 /usr/lib/grub/stage2 /media/floppy/
Kopieren Sie auch die im vorherigen Schritt erstellte Datei /tftboot/menu.lst auf die Diskette. Passen Sie die neu erstellte Datei /media/floppy/menu.lst an, indem Sie die Netzwerkkonfiguration an den Beginn der Datei hinzufügen (den bekannten dhcp- bzw. den ifconfig-Befehl):
dhcp
gfxmenu (nd)/message
color white/blue black/light-gray
default 1
timeout 8

title SuSE Linux Installation
   kernel (nd)/linux insmod=e100 install=ftp://192.168.0.1/pub/
   initrd (nd)/initrd
title SuSE Linux Rescue System
   kernel (nd)/linux insmod=e100 install=ftp://192.168.0.1/pub/ rescue=1
   initrd (nd)/initrd
title Booting from local hard disk
   root (hd0)
   chainloader +1
Um die Bootdiskette bootfähig zu machen, rufen Sie in der Shell den Befehl grub auf:
erde:~ # grub
Sie befinden sich nun in der sogenannten Grub-Shell. Durch den folgenden Aufruf wird die sich auf der Diskette befindende Datei stage1 in den Bootsektor der Diskette geschrieben. Weiterhin wird als Parameter übergeben, dass sich stage2 und die Konfigurationsdatei menu.lst ebenso auf der Diskette befinden.
grub > install (fd0)/stage1 (fd0) (fd0)/stage2 p (fd0)/menu.lst
Die Grub-Shell verlassen Sie mit:
grub > quit
Nun wird noch die Diskette ausgehangen:
erde:~ # umount /media/floppy
Falls alles geklappt hat, wird beim Booten die Konfiguration nun komplett von der Diskette geladen.

Weitere Hinweise zu GRUB finden Sie unter http://www.gnu.org/manual/grub/html_mono/grub.html. Dieselbe Information können Sie im installierten System mit info grub in einer Shell aufrufen. Weitere Hinweise zum Starten von Linux als diskless client (Kernelparameter zum Booten per nfs) finden Sie in Ihrem Linux-System in der Datei /usr/src/linux/Documentation/nfsroot.txt, sofern die Kernel-Quellen installiert sind (Paket kernel-source).

Abschließender Hinweis: Bitte beachten Sie, dass der kostenlose Installationssupport Ihnen bei dieser Thematik keine Hilfestellung geben kann.


Siehe auch:
o Der Bootmanager GRUB

Stichwörter: GRUB, NETZWERK, NETWORK, BOOTEN, TFTP

Kategorien: GRUB

Feedback willkommen: Send Mail to fhassel+sdb@suse.de (Geben Sie bitte folgendes Stichwort an: SDB-fhassel_grub_net)
SDB-fhassel_grub_net, Copyright SuSE Linux AG, Nürnberg, Germany - Version: 04. Feb 2003
SuSE Linux AG - Zuletzt generiert: 06. Mar 2003 von fhassel (sdb_gen 1.40.0)