Vlastní linuxová distribuce

Každého linuxového nadšence-programátora jistě někdy napadla myšlenka na vytvoření vlastní linuxové distribuce, která bude daleko lepší než ta, kterou používá teď. Mohla ho k tomu vést nějaká špatná vlastnost jeho distribuce nebo pouhá myšlenka vytvořit od základu a po svém něco vlastního, co by se možná mohlo líbit i dalším lidem.

Hned v úvodu musím zklamat všechny, kteří si myslí, že jde o jednoduchou procházku růžovým sadem. Vytvoření nové distribuce „od základu“ (tedy bez použití již nějaké existující) je velmi těžká a časově náročná práce a zřejmě ji sami nedotáhnete do konce. Přesto doporučuji zkusit si to. Alespoň pochopíte, jaké máte štěstí, když se o vaše oblíbené distro stará někdo jiný 🙂

Ze všeho nejdříve bude potřeba zkompilovat BusyBox. To je nástroj, který slučuje běžné linuxové nástroje do jednoho binárního souboru. To má tu výhodu, že výsledný soubor je menší, než součet velikostí všech nástrojů, které obsahuje.

#Stažení poslední verze BusyBoxu
git clone git://busybox.net/busybox.git --depth 1
cd busybox

#Konfigurace. Můžete se v tom hrabat a přizpůsobit si výslednou binárku.
make menuconfig
make

#Vytvoření adresáře _install, ve kterém bude
#vše potřebné
make install

Nyní bychom mohli náš BusyBox otestovat v chrootovaném prostředí. Bohužel to nebude možné, protože nám chybí některé základní knihovny, které BusyBox potřebuje ke svému životu. O jaké knihovny se jedná zjistíme pomocí příkazu:

ldd _install/bin/busybox

Není nic jednoduššího, než zkopírovat tyto knihovny z našeho aktuálního systému
do adresáře lib:

mkdir _install/lib

#V mém případě jsou knihovny z 64bitového systému.
#Vytvoříme i link lib64
cp /lib/x86_64-linux-gnu/libm.so.6 _install/lib
cp /lib/x86_64-linux-gnu/libc.so.6 _install/lib
cp /lib64/ld-linux-x86-64.so.2 _install/lib
(cd _install; ln -s lib lib64)

Teď by už chroot měl pracovat správně.

sudo chroot _install /bin/sh

Teď vytvoříme adresář /proc, do kterého se po startu naší nové distribuce budou připojovat procesy. Také vytvoříme adresář /etc, /etc/init.d a /dev. Do adresáře /etc/init.d umístíme skript, který se bude volat po startu systému a bude obsahovat právě ono připojení procesů do adresáře /proc.
Pokud chcete, můžete si tam přidat třeba tento řádek: echo „Toto je moje distribuce :)“. Důležité je, aby tento skript měl spustitelný příznak. Dalším důležitým úkonem je zkopírování terminálů z hostitelského systému do adresáře /dev. Pro naše potřeby stačí 4 terminály.

#Připojení procesů do /proc po startu systému
mkdir _install/proc
mkdir -p _install/etc/init.d
(cat << END #!/bin/sh mount -t proc none /proc END ) > _install/etc/init.d/rcS
chmod +x _install/etc/init.d/rcS

#Zkopírování 4 terminálů z hostitelského
#systému
mkdir _install/dev
sudo cp -a /dev/tty{1,2,3,4} _install/dev

Nakonec vytvoříme odkaz na náš BusyBox. Systém po startu hledá soubor init, který automatický spouští. Nakonec celý adresář _install zabalíme do souboru ramdisk a vyzkoušíme pomocí qemu. Použijeme nějaké předkompilované jádro, např. to, které používá náš hostitelský systém.

(cd _install; ln -s bin/busybox init) #Bez toho se způsobí kernel panic
(cd _install; find . | cpio -o -H newc | gzip) > ramdisk

# Zkouška se systémovým linuxovým jádrem
qemu-system-x86_64 -kernel /boot/vmlinuz-3.0.0-12-generic -initrd ramdisk

Protože děláme distribuci vlastní, nechceme používat jádro zkompilované někým jiným. Proto stáhneme zdrojové kódy linuxového jádra a zkompilujeme sami. Nastavení konfigurace není cílem tohoto článku, protože by si zasloužila samostatný článek. Pokud o to máte zájem, doporučuji článek na abclinuxu.cz.

#Přejít nad adresář busyboxu
cd ..

#Stažení poslední verze linuxového jádra
git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git --depth 1
cd linux

#Grafická konfigurace
make menuconfig

#Kompilujeme na plný výkon (4 udává počet jader počítače, na kterém kompilujeme)
make -j4

Nakonec zkusíme použít naše nové jádro:

qemu-system-x86_64 -kernel arch/x86_64/boot/bzImage -initrd ../busybox/ramdisk

Teď zbývá náš ramdisk a kernel dostat na bootovatelné CD. K tomu výborně poslouží program isolinux. Jedná se o malinkatý bootloader, který použijeme k načtení našeho systému. Stáheneme ho na adrese http://www.kernel.org/pub/linux/utils/boot/syslinux/. Bude zapotřebí naše jádro i ramdisk zkopírovat do příslušných adresářů.

#Přejít do hlavního adresáře
cd ..

mkdir CD_root
cd CD_root
mkdir {isolinux,images,kernel}

cp ../linux/arch/x86_64/boot/bzImage kernel/
cp ../busybox/ramdisk images/
cp ../syslinux-4.05/core/isolinux.bin isolinux/

(cat << END default 1 label 1     kernel /kernel/bzImage     append initrd=/images/ramdisk END ) > isolinux/isolinux.cfg

mkisofs -b isolinux/isolinux.bin -no-emul-boot -boot-load-size 4 -boot-info-table -o ../output.iso ./

Teď máme obraz naší distribuce output.iso, který můžeme vypálit na CD a spustit z něj počítač. V dnešní době virtualizace nám může vyhovovat spuštění ve VirtualBoxu nebo qemu 🙂

Příspěvek byl publikován v rubrice Blog se štítky a jeho autorem je Petr Pošvic. Můžete si jeho odkaz uložit mezi své oblíbené záložky nebo ho sdílet s přáteli.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *