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…
Obsah článku
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