O zmizelých Widlích a tučňáčím putování

Kterak přesunout fungující Linuxovou distribuci…

Stalo, co se stát (ne)mělo – usoudil jsem, že Windowsy na svém notebooku již potřebovat nebudu. Důvod? Hry, které hraju (nejnovější z nich zve se Warcraftem III), buď na Linuxu fungují nativně, nebo bez jediné chybky fungují ve Winu. Programy, které se bez Windowsů neobejdou, nepoužívám (programovat v C# mě nikterak neoslovilo, milejší mi z Céčkových jazyků je Qt framework pro C++). A navíc: na 80 GB disku mít dva systémy, z nichž jeden si jenom pro svou maličkost (tedy spíš velikost) ukrojí nehezkých 15 GB, a to na něm není o moc víc než kalkulačka, mediaplayer, a webový prohlížeč… Plus software, dívat se na holý systém (se systémovou tapetou k tomu :D) se dlouho nedá, to je dalších pár giga… Čtvrtina disku zabraná vlastně zbytečně. Nu, co se dá dělat, rozhodl jsem se zamávat vlaječce tučnáčím křídlem.

Otázkou zůstalo, kterak uvolněné místo použít k rozšíření mých linuxových disků. Původní rozložení disků nebylo zrovna ideální: 100 MB pro bootovací oddíl Windows 7, pak 15 giga pro samotné W7, potom pár linuxích oddílů (boot, swap a root) o celkové velikosti 15 giga (na kterých byl systém vybavený celou škálou softwaru, od přehrávače na muziku a videa, přes grafické editory pro všechny myslitelné formy grafiky až po Qt-Creator a Matlab; a pak několik her, z nichž nejobjemnější byly 5-gigové Neverwinter Nights) a nakonec jedna 40 gigová partitiona, kam jsem nasypal (jsem si vědom toho, že můj počítač svědčil o nepořádnosti svého majitele) jako software pro Windowsy, tak i muziku a videa. Situace zdála se špatná: kus místa před Linuxem, kus za ním. Což o to, místo za systémem se využít dá snadno, postačí rozšířit poslední oddíl, případně vytvořit nový oddíl a napojit ho jako /home. Ale 15 GB před systémem už bych neužil. Považte sami, 15 giga je na osmdesátce disku nemá daleko do pětiny. Nová instalace Linuxu, ke které by jistě přistoupil nejeden Ubuntář a dost možná i Debianista, je pro Gentooistu (za kterého se troufám považovat po necelém roce používání) projevem nejen nedostatku fantazie, ale také extrémního masochismu. Začal jsem tušit, že můj prostor, jak zrušit Windowsy, a mít z toho víc než jen pocit úlevy, se zúžil na jedinou možnost – přesunout stávající systém na místa, která mu uvolní Billův výtvor.

Chvíle googlení (opravdu jen chvíle), která mi dala naději, že můj nápad není science fiction. Několik zápisů v různých blozích, které pojednávali o tom, jak kdo hezky přesunul Linux z disku na disk. O přesunu partition-partition bylo zmínek pramálo (jedna mě vyděsila, neb ji popisovala jako předem odsouzenou k neúspěchu – jediné, co chlácholilo moje odhodlání, bylo datum u příspěvku, již několik let prošlé zákonnou dvouletou záruční lhůtou), nicméně i tady jsem našel trochu naděje. Pak zhruba stejně dlouhá doba strávená nad man cp man tar, man fdisk, man resize2fs. Poslední, co jsem musel, bylo uvařit si čaj, a vykročit…

Odstranění Windowsů je bez problému, postačí zbavit se jejich oddílů. Na to postačí GParted nebo třeba PartitionManager od KDE, ale vychutnal jsem si zmiňovaný fdisk. Konkrétně fdisk /dev/sda, tedy editace alokační tabulky prvního (shodou okolností také jediného) disku. Netřeba se lekat, začátky a konce oddílů určí za vás, jediné, co je potřeba mu zadat, zda má zapisovat oddíly jako primární nebo rozšířené/logické, a kterak mají být velké. Takže: delete windowsí partitiony(příkaz „d“ a číslo partitiony, měl jsem „d 1„, „d 2„), a rovnou na jejich místě vytvořit paritiony pro budoucí Linux. Nejprve jsem vytvořil nový oddíl pro bootovací sekci „n“ pro novou, „p“ jako primární, označení oddílu jsem nechal defaultní, dále defaultní možnost začít oddíl na prvním volném sektoru, a o velikosti 32MB – tedy „+32M„) a další pro swap. Následně zapsat změny v alokační tabulce. Toto všechno prosím pěkně lze udělat ze systému, který se chystáte přesouvat! Dále restart, aby si jádro sáhlo na novou alokační tabulku, nedá se nic dělat, tohle za běhu už udělat nejde (nebo o tom aspoň nevím, a systém o tom zarytě mlčí). Ale hned po restartu jsem navázal vytvořením souborového systému a swapu:

