Ubuntu na USB flash disku

autor - Čvn.21, 2009 - Linux

S rozmachem USB flash disků s vyšší kapacitou a podporou spouštění počítače přes USB jsem se začal zajímat o živé distribuce přímo na USB (Live USB) namísto klasického CD. Důvodem pro samostatný článek je fakt, že různé automatizované nástroje mi neumožnily dosáhnout požadovaných vlastností. Jednotlivé kroky jsou komentovány, aby je zkušenější uživatel zvládl upravit pro vlastní potřeby.

Článek vychází z Remastersys, Ubuntu Live CD Customization, Unclean casper-rw umount a Knoppix USB FAQ.

Cílem je:

  • funkční Ubuntu linux spustitelný z USB flash disku;
  • ukládání změn mezi jednotlivými spuštěními;
  • možnost používání USB flash disku i jako běžného disku pro zápis/čtení dat – a to i ze spuštěného Ubuntu;
  • a to vše pouze na jednom diskovém oddílu typu FAT – tj. bez rozdělování diskových oddílů.

Primárním cílem není vytvoření instalačního média.

Pozn.: příspěvky pod článkem odkazují na všelijaký software, který ale není schopen zajistit, aby šlo zapisovat na oddíl FAT32, ze kterého je současně spuštěno Ubuntu. Lze to řešit vytvořením dvou oddílů – první pro běžné používání, druhý pro „Live Ubuntu“ včetně souboru pro ukládání změn.

Pro informaci, spouštění OS z USB flash disku zahrnuje:

  • Nasměrování BIOSu, aby spustil zavaděč operačního systému z USB-HDD;
  • Spuštění zavaděče z MBR (master boot record) USB flash disku;
  • Načtení kernelu, kernel následně načte initramfs (initrd.img) obsahující autodetekci hardware a načtení modulů;
  • Načtení read-only obrazu souborového systému (squashfs);
  • Ukládání změn v souborovém systému do samostatného souboru casper-rw nebo home-rw (pomocí unionfs).

Výše uvedený proces je v podstatě shodný se spouštěním operačního systému na pevném disku, rozdílné jsou až poslední dva body. O ty se starají skripty projektu casper.

Casper je značně flexibilní, což umožňuje umístit squashfs i casper-rw různými způsoby: buď jako soubory na běžném FAT16/32 oddílu, nebo na samostatném linuxovém oddílu, nebo dokonce přímo jako blokové zařízení (tj. místo souboru casper-rw se použije diskový oddíl pojmenovaný casper-rw). Navíc to celé funguje automaticky.

Všimněte si rozdělení souborového systému na část, jež je pouze ke čtení, a ukládání veškerých změn proti tomuto obrazu do samostatného souboru. Díky unionfs se z pohledu uživatele systém chová, jako jeden zapisovatelný souborový systém.

UPOZORNĚNÍ: během testování dochází často k poškození casper-rw a někdy i filesystem.squashfs. Zatím jsem nezjistil, zda za to může vadný flash disk (nemyslím), nebo fakt, že souborový systém (FAT32) nesoucí oba soubory je současně zapisovatelný. Takže: USE AT YOUR OWN RISK.

Vytvoření funkční instalace Ubuntu

Opět existují různé metody, ostatní zdroje obvykle doporučují použít existující souborový systém na Live CD a pomocí chroot tento systém upravit dle vlastních požadavků. Chroot má nevýhodu pouze textové konzole, i to lze vyřešit (viz komentáře v Ubuntu Live CD Customization), osobně však dávám přednost běžné instalaci Ubuntu do virtualizovaného prostředí (VirtualBox non-OSE).

Ve virtuálním počítači nainstalujte minimálně následující balíčky:

$ sudo apt-get install casper xresprobe discover1-data squashfs-tools ubiquity

První je sada skriptů rozšiřujících vlastnosti initramfs (pro nalezení squashfs a casper-rw obrazů souborového systému), další jsou pomocné programy pro autodetekci hardware,  nástroje na vytvoření obrazu souborového systému a poslední je instalátor z USB flash disku (tj. vytvoření běžné instalace na počítači).

Je zbytečné instalovat „Přídavky pro hosta“ – sice by zpříjemnily používání virtuálního počítače, ale na Live USB jsou zbytečné.

