Da es wenig Sinn hat, die Kernelquellen auf jeden Rechner zu werfen, wenn man mehrere Rechner hat, compiliere ich Kernel zentral auf einem Rechner. Bisher habe ich den Kernel dann immer von Hand installiert. Doch warum jedesmal aufwendig dieselben Schritte ausführen, wenn es auch automatisch gehen kann? Hier ist ein Skript dafür. Habe ich was übersehen? Bei mir funktioniert es. Es kopiert allerdings nur den Kernel. Einträge für den Bootloader oder ein eventuelles Erzeugen einer Ramdisk habe ich außen vor gelassen.
Es waren ein paar Hürden zu überwinden, die mich bisher davon abgehalten haben, es zu implementieren. Im Endeffekt war es aber nicht viel Arbeit.
Code: Alles auswählen
#!/bin/sh
# Install a self-compiled kernel on a remote machine
# 20080621 hjb
# Assumptions:
# ssh with passwordless login for root
# Kernel is named bzimage
# .config belongs to the current kernel
set -e
# config
arch=x86 # Valid for x86 and x86_64 with newer kernels
dest="$1"
if [ -z "$dest" ]; then
echo "Need target hostname as argument"
exit 1
fi
# Kernel version
version=$(head .config | grep "Linux kernel version:" | tr -d ' #:[A-z]')
grep -q CONFIG_LOCALVERSION_AUTO=y .config
if [ $? = 0 ]; then
localversion=$(grep "CONFIG_LOCALVERSION=" .config | sed -e 's/.*="\(.*\)"/\1/')
version=$version$localversion
fi
# Install modules
mdir="$(cd ..; pwd)"
rm -rf "$mdir/lib"
make modules_install INSTALL_MOD_PATH="$mdir"
rm -f "$mdir/lib/modules/$version/build"
rm -f "$mdir/lib/modules/$version/source"
scp "arch/$arch/boot/bzImage" root@$dest:/boot/linux-$version
scp "System.map" root@$dest:/boot/System.map-$version
scp ".config" root@$dest:/boot/config-$version
ssh -l root $dest "rm -rf /lib/modules/$version"
tar cvzf - -C "$mdir" lib | ssh -l root $dest "cd /; tar xvzf -"
hjb