mkfs.ext2 /dev/sda1
mkswap /dev/sda2

Teď už mělo přijít na řadu kopírování ze současného /boot do nového:

mkdir /mnt/newboot	                  (přípojný bod pro /dev/sda1)
mount /dev/sda1 /mnt/newboot		(připojení oddílu na přípojný bod)
rsync -aHAS /boot/* /mnt/newboot

Příkaz rsync slouží ke kopírování. Nechme stranou jeho schopnost kopírovat i mezi počítači, ta se mě netýkala. Práce s ním je podobná jako s cp, jen je „o malinko šikovnější“. Přepínače aHAS zajistí rekurzivní kopírování se zachováním oprávnění, vlastníků, správně zkopíruje odkazy. Samotné kopírování je jen první krok přesunu bootovacího oddílu. Jednak je třeba v /etc/fstab změnit, jaký oddíl se má do /boot připojovat (změnil jsem z /dev/sda3 na /dev/sda1), dále je třeba přenastavit grub. Původní /boot se nacházel na /dev/sda3, které je označováno jako (hd0,2) – hd coby harddisk, číslovány jsou od nuly, tedy první (jemu odpovídající device-nod je označen sda), a na něm 3.oddíl (jsou opět číslovány od nuly), nyní ale bude /boot na /dev/sda1 (první disk, první oddíl, proto v /boot/grub/grub.conf změnít (hd0,2) na (hd0,0) ). Pak je ještě potřeba zdělit grubu, že se změnilo umístění konfiguračních souborů, a znovu ho zavést do MBR (master boot record). To lze nejsnáze provést z GRUB-shellu:

# grub
> root (hd0,0)		// odpovídá umístění nového /boot
> setup (hd0)		// grub se zavádí do MBR celého disku, proto jen hd0
> quit

A tímhle je připraven nový bootovací oddíl a systém je nastaven tak, aby do /boot připojoval nový oddíl, nikoliv starý. Rovnou je nejlépe toto otestovat, než se později divit, jako kupříkladu já. Nešlo o žádnou závažnou chybu, ale zabrala dost času 🙂 při formátování /dev/sda1 jsem se někde dopustil zřejmě chyby (kde, nevím), jejímž výsledkem byla chyba na /dev/sda1 oddílu. Co se nestalo: po naběhnutí systému se / připojil v read-only režimu, což je krajně nepříjemná záležitost. Při startu systému se disky připojují jako read-only, nezávisle na tom, jak je zapsáno v /etc/fstab. Následně se provede kontrola, a pokud jsou disky v pořádku, pak teprve se znovupřipojí dle nastavení. Pokud jsou disky v pořádku 🙂 Troufám si předpokládat, že díky neprošlé kontrole se nepřipojil disk (trochu mě mate, proč chyba na /boot disku zneschopní /, ale zkusím to zjistit). Naštěstí #gentoo IRC je kanál živý a plný ochotných zkušenějších kolegů, takže mě přivedli na správnou myšlenku, a nové naformátování a nakopírování problém zažehnalo 🙂

Odstranil jsem si starý /boot (umístěný na /dev/sda3), a celé volné místo (14 giga) jsem použil na nový / (oddíl naformátujeme jako ext4 pomocí mkfs.ext4 /dev/sda3). Tady jsem si už neodpustil zálohovat, ztratit celý systém se mi nechtělo. Ač se tohle může (převážně Linuxovému lidu) nezdát, i tohle zvládneme na běžícím systému. Linuxáci mohou (zcela oprávněně) namítat, že obsah složek jako /proc nebo /sys by se kopírovat neměly (možná ani nesmí, ale nebudu za to dávat ruku do ohně) – /proc obsahuje mj. informace o běžících procesech, v /sys je informace o jádru, ovladačích a devicích. Veškeré obavy rozptýlí jednoduchá věc: bind mount:

mkdir /rootfs
mount -o bind / /rootfs
mount -o remount,bind,ro / /rootfs

Díky prvnímu mountu se /rootfs stane dalším přístupovým bodem k oddílu napojenému na /, tedy jen a pouze /dev/sda6 – nezávisle na systémech napojených na místa v /, tedy disky připojené do /mnt nebo /media, virtuální souborové systémy jako ten v /proc nebo v /sys :). Druhý mount, vlastně remount, zajistí, aby byl /dev/sda6 přes /rootfs přístupný v read-only režimu, budiž to malou pojistkou (netuším proč, ale nelze bind-mountovat v read-only režimu „napoprvé“)

cd /rootfs
tar cvjpf záloha_root.tar.bz2 .		// obsah /dev/sda6 (tečka na konci!) zakompresí do záloha_root.tar.bz2
mkdir /mnt/newroot
mount /dev/sda3 /mnt/newroot
rsync -aHAS /rootfs/* /mnt/newroot		// jako u bootu, "správné" zkopírování
umount /rootfs
mkdir /roots

Tady jsou úpravy jednodušší než u přesunu /bootu. Teď stačí jenom změnit zařízení v /etc/fstab a /boot/grub/grub.conf (položka root=/dev/sda3) – bootovací oddíl se nijak neměnil, tak netřeba přepisovat umístění grubu ani jeho konfigurací.

Určitě vzpomínáte na to, že původně jsem měl Gentoo na 15 GB, teď ale je jenom na 14 (víc mi po W7 nezbylo, když jsem giga dal swapce). Naštěstí po rebootu je nový systém plně funkční, a lze tedy odstranit staré oddíly s Linuxem – opět poslouží fdisk – a volné místo použít pro přesunutý systém. Jako rozumné jevilo se mi dát systému 20 GB místo 15 (co kdyby se objevila nějaká hra navíc, tedy vlastně program navíc). Rozšiřovat / paritionu za běhu systému? Ale jo, to dáme 🙂 Nejprve potřebuji dost velkou partitionu, teď má 14 giga. Takže znovu fdisk /dev/sda, a k /dev/sda3 nějak přivařit 5 giga sektorů…. to nejde, aspoň ne přímo. Ale lze odstranit /dev/sda3 (smazat z alokační tabulky údaje o oddílu, nic víc se nestane – v uvozovkách – jakmile bych odstranil informace o oddílu a restartoval, nebo jinak přinutil systém znovu načíst informace z alokační tabulky, tak už oddíl nenajdu, ač data na něm jsou fyzicky stále v pořádku) a znovu ji přidat, už ve správné velikosti. A potom uložit změny. Systém to nepozná,
ten si jede dál (nyní už starou alokační tabulku má stále načtenou, o nové nic neví) a vesele mi k tomu přehrává muziku 🙂 Teď, když už disk ví, že má na /dev/sda3 celých 20 giga, můžu rozšířit souborový systém. Na tohle má Linux prográmek zvaný resize2fs. Před ním je ještě potřeba ověřit, zda je disk v pořádku (e2fsck /dev/sda3). Když se resize pustí bez určení velikosti (resize2fs /dev/sda3), tak využije celý prostor na oddílu, což je to, co jsem si přál 🙂

No a co nepozoruji? Krásných víc jak 50 giga volného místa, ještě nepřiděleného 🙂 To bude krásná velká /home, na muziku, na hry ve winu, na spoustu tapet vyrenderovaných ve Fyre, a tak 🙂 Tady malá poznámka: krom vytvoření oddílu (fdisk /dev/sda na vytvoření oddílu), formátování (mkfs.ext4 /dev/sda5), kopírování /home (rsync -aHAS /home/* /mnt/newhome) a editaci /etc/fstab (zapsat položku /dev/sda5 /home ext4 noatime 0 0) je potřeba ještě před tím, než nový disk připojíte na /home, smazat to, co máte v /home složce uložené na /, necháte jen a pouze samotnou prázdnou /home složku. Pokud tohle není jasné, ozřejmím: na /dev/sda3 coby / je složka /home, a v ní složka ondra, plná všeho možného. Pak existuje složka ondra ještě na /dev/sda5, který se má do /home připojit. Schválně, co se stane, když udělám mount /dev/sda5 /home (nebo to za mě při startu udělá systém, jak mu již káže /etc/fstab)? Složka /home (ta je fyzicky na /dev/sda3) bude přístupovým bodem pro /dev/sda5 (kde je ondra). Ale na /dev/sda3 je stále obsah mé domovské složky, ač je nepřístupný, protože /home jsem přeměnil na cestu k jinému disku…. Tohle je krásný způsob, jak si zaplácnout kus disku, navíc tak, aby se nedalo zjistit, jaké soubory místo zabírají… Jenom prosím vás, lidi, ne jako já… rm -rf /home/* bylo dobře, jenže v tu dobu už byl v /home připojen /dev/sda5. Kdo z vás si dovede představit výraz člověka, který si právě zamnul ruce nad tím, jak mu rm -fr /home/* ušetřilo 2 GB místa, pak napsal mount /dev/sda5 /home ve snaze připojit si zpět nový /home, ale dočetl se „mount: podle mtab je /dev/sda5 již připojeno na /home„, tak se teď válíte smíchy po zemi 🙂 následuje vyděšené ls -a, a když se objeví dvě položky (tečka a dvě tečky), tak se ten výraz ještě zlepší, garantuju 🙂 Před mazání obsahu /home musí samozřejmě stát příkaz /umount /home (který mi odpojí /dev/sda5 od /home, a od této chvíle můžu přistupovat k tomu, co ve složce /home (a tedy na /dev/sda3) fyzicky je:) ).
Čemu se smějete, hadi? Když jsem si to poka*il (pokazil, ne pokadil), na starém /home ještě pořád ty věci mám, ne? Tak se tomu nesmějte, mi tam totiž žádná škoda nevznikla 😀 (ale zatrnulo mi, těch konfigů je tam hafo, a k tomu ještě pytel vlastních skriptů k openboxu, ty bych znova psát nechtěl).

Abych to shrnul, až někdo z vás bude toužit po hezkém pocitu z přesunutého systému (a navíc tím bude mít kus volného času, který by jinak strávil reinstalací), tak směle do toho 🙂 Zklamu Windowsáky: tohle prostě neuděláte…. (leda přes Linuxí liveCD, kde uděláte podobný postup jako já na Linuxu, ale nevím, zda tím nerozházíte bootloader (ne-li něco horšího). Pokažený bootloader by se mohl dát opravit z Windowsího instalačního DVD, nabootovat do záchranného režimu, do příkazové řádky, a spustit fixmbr – ale nevím, zda tohle udělat jde, a jestli Widle pak naběhnou, nikdy jsem to nezkoušel!!!! – je to jenom na vás, zda to budete někdo zkoušet na vlastní riziko)

Hodně zdaru při Tuxení 🙂