четверг, 4 марта 2010 г.

Создание LiveCD Slackware based. Часть 1: базовая система

У меня есть любимый дистрибутив, архитектуру которого я считаю идеальной. Какой мне нужен LiveCD? Конечно, такой же: там, где все на своем месте, там, где я знаю каждый файл. В Slackware нет своего livecd, но есть все инструменты для его создания.
В блоге будет размещена серия статей, посвященных созданию специализированных livecd на базе Slackware GNU/Linux, средствами самого Slackware. Эта первая часть, в которой изложено создание базовой системы, т.е. минимальной рабочей среды, на которой будут основаны все остальные сборки.
Заканчивая с преамбулой, приведем источники.
1. LiveCD изначально был задуман как расширение или подобие другого проекта - RIPLinux, но в процессе работы стало возможно полностью от него отказаться и использовать только Slackware. Домашняя страница проекта RIPLinux
http://www.tux.org/pub/people/kent-robotti/looplinux/rip/
2. Для русификации используется статья:
Русификация Slackware 13 c utf8
3. В качестве теории можно почитать:
LiveCD из Slackware в домашних условиях
Общее представление о initrd (Initial RAM disk)
Постановка задачи и условия её выполнения.
Мы предполагаем, что у Вас есть установленный Slackware и Вы умеете им пользоваться.
Мы предполагаем что Вы умеете собирать ядро linux, потому что мы будем делать компактную систему, а это подразумевает компактное ядро. В статье будут даны только рекомендации и раскрыты нюансы.
Мы будем собирать базовую систему под которой подразумеваем: базовую операционную систему Slackware GNU/Linux загружаемую со сменного носителя, целиком располагающейся в оперативной в оперативной памяти компьютера, не требующей для работы жесткого диска, с полной поддержкой русской языка.
Мы будем собирать систему основанную на последнем стабильном релизе Slackware-13.0, исключение составляет ядро, оно будет взято из current.
В качестве корневой файловой системы доступной на запись используется tmpfs.
В качестве сжатой файловой системы доступной только для чтения используется zisofs.
В качестве файловой системы для подключаемых дисков будем использовать ext3.
В качестве загрузчика используется isolinux.
Мы не затрагиваем создание LiveUSB потому-что любой LiveCD легко превращается в LiveUSB.
В качестве тестового компьютера мне служит:
Celeron 850 (Pentium III based)
M/B: CT-6BJM (i440BX chipset based)
RAM: 192Mb
Нам понадобятся пакеты с установочного диска Slackware, которые можно взять с самого диска, но в описании я буду загружать их из интернета.

Заканчивая с введением, приступим к делу.
Наша базовая система будет состоять из ядра + пакетов директории "a" + текстовый редактор nano + пакет локализации glibc-i18n.

Даем себе права:
su
Password:

Создаем рабочий каталог:
mkdir /tmp/livecd
cd /tmp/livecd

