Smalkā pārstartēšanas māksla

Apr 08 2013

Viens no maniem nodarbošanās veidiem ir virtuālu serveru uzturēšana. (Virtualizācijas vidi uztur Leo Trukšāns un dažādus papildu servisus uztur paši serveru lietotāji. Ja tas šķiet sarežģīti, tad tā arī ir. Bet pieredze rāda, Linux serveri spēj izturēt ne tādu vien "menedžmentu".)

Vairums no šiem serveriem ir veci Ubuntu 8.04, kuru uzturēšanu Canonical pārtrauks šā gada maijā. Lai arī mani īpaši neuztrauc atjaunojumu neesamība, jo arī bez tiem Linux ir pietiekami drošs, galvenais trūkums, no lietotāju viedokļa ir tas, ka vecam Linux arī saistītās lietojumprogrammas ir vecas (piemēram, ar veca Postgresql versija). Tāpēc dažus no serveriem kopā ar Leo pārmigrējām uz 12.04 jau pagājušajā gadā, bet atklājām nepatīkamu lietu — pēc servera kodola atjaunošanas tas vairs nepalaidās, jo kaut kas sāknēšanas procesā bija salauzts.

Tā kā mums ar Leo ir arī citi darbi šo "mistiku" atstājām uz vēlāku laiku, ar bargu piekodinājumu lietotājiem: serverus nedrīkst atjaunot, un ja to uzdrošinās darīt, tad tos nedrīkst pārstartēt! (Ja tas liekas ārprāts, tad iespējams, ka tā arī ir. Bet Linux spēj izturēt arī to. Patiesībā viens no serveriem (t.s. files) vispār bija pazaudējis /boot mapes saturu, un bija izticis bez tās vairāk kā 400 dienas, līdz sapratu, kā tās saturu atjaunot, un veiksmīgi to pārstartēju).

Pa brīviem brīžiem pētot un gūglējot kļūdu risinājumus, pamazām nonācām pie domas, ka problēma ir saistīta ar to, ka jaunākajās Ubuntu versijās kā sāknēšanas pārvaldnieks tiek izmantots Grub2, bet MII izmantotais "vecais Xen serveris" (jo tasi ir ~4 gadus vecs), nesaprot tā konfigurāciju.
Leo atklāja, ka to var labot ar vienkāršu komandu:

sudo apt-get install grub

 kas automātiski noņem grub2 un "novecina" sāknēšanas iestatījumus uz grub1. Pēc tam, drošības labad var palaist arī

sudo update-grub

Bruņojies ar šīm zināšanām, ķēros klāt pie pirmā servera un nonācu līdz tam, ka pēc pārstartēšanas tas nepalaidās.

Protams, triviāla atbilde: "ir problēma starp krēslu un tastatūru". Bet kā to atrisināt?

Bijām spiesti atjaunot servera konfigurāciju "no nulles" un sāku uzmanīgi pētīt, kas īsti ir nepareizi. 

Kad uzstāda jaunu, Ubuntu 12.04 versiju, tam, protams tiek izmantots grub2, kas Xen nepatīk. Tekošo grub versiju var noteikt, ievadot komandu:

grub-install -v

 Ja tā parāda:

grub-install (GRUB) 1.99-21ubuntu3.9

tad izmantojat grub2 versiju (Versija ir jānoapaļo uz augšu. Vienkārši, vai ne?). Un iestatījumi tiek glabāti /boot/grub/grub.cfg failā. To var "novecināt" ar augšminētajām komandām. Pēc tam, ievadot grub-install -v atbilde ir:

grub-install (GNU GRUB 0.97)

kas parāda, ka izmantojat Grub1 versiju, un iestatījumi glabājas /boot/grub/menu.lst failā. (Ja pēc eksperimentiem datorā ir abi faili, tad spēkā būs tikai tas, kuru attiecīgā grub versija vēlas nolasīt!) Gan vienā, gan otrā gadījumā svarīgā daļa ir ielādējamo Linux kodolu saraksts. menu.lst tas izskatās aptuveni sekojoši:

...
title           Ubuntu 12.04.2 LTS, kernel 3.2.0-39-generic
root            (hd0,0)
kernel          /boot/vmlinuz-3.2.0-39-generic root=UUID=cd7cce38-81c4-4152-bd07-8e11589dfb6d ro quiet splash
initrd          /boot/initrd.img-3.2.0-39-generic
...

 (grub.cfg līdzīgi, bet savādāk). kernel... rindā ir norādīts fails, kurš sāknējot sistēmu tiks ielādēts, kā arī diska identifikators, kas tiks uzskatīts par failu sistēmas sākumu. Disku identifikatorus var apskatīt, ievadot komandu:

sudo blkid

Ir svarīgi, ka failā /etc/fstab ir rakstīts tas pats, un / sadaļa ir norādīta tam pašam diskam:

att01.png
 (Ja rodas jautājums — kā gan to visu var dabūt neatbilstošu? Pateikšu priekšā — pievienojot jaunu disku un atjaunojot pilnu rezerves kopiju diska UUID ir jaunais, bet konfigurācijas failu saturs — vecais.)

Lai uzzinātu disku UUID, ievada komandu:

blkid

kas atgriež, piemēram, sekojošu sarakstu:

