Как да си направим собствено LiveCD
Въведение
редактиранеТова кратко ръководство ще ви покаже колко е лесно да си направите livecd. LiveCD е диск с ГНУ/Линукс, който се зарежда директно от CD-ROM-а без да е нужна инсталация на твърдия диск. Описания тук подход има следните предимства пред използването на catalyst (Програма за направа на LiveCD-та, разработена от програмистите на Gentoo):
- Програмния код се запазва непроменен без да се губи през последващите направи на livecd-то. Това ви позволява да синхронизирате (sync), актуализирате (update) и настройвате работната среда постепенно, както при нормална работа с вашата система.
- Зареждането на CD-то става с GRUB (ISOLINUX остава като алтернатива). Така имате същата гъвкавост както при работа с нормална система, т.е. имате възможност да променяте параметрите на ядрото, откриването на устройства, и т.н.
- Запазване на програмния код между итерациите, води до значителното намаляване на времето за направата на нови CD-та.
Можете да използвате Linux Live Scripts системата, или директно да използвате инструмент, базиран на нея, наречен makelivecd - сайт.
Изисквания
редактиранеНеобходимо е да имате достатъчно свободно място. Колко, зависи от избора на пакетите които сте решили да включите в livecd-то. Средно, около 4 GB трябва да са достатъчни.
Трябва сте запознати с инсталирането на Gentoo от stage2 tarball, защото това е до голяма степен каквото правим тук. Ако не се чувствате уверен, консултирайте се с Gentoo наръчникa.
Използването на stage1 е също възможно, но ще отнеме много по-вече време в сравнение със stage2. Освен това мнозинството от хората ще направят нещо подобно на emerge -e world
към края, така че това е най-добрият начин.
Настройване на Работната Среда
редактиранеОб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.
Инсталиране на 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 и т.н.). Ще ни се наложи да използваме squashfs като 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' образ.
Създаване на 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 CDROM="${x}" 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!
Направа на 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-нете от него, и му се наслаждавайте :)
Съвети
редактиранеМоже да използвате следния скрипт за да 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-нати системи.
Надявам се, че ще намерите тази статия полезна. Вашите поправки/коментари са винаги добре дошли.
Автоматично логване
редактиранеТова е лесно да се направи. Инсталирайте 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-ването.
Алтернативни Скриптове
редактиранеТова е леко изменен '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 минути повече време.
Последна промяна & Други
редактиране3 - декември - 2024, 18:38
Искам да благодаря на veezi, който свърши повечето от нобходимата работата и започна първоначалната дискусия в официалните gentoo форуми.