Уикикниги
bgwikibooks
https://bg.wikibooks.org/wiki/%D0%9D%D0%B0%D1%87%D0%B0%D0%BB%D0%BD%D0%B0_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0
MediaWiki 1.46.0-wmf.23
first-letter
Медия
Специални
Беседа
Потребител
Потребител беседа
Уикикниги
Уикикниги беседа
Файл
Файл беседа
МедияУики
МедияУики беседа
Шаблон
Шаблон беседа
Помощ
Помощ беседа
Категория
Категория беседа
TimedText
TimedText talk
Модул
Модул беседа
Event
Event talk
Как да си направим собствено LiveCD
0
2101
16413
15593
2026-04-08T15:46:50Z
Skip678
5709
16413
wikitext
text/x-wiki
== Въведение ==
Това кратко ръководство ще ви покаже колко е лесно да си направите livecd. LiveCD е диск с ГНУ/Линукс, който се зарежда директно от CD-ROM-а без да е нужна инсталация на твърдия диск. Описания тук подход има следните предимства пред използването на catalyst (Програма за направа на LiveCD-та, разработена от програмистите на Gentoo):
* Програмния код се запазва непроменен без да се губи през последващите направи на livecd-то. Това ви позволява да синхронизирате (sync), актуализирате (update) и настройвате работната среда постепенно, както при нормална работа с вашата система.
* Зареждането на CD-то става с GRUB (ISOLINUX остава като алтернатива). Така имате същата гъвкавост както при работа с нормална система, т.е. имате възможност да променяте параметрите на ядрото, откриването на устройства, и т.н.
* Запазване на програмния код между итерациите, води до значителното намаляване на времето за направата на нови CD-та.
Можете да използвате [http://www.linux-live.org Linux Live Scripts] системата, или директно да използвате инструмент, базиран на нея, наречен makelivecd - [http://makelivecd.awardspace.com/ сайт].
== Изисквания ==
Необходимо е да имате достатъчно свободно място. Колко, зависи от избора на пакетите които сте решили да включите в livecd-то. Средно, около 4 GB трябва да са достатъчни.
Трябва сте запознати с инсталирането на Gentoo от stage2 tarball, защото това е до голяма степен каквото правим тук. Ако не се чувствате уверен, консултирайте се с Gentoo [http://www.gentoo.org/doc/en/handbook наръчникa].
Използването на stage1 е също възможно, но ще отнеме много по-вече време в сравнение със stage2. Освен това мнозинството от хората ще направят нещо подобно на <code>emerge -e world</code> към края, така че това е най-добрият начин.
== Настройване на Работната Среда ==
Об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 и т.н.). Ще ни се наложи да използваме [http://squashfs.sourceforge.net 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
Следва и самият скрипт
<pre>
#!/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/
</pre>
Убедете се че последният ред в скрипта (започващ с 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' скрипт:
<pre>
#!/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/
</pre>
Скриптът копира цялата Gentoo инсталация в нова директория (livecd/target/files), изтрива документацията (но не и man страниците), и emerge системата (включително portage tree). Крайният резултат е с около 50MB по-малък, но затова пък отнема с около 20 минути повече време.
== Последна промяна & Други ==
{{CURRENTDAY}} - {{CURRENTMONTHNAMEGEN}} - {{CURRENTYEAR}}, {{CURRENTTIME}}
Искам да благодаря на [http://forums.gentoo.org/profile.php?mode=viewprofile&u=34942 veezi], който свърши повечето от нобходимата работата и започна първоначалната [http://forums.gentoo.org/viewtopic.php?t=244837 дискусия] в официалните gentoo форуми.
== Външни препратки ==
* [http://gentoo-wiki.com/HOWTO_build_a_LiveCD_from_scratch Оригиналната статия]
* [http://gentoo-wiki.com/HOWTO_Index http://gentoo-wiki.com/HOWTO_Index]
[[Категория:ГНУ/Линукс]]
[[Категория: Gentoo Linux]]
oz6pchudhpvo8yialldgtqp9x5ojee8