Upgrade jádra paravirtualizovaného Linuxu

Krátký zápisek o tom, jak automatizovat konfiguraci paravirtualizačních ovladačů guestovského linuxového systému při výměně jádra.

Při provozování jakéhokoliv operačního systému se dříve nebo později každý dostane do situace, kdy je zapotřebí provést menší či větší upgrade. Samostatnou kapitolkou jsou pak změny systémového jádra. U microsoftích systémů není toto téma tak relevantní, protože nové jádro = nový systém. Samozřejmě ne doslova, ale obecně se opravdu s jádrem moc nehýbe, o jeho kompletní výměně ani nemluvě. Protipólem je linuxový systém, kde jsou změny a výměny jádra běžnou věcí.

Pokud vyměňujeme jádro systému, je zapotřebí ošetřit všechny jeho dynamické moduly tak, aby byly schopny s novým jádrem pracovat. To platí i pro paravirtualizační ovladače, které jsou do guestovského systému doinstalovány. Tyto ovladače jsou zapotřebí pro komunikaci s hostitelským systémem, a tedy nefungují-li, náš virtuál není dostupný zvenčí, případně vůbec není schopen běhu.

Příklad z praxe

Vezměme si třeba VMware virtualizační technologii, která je ve firemním sektoru hodně rozšířená. Provozujeme pod ní deset, dvacet nebo ještě více virtuálních linuxů a potřebujeme jim upgradovat jádro. Virtualizační ovladače jsou součástí jádra a pokud jádro vyměníme, po restartu serveru už se ovladače nenačtou správně. To zpravidla znamená, že nebudou fungovat síťová rozhraní virtuálního stroje a k systému se pak už nepřipojíme. Pokud děláme update vzdáleně, jsme (slušně řečeno) v loji – musíme se připojit přes hypervisor k lokální konzoli a celou situaci napravit.

Práce přes lokální konzoli guesta je běžný postup při updatu jádra. Není to postup chybný nebo špatný, ale je prostě neelegantní. A pokud takto updatujeme více než dva nebo tři servery, už se tomu prostě nedá říkat jinak než masochismus. Nedávno mě právě taková situace potkala, a proto jsem se ji snažil vyřešit jednou a provždy.

Řešení se nakonec ukázalo, pro zmíněný VMware, jako velice snadné. Našel jsem blogpost s jednoduchým shellovým skriptem:

#!/bin/bash

VMToolsCheckFile="/lib/modules/`uname -r`/misc/.vmware_installed"
VMToolsVersion=`vmware-config-tools.pl --help 2>&1 | awk '$0 ~ /^VMware Tools [0-9]/ { print $3,$4 }'`

printf "\nCurrent VM Tools version: $VMToolsVersion\n"

if [[ ! -e $VMToolsCheckFile || `grep -c "$VMToolsVersion" $VMToolsCheckFile` -eq 0 ]]; then
        [ -x /usr/bin/vmware-config-tools.pl ] && \
 printf "Automatically compiling new build of VMware Tools\n" && \
 /usr/bin/vmware-config-tools.pl --default && \
 printf "$VMToolsVersion" > $VMToolsCheckFile && \
 rmmod pcnet32
 rmmod vmxnet
 depmod -a
 modprobe vmxnet
fi

Podmínkou správné funkčnosti je pouze to, aby se s novým jádrem instalovaly i odpovídající jaderné hlavičkové soubory. Jinak není konfigurační nástroj schopný provést automatický rebuild. Skript se také spoléhá na několik věcí – že konfigurátor wmvare-config-tools.pl nastartuje přenastavené drivery a že vytvoří initrd image. Skript vmware-config-tools.pl toto skutečně dělá, ale je to teoreticky funkcionalita, která se může v budoucnu změnit.

Kontrolní skript stačí nalinkovat do /etc/rc.d/rc{3,5,…}.d podle toho, v jakém runlevelu systém startujete. Původní autor skriptu doporučuje prioritu S09.

Závěr

S tímto skriptem na každém z guestů se update jádra stane jednoduchou záležitostí, protože veškerá konfigurace proběhne automaticky. Při jejich větším počtu je to navíc významná úspora času a nervů. Navíc jsou ošetřeny i veškeré následující jaderné updaty. Skript je zaručeně funkční pod RHEL5 a CentOS6.

Pokud budete mít k tomuto postupu nějaké dotazy, neváhejte mne kontaktovat na info@bcvsolutions.eu.