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):

  1. Welches der Installationsort des Bootloaders ist, hier: „/dev/sda“ (siehe unten in Zeile 3)

  2. Ob /boot auf einer separaten Partition ist, hier: „Ja“ (siehe unten in Zeile 4)

  3. 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!).

  1. 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
  1. 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.

  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
}
  1. 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
}