/dev/xvda1: UUID="f05cce8b-8bdf-4b48-99ec-4e7aaed479f0" TYPE="ext2"
/dev/xvda5: UUID="JLQTN9-wF0A-hwZs-k1vA-0CPN-OTC2-PZjLUV" TYPE="LVM2_member"
/dev/mapper/vg-home: UUID="8eea01a5-7ded-4c7f-a819-66d3ebd6ce90" TYPE="ext3"
/dev/xvdb: UUID="zvOEBI-TQ8l-4n3k-K4kg-ywD0-P3K6-hOnCc7" TYPE="LVM2_member"
/dev/mapper/vg-root: UUID="587e9e40-5526-4e3d-86e8-48e706e77ceb" TYPE="ext4"
/dev/mapper/vg-swap_1: UUID="38fe2481-9193-415f-8138-9eacefd41990" TYPE="swap"

Ja izmanto fizisku datoru un nav grūtību ar fizisku iekārtu numurēšanu, tad fstab failā UUID vietā var rakstīt klasisko iekārtas numuru, piemēram:

/dev/sda1 / ext4 noatime,errors=remount-ro 0 1

Lai pasargātu grub atjaunošanu no 1. versijas uz 2., pievieno to paturamo pakotņu sarakstā:

sudo aptitude hold grub

Pēc tam var pārliecināties, ka pēc visu pakotņu atjaunošanas, piemēram:

sudo apt-get update && sudo apt-get dist-upgrade

grub versija saglabājas. Vēlreiz var pārliecināties, ka visi sāknēšanas iestatījumi ir atbilstoši un var droši pārstartēt serveri.

Gadījumā ja serverim ir atsevišķa /boot sadaļa, tad ir svarīgi tas, ka Grub to norāda kā /. Tas tā ir tāpēc, ka sāknējot kodolu, tas vēl neko nezina par citām sadaļām, izņemot boot sadaļu. Tāpēc kodola atrašanās vietu norāda /vmlinuz... un pēc tam root=UUID=... kur ir / sadaļas identifikators.

/boot/grub/menu.lst

...
## ## End Default Options ##

title   Ubuntu 12.04.5 LTS, kernel 3.2.0-87-generic
root    (hd0,0)
kernel    /vmlinuz-3.2.0-87-generic root=UUID=587e9e40-5526-4e3d-86e8-48e706e77ceb ro quiet splash
initrd    /initrd.img-3.2.0-87-generic

lsblk

NAME                       MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
xvda                       202:0    0    20G  0 disk
├─xvda1                    202:1    0   243M  0 part /boot
├─xvda2                    202:2    0     1K  0 part
└─xvda5                    202:5    0  19,8G  0 part
  ├─vg-root (dm-1)   252:1    0  19,2G  0 lvm  /
  └─vg-swap_1 (dm-2) 252:2    0   524M  0 lvm  [SWAP]
xvdb                       202:16   0   300G  0 disk
└─vg-home (dm-0)           252:0    0   293G  0 lvm  /home

blkid

/dev/xvda1: UUID="f05cce8b-8bdf-4b48-99ec-4e7aaed479f0" TYPE="ext2"
/dev/xvda5: UUID="JLQTN9-wF0A-hwZs-k1vA-0CPN-OTC2-PZjLUV" TYPE="LVM2_member"
/dev/mapper/vg-home: UUID="8eea01a5-7ded-4c7f-a819-66d3ebd6ce90" TYPE="ext3"
/dev/xvdb: UUID="zvOEBI-TQ8l-4n3k-K4kg-ywD0-P3K6-hOnCc7" TYPE="LVM2_member"
/dev/mapper/vg-root: UUID="587e9e40-5526-4e3d-86e8-48e706e77ceb" TYPE="ext4"
/dev/mapper/vg-swap_1: UUID="38fe2481-9193-415f-8138-9eacefd41990" TYPE="swap"

/etc/fstab

/dev/mapper/vg-root /               ext4    errors=remount-ro 0       1
# /boot was on /dev/xvda1 during installation
UUID=f05cce8b-8bdf-4b48-99ec-4e7aaed479f0 /boot           ext2    defaults        0       2
/dev/mapper/vg-swap_1 none            swap    sw              0       0
# home as a LVM
/dev/vg/home /home ext3 noatime,nodiratime,errors=remount-ro 0 1

Ja kāds domā, ka tagad esmu Linux sāknēšanas eksperts, tad tas, visticamāk, maldās. Tomēr ceru, ka šī informācija var noderēt "uzvedinošām pārdomām". Kā sacīt, jāsaka:

Klausot mani cietumā tiksiet, neklausot netiksiet laukā!

Katram sistēmu administratoram noteikti ir pazīstama kņudinošā sajūta, kas rodas, pārstartējot serveri, pilnībā neesot pārliecinātam par rezultātu. Sakarā ar to, ka Saule šobrīd ir starp Marsu un Zemi, Curiosity robots ir iesnaudināts. Nez' kāda ir sajūta, iesnaudinot robotu 300 miljonu kilometru attālumā, un kāda ir sajūta, to mēģinot atkal pamodināt?

Created by Valdis Vītoliņš on 2013-04-08 18:04
Last modified by Valdis Vītoliņš on 2016-04-02 15:05
 
Xwiki Powered
Creative Commons Attribution 3.0 Unported License