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. :)
- Logirajte se za dodavanje komentara
- Inačica za ispis
- PDF version