Bootvorgang mit extlinux
Autor: Axel Pemmann, Stand 01.11.2020
Ziel: Ablösung von GRUB als Bootloader.
Ausgangssituation
Linux-Distribution: CentOS 8 in Standardinstallation (auf LVM), alternativ: Debian/Ubuntu
Partitionierungsschema: klassischer, alter MBR (extlinux unterstützt UEFI nicht)
Zuerst einmal sehen wir nach, wie die Partitionierung gestaltet ist. LVM macht hierbei keine Probleme, allerdings muss folgendes klar sein (siehe auch die Zeilennummern der nachfolgenden Shell-Sitzung):
Welches der Installationsort des Bootloaders ist, hier: „/dev/sda“ (siehe unten in Zeile 3)
Ob /boot auf einer separaten Partition ist, hier: „Ja“ (siehe unten in Zeile 4)
Wie die Gerätedatei heißt, die das RootFS spezifiziert, hier: „/dev/dm-1“ (siehe unten in Zeile 22)
Dazu bitte diese Shell-Sitzung studieren:
1root@cent ~# lsblk
2NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
3sda 8:0 0 50G 0 disk
4├─sda1 8:1 0 1G 0 part /boot
5└─sda2 8:2 0 49G 0 part
6├─cl-swap 253:0 0 2,2G 0 lvm [SWAP]
7└─cl-root 253:1 0 46,9G 0 lvm /
8sr0 11:0 1 1024M 0 rom
9root@cent ~#
10root@cent ~# lsblk -f
11NAME FSTYPE LABEL UUID MOUNTPOINT
12sda
13├─sda1 ext4 164a5ae1-7e89-40f4-ba38-b188f78a0eb9 /boot
14└─sda2 LVM2_member mNrg1L-4NCG-jibN-Xmwu-oSEA-C026-3zC23u
15├─cl-swap swap 3c33e9c1-5f5c-4473-8a15-8adfe7b569db [SWAP]
16└─cl-root xfs 88b5e09c-8966-4f6a-8780-589af5b075a7 /
17sr0
18root@cent ~#
19root@cent ~# ## LPI-relevant ist hierbei der Pfad "/dev/disk/by-uuid"; in diesem Verzeichnis befindet sich
20root@cent ~# ## der Symlink, welcher auf unser LVM-Blockgerät "/dev/dm-1" zeigt:
21root@cent ~# ls -l /dev/disk/by-uuid/88b5e09c-8966-4f6a-8780-589af5b075a7
22lrwxrwxrwx 1 root root 10 9. Okt 13:57 /dev/disk/by-uuid/88b5e09c-8966-4f6a-8780-589af5b075a7 -> ../../dm-1
23root@cent ~#
Software installieren
Mit yum -y install syslinux-extlinux
ist das schnell erledigt. Bei Debian/Ubuntu heißt die Zeile apt install extlinux
.
Vorbereitungen
Mit mkdir -p /boot/extlinux/
erzeugen wir das Wurzelverzeichnis für den Bootloader. Bei CentOS wird es bereits beim Installieren der Software angelegt, deshalb die Option ‚-p‘.
Mit extlinux --install /boot/extlinux
wird nun der SYSLINUX loader „ldlinux.sys“ ins Wurzelverzeichnis kopiert und die Information „/boot/extlinux is device /dev/sda1“ ausgegeben, welche besagt, dass sich die Bootkonfiguration auf /dev/sda1 befindet, was bei einer LVM basierten Festplattenaufteilung eine separate Partition ist. Dies ist wichtig für die spätere Konfigurationsdatei.
Konfiguration
Config mit klassischem Partitionslayout
Gehen wir aber erst einmal von einer einfacheren Situation auf einem Devuan Beowulf System aus (= Debian 10), wo sich /boot mit auf der Wurzelpartition /dev/sda3 befindet:
tux@devuanBeo:~$ grep ^/dev /proc/mounts
/dev/sda3 / ext4 rw,noatime 0 0
/dev/sda1 /home ext4 rw,noatime 0 0
tux@devuanBeo:~$
Die zu erzeugende Konfigurationsdatei /boot/extlinux/extlinux.conf
könnte dann so aussehen:
1# Eingabeprompt anzeigen: Ja
2prompt 1
3
4# Nach dem "timeout" zu bootendes "label":
5default devuan
6
7# Wartezeit, bis das "default"-Label (= Default-Konfiguration) gebootet wird [1/10s]:
8timeout 100
9
10# Name der Konfiguration festlegen:
11label devuan
12 # Angabe der Kernel-Datei (hier mit "/boot/...", weil es KEINE separate Bootpartition gibt):
13 kernel /boot/vmlinuz-4.19.0-9-amd64
14
15 # Angabe der "Initrd" (ebenso mit "/boot") sowie der RootFS-Gerätedatei:
16 append initrd=/boot/initrd.img-4.19.0-9-amd64 ro root=/dev/sda3
Um auf Nummer sicher zu gehen, wollen wir noch das Boot-Flag setzen. Bei der Kontrolle mittels:
1root@devuanBeo:~# fdisk -l
2Festplatte /dev/sda: 50 GiB, 53687091200 Bytes, 104857600 Sektoren
3Disk model: VBOX HARDDISK
4Einheiten: Sektoren von 1 * 512 = 512 Bytes
5Sektorgröße (logisch/physikalisch): 512 Bytes / 512 Bytes
6E/A-Größe (minimal/optimal): 512 Bytes / 512 Bytes
7Festplattenbezeichnungstyp: dos
8Festplattenbezeichner: 0x00000000
9
10Gerät Boot Anfang Ende Sektoren Größe Kn Typ
11/dev/sda1 * 2048 4098047 4096000 2G 83 Linux
12/dev/sda2 4098048 8194047 4096000 2G 82 Linux Swap / Solaris
13/dev/sda3 8194048 104857599 96663552 46,1G 83 Linux
14
15root@devuanBeo:~#
stellen wir fest, dass fälschlicherweise /dev/sda1 das Boot-Flag aufweist, was aber die /home-Partition ist (-> Stern: „*“)! Das ändern wir gleich noch mit 2 kurzen Zeilen:
root@devuanBeo:~# parted -s /dev/sda set 1 boot off
root@devuanBeo:~# parted -s /dev/sda set 3 boot on
Config auf einem LVM-System
Bei einer LVM basierten Linuxinstallation liegt /boot nicht mit im Wurzeldateisystem („rootfs“). Dies muss in der darauffolgenden Konfiguration beachtet werden.
In die neu zu erzeugende Konfigurationsdatei /boot/extlinux/extlinux.conf
kopieren wir folgende Zeilen hinein:
# Eingabeprompt anzeigen: Ja
prompt 1
# Nach dem "timeout" zu bootendes "label":
default cent1
# Wartezeit, bis das "default"-Label (= Default-Konfiguration) gebootet wird [1/10s]:
timeout 100
# Name der Konfiguration festlegen:
label cent1
# Angabe der Kernel-Datei (hier ohne "/boot", weil der Kernel direkt auf separater Partition liegt):
kernel /vmlinuz-4.18.0-193.19.1.el8_2.x86_64
# Angabe der "Initrd" (ebenso ohne "/boot") sowie der RootFS-Gerätedatei des LVM-Volumes "cl-root":
append initrd=/initramfs-4.18.0-193.19.1.el8_2.x86_64.img ro root=/dev/dm-1
MBR neu schreiben
Da CentOS andere Pfade als Debian verwendet (dort: /usr/lib/EXTLINUX/mbr.bin
), suchen wir nach der Datei namens ‚mbr.bin‘, die genau 440 Bytes groß sein muss:
root@cent ~# find /usr -name mbr.bin
/usr/share/syslinux/mbr.bin
root@cent ~#
root@cent ~# file /usr/share/syslinux/mbr.bin
/usr/share/syslinux/mbr.bin: data
root@cent ~#
root@cent ~# ls -l /usr/share/syslinux/mbr.bin
-rw-r--r--. 1 root root 440 9. Nov 2019 /usr/share/syslinux/mbr.bin
root@cent ~#
Bevor es nun ernst wird, empfiehlt es sich natürlich, ein Backup/VM-Snapshot anzufertigen…!
Das Ersetzen des Bootcodes geschieht dann kurz und schmerzlos mittels:
root@cent ~# cat /usr/share/syslinux/mbr.bin > /dev/sda
root@cent ~#
Und nun bitte neu starten…
Nach dem erfolgreichen Booten mit dem neuen Loader gibt die folgende Datei Auskunft über die andere Art der Parameterübergabe:
root@devuanBeo:~# cat /proc/cmdline
BOOT_IMAGE=/boot/vmlinuz-4.19.0-9-amd64 initrd=/boot/initrd.img-4.19.0-9-amd64 ro root=/dev/sda3
root@devuanBeo:~# # ======================================
- typisch SYSLINUX -
Partitionierung und Konfiguration für GRUB im Vergeich
Das obige Problem mit der ausgelagerten /boot-Partition findet sich auch bei GRUB wieder. Dies soll hier im Zusammenhang mit der alten und der neuen Variante umrissen werden.
GRUB 1 (legacy)
ACHTUNG: Ungewöhnlicherweise wird hier die 1. Partition seitens der GRUB-Bezeichung NICHT mit der 1 bezeichnet, sondern mit der 0 (root (hd0,0
, -> die letzte der beiden Nullen ist die Partitionsnummer!).
Wenn /dev/sda1 separat als ‚/boot‘ verwendet wird und /dev/sda2 als RootFS ‚/‘:
title MyLinux
root (hd0,0)
kernel /vmlinuz-2.6.15 root=/dev/sda2 ro
initrd /initrd.img-2.6.15
Wenn sich alles auf /dev/sda2, also alles auf RootFS ‚/‘ befindet:
title MyLinux
root (hd0,1)
kernel /boot/vmlinuz-2.6.15 root=/dev/sda2 ro
initrd /boot/initrd.img-2.6.15
GRUB 2
In der aktuellen GRUB-Version ist die Partitionsnummerierung analog: 1 -> 1, für /dev/sda1 also hd0,1
.
Wenn /dev/sda1 separat als ‚/boot‘ verwendet wird und /dev/sda2 als RootFS ‚/‘:
menuentry MyLinux {
set root='hd0,1'
linux /vmlinuz-3.0.9 root=/dev/sda2 ro
initrd /initrd.img-3.0.9
}
Wenn sich alles auf /dev/sda2 als RootFS ‚/‘ befindet:
menuentry MyLinux {
set root='hd0,2'
linux /boot/vmlinuz-3.0.9 root=/dev/sda2 ro
initrd /boot/initrd.img-3.0.9
}