Restart servera zbog nove verzije kernela

Znamo da Linux serveri ne trebaju restart sve dok ne izađe nova verzija kernela. Kako restart servera znači i restart svih servisa, ovu operaciju je najbolje izvesti  kada ne ometamo rad korisnika, odnosno izvan radnog vremena. Dakle, sasvim je moguće da zbog te odgode server zaboravimo restartati.

Kako bismo ovo spriječili, možemo se poslužiti skriptom koju možemo pokretati iz crona. Treba usporediti instaliranu verziju kernela s onom koja  se trenutno "vrti".

Kako to možemo napraviti? Najprije moramo saznati koju verziju kernela "vrtimo". Možemo je dobiti na dva načina, s naredbama:

# uname -a 
Linux server.etfos.hr 3.2.0-4-686-pae #1 SMP Debian 3.2.73-2+deb7u2 i686 GNU/Linux
# cat /proc/version
Linux version 3.2.0-4-686-pae (debian-kernel@lists.debian.org) (gcc version 4.6.3 (Debian 4.6.3-14) ) #1 SMP Debian 3.2.73-2+deb7u2

Verzija odnosno ili 'niz znakova' koji tražimo je onaj dio 3.2.73... Naredba 'cut' sa svojim parametrima može pomoći da izvučemo traženo polje:

#uname -a | cut -d " " -f 7
3.2.73-2+deb7u2
# cat /proc/version | cut -d " "  -f 14
3.2.73-2+deb7u2

Korišteni su parametri 'cut' naredbe:
    -d   delimiter;    u našem slučaju 'razmak'
    -f    polje;         7-mo za prvu ili 14-to za drugu verziju

Ukoliko više volite 'awk', može i ovako:

#uname -a | awk '{ print $7 }'
3.2.73-2+deb7u2
# cat /proc/version | awk '{ print $14 }'
3.2.73-2+deb7u2

Sada znamo verziju aktualnog kernela, još nam treba verzija zadnje instaliranog. Ovdje se stvari malo kompliciraju, jer možemo imati više instaliranih kernela, ili imati različite nazive kernela zbog drugačije arhitekture i slično. Evo primjera kako to moze izgledat:

ii  linux-image-2.6-686  3.2+46    i386     Linux for modern PCs (dummy package)
ii  linux-image-2.6.32-5-686-bigmem  2.6.32-48squeeze6  i386  Linux 2.6.32 for PCs with 4GB+ RAM
ii  linux-image-3.2.0-4-686-pae  3.2.73-2+deb7u2    i386     Linux 3.2 for modern PCs
ii  linux-image-686-bigmem  3.2+46   i386    Linux for PCs with 4GB+ RAM (dummy package)
ii  linux-image-686-pae        3.2+46   i386    Linux for modern PCs (meta-package)

Ovo zapravo nije problem, jer iako je dobro imati i jedan stariji kernel (u slučaju da se iz nekog razloga ne boota najnoviji), obično koristimo samo jedan kernel, onaj originalni iz distribucije.

U našem primjeru pratimo kernel "linux-image-3.2.0-4-686-pae", a vi će te naziv prilagoditi vašem stroju:

# dpkg -l linux-image-3.2.0-4-686-pae | grep ii | awk '{ print $3 }' 3.2.73-2+deb7u2

Ovaj put smo posegnuli za naredbom 'awk' koja bolje vlada razmacima i tabovima. Verzija s 'cut' zahtjeva brojanje razmaka ili uvođenje još jedne naredbe 'tr' sa njenom opcijom za uklanjanje istih znakova koji su u nizu.


# tr –s ' ' 

Korištena je opcija 'tr' naredbe:
      -s        squeeze repeates; u našem slučaju razmak

I onda bi dobili :


# dpkg -l linux-image-3.2.0-4-686-pae | grep ii | tr -s ' ' | cut -d " "  -f 3 3.2.73-2+deb7u2

Držat ćemose elegantnijeg rješenja sa 'awk'. Sada samo moramo usporediti dvije verzije i na osnovu toga javiti treba li napraviti reboot ili ne. Poslužit ćemo se naredbom "test" i to sve zapakirat u jednu skriptu s nazivom 'check-kernel-version':

-----------check-kernel-version --------------
#!/bin/sh
kernel=$(cat /proc/version | awk '{ print $3 }')
debian=$(cat /proc/version | awk '{ print $14 }')
paket=$(dpkg -l linux-image-$kernel | grep "ii" | awk '{ print $3 }')
if [ "$paket" != "$debian" ] ; then
        mailx -s "cron" sistemac@domena.hr <<<"Verzija aktualnog kernela je drugacija od instaliranog paketa, treba napraviti reboot"
fi
-----------------------------------------------------

U skripti imamo tri varijable: 
        kernel     - verzija kernela kojeg trenutno vrtimo
        debian     - Debianova verzija kernela kojeg trenutno vrtite
        paket      - Debianova verzija kernela u instaliranom paketu

Kad ste napravili skriptu sigurno će te je pokrenuti da vidite radi li ispravno. Ako niste ništa dobili u vašoj konzoli, to ne znači da vam ne valja skripta, nego da nema razlike između zadnje instalirane verzije kernela i one koja se trenutno vrti.

Sve što trebate napraviti ubaciti ovu skriptu u /etc/cron.daily, i napraviti jedan chmod:

# mv check-kernel-version /etc/cron.daily
# chmod 755 /etc/cron.daily/check-kernel-version

Sada će se svaki dan izvršiti vaša skripta 'check-kernel-version' i podsjetiti vas na restart ukoliko se aktivna verzija kernela razlikuje od one u zadnjem instaliranom paketu.

Skripta je namjerno mala da bude što jasnija, ali naravno da tu ima mjesta poboljšanjima. Ukoliko kod vas iz nekog razloga ne proradi (specifična virtualizirana okolina ili nešto slično), debugiranje se svodi na upisivanje 2-3 echo naredbe, s kojima ćete vidjeti što se zapisuje u pojedinu varijablu.

I ne zaboravite, restart servera se nikad ne radi u petak, jer SYS.HELP neradi vikendom. Ali ako imate sreće da živite u gradu sa kolegom koji se odaziva na adresi zelja@carnet, runda ćevapa vam može uštediti nerviranje i čekanje ponedjeljka. :)

Kuharice: 
Vote: 
5
Vaša ocjena: Nema Average: 5 (2 votes)