Формируем список пакетов для закачки:
cat > pklist << EOF
ftp://ftp.chg.ru/pub/Linux/Slackware/slackware-13.0/slackware/a/aaa_base-13.0-i486-2.txz
ftp://ftp.chg.ru/pub/Linux/Slackware/slackware-13.0/slackware/a/aaa_elflibs-13.0-i486-2.txz
ftp://ftp.chg.ru/pub/Linux/Slackware/slackware-13.0/slackware/a/aaa_terminfo-5.7-noarch-1.txz
ftp://ftp.chg.ru/pub/Linux/Slackware/slackware-13.0/slackware/a/acl-2.2.47_1-i486-1.txz
ftp://ftp.chg.ru/pub/Linux/Slackware/slackware-13.0/slackware/a/acpid-1.0.8-i486-2.txz
ftp://ftp.chg.ru/pub/Linux/Slackware/slackware-13.0/slackware/a/attr-2.4.43_1-i486-1.txz
ftp://ftp.chg.ru/pub/Linux/Slackware/slackware-13.0/slackware/a/bash-3.1.017-i486-2.txz
ftp://ftp.chg.ru/pub/Linux/Slackware/slackware-13.0/slackware/a/grep-2.5.4-i486-1.txz
ftp://ftp.chg.ru/pub/Linux/Slackware/slackware-13.0/slackware/a/bin-11.1-i486-1.txz
ftp://ftp.chg.ru/pub/Linux/Slackware/slackware-13.0/slackware/a/bzip2-1.0.5-i486-1.txz
ftp://ftp.chg.ru/pub/Linux/Slackware/slackware-13.0/slackware/a/coreutils-7.4-i486-1.txz
ftp://ftp.chg.ru/pub/Linux/Slackware/slackware-13.0/slackware/a/cpio-2.9-i486-2.txz
ftp://ftp.chg.ru/pub/Linux/Slackware/slackware-13.0/slackware/a/cxxlibs-6.0.10-i486-1.txz
ftp://ftp.chg.ru/pub/Linux/Slackware/slackware-13.0/slackware/a/devs-2.3.1-noarch-25.txz
ftp://ftp.chg.ru/pub/Linux/Slackware/slackware-13.0/slackware/a/e2fsprogs-1.41.8-i486-1.txz
ftp://ftp.chg.ru/pub/Linux/Slackware/slackware-13.0/slackware/a/etc-13.0-i486-2.txz
ftp://ftp.chg.ru/pub/Linux/Slackware/slackware-13.0/slackware/a/findutils-4.4.2-i486-1.txz
ftp://ftp.chg.ru/pub/Linux/Slackware/slackware-13.0/slackware/a/gawk-3.1.6-i486-1.txz
ftp://ftp.chg.ru/pub/Linux/Slackware/slackware-13.0/slackware/a/gettext-0.17-i486-2.txz
ftp://ftp.chg.ru/pub/Linux/Slackware/slackware-13.0/slackware/a/getty-ps-2.1.0b-i486-1.txz
ftp://ftp.chg.ru/pub/Linux/Slackware/slackware-13.0/slackware/a/glibc-solibs-2.9-i486-3.txz
ftp://ftp.chg.ru/pub/Linux/Slackware/slackware-13.0/slackware/a/gzip-1.3.12-i486-1.tgz
ftp://ftp.chg.ru/pub/Linux/Slackware/slackware-13.0/slackware/a/hdparm-9.3-i486-1.txz
ftp://ftp.chg.ru/pub/Linux/Slackware/slackware-13.0/slackware/a/infozip-6.0-i486-1.txz
ftp://ftp.chg.ru/pub/Linux/Slackware/slackware-13.0/slackware/a/inotify-tools-3.13-i486-1.txz
ftp://ftp.chg.ru/pub/Linux/Slackware/slackware-13.0/slackware/a/kbd-1.15-i486-3.txz
ftp://ftp.chg.ru/pub/Linux/Slackware/slackware-13.0/slackware/a/less-418-i486-2.txz
ftp://ftp.chg.ru/pub/Linux/Slackware/slackware-13.0/slackware/a/lha-114i-i486-1.txz
ftp://ftp.chg.ru/pub/Linux/Slackware/slackware-13.0/slackware/a/module-init-tools-3.6-i486-2.txz
ftp://ftp.chg.ru/pub/Linux/Slackware/slackware-13.0/slackware/a/openssl-solibs-0.9.8k-i486-2.txz
ftp://ftp.chg.ru/pub/Linux/Slackware/slackware-13.0/slackware/a/pciutils-3.1.3-i486-1.txz
ftp://ftp.chg.ru/pub/Linux/Slackware/slackware-13.0/slackware/a/pkgtools-13.0-noarch-3.tgz
ftp://ftp.chg.ru/pub/Linux/Slackware/slackware-13.0/slackware/a/procps-3.2.7-i486-2.txz
ftp://ftp.chg.ru/pub/Linux/Slackware/slackware-13.0/slackware/a/sed-4.1.5-i486-1.txz
ftp://ftp.chg.ru/pub/Linux/Slackware/slackware-13.0/slackware/a/shadow-4.0.3-i486-18.txz
ftp://ftp.chg.ru/pub/Linux/Slackware/slackware-13.0/slackware/a/sharutils-4.7-i486-1.txz
ftp://ftp.chg.ru/pub/Linux/Slackware/slackware-13.0/slackware/a/slocate-3.1-i486-3.txz
ftp://ftp.chg.ru/pub/Linux/Slackware/slackware-13.0/slackware/a/splitvt-1.6.5-i486-1.txz
ftp://ftp.chg.ru/pub/Linux/Slackware/slackware-13.0/slackware/a/sysfsutils-2.1.0-i486-1.txz
ftp://ftp.chg.ru/pub/Linux/Slackware/slackware-13.0/slackware/a/sysvinit-2.86-i486-6.txz
ftp://ftp.chg.ru/pub/Linux/Slackware/slackware-13.0/slackware/a/sysvinit-scripts-1.2-noarch-30.txz
ftp://ftp.chg.ru/pub/Linux/Slackware/slackware-13.0/slackware/a/tar-1.22-i486-2.tgz
ftp://ftp.chg.ru/pub/Linux/Slackware/slackware-13.0/slackware/a/udev-141-i486-3.txz
ftp://ftp.chg.ru/pub/Linux/Slackware/slackware-13.0/slackware/a/util-linux-ng-2.14.2-i486-1.txz
ftp://ftp.chg.ru/pub/Linux/Slackware/slackware-13.0/slackware/a/xz-4.999.8beta-i486-1.tgz
ftp://ftp.chg.ru/pub/Linux/Slackware/slackware-13.0/slackware/ap/nano-2.0.9-i486-1.txz
ftp://ftp.chg.ru/pub/Linux/Slackware/slackware-13.0/slackware/l/glibc-i18n-2.9-i486-3.txz
Для выхода из режима редактирование нажмите Ctrl+D или напечатайте EOF и нажмите Enter.

