Raspberry Pi Kernel für Proxmox optimieren
Um auf einem Raspberry Proxmox Cluster, Container in einem RBD Storage zu speichern oder auf einer Linux Bridge VLAN awareness zu aktivieren, muss der Raspberry Kernel leicht modifiziert werden.
Diese Anleitung zeigt wie man den Raspberry Pi Kernel optimiert für Proxmox baut.
Vorbereitungen
Getestet auf Ubuntu 20.04.2 (64 Bit)
Abhängigkeiten und 64Bit Toolchain installieren:
apt install git bc bison flex libssl-dev make libc6-dev libncurses5-dev crossbuild-essential-arm64
Ins /home/<user>/
Verzeichnis wechseln und Git-Repo klonen:
git clone --depth=1 https://github.com/raspberrypi/linux
Konfiguration für den Raspberry Pi 4 64 Bit erstellen:
cd linux
KERNEL=kernel8
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- bcm2711_defconfig
Die erstelle .config Datei mit dem Editor öffnen:
vi .config
RBD-Modul (Container auf RBD-Storage speichern)
Den Eintrag für das RBD-Modul finden:
# CONFIG_BLK_DEV_RBD is not set
Kommentar entfernen und als Modul einbinden:
CONFIG_BLK_DEV_RBD=m
VLAN-Filtering aktivieren (Linux Bridge mit VLAN awareness)
Den Eintrag für das VLAN-Filtering finden:
# CONFIG_BRIDGE_VLAN_FILTERING is not set
Die Funktion aktivieren:
CONFIG_BRIDGE_VLAN_FILTERING=y
KSM-Sharing aktivieren (RAM bei mehreren VMs sparen)
KSM (Kernel Samepage Merging) führt identische Teile des RAMs von mehreren VMs zusammen.
Bei Proxmox tritt dieser Effekt erst ein wenn der Host >=80% RAM-Auslastung hat.[1]
Den Eintrag für das KSM-Sharing finden:
# CONFIG_KSM is not set
Die Funktion aktivieren:
CONFIG_KSM=y
Zur Funktionskontrolle kann in der Übersicht eines Proxmox Nodes der Wert "KSM sharing" beobachtet werden.
Alternativ kann folgender Befehl in der Shell ausgeführt werden:
watch cat /sys/kernel/mm/ksm/pages_sharing
Kernel bauen
Mit folgendem Befehl den Build-Prozess starten:
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- Image modules dtbs
Tipp: Mit dem Parameter -j$(nproc)
führt der make-Befehl mehrere Jobs parallel aus (Soviele wie die CPU Kerne hat).
Alle Abfragen mit ENTER bestätigen
Lange warten...
Als nächstes muss die SD Karte des Raspberry gemounted werden.
Bei Ubuntu 20.04 mit Desktop geschieht dies automatisch sobald Ihr die SD Karte einlegt.
Ansonsten müsst Ihr sie manuell mounten:
mkdir mnt
mkdir mnt/fat32
mkdir mnt/ext4
sudo mount /dev/sdb6 mnt/fat32
sudo mount /dev/sdb7 mnt/ext4
Der Pfad zu den Partitionen (sdb6, sdb7) muss ggf. angepasst werden.
Bei der automatischen Einbindung unter Ubuntu heißen die Verzeichnisse eventuell anders:
- /mnt/fat32
→ /media/<user>/boot
- /mnt/ext4
→ /media/<user>/rootfs
Kernel Module auf SD Karte installieren
Bei manueller Einbindung:
sudo env PATH=$PATH make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- INSTALL_MOD_PATH=/mnt/ext4 modules_install
Bei automatischer Einbindung:
sudo env PATH=$PATH make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- INSTALL_MOD_PATH=/media/<user>/rootfs modules_install
Kernel auf SD Karte kopieren
Bei manueller Einbindung:
sudo cp /mnt/fat32/$KERNEL.img /mnt/fat32/$KERNEL-backup.img
sudo cp arch/arm64/boot/Image /mnt/fat32/$KERNEL.img
sudo cp arch/arm64/boot/dts/broadcom/*.dtb /mnt/fat32/
sudo cp arch/arm64/boot/dts/overlays/*.dtb* /mnt/fat32/overlays/
sudo cp arch/arm64/boot/dts/overlays/README /mnt/fat32/overlays/
sudo umount mnt/fat32
sudo umount mnt/ext4
Bei automatischer Einbindung:
sudo cp /media/<user>/boot/$KERNEL.img /media/<user>/boot/$KERNEL-backup.img
sudo cp arch/arm64/boot/Image /media/<user>/boot/$KERNEL.img
sudo cp arch/arm64/boot/dts/broadcom/*.dtb /media/<user>/boot/
sudo cp arch/arm64/boot/dts/overlays/*.dtb* /media/<user>/boot/overlays/
sudo cp arch/arm64/boot/dts/overlays/README /media/<user>/boot/overlays/
sudo umount /media/<user>/boot
sudo umount /media/<user>/rootfs
Kernel Update blockieren
Damit beim nächsten apt update/upgrade
der Kernel nicht durch die offizielle Version ersetzt wird, blockieren wir die Updates:
sudo apt-mark hold raspberrypi-bootloader raspberrypi-kernel raspberrypi-kernel-headers
Quellen
https://www.raspberrypi.org/documentation/linux/kernel/building.md