Kategória: Linux všeobecne

Zmenené: 2. august 2009

UUID

Narazili ste už na túto skratku? Viete čo znamená? UUID znamená Universally Unique Identifier, po našom Univerzálny jedinečný identifikátor. Inými slovami číslo, ktoré niečo jednoznačne identifikuje. A v našom prípade jednoznačne identifikuje partície…

Iste Vás napadá, že partície sú v Linuxe jednoznačne identifikované. Pre tých, čo nevedia ako, disky sú v Linuxe reprezentované ako súbory (ostatne ako všetko). Tieto súbory sú umiestnené v adresári /dev, ktorý bol svojho času vytváraný staticky a teda aby ste mohli tieto súbory (zariadenia) používať, museli byť najprv vytvorené pomocou nástroja mknod, pripadne skriptu MAKEDEV.

Disky boli identifikované ako hdX či sdX, kde písmeno h hovorilo o IDE disku a s o SCSI alebo SATA disku, pričom IDE disky sú najstaršie. Písmeno X tu nahradzuje písmeno, ktoré označovalo spôsob pripojenia disku master disk prvého IDE bol a, slave disk zase b atď. Za týmito písmenami nasledovalo číslo, ktoré udávalo poradie partície čísla <= 4 označovali (a označujú) primárne partície, čísla 5 a viac zase partície logické. Bývalo bežné, že v systéme bol len jeden disk. A tak /dev/hda5 postačovalo na jednoznačné označenie partície, a to najmä pri IDE diskoch. Aby ste totiž mohli zameniť partície hda1 s hdb1, potrebovali ste otvoriť stroj, prehodiť jumpery (prípadne káble).

V dnešnej dobe sú súbory zariadení vytvárané dynamicky, pri zistení zariadenia v systéme pomocou udev a ak si dáte urobiť výpis pripojených zariadení pomocou mount, okrem iného môžete vidieť niečo takéto (výpis som skrátil):

mount
...
udev on /dev type tmpfs (rw,mode=0755)
...

V prípade IDE diskov je to stále jedno. Pre SATA disky to už tak jedno nie je. Tieto disky nemajú svoju rolu v systéme danú konektorom na základnej doske. A, aby toho nebolo málo, pletú sa tu aj vyberateľné médiá, ako rôzne USB kľúče, čítačky kariet, či fotoaparáty a o externých diskoch ani nehovoriac.

V mojom stroji mám dva SATA disky, označené ako sda a sdb. Keď pripojím USB kľúč, je rozpoznaný ako sdc a všetko funguje. Ale keď ho nechám zasunutý aj pri štarte, systém ho označí ako sda a moje disky ako sdb a sdc. Asi už tušíte problém. Áno, je síce nájdený GRUB v MBR disku (momentálne označenom ako sdb), ale ten už nenájde koreň súborového systému sda1… Svojho času som to vyriešil zmenou nastavenia v BIOSe, a tak mi systém USB disky pri štarte nerozpoznáva, ale existuje elegantnejšie riešenie, ktoré je založená práve na použití `UUID`_.

Podpora v súborových systémoch

UUID je vlastnosťou súborového systému a je generované pri formátovaní partície. Teda celkom jednoznačne to platí pre partície so súborovými systémami v GNU/Linux bežnými (ako extX, ReiserFS, XFS, swap atď.) a neplatí to pre súborové systémy asi najrozšírenejšie, teda pre FAT a NTFS. Ale ešte to nevzdávajte, existuje spôsob ako tento systém použiť aj pre partície s týmito súborovými systémami, len je tento jednoznančý identifikátor kratší.

Zastavím sa ešte pri partícii swap. Pri písaní tohoto článku som zistil, že mám jeden swap s UUID a jeden bez. Neviem presne čím to je spôsobené, každopádne však viem, že jeden som vytvoril už dávnejši pri inštalácii a druhý relatívne nedávno. Je možné, že neexistenciu UUID má na svedomí staršia verzia mkswap.

Zistenie UUID

UUID netreba nejako špeciálne vytvárať, je automaticky vygenerovaný pri formátovaní partície. Identifikátory UUID všetkých pripojených partícii si môžete pozrieť v adresári /dev:

ls -lG /dev/disk/by-uuid/ celkom 0 lrwxrwxrwx 1 root 10 27. sep 19.08 ACC0-F2BD -> ../../sdc1 lrwxrwxrwx 1 root 10 27. sep 10.34 adce5faa-0998-44b6-afa3-b03f95c71947 -> ../../sda5 lrwxrwxrwx 1 root 10 27. sep 10.34 b55b065b-dead-4217-abe9-0e2791e16bd9 -> ../../sda1 lrwxrwxrwx 1 root 10 27. sep 10.34 e721a1c9-2094-4fce-9afd-dda687809b14 -> ../../sdb3 lrwxrwxrwx 1 root 10 27. sep 10.34 94d05850-4809-4eae-bc0c-835cc7724300 -> ../../sdb1

