Как да си направим собствено 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'

  1. Бъдете внимателни в избора си на USE флаговете. Колкото повече флагове използвате, толкова повече ще расте вашето обкръжение. Възможно е размера да нарастне толкова, че да не се събере на едно CD! В случай че използваме само KDE и не се интересуваме от документация и java, можем да добавим '-gnome -gtk -java -doc' в списъка с флагове
  2. Проверете че ИМАТЕ '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.

При конфигурирането на ядрото се уверете че изброените по-долу са включени:

  1. squashfs filesystem
  2. iso9660 cdrom filesystem
  3. initrd support, set size to 8MB
  4. loopback block device support
  5. IDE/ATAPI cdrom device support
  6. ext2 filesystem support (която се използва за нашия initrd образ)
  7. 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 включва следните стъпки:

  1. Почистване на не нужните директории в source (като /tmp и /var/tmp)
  2. Създаването на target директория, която ще се използва при направата на iso образа
  3. Запазването на read-write директориите (като /etc и /var) използвайки tar, в target
  4. Преобразуването на source директорията в squash образ, използвайки squashfs tools
  5. И най-накрая, направата на 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 минути повече време.

Последна промяна & Други

редактиране

5 - ноември - 2024, 08:36

Искам да благодаря на veezi, който свърши повечето от нобходимата работата и започна първоначалната дискусия в официалните gentoo форуми.

Външни препратки

редактиране