Как да си направим собствено LiveCD

1 Въведение
Това кратко ръководство ще ви покаже колко е лесно да си направите livecd. LiveCD е диск с ГНУ/Линукс, който се зарежда директно от CD-ROM-а без да е нужна инсталация на твърдия диск. Описания тук подход има следните предимства пред използването на catalyst (Програма за направа на LiveCD-та, разработена от програмистите на Gentoo):
* Програмния код се запазва непроменен без да се губи през последващите направи на livecd-то. Това ви позволява да синхронизирате (sync), актуализирате (update) и настройвате работната среда постепенно, както при нормална работа с вашата система.
* Зареждането на CD-то става с GRUB (ISOLINUX остава като алтернатива). Така имате същата гъвкавост както при работа с нормална система, т.е. имате възможност да променяте параметрите на ядрото, откриването на устройства, и т.н.
* Запазване на програмния код между итерациите, води до значителното намаляване на времето за направата на нови CD-та.
Можете да използвате системата, или директно да използвате инструмент, базиран на нея, наречен makelivecd - .
2 Изисквания
Необходимо е да имате достатъчно свободно място. Колко, зависи от избора на пакетите които сте решили да включите в livecd-то. Средно, около 4 GB трябва да са достатъчни.
Трябва сте запознати с инсталирането на Gentoo от stage2 tarball, защото това е до голяма степен каквото правим тук. Ако не се чувствате уверен, консултирайте се с Gentoo .
Използването на stage1 е също възможно, но ще отнеме много по-вече време в сравнение със stage2. Освен това мнозинството от хората ще направят нещо подобно на <code>emerge -e world</code> към края, така че това е най-добрият начин.
3 Настройване на Работната Среда
Обkръжението което ще ползваме е просто директория в която ще chroot-нем и където ще инсталираме Gentoo (аналогично на инсталирането от официално CD). Съдържанието на тази директория е това, което ще „направи“ нашето livecd. За целта използваме директорията 'source', която създаваме в директорията '~/livecd'.
cd ~
mkdir -p livecd/source
Изтеглете stage2 tarball от най-близкото Gentoo огледало и го запомнете във вашата home директория. Като пример тук е използван i686 stage2, който би трябвало да работи на повечето съвременни PC-та. Разархивирайте го в директорията 'source'. После направете нова директория 'newroot', която ще бъде използвана по време на началното зареждане.
cd livecd/source
tar jxvpf ~/stage2-i686-2004.2.tar.bz2
mkdir newroot
Изтеглете последния portage snapshot във вашата home директория и го разархивирайте в новата работна директория.
cd livecd/source/usr/
tar jxvf ~/portage-whatever.tar.bz2
Ако има нужда от изтеглянето на допълнителни пакети по време на инсталацията, се погрижете да настроите необходими за работа в интернет файлове в 'livecd/source/etc'. Например 'resolv.conf'.
С това вашата 'source' директория е готова за инсталирането на Gentoo.
4 Инсталиране на Gentoo
Монтирайте необходимите ви директории преди да chroot-нете в работната директория и да започнете инсталацията. Например, за да спестим място ще монтираме 'distfiles' в '/usr/portage'. По този начин ще избегнем тегленето на еднакви (dist) файлове по време на инсталацията.
cd livecd/source
mount -o bind /proc proc
mkdir usr/portage/distfiles
mount -o bind /usr/portage/distfiles usr/portage/distfiles
Следва 'chroot' в 'source' както и самото инсталиране. Имайте предвид следното, когато правите промени в '/etc/make.conf'
# Бъдете внимателни в избора си на USE флаговете. Колкото повече флагове използвате, толкова повече ще расте вашето обкръжение. Възможно е размера да нарастне толкова, че да не се събере на едно CD! В случай че използваме само KDE и не се интересуваме от документация и java, можем да добавим '-gnome -gtk -java -doc' в списъка с флагове
# Проверете че ИМАТЕ 'livecd' в USE флаговете. Този флаг, заедно със 'cdroot' параметъра, който се предава на ядрото по време на зареждане на състемата, ще осигури че инициализиращите скриптове „знаят“, че стартираме системата от CDROM, и че няма да правят грешки като проверка на 'root' файловата система.
Това са и самите стъпки:
cd livecd/source
chroot . /bin/bash --login
env-update
source /etc/profile
emerge -e system
ln -sf /usr/share/zoneinfo/<path to time zone file> /etc/localtime
emerge <желаните от вас пакети, например logger hotplug udev>
rc-update add <нобходимите services, например hotplug, net.eth0, sysklogd> default <или boot, по ваш избор>
emerge <допълнителни пакети, по ваш избор, например kde mplayer>
Преди да инсталираме ядрото и зареждащия мениджър, нека да модифицираме някоко важни файла в '/etc'. Първо, fstab
/dev/loop0 / squashfs ro,defaults 0 0
none /proc proc defaults 0 0
none /dev/shm tmpfs defaults 0 0
none /dev/pts devpts defaults 0 0
Проверете, че има празен ред в края на файла или livecd-то няма да тръгне!
Обърнете внимание, че монтираме root върху loop устройство, използвайки 'squashfs' файлова система, повече по въпроса след малко. Оправете останалите файлове в '/etc' в зависимост от вашите предпочитания (например hostname, rc.conf, conf.d/* и т.н.).
Подгответе желаното от вас ядро за инсталиране. Добавете желаните от вас кръпки (например vesafb-tng, reiser4, mppe-mppc и т.н.). Ще ни се наложи да използваме като root файлова система. Затова се уверете, че ядрото има необходимата поддръжка, и ако трябва я добавете. Освен това описания тук подход предполага, че зареждането става от IDE cdrom.
При конфигурирането на ядрото се уверете че изброените по-долу са включени:
# squashfs filesystem
# iso9660 cdrom filesystem
# initrd support, set size to 8MB
# loopback block device support
# IDE/ATAPI cdrom device support
# ext2 filesystem support (която се използва за нашия initrd образ)
# tmpfs filesystem support
emerge development-sources #ако е необходимо добавете кръпките след тази стъпка
cd /usr/src/linux
make menuconfig #конфигурация на ядрото
make bzImage modules modules_install
cp arch/i386/boot/bzImage /boot/vmlinuz
Последна стъпка е изтегляне и конфигуриране на зареждащия менажер. Използвайте възможно най-новия GRUB (0.96.xxx или по-нов), тъй като той ще има поддръжка за зареждане от cdrom.
Следват '/boot/grub/grub.conf' или '/boot/grub/menu.lst', като след малко ще се върнем към тях отново.
default 0
timeout 5
splashimage=(cd)/boot/grub/splash.xpm.gz
title=Gentoo Linux
root (cd)
kernel (cd)/boot/vmlinuz video=vesafb:1024x768-32 root=/dev/ram0 rw init=/linuxrc cdroot
initrd (cd)/boot/initrd
Не забравйте да изтриете символната връзка boot/grub/menu.lst и да преименувате grub.conf на menu.lst, защото iso9660 не поддържа връзки (symlinks). В противен случай ще свършите с празен терминал!
Можете да не използвате 'video' параметъра, но останалите са необходими. Следващата стъпка е създаването на 'initrd' образ.
5 Създаване на initrd образа
Тук се случват повечето от нещата по време на зареждането (boot). Ще се уверите че не е толкова трудно, след като разберете какво точно става. Първо създайте образа, в конкретния случай е използван размер от 8MB за initrd, при нужда размера може да се увеличи, но не забравйте в такъв случай да зададете правилната конфигурация в ядрото, която отговаря за максималния ramdisk размер.
touch /boot/initrd
dd if=/dev/zero of=/boot/initrd bs=1024k count=8
losetup /dev/loop0 /boot/initrd
mke2fs /dev/loop0
mkdir /mnt/initrd
mount /dev/loop0 /mnt/initrd
А сега запълнете образа с необходимите директории и файлове:
cd /mnt/initrd
mkdir etc dev lib bin proc new cdrom
touch linuxrc
chmod +x linuxrc
touch etc/mtab
touch etc/fstab
linuxrc е скрипта, който се изпълнява по време на зареждането (boot) на линукс. Повече по въпроса след малко.
Трябва да копираме необходимите файлове в bin и lib. За bin, копирайте следните:
/bin/sh
/bin/cat
/bin/mount
/bin/umount
/bin/mkdir
/bin/chroot
/bin/tar
/bin/ls
/sbin/pivot_root
За lib. ще трябва да намерим кои библиотеки са използвани от по-горните бинарни файлове. Това може да стане като се изпълни 'ldd' за всеки от бинарните файлове и се копират съответните библиотеки. Например:
ldd /bin/mount
linux-gate.so.1 => (0xffffe000)
libc.so.6 => /lib/libc.so.6 (0x4002e000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
cp /lib/libc.so.6 /mnt/initrd/lib/
cp /lib/ld-linux.so.2 /mnt/initrd/lib/
Повторете за останалите бинарни файлове.
Кратък но вършещ добра работа скрипт ще направи това за вас:
#!/bin/sh
for x in sh ls cat mount umount mkdir chroot tar
do
cp -v /bin/${x} /mnt/initrd/bin
done
cp -v /sbin/pivot_root /mnt/initrd/bin
cd /lib
for x in sh ls cat mount umount mkdir chroot tar
do
cp -v `ldd /bin/${x}|egrep lib|cut -d "=" -f1` /mnt/initrd/lib
done
cp -v `ldd /sbin/pivot_root|egrep lib|cut -d "=" -f1` /mnt/initrd/lib
Да създадем и необходимите устройства в dev директорията:
mknod /mnt/initrd/dev/console c 5 1
mknod /mnt/initrd/dev/null c 1 3
mknod /mnt/initrd/dev/hda b 3 0
mknod /mnt/initrd/dev/hdb b 3 64
mknod /mnt/initrd/dev/hdc b 22 0
mknod /mnt/initrd/dev/hdd b 22 64
mknod /mnt/initrd/dev/tty c 4 0
mknod /mnt/initrd/dev/loop0 b 7 0
И най-накрая, трябва да направим наш linuxrc скрипт. Скрипта ще се погрижи за следното:
* Да запомни какво е зададено на ядрото и по-късно да го зададе на /sbin/init
* Да открие CDROM устройството (претърсваме само hda, hdb, hdc, hdd и cdroms/cdrom*, който са най-често срещаните IDE cdrom устройства)
* Да монтира cdrom на /cdrom
* Да монтира образа който използва squash файлова система (това е всъщност нашата gentoo инсталация събрана в един файл) на /new. Това ще е представлява нашата root файл система, която е позволена само за четене
* Да създаде необходимите позволени за четене и записване mount points (etc, var, tmp и root) като tmpfs файлова системи и да ги попълни
* Да насочи (pivot) root файловата система към newroot и да започне същинския init процес
#!/bin/sh
export PATH=/bin
# Get kernel CMDLINE
mount -t proc none /proc
CMDLINE=`cat /proc/cmdline`
umount /proc
# Mount CD device
CDROM=""
for x in hda hdb hdc hdd cdroms/cdrom0 cdroms/cdrom1 cdroms/cdrom2 cdroms/cdrom3
do
mount -t iso9660 -r /dev/${x} /cdrom > /dev/null 2>&1
if [ "$?" = "0" ]
then
break
fi
done
# CD not found
if [ "${CDROM}" == "" ]
then
exec /bin/sh
exit
fi
# Mount root and create read-write directories
mount -t squashfs -o loop /cdrom/files/source.img /new > /dev/null 2>&1
mount -t tmpfs -o size=32m none /new/var > /dev/null 2>&1
mount -t tmpfs -o size=32m none /new/etc > /dev/null 2>&1
mount -t tmpfs -o size=32m none /new/tmp > /dev/null 2>&1
mount -t tmpfs -o size=32m none /new/root > /dev/null 2>&1
cd /new/var && tar xpf /cdrom/files/var.tar > /dev/null 2>&1
cd /new/etc && tar xpf /cdrom/files/etc.tar > /dev/null 2>&1
cd /new/root && tar xpf /cdrom/files/root.tar > /dev/null 2>&1
# Pivot root and start real init
cd /new
pivot_root . newroot
exec chroot . /bin/sh <<- EOF >dev/console 2>&1
exec /sbin/init ${CMDLINE}
EOF
Обърнете внимание, че използваме 4 x 32MB tmpfs файлови системи. Това изисква доста памет. При необходимост можете да намалите този размер.
С това сме готови! Нашата source директория е готова. Но преди да продължим трябва да направим няколко малки промени. Първо, '/var' съдържа 'cache' и 'db' директориите, които са използвани от portage. Тези директории са големи, така че ще ги преместим в '/usr/lib/portage' за да спестим място на '/var'
cd /var
mv cache db /usr/lib/portage/
ln -s /usr/lib/portage/cache cache
ln -s /usr/lib/portage/db db
И второ, ако използвате 'udev' за управление на устройствата както в конкретния случай, и ако искате gentoo да запазва състоянието на устройствата преди рестартиране, трябва да направите следното:
cd /lib
mv udev-state /var/lib
ln -s /var/lib/udev-state udev-state
Това се налага, защото /lib не е позволена за писане на нашето CD!
С това завършихме работата в нашата source директория. Излезте от 'chroot' и unmount proc и distfiles. Следва направата на самото CD!
6 Направа на LiveCD
Направата на LiveCD включва следните стъпки:
# Почистване на не нужните директории в source (като /tmp и /var/tmp)
# Създаването на target директория, която ще се използва при направата на iso образа
# Запазването на read-write директориите (като /etc и /var) използвайки tar, в target
# Преобразуването на source директорията в squash образ, използвайки squashfs tools
# И най-накрая, направата на iso образа
За да си помогнем с автоматизирането на тези стъпки, направете 'build' скрипта и го запомнете в 'livecd'
cd livecd
touch build
chmod +x build
Следва и самият скрипт
#!/bin/bash
rm -rf target
mkdir target
cp -a source/boot target/
mkdir target/files
rm -rf source/var/tmp/*
rm -rf source/var/run/*
rm -rf source/var/lock/*
rm -rf source/tmp/*
rm -f source/etc/mtab
touch source/etc/mtab
cd source/etc/
tar cvpf ../../target/files/etc.tar * .:alnum:*
cd ../var/
tar cvpf ../../target/files/var.tar * .:alnum:*
cd ../root/
tar cvpf ../../target/files/root.tar * .:alnum:*
cd ../../
mksquashfs source/ target/files/source.img
mkisofs -R -b boot/grub/stage2_eltorito -no-emul-boot -boot-load-size 4 -boot-info-table -iso-level 4 -hide boot.catalog -o ~/livecd.iso target/
Убедете се че последният ред в скрипта (започващ с mkisofs) е наистина запомнен на един ред.
Винаги проверявайте, че размера на всеки от създадените tar файлове е по-малък от размера на tmpfs ram устройството, което създадохме преди това (32MB в конкретния случай).
Squash-ването на голяма 'source' директория отнема време, така че бъдете търпеливи. След като сте готови и с това, запишете вашия ISO образ, boot-нете от него, и му се наслаждавайте :)
7 Съвети
Може да използвате следния скрипт за да chroot-вате когато имате нужда на синхронизирате portage, използвате нови пакети или да направите някакви промени във вашето обкръжение. Скриптът е наречен 'work'
cd livecd
touch work
chmod +x work
Следва самият скрипт:
#!/bin/bash
mount -o bind /proc source/proc
mount -o bind /sys source/sys
mount -o bind /dev source/dev
mount -o bind /dev/pts source/dev/pts
mount -o bind /usr/portage/distfiles source/usr/portage/distfiles
chroot source/ /bin/bash --login
umount source/proc
umount source/sys
umount source/dev/pts
umount source/dev
umount source/usr/portage/distfiles
Не забравйте след изпълнение на скрипта, когато се намирате вече в chroot обкръжението да изпълните:
env-update
source /etc/profile
Това се налага, защото този прост скрипт не може да дава команди на новото обкръжение, но може да unmount-ва, изпълнете env-update и source /etc/profile след като напуснете обкръжението.
Монтирането на /dev е важно за правилната работа на X и други от chroot обкръжението.
Друго нещо което може да се вземе под внимание е размера на source директорията. Както може да се досетите, там има неща които заемат доста място без да се необходими на LiveCD-то. Такива са например '/usr/src' и '/usr/portage'. Ако не искате да ги включите във вашето LiveCD, не ги изтърквайте, а вместо това използвайте опция на 'mksquashfs', която ви позволява да изключите директории по ваше желание от squash-натия образ. По този начин ще запазите съдържанието на source директорията непроменено.
Ако зареждането от CD-то спира по някаква неизвестна причина по време на изпълнение на linuxrc скрипта, можете да промените реда в GRUB на 'init=/bin/sh' вместо 'init=/linuxrc'. Това ще ви даде възможност да работите в малка обвивка отворена в initrd образа. Там ще можете да изпълните командите от linuxrc скрипта една по една и по този начин ще имате възможност да откриете къде и какъв е проблема.
Няма нужда от bootstrap-ване на системата ви, CD-to ще работи както от bootsrap-ната така и от не-bootsrap-нати системи.
Надявам се, че ще намерите тази статия полезна. Вашите поправки/коментари са винаги добре дошли.
8 Автоматично логване
Това е лесно да се направи. Инсталирайте mingetty. После редактирайте /etc/inittab на CD-то (направете копие на оригинала). Намерете:
c1:12345:respawn:/sbin/agetty 38400 tty1 linux
и го заместете с
c1:12345:respawn:/sbin/mingetty --autologin root --noclear tty1
за вяко tty за което искате да имате автоматично логване като root.
Ако получите грешка "Session opened for ....." при стартиране на CD-то, инсталирайте syslogger и го направете да стартира при boot-ването.
9 Алтернативни Скриптове
Това е леко изменен 'build' скрипт:
#!/bin/bash
rm -rf target
mkdir target
cp -a source/boot target/
mkdir target/files
mkdir target/files/source
cp -p -R -P -d source/ target/files
rm -rf target/files/source/var/tmp/*
rm -rf target/files/source/var/run/*
rm -rf target/files/source/var/lock/*
rm -rf target/files/source/var/cache/*
rm -rf target/files/source/var/db/*
rm -rf target/files/source/tmp/*
rm -f target/files/source/etc/mtab
touch target/files/source/etc/mtab
rm -rf target/files/source/usr/portage
rm -rf target/files/source/usr/lib/portage
rm -rf target/files/source/usr/share/doc
rm -rf target/files/source/root/.mc
rm target/files/source/root/.bash_history
rm target/files/source/var/log/emerge.log
cd target/files/source/etc/
tar cvpf ../../../../target/files/etc.tar * .alnum:*
cd ../var/
tar cvpf ../../../../target/files/var.tar * .alnum:*
cd ../root/
tar cvpf ../../../../target/files/root.tar * .alnum:*
cd ../../
mksquashfs source/ source.img
rm -rf source/
cd ../../
mkisofs -R -b boot/grub/stage2_eltorito -no-emul-boot -boot-load-size 4 -boot-info-table -iso-level 4 -hide boot.catalog -o ~/livecd.iso target/
Скриптът копира цялата Gentoo инсталация в нова директория (livecd/target/files), изтрива документацията (но не и man страниците), и emerge системата (включително portage tree). Крайният резултат е с около 50MB по-малък, но затова пък отнема с около 20 минути повече време.
10 Последна промяна & Други
- - ,
Искам да благодаря на , който свърши повечето от нобходимата работата и започна първоначалната в официалните gentoo форуми.