Kategória: Linux všeobecne

Zmenené: 10. september 2010

Bootovateľné CD

Už dávno som sa zaoberal myšlienkou vytvorenie vlastného servisného CD. Robil som aj nejaké pokusy, ale vždy to skončilo na mojej pohodlnosti, pretože existujúce nástroje (SystemRescueCD a pod.) mi plne vyhovovali a hlavne boli hotové. Túto myšlienku som oprášil, keď som zistil, že nové verzie SystemRescueCD sa min evmestia na malé CD. Oprášil som staré vedomosti i poznámky a pustil sa do práce.

Moje predchdzajúce pokusy boli zamerané na použitie ISOLINUX. Jedná sa o súčasť projektu SYSLINUX, ktorá je určená práve na zavádzanie (systému) z CD. Pre tých, čo nevedia, zavádzanie z CD musí podporovať BIOS počítača (hoci sa to dá obísť pomocou diskety). Samotné zavádzanie z CD umožnila Špecifikácia El Torito, ktorá popisuje tri režimy zavádzania:

  • emulovanie diskety – v ktorom časť CD obsahuje obraz diskety, ktorý je použitý na zavedenie systému a zvyšok CD je dostupný štandardným spôsobom;
  • emulovanie pevného disku – je režim, v ktorom je celé CD použité ako jedno veľké úložisko a zavádzanie systému ako i beh programov je riešený len z CD;
  • bez emulácie – v tomto režime je dostupné celé CD, zavádzač je uložený priamo v ňom a celé CD je dostupné štandardným spôsobom.

Dnešné BIOSy už nepotrebujú emulovaný režim a pre zavedenie systému z CD je určený aj spomínaný ISOLINUX. Naučiť sa nastaviť ISOLINUX prináša jednu veľkú výhodu, ak potrebujete používať zavádzanie po sieti. Na to slúži PXELINUX, z rovnakého projektu, takže ich nastavenie je veľmi podobné. Ja som sa však rozhodol využiť to čo viem o nastavení GRUB a pre vytvorenie CD použiť práve tento zavádzač, ktorý sa vo svete Linuxu stáva štandardom.

Tento popis som sa rozhodol urobiť trochu inak, a krok za krokom popísať celý môj postup, ktorým som sa od jednoduchej úpravy SystemRescueCD dostal až k CD s viacerými nástrojmi v jednom.

Krok 1: Úprava SysRescue

Moja prvá myšlienka bola založená na tom, že SystemRescueCD iste bude obsahovať aj veci, ktoré nepotrebujem a budú sa dať prosto vyhodiť, čím by sa zmenšila veľkosť na obrazu na prijateľnú hodnotu, teda v mojom prípade pod 210 MB. Začal som tým, že som si vytvoril nový adresár, v ktorom budem robiť pokusy:

mkdir ~/boot
cd ~/boot

a do neho som stiahol obraz SystemRescueCD. Potom som si tu pripravil adresár, do ktorého si tento ISO obraz pripojím:

mkdir iso-test
sudo mount -o loop systemrescuecd-x86-1.1.4.iso iso-test/

Upozornenie

Samozrejme, možné je obraz napáliť na CD, prípadne použiť už hotové CD…

Keď som pozrel obsah obrazu, zistil som, že používa ISOLINUX (adresár isolinux), a pohľadom do konfiguračného súboru v tomto adresári som zistil, že pre samotné CD potrebujem súbor s jadrom, RAM diskom a samozrejme samotný dátový súbor s obsahom LiveCD, konkrétne tieto::

isolinux/rescuecd
isolinux/rescue64
isolinux/initram.igz
sysrcd.dat

Už pohľad na veľkosť týchto súborov mi naznačoval, že sa do 210 MB nevojdem, a tak sa začala črtať nová myšlienka, ale rozhodol som sa pokračovať. Tak som si pripravil štruktúru nového CD, v ktorom som najprv pripravil samotný GRUB. K tomu sú potrebné dva súbory (teda vlastne len jeden, ten druhý je konfiguračný). Jedná sa o súbor stage2_eltorito, ktorý je súčasťou balíka grub. Keďže mám grub nainštalovaný môžem ho rovno prekopírovať na patričné miesto (stále som v adresári boot) a vytvoriť zatiaľ prázdny konfiguračný súbor:

mkdir -p mycd/boot/grub
cp /usr/lib/grub/x86_64-pc/stage2_eltorito mycd/boot/grub/
touch mycd/boot/grub/menu.lst