Ako možno vidieť, UUID je siahodlhé šestnástkové číslo. Zdá sa Vám to prvé akosi krátke? Zdá sa vám správne, ide o FAT partíciu (konkrétne USB kľúč). Spomínal som, že FAT a NTFS nepodporujú UUID, ale používa sa ich identifikátor, takže aj takto jednoducho rozlíšite Linuxové partície od tých z Windows. Jednotlivé identifikátory sú symbolickými odkazmi na mená súborov zariadení, čo môže vytvárať dojem, že je to jedno, ale nie je. Tieto odkazy robí udev, a práve v nich je tá výhoda. Ak partíciu označujeme pomocou UUID, tieto dokazy zabezpečia mapovanie na aktuálne meno partície, nech je akékoľvek.

Iný nástroj, ktorý vypíše (okrem iného) univerzálny identifikátor je blkid:

blkid /dev/sda1: LABEL=“root“ UUID=“b55b065b-dead-4217-abe9-0e2791e16bd9“ TYPE=“ext3“ /dev/sda5: UUID=“adce5faa-0998-44b6-afa3-b03f95c71947“ LABEL=“usr“ TYPE=“reiserfs“ /dev/sda8: TYPE=“swap“ UUID=“721a5f8c-ba5e-4941-9317-d6f6cb4dc22d“ /dev/sdb1: UUID=“94d05850-4809-4eae-bc0c-835cc7724300“ TYPE=“reiserfs“ /dev/sdb3: LABEL=“virtual“ UUID=“e721a1c9-2094-4fce-9afd-dda687809b14“ TYPE=“xfs“ /dev/sdc1: SEC_TYPE=“msdos“ LABEL=“MYKEY“ UUID=“ACC0-F2BD“ TYPE=“vfat“

Sami môžete vidieť, že o blokových zariadeniach zobrazuje veľa zaujímavých vecí. Dozviete sa nie len UUID, ale aj typ súborového systému, či menovku disku. Posledný nástroj na zisťovanie UUID, ktorý spomeniem, je vol_id. Tento, na rozdiel od predchádzajúcich, neposkytuje súhrnné informácie o všetkých, ale len o zadanej partícii:

vol_id /dev/sda1
ID_FS_USAGE=filesystem
ID_FS_TYPE=ext3
ID_FS_VERSION=1.0
ID_FS_UUID=b55b065b-dead-4217-abe9-0e2791e16bd9
ID_FS_UUID_ENC=b55b065b-dead-4217-abe9-0e2791e16bd9
ID_FS_LABEL=root
ID_FS_LABEL_ENC=root
ID_FS_LABEL_SAFE=root

Niekedy sa môže zísť aj opačný spôsob, teda mám UUID a zaujíma ma, ktorá je to partícia a na to slúži nástroj findfs:

findfs UUID=b55b065b-dead-4217-abe9-0e2791e16bd9
/dev/sda1

Nastavenie UUID

Ako som spomínal, UUID je vytvorené pri formátovaní a netreba pre to nič urobiť. Niekedy je však potrebné UUID zmeniť, respektíve nastaviť na nejakú konkrétnu hodnotu. Napríklad ak sa rozhodnete preformátovať existujúcu partíciu (pri zmene súborového systému), iste je pohodlnejšie nastaviť/zmeniť UUID partície, ako hľadať kde všade treba zmeniť UUID pre pripájanie správnej partície. Niektoré programy (napr. mkswap, mkreiserfs) dovoľujú zadať UUID ako parameter pri spustení, iné nie (mkfs.ext2). Každopádne na zmenu UUID partície možno použiť nástroje typu tune2fs, reiserfstune, či xfs_admin a podobne. So swapom je to jednoduché, prosto ho odpojíme, znova naformátujeme a opäť zaradíme do prevádzky:

swapoff /dev/...
mkswap /dev/...
swapon -a

Výsledok si môžete skontrolovať niektorým z vyššie popísaných spôsobov.

Pripájanie podľa UUID

Teraz, keď už viete ako zistiť, či nastaviť UUID partície, nastal čas dozvedieť sa ako to využiť, čiže použiť. Určite viete, že na pripájanie partícií slúži príkaz mount, pomocou ktorého pripojíte partície ručne. Pre nastavenie partícií, ktoré sa pripájajú automaticka (a na niektoré ďalšie veci) slúži konfiguračný súbor /etc/fstab. Pre lepšiu predstavu, ukážka klasického /etc/fstab:

cat /etc/fstab
# file system   mount point     type     options       dump   pass
/dev/sda1    /        ext3   errors=remount-ro 0    0
/dev/sdb1    /home      reiserfs defaults      0    0
/dev/sdb3 /home/virtual xfs  defaults   0 0
/dev/sda5 /usr reiserfs defaults   0 0
/dev/sdb2 none swap  sw   0 0

