Kompilierung eines eigenen Debian Squeeze-Kernels 2.6.38 mit Hyper-V Client Treiber / Integrationsdienste
Da mal wieder ein neuer Linux-Kernel erschienen ist, habe ich mich der Aufgabe angenommen auf einem Debian Squeeze einen Kernel der Version 2.6.38 zu kompilieren, der die Hyper-V Client Client Treiber integriert hat. Dieser Beitrag hier aktualisiert quasi den von meinem Kollegen Carsten Rachfahl geschriebenen Artikel Debian Linux Kernel mit Hyper-V Additions compilieren.
Installations-Medium war in meinem Fall das Image “debian-6.0.1a-amd64-netinst.iso”
//Update 08.12.2011: Eine aktualisierte Version mit dem Kernel 3.1.4 findet sich hier.
Nach der Grundinstallation startet ein Kernel 2.6.32 ohne Hyper-V Client Treiber. Wichtig für die nachfolgende Prozedur: Es wird eine “Ältere Netzwerkkarte” benötigt, da sonst keine Downloads verfügbar sind und wir in unserem Fall den neuen Kernel sowie einige weitere Pakete benötigen. Auf geht’s…
apt-get update
aptitude update
apt-get install -y build-essential
apt-get install -y ncurses-dev kernel-package fakeroot
apt-get install -y linux-headers-`uname -r`
apt-get install -y linux-source-`uname -r | awk -F"-" '{print $1}'`
cd /usr/src
wget -c http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.38.tar.bz2
bzip2 -d linux-2.6.38.tar.bz2
tar xf linux-2.6.38.tar
cd linux-2.6.38
cp /boot/config* ./.config
make menuconfig
An dieser Stelle wählen wir die “Hyper-V Client Drivers” aus, die sich unter “Device Drivers” –> “Staging Drivers” verstecken
Nachdem man mehrfach mit “Exit” die Kernel-Konfiguration verlassen hat und die Frage nach dem Speichern der Konfiguration mit “Ja” beantwortet hat, geht es weiter mit der Kompilierung und der Installation des Kernels:
make-kpkg clean
fakeroot make-kpkg --initrd --append-to-version=-hyperv kernel_image kernel_headers
cd ..
dpkg -i linux-image-2.6.38-hyperv_2.6.38-hyperv-10.00.Custom_amd64.deb linux-headers-2.6.38-hyperv_2.6.38-hyperv-10.00.Custom_amd64.deb
echo -e "hv_vmbus\nhv_storvsc\nhv_blkvsc\nhv_netvsc" >> /etc/initramfs-tools/modules
update-initramfs –u –k 2.6.38-hyperv
Nach einem Neustart des Systems wartet der Grub mit zwei weiteren Einträgen auf, von denen die ersten beiden der neue Kernel ist.
Austausch der Netzwerkkarte
Wenn man nun das System herunterfährt, die “ältere Netzwerkkarte” austauscht gegen eine voll unterstützte Karte und das System wieder startet hat man keine IP-Adresse auf der Karte “eth0”. Grund hierfür ist der Eintrag in der Datei “70-persistent-net.rules”. Um dies zu ändern, öffnet man die besagte Datei
vi /etc/udev/rules.d/70-persistent-net.rules
und löscht alle Einträge unterhalb der auskommentierten Kommentare. Nach einem Neustart kann die Karte verwendet werden. Hintergrund ist der, das die MAC-Adresse der Karte in die Datei “70-persistent-net.rules” geschrieben wird und sich diese bei einem Austausch der Karte ändert.
Optimierung des Kernels an seine Umgebung
Ich habe in der c’t 5/2011 einen Artikel gefunden, in dem es um die Anpassung des Kernels an seine Umgebung geht. Hierbei wird der Parameter “localmodconfig” verwendet, um alle nicht verwendeten Module des Kernels zu deaktivieren.
Nachdem man nun wie oben beschrieben seinen Kernel kompiliert und installiert hat, sollte man zuerst einen Export der laufenden Maschine machen, um zur Not auf diesen Stand zurückgreifen zu können und nicht von neu anfangen muss.
Hier erst einmal die Befehle die man benötigt, um eine Anpassung des Kernels zu bekommen (Zur Info: Wir bewegen uns weiterhin mit dem Kernel 2.6.38):
cd /tmp
wget -c http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.38.tar.bz2
tar -xif linux-2.6.38.tar.bz2
cd linux-2.6.38
make localmodconfig
make -j 4 bzImage modules
make modules_install install
reboot
Hier eine Erklärung der Befehle:
Wir wechseln in das Verzeichnis /tmp, da die Dateien nach einem Neustart nicht mehr benötigt werden. Nach dem Wechsel laden wir den aktuellen Kernel herunter, entpacken ihn und wechseln in das Verzeichnis, welches während des Extrahierens erstellt wurde. Ein “make localmodconfig” bewirkt, das nun eine Überprüfung stattfindet, welche Module benötigt werden und welche nicht. Es erscheinen mehrere Nachfragen, die man eigentlich alle direkt mit Enter bestätigen kann (in dem ein oder anderen Fall kann es natürlich auch sein das man eigene Werte hat, dies ist aber nicht die Regel). An diesem Punkt kann man sich die Konfiguration mit einem “make menuconfig” anschauen und ggf. anpassen, in meinem Fall passt die Konfiguration allerdings. Der nächste Befehl bewirkt die Kompilierung, der Parameter “-j” und die dahinter gesetzte Zahl gibt an, wie viele Compiler-Aufgaben gleichzeitig ausgeführt werden dürfen. “make modules_install install” installiert die Module, und ein “reboot” sollte jedem klar sein :)
Meine beiden für diesen Test parallel installierten Debian-Systeme laufen beide problemlos und performant. Es werden alle konfigurierten CPUs sowie Netzwerkkarten genutzt, zusätzlich kann das System über den Hyper-V-Manager “von außen” heruntergefahren werden.