Konfiguráciu budem upravovať neskôr, najprv som si nakopíroval potebné súbory z ISO obrazu, ktorý mám stále pripojený v adresári iso-test. Aby som sa ľahšie orientoval, najprv som si však pripravil potrebné adresáre:

cd mycd/boot
mkdir obrazy
mkdir jadra

a do týchto adresárov som prekopíroval súbory, do adresárov, ktorých mená sú samovysvetľujúce:

cp ../../iso-test/isolinux/initram.igz obrazy/
cp ../../iso-test/isolinux/rescue* jadra/
cd ..
cp ../iso-test/sysrcd.dat ./

a tým som mal štruktúru CD hotovú. Jej výsledný stav bol takýto:

|-- boot
|   |-- grub
|   |   |-- menu.lst
|   |   `-- stage2_eltorito
|   |-- jadra
|   |   |-- rescue64
|   |   `-- rescuecd
|   `-- obrazy
|       `-- initram.igz
`-- sysrcd.dat

Možno ešte jedna vec, a tou je príznak spustenie súborov prekopírovaných z iso. Komu vadí, nech ho odstráni, ja som ho nechal, veď súborový systém iso9660 práva súborov i tak nepozná. Ostalo mi už len upraviť konfiguračný súbor menu.lst. Vlatne veľa úprav ani netreba, veci budú fungovať aj s predvolenými hodnotami, samozrejme okrem menu, ktoré som pripravil takto:

title RescueCD
    kernel /boot/jadra/rescuecd
    initrd /boot/obrazy/initram.igz

title RescueCD 64
    kernel /boot/jadra/rescue64
    initrd /boot/obrazy/initram.igz

Ostáva posledný krok, ktorým bolo samotné vytvorenie CD, teda vlastne jeho obrazu, ale to považujem len za drobný detail. O vytvorenie obrazu sa mi postaral nástroj mkisofs:

cd ..
mkisofs -R -b boot/grub/stage2_eltorito -no-emul-boot -boot-load-size 4 -boot-info-table -o grub.iso mycd
I: -input-charset not specified, using utf-8 (detected in locale settings)
Size of boot image is 4 sectors -> No emulation
  4.41% done, estimate finish Mon Jan 19 20:24:31 2009
 ... skrátené ...
 96.99% done, estimate finish Mon Jan 19 20:24:36 2009
Total translation table size: 2048
Total rockridge attributes bytes: 1588
Total directory bytes: 8192
Path table size(bytes): 62
Max brk space used 0
113423 extents written (221 MB)

Nástroj mkisofs nie je žiadnou novinkou, ja som mu poslal niektoré zaujímavé informácie. Najmä ide o cestu k súboru zavádzača (-b boot/grub/stage2_eltorito), režim bez emulácie (-no-emul-boot) a počet virtuálnych sektorov, ktoré má BIOS načítať (-boot-load-size 4) táto hodnota musí byť pre staršie BIOSy násobkom 4. Posledné dva parametre udávajú meno vytvoreného obrazu (grub.iso) a adresár so štruktúrou CD (mycd). Program po spustení postupne ukazuje priebeh vytvárania obrazu (ja som ho vo výpise skrátil) a na konci vypíše štatistiku toho, čo vytvoril. Parameter, ktorý ma zaujímal je v poslednom riadku a udáva, že výsledný obraz CD má 221 MB, čo je síce menej ako pôvodný, ale stále veľa na to, aby mi pomohli moje malé CD.

Rada

Keďže som mal v tomto okamžiku na výber, či použijem na malom CD starú verziu (ísť cestou úpravy LiveCD sa mi nechcelo) alebo použiť štandardné veľké CD. Keďže som chcel novú verziu, prvá možnosť odpadla, avšak ako človeka sporovlivého sa mi zdalo voľných cca 500 MB na CD dosť neekonomické. Logickým vyústením tejto lakomosti bolo pridať na takéto CD aj ďalšie nástroje, nech je disk využitý poriadne.

Takýmto spôsoboom je možné pridať skoro každé Linuxové CD, napríkladnejakú plnohodnotnú grafickú minidistribúciu? Prečo minidistribúciu? Aby sa vošlo veľa rôznych vecí. Prečo grafickú, keď aj SystemRescueCD poskytuje aj X server? Len tak, aby som mohol frajerovať… Takže som zvolil DSLinux. Je to naozaj mini, veď zaberá len 50 MB.

Krok 2: Pridanie MemTest86+

Ak spravuje viacero počítačov a najmä tie so super bezpečným Windows, iste máte zbierku rôznych servisných diskiet. Ja ich teda mám niekoľko, hoci mnohé už nepoužívam, niekedy sa tomu predsa nevyhnem (najmä na deduškoch bez zavádzania z CD a s 32 MB RAM). Pomocou GRUBu je možné tieto diskety jednoducho využiť na CD. Samozrejme, nie priamo diskety, ale ich obrazy. Popisom vytvárania obrazu z diskiet sa zdržiavať nebudem (man dd) a všetko popíšem na príklade obrazu diskety s testerom pamäti RAM, zvaným Memtest86+.

Pre zavádzanie z obrazov diskiet je možné využiť nástroj memdisk, ktorý je tiež súčasťou projektu SYSLINUX, pre ktorý bol vyvinutý, no mne poslúžil tiež. Súbor memdisk, ktorý potrebujem môžem získať viacerými spôsobmi. Môžem nainštalovať balíček balíček syslinux (prípadne priamo syslinux-common), ktorý ho obsahuje (/usr/lib/syslinux/memdisk) alebo, ke už mám pripojený obraz SystemrescueCD, môžem tento prekopírovať z tohoto obrazu. Zvolil som si druhý spôsob:

cp iso-test/isolinux/memdisk mycd/boot/jadra/

a k nemu potrebujem ešte obraz diskety s Memtest86+. Aj tento je možné získať viacerými spôsobmi. Možné je stiahnuť predpripravený obraz diskety z domovskej stránky, ale ja opäť použijem ten, ktorý je súčasťou SystemRescueCD:

cp iso-test/bootdisk/memtestp.img mycd/boot/obrazy/

no a ostáva už len pridať položku do menu GRUBu:

title MemTest86+
    kernel /boot/jadra/memdisk
    initrd /boot/obrazy/memtestp.img

Netreba zabudnúť, že po úprave je potrebné znova vygenerovať iso súbor, tak použijem v konzoli šípku hore a z histórie vyvolám už raz použitý príkaz mkisofs a opäť ho použijem, bez akejkoľvek úpravy. Obdobným spôsobom je možné na CD pridať obraz akejkoľvek systémovej diskety a tak sa zbaviť kopy diskiet. Samozrejme, súbor memdisk stačí len jeden!

Krok 3: Pridanie emulovaného CD

Ďalšia možnosť, ktorá ma napadla, bolo pridanie celého CD, ktoré je založené na emulácii diskety El Torito. V tomto prípade je vlastne postup obdobou kroku 2. Celé čo je potrebné, je vyextrahovať z CD zavádzací obraz diskety, ktorý môže mať veľkosť napr. 1440 kB. Možno na to isto použi nástroje príkazového riadku, ale tento zavádzací obraz môže mať rôznu veľkosť. ja som úspešne využil program ISOMaster (z rovnomenného balíka), ktorý to urobí za mňa.

Takto vyextrahovaný obraz zavádzacej diskety potom už možno v GRUBe nastaviť rovnako ako pri použití obrazu s Memtest86+, teda pomocou memdisk. Samozrejme, aby fungovalo CD ako celok, je treba do nášho adresára prekopírovať celý obsah (alebo potebné časti) CD. A to je všetko.

Krok 4: Pridanie neemulovaného CD

No dobre, pridanie meulovaného CD nie je problém. Dá sa však pridať aj neemulované bootovacie CD. Hoci tu už nie je postup taký jednoznačný, ako v predchádzajúcom prípade. Nie, nie je zložitejší, len je rôznejší, pretože nemulované CD môže byť riešené rôznym spôsobom, napríklad pomocou ISOLinux, SYSLinux, či nášho GRUB. V tomto prípade je teda treba nájsť konfiguračný príslušný konfiguračný súbor a podľa neho vybrať príslušné súbory a upraviť nastavenie GRUB. Aj v tomto prípade pomôže porgram ISOMaster, v ktorom je možné nechať si zobraziť informácie o typezavádzača.

Rada

Je to vlastne rovnaký postup ako na začiatku, pri mojom prvom pokuse s úpravou SystemRescueCD v začiatku článku.

Záver

Na záver už len niekoľko poznámok, nápadov či inšpirácií. Do menu je dobré pridať aj možnosť pre zavedenie systému z pevného disku, prípadne z diskety, či siete. Prosto, pripraviť si CD na svoj obraz a zahodiť množstvo samostatných diskiet či CD. ďalšou zaujímavou možnosťou, je vytvoriť si bootovaciu disketu, pomocou ktorej je možné bootovať z CD aj na strojoch, ktorých BIOS to nepodporuje.