Pre použitie UUID stačí jednoducho nahradiť prvý stĺpec (meno zariadenia) jedinečným identifikátorom. Samozrejme, je potrebné nejako systému povedať, že sa jedná o UUID, a to tak, že pred samotné UUID pridáte UUID=. Takže nakoniec by to vyzeralo takto:

cat /etc/fstab
# file system                                mount point    type     options           dump   pass
UUID=b55b065b-dead-4217-abe9-0e2791e16bd9    /              ext3     errors=remount-ro  0      0
UUID=94d05850-4809-4eae-bc0c-835cc7724300    /home          reiserfs defaults           0      0
UUID=e721a1c9-2094-4fce-9afd-dda687809b14    /home/virtual  xfs      defaults           0      0
UUID=adce5faa-0998-44b6-afa3-b03f95c71947    /usr           reiserfs defaults           0      0
UUID=7199c320-9ce7-4025-a8ca-044c287a8ceb    none           swap     sw                 0      0

Len pripomínam, že jedinečné identifikátory nie sú nahádzané len tak ledajako, ale jedná sa o identifikátory príslušných partícií zistené vyššie uvedeným spôsobom (blkid, vol_id, …).

Zdá sa Vám to trochu neprehľadné? Súhlasím, ale neprehľadnosť je vyvážená tým, že pripájanie súborových systémoch už nebude závisieť na tom, ako je príslušné zariadenie identifikované pri štarte.

UUID pri boote

Ak ste si prerobili súbor /etc/fstab tak, aby používal UUID, máte vyriešený problém po (štarte respektíve pred). Mnohí z Vás určite vedia, že pred samotným štartom systému sa zavádza tzv. bootloader, ktorého úlohou je nájsť systém a predať mu riadenie.Spomínaný problém s USB kľúčom by zmena samotného /etc/fstab nevyriešila, pretože už bootloader by nemusel príslušné zariadenie nájsť, tam kde ho hľadá. Ja sa zameriam na bootloader GRUB. Netvrdím, že je lepší ako LILO, ale LILO nemám, tak ma netrápi ako sa to v ňom nastavuje.

Samotný konfiguračný súbor GRUBu je v /boot/grub/menu.lst. Za normálnych okolností v ňom nie je potrebné nič meniť, takže ste sa s nim ľahko ani nemuseli stretnúť.Tí, ktorí tento konfiguračný súbor poznajú, si dovolím upozorniť, že v Debiane má trochu nezvyčajnú syntax komentárov, a to vzhľadom k použitiu skriptu update-grub. To nás však momentálne až tak nezaujíma, zaujíma nás skôr, kde je nastavená cesta k koreňu súborového systému. V GRUBe ju udáva parameter jadra root= a taký riadok pre zavedenie jadra môže vyzeraťnapríklad takto:

kernel /boot/vmlinuz-2.6.26-1-amd64 root=/dev/sda1 ro vga=791 quiet

Prosím, nepomýľte si to s parametrom root GRUBu:

root (hd0,0)

GRUB používa iný spôsob, ale ani tým sa tu zaoberať nebudem. Ak teda chcete použiť UUID vo svojom bootloaderi, môžete zadať identifikátor partície k parametrom jadra, napríkald takto:

kernel  /boot/vmlinuz-2.6.26-1-amd64 root=UUID=b55b065b-dead-4217-abe9-0e2791e16bd9 ro vga=791 quiet

Ak teraz systém reštartujete, bude to fungovať, ale nie je to najlepšie riešenie. A to práve kvôli spomínanému skriptu update- grub. Ktorý môžete spustiť ručne alebo je využívaný pri aktualizácii jadra prostredníctvom balíčkovacieho systému. Aby teda naša zmena prežila použitie tohoto skriptu, treba zmeniť premennú kopt:

# kopt=root=/dev/sda1 ro

Vyzerá to ako komentár, však? Ale pre update-grub nie je. Táto premenná obsahuje voľby jadra, ktoré potom skript update-grub pridá do každého riadku kernel. Aby teda naša zmena bola úplná, zmeníme túto premennú takto:

# kopt=root=UUID=b55b065b-dead-4217-abe9-0e2791e16bd9 ro

Teraz však je potrebné spustiť spomínaný skript update-grub, ktorý nám zaktualizuje potrebné riadky v konfigurácii zavádzača a funkčnosť môžme to vyskúšať reštartovaním. Ak ste zadali správne UUID, nie je dôvod aby systém nenaštartoval, takže ho skontrolujte aj viackrát. Po reštartovaní si môžete overiť použitie UUID vypísaním parametrov jadra:

cat /proc/cmdline
root=UUID=b55b065b-dead-4217-abe9-0e2791e16bd9 ro vga=791 quiet