Выкачиваем их:
wget -c -i ./pklist

Создаем корневую директорию нашего дистрибутива:
mkdir ./1

Устанавливаем полученные пакеты в корень:
installpkg -root ./1 ./*t?z

,и удаляем теперь уже не нужное:
rm /tmp/livecd/*t?z
rm /tmp/livecd/pklist

Локализуем дистрибутив:
cat > /tmp/livecd/1/etc/rc.d/rc.keymap << EOF
#!/bin/sh
# Load the keyboard map. More maps are in /usr/share/kbd/keymaps.
if [ -x /usr/bin/loadkeys ]; then
/usr/bin/loadkeys /usr/share/kbd/keymaps/i386/qwerty/ruwin_ct_sh-UTF-8.map.gz
fi

cat > /tmp/livecd/1/etc/rc.d/rc.font << EOF
#!/bin/sh
setfont Cyr_a8x16.psfu.gz

cat > /tmp/livecd/1/etc/profile.d/lang.sh << EOF
#!/bin/sh
export LANG=ru_RU.UTF-8
export LC_COLLATE=C

chmod +x /tmp/livecd/1/etc/rc.d/rc.keymap /tmp/livecd/1/etc/rc.d/rc.font /tmp/livecd/1/etc/profile.d/lang.sh

Для минимизации размера дистрибутива, удалим чужие локали:
cd /tmp/livecd/1/usr/lib/locale/; rm -r `ls -1 ./ |grep -vE "en_US|ru_RU"`; cd -

cd /tmp/livecd/1/usr/share/locale/; rm -r `ls -1 ./ |grep -vE "en|ru|alias"`; cd -

Настало время собрать ядро.
Для работы нам обязательно нужны будут опции:
General setup -> Initial RAM filesystem and RAM disk (initramfs/initrd) support
Device Drivers -> Block devices -> Loopback device support
Device Drivers -> Block devices -> RAM block device support
File systems -> CD-ROM/DVD Filesystems -> ISO 9660 CDROM file system support
File systems -> CD-ROM/DVD Filesystems -> ISO 9660 CDROM file system support -> Transparent decompression extension
File systems -> Pseudo filesystems -> Virtual memory file system support (former shm fs)

Если Вы сумеет собрать ядро в пределах 2Mb - это будет хороший результат.
Если, собираете модульное ядро не забудьте создать файл /etc/rc.d/rc.modules.
Скопируйте полученное ядро под именем kernel32 в директорию:
/tmp/livecd
,а модули в:
/tmp/livecd/1/lib/modules

Следует настроить полученную систему.
Выполним chroot:
chroot /tmp/livecd/1/

Cоздаем ссылку на init:
ln -s /sbin/init /init

Cоздадим локального пользователя:
useradd -u 1000 -G users,audio,cdrom,floppy,plugdev,video,power,netdev -d /home/flanker -s /usr/bin/bash flanker
mkdir /home/flanker
chown flanker /home/flanker
chgrp users /home/flanker

Зададим пароли пользователей:
passwd flanker
passwd root

Чтобы система при загрузке на пыталась проверить файловую систему на ошибки, создадим пустой файл /etc/fastboot:
touch /etc/fastboot

Пишем fstab:
cat > /etc/fstab << EOF
/usr.zisofs /usr iso9660 loop,auto 0 0
tmpfs /dev/shm tmpfs defaults 0 0

Корневая файловая система Slackware на начальных уровнях инициализации монтируется в режиме "только чтение", т.к. наш носитель оперативная память, мы не можем ее перевести в RO mode. Мы просто уберем нажатие на Enter после соответсвующего warning'а:
sed -i "235 s/read/#read/" /etc/rc.d/rc.S

Выходим из chroot:
exit

Вероятно мы захотим, обеспечить нашему пользователю автоматический вход в систему без ввода регистрационных данных.
уберем запрос пароля на первой консоли:
sed -i "/^#NO_PASSWORD_CONSOLE/a NO_PASSWORD_CONSOLE tty1" /tmp/livecd/1/etc/login.defs

Для отмены запроса логина потребуется программа:
cat > ./auto.c << "EOF"
int main()
{
execlp( "login", "login", "-f", "flanker", 0);
}

Cобираем и настраиваем:
gcc auto.c -o /tmp/livecd/auto
mv /tmp/livecd/auto /tmp/livecd/1/sbin/
rm ./auto.c
sed -i "s/c1:1235:respawn/#c1:1235:respawn/" /tmp/livecd/1/etc/inittab
sed -i "/#c1:1235:respawn/ a c1:1235:respawn:/sbin/agetty -n -l /sbin/auto 38400 tty1 linux" /tmp/livecd/1/etc/inittab


Все, систему мы настроили, приступаем к созданию LiveCD.
Cоздаем конфиг загрузчика isolinux:
cat > /tmp/livecd/isolinux.cfg << EOF
DEFAULT linux
PROMPT 0

LABEL linux
KERNEL kernel32
APPEND video=normal initrd=rootfs.cgz root=/dev/ram0 rw vt.default_utf8=1

Теперь создим управляющие скрипты.
Cкрипт упаковки корня в архив initrd:
cat > /tmp/livecd/cl << EOF
#!/bin/sh
[ -d ./1 ] || exit 1
cd ./1
[ -e ../rootfs.cgz ] && rm ../rootfs.cgz
[ -d ./usr/doc ] && rm -rf ./usr/doc/*
[ -d ./usr/man ] && rm -rf ./usr/man/*
[ -d ./usr/info ] && rm -rf ./usr/info/*
[ -d ./usr/include ] && rm -rf ./usr/include/*
mkzftree -z 9 -F ./usr ./usr.z
rm -r ./usr/*
mkisofs -z -R -o ./usr.zisofs ./usr.z
rm -r ./usr.z
find . | bin/cpio -v -o -H newc | gzip -9 >../rootfs.cgz
cd -
rm -r ./1

Cкрипт для обратной распаковки архива initrd в корневую директорию:
cat > /tmp/livecd/op << EOF
#!/bin/sh
[ -d ./1 ] && exit 1
mkdir ./1
cd ./1
gzip -dc ../rootfs.cgz | cpio -iumdv
mount ./usr.zisofs /mnt/tmp -o loop && cp -av /mnt/tmp/* ./usr/
umount /mnt/tmp
rm ./usr.zisofs
cd -

скрипт для прожига болванки:
cat > /tmp/livecd/mk << EOF
#!/bin/sh
[ -e /tmp/mycd.iso ] && mv /tmp/mycd.iso /tmp/mycd1.iso
mkisofs -o /tmp/mycd.iso -b isolinux.bin -c boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table ./
cdrecord -v blank=fast -tao -eject dev=/dev/cdrom /tmp/mycd.iso

Копируем isolinux.bin в рабочий каталог:
cp /usr/lib/syslinux/isolinux.bin /tmp/livecd/

Итак, все готово. упаковываем корень в initrd
sh ./cl

Вставляем диск в /dev/cdrom и набираем:
sh ./mk
,через минуту получите готовый LiveCD.

Подведем итоги.
Мы получили LiveCD размером - 27 Mb.
Общий расход RAM при старте - 67 Mb.
Системный раздел системы целиком расположен в оперативной памяти. Чтобы выполнить какую-либо команду система не должна обращаться к жесткому диску чтобы считать файл с программой, она сразу ее выполняет. Моментальная отклик системы настолько мне понравился, что я захотел себе такое на десктоп, в расширенном варианте разве что.
Другая "фишка" бездисковой системы в том, что она независима от модели материнской платы компьютера, т.е. система будет работать на любом компьютере включая Pentium II и выше, с 96Mb RAM, и умеющим стартовать с CD-ROM.

P.S. Пару слов напоследок. Система собирается жестко - на конкретную конфигурацию компьютера. Чтобы обеспечить ей универсальность, нужно собирать по другому принципу: Сначала должен монтироваться промежуточный initrd на основе busybox, на котором будут лежать все модули ядра с дисковыми контролерами, и уже потом, после определения оборудования и старта нужных модулей будет монтироваться основная файловая система. Надеюсь у меня меня будет когда-либо желание этим заняться.

Комментариев нет:

Отправить комментарий