[Eisfair] Problem beim Kernel-Update

Thomas Bork tom at eisfair.org
Sa Okt 29 20:21:51 CEST 2016


Am 29.10.2016 um 10:53 schrieb Uwe Kunze:

>> Saving your kernel configuration in /tmp/kernel-backup.tar:
>>  /boot
>>  /etc/lilo.conf
>>  /lib/modules/3.2.81-eisfair-1-SMP
>>  /System.map-3.2.81-eisfair-1-SMP
>>  /usr/src/linux-3.2.81-eisfair-1/dot-config-smp
>>  /usr/src/linux-3.2.82-eisfair-1/dot-config-pae
>>  /usr/src/linux-3.2.81-eisfair-1/Module.symvers-smp
>>  /usr/src/linux-3.2.82-eisfair-1/Module.symvers-pae
>>  /var/install/packages/eiskernel
>>  /var/install/packages/eiskernel-smp
>> Done.
>> Compressing /tmp/kernel-backup.tar to /tmp/kernel-backup.tar.gz ...

Hier wird ein Backup Deiner bisherigen Konfiguration erzeugt. Das 
benötigt Platz. Du vergleichst also den Zustand vor einer Installation 
mit dem Zustand während einer Installation.

>> Cannot move kernel and initrd.gz to old-kernel and old-initrd.gz,
>> cancelling installation!
>> You need at least 4108 blocks in /boot.
>> There are only 0 blocks in /boot available.

Hier wird ermittelt, dass zum Zeitpunkt der Installation nach Backup 
(siehe oben) kein Platz mehr vorhanden ist, um den aktiven Kernel und 
die aktive initrd zu sichern.

>> Kernel update failed!
>> Successfully installed: eiskernel-pae (2.26.0)!
> Mal davon abgesehen, dass das Install-Script in den letzten 2 Zeilen
> widersprüchliche Angaben macht und eisman das Paket jetzt als
> "installiert" anzeigt, schlägt das Update also fehl.

Die erste Zeile stammt aus dem Install-Skript, die zweite von eisman. 
Das install-Skript gibt aber einen exit-Wert von 1 vor:

if [ $available_for_old -ge $du_kernel_initrd ]
then
     message="Moving /boot/kernel to /boot/old-kernel ..."
     echo "$message"
     echo "$message" >>"$klogfile"
     mv /boot/kernel /boot/old-kernel

     if [ $old_initrd = true ]
     then
         message="Moving /boot/initrd.gz to /boot/old-initrd.gz ..."
         echo "$message"
         echo "$message" >>"$klogfile"
         mv /boot/initrd.gz /boot/old-initrd.gz
     fi
else
     echo
     message="Cannot move kernel and initrd.gz to old-kernel and 
old-initrd.gz, cancelling installation!
You need at least $du_kernel_initrd blocks in /boot.
There are only $available_for_old blocks in /boot available."
     mecho --error "$message"
     echo "$message" >>"$klogfile"
     delete_install_scripts
     message="Kernel update failed!"
     mecho --error "$message"
     echo "$message" >>"$klogfile"
     exit 1
fi

Warum eisman den ignoriert? Kann ich nicht sagen.

>> server # df -h
>> Filesystem      Size  Used Avail Use% Mounted on
>> /dev/hde1        12G  6.7G  4.2G  62% /
>> tmpfs           1.5G  368K  1.5G   1% /run
>> devtmpfs        1.5G     0  1.5G   0% /dev
>> tmpfs           1.5G   24K  1.5G   1% /run/shm
>> tmpfs           2.0M  312K  1.7M  16% /brute_force_blocking
>> /dev/hdi1       459G  227G  209G  53% /mnt/_hdi
>> /dev/hdj1       459G  346G   90G  80% /mnt/_hdj
>> /dev/hdk1       459G  234G  203G  54% /mnt/_hdk
>> /dev/hdl1       459G  316G  121G  73% /mnt/_hdl
> Warum meint das Script, ich hätte 0 blocks in /boot available ?

Sieh Dir das Skript an. Du verwendest keine Boot-Partition, deshalb wird 
die Root-Partition zum Vergleich des Platzbedarfs herangezogen, da hier 
boot als Verzeichnis existiert.

root wird aus der lilo.conf ermittelt:

tab=`/bin/echo -e "\011\c"`
tabs_or_blanks="[ $tab]*"
old_root_line=`grep "root${tabs_or_blanks}=${tabs_or_blanks}/dev/" 
/etc/lilo.conf | head -1`
root=`echo $old_root_line | sed 
"s#root${tabs_or_blanks}=${tabs_or_blanks}##g"`

Darauf wird dann 'du' losgelassen:

if [ -n "`df /boot | grep "/boot$"`" ]
then
     set -- `df /boot | grep "/boot$"`
     boot=$1
     available=$4
else
     set -- `df / | grep "^$root"`
     boot=$1
     available=$4
fi

Dann wird die Grösse der alten Sicherung von Kernel und initrd ermittelt:

if [ -f /boot/initrd.gz ]
then
     old_initrd=true
else
     old_initrd=false
fi

du_old_kernel_initrd='0'
if [ -f /boot/old-kernel ]
then
     du_old_kernel=`du /boot/old-kernel | awk '{print $1}'`
else
     du_old_kernel='0'
fi

if [ -f /boot/old-initrd.gz ]
then
     du_old_initrd=`du /boot/old-initrd.gz | awk '{print $1}'`
else
     du_old_initrd='0'
fi

du_old_kernel_initrd=`expr $du_old_kernel + $du_old_initrd`

Zur Sicherung des aktuellen Kernels und der aktuellen initrd steht der 
Platz von $available (siehe oben) plus dem Platz des alten Kernels und 
der alten initrd zur Verfügung (denn die werden ja überschrieben).

available_for_old=`expr $available + $du_old_kernel_initrd`

Dann wird der Platzbedarf des gerade aktiven Kernels und der gerade 
aktiven initrd vor Installation ermittelt:

if [ -f /boot/kernel -a -f /boot/initrd.gz ]
then
     du_kernel_initrd=`du -c /boot/initrd.gz /boot/kernel | tail -n1 | 
awk '{print $1}'`
else
     du_kernel_initrd=`du /boot/kernel | awk '{print $1}'`
fi

Und wenn der Platz für eine Sicherung ausreicht, wird gesichert, 
ansonsten abgebrochen:

if [ $available_for_old -ge $du_kernel_initrd ]
then
     message="Moving /boot/kernel to /boot/old-kernel ..."
     [...]
else
     echo
     message="Cannot move kernel and initrd.gz to old-kernel and 
old-initrd.gz, cancelling installation!
You need at least $du_kernel_initrd blocks in /boot.
There are only $available_for_old blocks in /boot available."
     [...]
     exit 1
fi

Gehen Dir eventuell die inodes aus?

-- 
der tom
[eisfair-team]


Mehr Informationen über die Mailingliste Eisfair