Dále nainstalujte programy dle vlastního výběru, jediné omezení je instalace binárních ovladačů nvidia a fglx – casper při spouštění vždy vytvoří nový /etc/X11/xorg.conf a (záměrně) nedetekuje binární ovladače. Onen záměr zřejmě souvisí s GPL – distribuce těchto binárních ovladačů dle některých názorů odporuje této licenci. Zatím jsem nezjistil, zda již někdo tyto skripty úspěšně upravil.

Dalším krokem je úprava skriptu /usr/share/initramfs-tools/scripts/casper, aby byl USB flash disk připojen s právy zápisu pro všechny uživatele (standardně je předpokládáno, že obraz read-only souborového systému /media/ubuntu/casper/filesystem.squashfs je uložen na disku, na který není třeba zapisovat (CD-ROM, samostatný oddíl disku). Zvýrazněná část označuje změny:

fstype=$(get_fstype "${devname}")
if is_supported_fs ${fstype}; then
  # We want everyone with read/write perms to vfat usbdisk. NB it gets rw later by casper.
  mntopts="ro,noatime"
  if [ ${fstype} == "vfat" ]; then mntopts="ro,noatime,fmask=0111,dmask=0000,nosuid,nodev,shortname=mixed,utf8,quiet"; fi
  mount -t ${fstype} -o ${mntopts} "${devname}" $mountpoint || continue
  if is_casper_path $mountpoint && \
  ([ "$skip_uuid_check" ] || matches_uuid $mountpoint); then
    echo $mountpoint
    return 0
  else
    umount $mountpoint
  fi
fi

Dále je výhodné doplnit do initramfs e2fsck a upravit casper skript, aby byl kontrolován persistentní casper-rw diskový oddíl. První část se zařídí doplněním skriptu /usr/share/initramfs-tools/hooks/casper (doplňte zvýrazněnou část):

# We need fsck to check the persistent casper-rw partition
copy_exec /sbin/e2fsck /sbin
# cifs boot
if [ -x /sbin/mount.cifs ]; then
   copy_exec /sbin/mount.cifs /sbin

A druhá část editací skriptu /usr/share/initramfs-tools/scripts/casper (doplňte zvýrazněnou část):

log_warning_msg "Checking the casper-rw partition ${cowdevice}"
e2fsck -v -y ${cowdevice} || log_warning_msg "Not able to check the ${cowdevice} partition"
log_warning_msg "Mounting the casper-rw partition"
mount -t ${cow_fstype} -o ${cow_mountopt} ${cowdevice} /cow || panic "Can not mount $cowdevice on /cow"

Po dokončení všech úprav systému ve virtuálním počítači je třeba aktualizovat závislosti modulů a vytvořit nový initramfs:

$ sudo depmod -a $(uname -r)
$ sudo update-initramfs -u -k $(uname -r)

Příkaz update-initramfs automaticky zahrne skripty casperu do /boot/initrd-xxx.img, což je klíčová část celého postupu.

Příprava USB flash disku

VDI soubory vytvořené VirtualBoxem nelze jednoduše připojit jako logický oddíl, takže obraz disku vytvářím z běžícího systému ve VirtualBoxu přímo na externí USB flash disk.

Nejprve připojte USB flash disk k virtuálnímu počítači (VirtualBox menu Zařízení / USB zařízení … Upozornění: toto umí pouze non-OSE verze VirtualBoxu od SUNu.).

Zformátujte USB flash disk tak, aby měl pouze jeden diskový oddíl formátu FAT (při velikosti nad 4 GB zvolte formát FAT32(LBA), jinak stačí FAT16). Označení disku zjistíte příkazem:

$ dmesg | grep sd

Z výstupu se pokuste vyčíst, jaké zařízení kernel přidělil USB flash disku – v mém případě /dev/sdb. Pokud se spletete, můžete aplikací následujících příkazů smazat veškerá data na hard disku virtuálního počítače!

Pokud již USB flash disk obsahoval nějaké diskové oddíly a byl automaticky připojen, nejprve je „odpojte“ kliknutím pravým tlačítkem myši na ikonu disku na desktopu.

$ sudo dd if=/dev/zero of=/dev/sdb bs=1k count=1024
$ sudo fdisk /dev/sdb

První příkaz pro jistotu smaže začátek disku (tj. vynuluje MBR a existující diskový oddíl), druhý spustí fdisk.

V menu fdisku

  • nejprve vytvořte nový primární oddíl (klávesové sekvence znaků „n“+“p“+“1″+“enter“+“enter“+“enter“),
  • nastavte typ na FAT32 („t“+“c“),
  • nastavte příznak pro boot („a“+“1″+“enter“)
  • a při ukončení zapište změny („w“).

Alternativně můžete použít cfdisk nebo gParted (s grafickým rozhraním).

Pro kontrolu, zobrazte diskový oddíl:

$ sudo fdisk -l /dev/sdb
Disk /dev/sdb: 16,2 GB, 16 240 345 088 bajtů
hlav: 64, sektorů na stopu: 32, cylindrů: 15 488
Jednotky = cylindry po 2048 * 512 = 1 048 576 bajtech
Identifikátor disku: 0x127e2f34
Zařízení Zavádět   Začátek       Konec    Bloky    Id  Systém
/dev/sdb1   *           1       15488    15859696    c  W95 FAT32 (LBA)

Vytvořený oddíl zformátujte na FAT (není třeba volit FAT 16 či 32, příkaz to rozhodne automaticky dle velikosti disku) a pojmenujte „ubuntu“, následně zkontrolujte flash disk (kvůli chybným blokům):

$ sudo mkfs.vfat -n ubuntu /dev/sdb1
$ sudo dosfsck -atv /dev/sdb1

Kontrolu flash disku provádějte občas i během používání Live USB, ať už z MS Windows či linuxu.

Vytvoření obrazu disku

Poté pokračujte připojením USB flash disku (tj. odpojte jej od virtuálního počítače a znovu připojte, disk by měl být automaticky detekován a připojen do adresáře /media/ubuntu) a vytvořením adresáře pro obraz souborového systému:

$ mkdir /media/ubuntu/casper

Adresář se musí jmenovat casper, neb je to očekáváno casper skripty. Chcete-li použít jiné umístění, je třeba editovat /usr/share/initramfs-tools/scripts/casper a znovu vytvořit initrd.img.

V hostovaném systému ukončete všechny běžící aplikace, přepněte se do jednouživatelského režimu (bez podpory sítě), změňte připojení kořenového adresáře do režimu read-only (aby se eliminovaly změny v souborovém systému), vytvořte obraz souborového systému přímo na USB flash disk a nakonec opět připojte kořenový adresář s povolením zápisu změn:

$ sudo init 1
$ mount -o remount,ro /
$ mksquashfs / /media/ubuntu/casper/filesystem.squashfs -e /sys /proc /tmp /media/ubuntu /media/.hal-mtab /media/.hal-mtab-lock /etc/resolv.conf /etc/fstab /etc/mtab /etc/X11/xorg.conf /boot/grub/device.map
$ mount -o remount,rw /

Příkaz mksquasfh zkomprimuje kompletní adresářovou strukturu hostovaného systému (kromě adresářů či souborů za parametrem -e) a uloží do souboru /media/ubuntu/casper/filesystem.squashfs. Název souboru s obrazem může být libovolný, ale zakončený příponou „squashfs“.

Adresáře /proc, /sys a /tmp jsou vynechány úmyslně – první dva obsahují virtuální údaje o systému, nikoliv skutečné soubory, poslední adresář obsahuje pouze dočasné soubory.

Nyní se vraťte do grafického prostředí (stačí stlačit CTRL+D nebo napsat příkaz exit a z dalšího menu zvolit „resume boot“).

Do obrazu souborového systému je ještě nutné doplnit prázdné adresáře, které jsme původně vynechali (tmp adresář má speciální přístupová práva):

$ sudo mkdir /tmp/proc /tmp/sys /tmp/tmp
$ sudo chmod ugo+rwxt /tmp/tmp
$ sudo mksquashfs /tmp/proc /tmp/sys /tmp/tmp /media/ubuntu/casper/filesystem.squashfs

Dále nainstalujte grub – zavaděč kernelu:

$ sudo grub-install --root-directory=/media/ubuntu /dev/sdb

Příkaz automaticky zapíše grub do MBR disku /dev/sdb, vytvoří na tomtéž disku adresář boot/grub a zkopíruje do něj soubory potřebné pro funkčnost zavaděče.

(Alternativně lze použít syslinux, který zabírá méně paměti a má jednodušší konfiguraci, ale v mém případě byl spolehlivější grub.)

Dále zkopírujte kernel, initramfs a memtest z virtuálního počítače na USB flash disk:

$ cp /boot/vmlinuz-$(uname -r) /media/ubuntu/boot/vmlinuz
$ cp /boot/initrd.img-$(uname -r) /media/ubuntu/boot/initrd.img
$ cp /boot/memtest86+.bin /media/ubuntu/boot/memtest86+.bin

Memtest je volitelný, slouží k testování RAM počítače.

Nyní je třeba vytvořit /media/ubuntu/boot/grub/menu.lst tak, aby obsahoval (obsah samozřejmě můžete upravit, viz manuálové skripty grubu a casperu):

# By default, boot the first entry.
default 0
# Boot automatically after 30 secs.
timeout 30
color cyan/blue white/blue

title                Ubuntu - graficky mod s ukladanim zmen
kernel                /boot/vmlinuz boot=casper persistent rw quiet splash
initrd                /boot/initrd.img

title                Ubuntu - graficky mod s ukladanim zmen, nacteni do RAM(!!)
kernel                /boot/vmlinuz boot=casper persistent toram rw quiet splash
initrd                /boot/initrd.img

title                Ubuntu - bezpecny graficky mod s ukladanim zmen
kernel                /boot/vmlinuz boot=casper persistent xforcevesa rw debug
initrd                /boot/initrd.img

title                Ubuntu - textovy rezim s ukladanim zmen
kernel                /boot/vmlinuz boot=casper persistent textonly rw quiet
initrd                /boot/initrd.img

title                Ubuntu - graficky rezim bez ukladani zmen
kernel                /boot/vmlinuz boot=casper nopersistent rw quiet splash
initrd                /boot/initrd.img

title                Memory Test
kernel                /boot/memtest86+.bin

title                Spustit OS z prvniho hard disku
root                (hd0)
chainloader +1

title                Spustit OS z prvniho hard disku
root                (hd0)
chainloader +1

Výhoda Grubu je, že při spuštění počítače můžete editovat výše uvedené (klávesou „e“) a po úpravách parametrů pokračovat ve startu operačního systému (klávesou „b“).

A poslední krok je vytvoření obrazu souborového systému, do kterého se budou ukládat změny vůči obrazu filesystem.squashfs (který je pouze ke čtení).

$ dd if=/dev/zero of=/media/ubuntu/casper-rw bs=1M count=1024
$ mkfs.ext2 -L casper-rw -F /media/ubuntu/casper-rw

První příkaz vytvoří prázdný soubor casper-rw o velikosti 1 GiB (bs je velikost bloku, count je počet opakování bloků). Druhý příkaz pak vytvoří souborový systém ext2 uvnitř tohoto souboru a přidělí mu název casper-rw (to je volitelné).

Název souboru casper-rw je důležitý, neb to očekávají casper skripty. Soubor též musí být umístěn v hlavním (root) adresáři USB flash disku.

Alternativně lze použít název souboru /media/ubuntu/home-rw – pak budou ukládány pouze změny v domovských adresářích, zatímco zbytek (tj. nově nainstalované programy, úpravy /etc skriptů, apod. budou po vypnutí počítače ztraceny).

Toť vše.

Čistě pro informaci můžete ještě přidat seznam nainstalovaných balíčků:

$ dpkg-query -W --showformat='${Package} ${Version}\n' > /media/ubuntu/casper/packages.list

Ostatní poznámky

Proprietární ovladače grafické karty

Pokud trváte na binárních ovladačích grafické karty, není problém je doinstalovat po spuštění OS z USB flash disku – pomocí menu Systém / Správa / Ovladače hardwaru. Po instalaci nemusíte systém restartovat, stačí se odhlásit z Gnome a znovu přihlásit (mezitím dojde k restartu X.org a načtení nového ovladače).
Po dalším restartu dojde k přepsání /etc/X11/xorg.conf (za to mohou casper skripty) a nebudou nastaveny binární ovladače. To by šlo vyřešit buď úpravou casper skriptů nebo doplněním vlastního xorg.conf pomocí /etc/rc.local. Pak ovšem ztratíte univerzálnost takové instalace – na počítači s grafickou kartou od Intelu budou nVidia ovladače k ničemu. Testoval jsem souběžnou instalaci binárních ovladačá nvidia i fglrx, pak se ovšem Xka nespustila vůbec…

Soupis úprav standardní instalace Ubuntu

Před vytvořením obrazu jsem

  • deaktivoval služby cron, anacron, cups, saned (změnou práv: sudo chmod -x /etc/init.d/_příslušná_služba);
  • odinstaloval apport, python-apport thunderbird, pidgin*, bogofilter*, myspell*, popularity-contest, scim*, wamerican, wbritish, evolution*;
  • nainstaloval mc, bluez-compat, mtools, testdisk, wipe, partimage, xfsprogs, medibuntu (mplayer, skype, alsa-firmware, w32codecs, googleearth, libdvdcss2), digikam, mapivi, ufraw, různé detekční programy (kismet, aircrack-ng, wireshark, nmapsi4), cryptkeeper, KeepassX, Citrix ICA client (XenApp plugin + certifikáty), NoMachine NXclient (+ klíč), ntlmaps;
  • provedl různé úpravy: X (rel. rozlišení displeje snížit na 90 dpi), mc (interní editor), gedit (neukládat zálohu souboru), gnome-terminal (zrušit klávesové zkratky), gnome-panel (přidat: ikony Firefox, terminal, gedit, system monitor, Preferences/Display; odstranit User Switcher), mythbuntu téma (gtk2-engines-mythbuntu, mythtv-theme-mythbuntu).

Změna velikosti casper-rw

Nejprve vytvořte prázdý soubor /tmp/tempfile s velikostí dle potřeby (zde bude přidáno ke stávajícímu casper-rw dalších 256 MiB):

$ dd if=/dev/zero of=/tmp/tempfile bs=1M count=256

Nyní připojte tento prázdný soubor na konec existujícího souboru casper-rw na flash disku, zkontrolujte existující souborový systém a rozšiřte jej:

$ cat /tmp/tempfile >> /media/ubuntu/casper-rw
$ e2fsck -f /media/ubuntu/casper-rw
$ resize2fs /media/ubuntu/casper-rw

Přímá instalace na flash disk

Ubuntu lze na flash disk instalovat i přímo z Live CD stejně jako na jakýkoliv jiný hard disk, to má však několik nevýhod:

  • Čtení a zapisování malých souborů: flash disky jsou nejpomalejší právě u malých souborů (zápis 4kB bloků může být „rychlostí“ kolem 300 kB/s, zatímco 1MB bloky až 20 MB/s). V praxi je proto Live USB rychlejší.
  • Častý zápis drobných událostí (dočasné soubory prohlížeče, logy) opotřebovávají flash disk, což může skončit jeho poškozením (I/O errors v syslogu). Nicméně toto již dnes není tak kritické vzhledem ke zvyšující se kvalitě NAND pamětí a klesající ceně flash disků.

Na druhou stranu lze použít „logovací“ souborové systémy, které oba problémy částečně řeší (viz článek na stránkách IBM).

Záloha aktuálního stavu souborového systému

Soubor s obrazem souborového systému casper/filesystem.squashfs je pochopitelně stále stejný, veškeré změny se ukládají do obrazu v souboru casper-rw. Po čase může tento soubor značně nabobtnat – zvláště při aktualizacích systému.

Oba obrazy jdou naštěstí spojit dohromady a připojit k běžnému linuxovému systému. Nejprve připojte do samostatných složek oba souborové systémy a poté je pomocí UnionFS slučte do samostatného přípojného bodu /tmp/3:

$ sudo mkdir /tmp/1 /tmp/2 /tmp/3
$ sudo mount -t squashfs -o loop /media/ubuntu/casper/filesystem.squashfs /tmp/1
$ sudo mount -t ext2 -o loop /media/ubuntu/casper-rw /tmp/2
$ sudo mount -t unionfs -o dirs=/tmp/1:/tmp/2 none /tmp/3

Následně lze složku /tmp/3 zálohovat či jejím obsahem přepsat disk používaný ve virtuálním počítači.

:,

Komentáře: 8

Zanechte komentář

Archivy