Fehler bei der Konfiguration des Bootmanagers können zu einem unbenutzbaren System führen.
Der ab Ubuntu 9.10 als Standard verwendete neue Bootloader GRUB 2 wird in einem eigenen Artikel behandelt. Der hier beschriebene Vorgänger wird inzwischen auch als "GRUB Legacy" bezeichnet. Der Artikel Grub 2 durch Grub ersetzen erläutert, wie man die ältere GRUB-Version dennoch nutzen kann.
Dieser Artikel ist größtenteils für alle Ubuntu-Versionen gültig.
Um bei Problemen mit dem Bootloader auf einer Festplatte noch eine Notlösung zu haben, kann man GRUB zusätzlich auch auf einer Diskette installieren. Dazu hat man zwei Möglichkeiten. Methode 1 installiert dabei fast das komplette /boot-Verzeichnis auf Diskette, so dass man unabhängig vom zu startenden System ist. Methode 2 schreibt nur einen Verweis auf die menu.lst der aktuellen Distribution, geht dafür aber auch schneller und einfacher.
Eine Diskette ins Laufwerk einlegen und dann die folgenden Befehle im Terminal [1] ausführen:
mke2fs /dev/fd0
Legt auf der Diskette (fd0) ein ext2-Dateisystem an. Alle Daten auf der Diskette gehen verloren.
sudo mkdir /media/floppy
Legt das Verzeichnis floppy als Unterverzeichnis des Verzeichnisses /media an.
sudo mount -t ext2 /dev/fd0 /media/floppy
Bindet das Dateisystem der Diskette (fd0) an das Verzeichnis /media/floppy
sudo mkdir /media/floppy/boot
Legt ein Unterverzeichnis boot im Verzeichnis floppy an
cd /media/floppy/boot sudo cp /usr/lib/grub/i386-pc/* . sudo cp /usr/sbin/grub . sudo cp /boot/grub/menu.lst .
Bei AMD64:
cd /media/floppy/boot sudo cp /usr/lib64/grub/x86_64-pc/* . sudo cp /usr/sbin/grub . sudo cp /boot/grub/menu.lst .
Mit dem ersten Befehl wechselt man in das Verzeichnis /media/floppy/boot. Die drei weiteren Befehle kopieren die angegebenen Dateien in eben diesen Ordner. Dass der aktuelle Ordner als Zielverzeichnis verwendet werden soll, wird durch den Punkt angezeigt.
Die Diskette muss jetzt wieder ausgehängt werden, da die Installation sonst mit einem Fehler abbricht. Vorher muss man das Verzeichnis verlassen.
cd / sudo umount /dev/fd0
Nun sind alle benötigten Dateien kopiert und das Programm GRUB kann mit dem Befehl
sudo grub
aufgerufen werden. Mit den folgenden GRUB-Shell-Kommandos wird der Bootloader nun auf der Diskette installiert:
root (fd0)
install (fd0)/boot/stage1 (fd0) (fd0)/boot/stage2 p (fd0)/boot/menu.lst
Dieser Befehl muss in einer Zeile eingegeben werden! "stage1" und "stage2" sind zwei unterschiedliche Programmteile von GRUB, die beim Systemstart nacheinander geladen werden. In der Datei menu.lst, die man mit einem Texteditor [2] bearbeiten kann, sind die Betriebssysteme mit ihren jeweiligen Bootparametern aufgeführt.
Bei der Installation hört man, wie die Diskette beschrieben wird. Hat alles gut funktioniert, kann man GRUB mit
quit
wieder verlassen und einem Test steht nichts mehr im Wege. Natürlich muss bei Einstellung der Boot-Reihenfolge im BIOS das Floppy-Laufwerk an erster Stelle stehen.
Oft reicht es aus, wenn auf der Diskette nur ein Verweis auf die menu.lst der aktuellen Distribution liegt. Dies hat den Vorteil, dass das Dateisystem auf der Diskette unberührt bleibt und man so auch eine "normale" FAT-formatierte Diskette benutzen kann.
Man legt hierfür einfach eine Diskette in das Laufwerk ein, welche aber nicht eingebunden werden darf! Durch den Befehl [1]
sudo grub-install /dev/fd0
installiert man GRUB nun in den Boot Record der Diskette. Der Eintrag verweist dann aber nur auf das aktuelle Ubuntu.
Z.B. um ein weiteres Linux mit eigener menu.lst zu booten, siehe menu.lst.
sudo grub-install --root-directory=/mnt/sda7 /dev/sda7
sda7 ist hier die Partition, auf der sich das Zweitsystem befindet. /mnt/sda7 ist die Stelle, an der die Partition eingebunden ist. Arbeitet man gerade auf dem Zweitsystem kann man die --root-directory=/
Option auch weglassen. Dabei ist sicherzustellen, dass auch die device.map des Zweitsystems korrekt konfiguriert ist.
Linux-Traditionalisten und "Sicherheitsfanatiker" separieren gerne die Boot-Daten von dem eigentlichen Linux-System in eine eigene Partition. Unproblematisch ist dies, wenn man sich bereits bei der Installation von Ubuntu selbst für diese Variante entschieden hat. Hier wird der Fall beschrieben, dass dies nachträglich erfolgen soll. Es sind einige Änderungen erforderlich, damit Ubuntu konsequent von der neuen Partition bootet. Die nachfolgende Anleitung führt Schritt für Schritt durch die notwendigen Änderungen durch. Sie bietet sich auch dann an, wenn man aus Versehen seine Boot-Partition zerschossen hat und unglücklicherweise keinen Backup bzw. Boot-Diskette mehr auftreiben kann. Und es empfiehlt sich, nach einer Neuinstallation von Ubuntu, bei der man mit Hilfe des Installations-Assistenten eine getrennte Boot-Partition erstellt hat, die Dateien /boot/grub/menu.lst, /boot/grub/devices.map und /etc/fstab auf die Änderungen zu prüfen und ggf. nachträglich anzupassen.
Zunächst muss man eine neue Boot-Partition erstellen. Dafür benötigt man GParted oder einen beliebigen anderen Partition-Editor. 250-500 MB Speicher auf der Festplatte reichen locker aus, um auch mehrere Kernel-Versionen parallel zu unterstützen. Am Beispiel einer neu angelegten Partition in /dev/sda11 wird nun die weitere Vorgehensweise erläutert:
Zunächst wird mit
sudo mkfs -t ext2 /dev/sda11
die Partition formatiert. Natürlich funktionieren auch andere Dateisysteme wie ext3 oder ReiserFS.
Anschließend wird die neu formatierte Boot-Partition ins Verzeichnis /media eingebunden:
sudo mkdir /media/boot
und
sudo mount -t ext2 /dev/sda11 /media/boot
Für andere Dateisysteme wie ext3 oder ReiserFS die Option -t
anpassen zu ext3
bzw. reiserfs
.
Jetzt kann man die im bisherigen Boot-Verzeichnis enthaltenen Dateien in die neue Boot-Partition kopieren mit
sudo cp -r /boot/* /media/boot
Man beachte, dass in der neuen Boot-Partition kein Verzeichnis boot erstellt wird. Da die Boot-Partition später ja als Verzeichnis /boot in das Root-Verzeichnis eingebunden werden soll, würden sich die Dateien sonst unter /boot/boot befinden.
Jetzt muss noch die Datei /etc/fstab angepasst werden. Dazu wird ein Verweis auf die neue Partition eingefügt:
# /etc/fstab: static file system information. # # <file system> <mount point> <type> <options> <dump> <pass> proc /proc proc defaults 0 0 # /dev/sda11 UUID=9e9e5184-127f-45d2-bf4a-e6f0a112f180 /boot ext2 defaults,errors=remount-ro 0 1
Die UUID der neuen Partition ermittelt man mittels folgendem Kommando:
ls -l /dev/disk/by-uuid
Es muss die in der Ausgabe des Befehls angegebene UUID der neuen Boot-Partition in /etc/fstab eingefügt werden, da sonst GRUB die Partition nicht findet.
Abschließend die neue Boot-Partition in das Wurzelverzeichnis einbinden:
sudo umount /media/boot sudo mount -t ext2 /dev/sda11 /boot
Das weiter oben angelegte Verzeichnis /media/boot wird nun nicht mehr benötigt und kann gelöscht werden:
rmdir /media/boot
Sollte eine Bootpartition bereits existieren, deren Inhalt aber zerstört worden sein, so kann der Inhalt wie folgt wiederhergestellt werden: Von der Ubuntu-Live-CD oder einem ähnlichem Boot-Medium das System im Rescue-Modus booten. Ein Terminal [1] im bisherigen Root-System (im Beispiel /dev/sda1) ausführen die Boot-Partition mit
fdisk /dev/sda
neu erstellen und/oder mit
mkfs -t ext2 /dev/sda11
formatieren. Anschließend die Boot-Partition mit
mount -t ext2 /dev/sda11 /boot
einbinden. Dann von der Live-CD oder mittels
apt-get --reinstall install
über das Internet das Paket
linux-image-<Kernel-Version>-generic
installieren. Auf diese Art erhält man die für die Installation von GRUB benötigten Kernel-Dateien in das Verzeichnis /boot installiert. Anschließend muss noch die UUID der Boot-Partition in der Datei /etc/fstab wie oben beschrieben angepasst werden.
Der Befehl grub-install installiert GRUB neu und schreibt den Bootloader in den MBR der angegebenen Festplatte:
sudo grub-install /dev/sda
Als Rückmeldung gibt GRUB die interne Festplattennumerierung zurück:
(hd0) /dev/sda (hd1) /dev/hda (hd2) /dev/sdb
Sollte diese nicht korrekt sein, muss die vom GRUB-Installer neu erstellte Datei /boot/grub/devices.map angepasst und grub-install nochmals ausgeführt werden.
Anschließend wird mit dem Kommando
sudo update-grub
die Installation abgeschlossen. Die Frage, ob die Datei /boot/grub/menu.lst erstellt werden soll, bitte mit "Ja" beantworten. Wie eingangs schon erwähnt, tut sich GRUB schwer mit getrennten Boot-Partitionen. Deshalb muss die durch update-grub erstellte Datei /boot/grub/menu.lst noch angepasst werden. Dafür öffnet man sie in einem Editor mit Root-Rechten [2] und sucht nach den Ubuntu-Boot-Einträgen. Diese sollten etwa wie folgt aussehen:
title Ubuntu, kernel 2.6.20-15-generic root (hd0,0) kernel /boot/vmlinuz-2.6.20-15-generic root=UUID=fe7bf845-7ce9-4733-b6de-f70f2b62076d ro quiet splash initrd /boot/initrd.img-2.6.20-15-generic quiet savedefault
Damit GRUB Ubuntu booten kann, müssen diese automatisch (leider fehlerhaft) eingestellten Einträge (oben) wie (unten) folgt abgeändert werden:
title Ubuntu, kernel 2.6.20-15-generic root (hd0,10) kernel /vmlinuz-2.6.20-15-generic root=UUID=fe7bf845-7ce9-4733-b6de-f70f2b62076d ro quiet splash initrd /initrd.img-2.6.20-15-generic quiet savedefault
Dabei verweist root nun auf die neue Boot-Partition in interner GRUB-Darstellung (die Partitionen werden von 0 an aufwärts gezählt) und /boot muss aus der Pfadangabe für "vmlinuz" und "initrd.img" entfernt werden, da die Boot-Partition wie weiter oben schon angemerkt kein Boot-Verzeichnis enthält. Die UUID im Eintrag kernel
muss nicht angepasst werden, da sie ja korrekterweise auf die Root-Partition verweist. Um bei zukünftigen Kernel-Updates durch Ubuntu nicht böse Überraschungen zu erleben, muss man den Verweis auf die Boot-Partition (root (hd0,10)
) noch vor Änderungen durch update-grub schützen. Dazu editiert man die groot
-Zeile im "debian automagic kernels list"-Teil der /boot/grub/menu.lst-Datei:
## default grub root device ## e.g. groot=(hd0,0) # groot=(hd0,0)
Die Zeile findet man durch Blättern nach oben und ändert sie im Texteditor wie folgt ab:
## default grub root device ## e.g. groot=(hd0,0) # groot=(hd0,10)
(hd0,0)
ist der alte GRUB-Verweis auf die Wurzel-Partition, in der sich bislang der Kernel befand und (hd0,10)
ist die GRUB-Referenz auf die neue Boot-Partition, in die von nun an die neuen Kernel installiert werden sollen. Bitte nicht das Kommentarzeichen entfernen. Außerdem ist darauf zu achten, dass die GRUB-Referenzen auf die richtigen Partitionen des Computers verweisen. Dazu die in diesem Wiki verwendeteten Beispiele sorgfältig anpassen. Dabei nicht vergessen, die Änderungen in der Datei menu.lst zum Abschluss zu speichern. Es empfiehlt sich außerdem eine Sicherheitskopie der Datei sowohl im Boot-Verzeichnis als auch wie später noch beschrieben auf einer Diskette anzulegen.
Zum Abschluss muss das Kommando
sudo update-grub
ausgeführt werden. Dadurch werden Änderungen an den Optionen in die automatisch verwalteten Kerneleinträge übernommen. Ohne dieses Kommando wirken Änderungen an bestimmten Optionen nicht.
Nun das System neu booten, dabei nicht vergessen, die evtl. noch eingelegte Ubuntu-Live-CD zuvor zu entfernen.
Auf keinen Fall nach dem Reboot des Systems versuchen, das alte /boot-Verzeichnis zu löschen. Der neue Eintrag in der /etc/fstab-Datei hat schon dafür gesorgt, dass die neue Boot-Partition als Verzeichnis /boot in das System eingebunden worden ist. Alle Änderungen - d.h. auch das Löschen von Daten - unterhalb von /boot erfolgt nun in der neuen Boot-Partition.
Diese Revision wurde am 24. Mai 2013 15:10 von aasche erstellt.