From: Eugene Grosbein Subject: FreeBSD 7: сборка своего LiveCD Date: Thu, 25 Sep 2008 00:36:41 +0800 Привет! Удивительно, насколько просто в FreeBSD 7.x сделать собственный полнофункциональный LiveCD (или DVD), причем для этого не требуется вообще никакого дополнительного софта, кроме собственно mkisofs для генерации ISO. Содержимое для него можно сделать, например, при помощи /usr/src/tools/tools/nanobsd/nanobsd.sh Создадим каталог, в который поместим конфигурацию сборки образа, и при необходимости, дополнительные файлы типа rc.conf. Для определенности, пусть каталог будет называться /home/nanobsd/livecd В нём создаем конфигурационный файл, назовем его generic.conf: NANO_NAME=nanobsd # имя образа NANO_ISO=/home/nanobsd/$NANO_NAME.iso # куда писать ISO #NANO_KERNEL=GENERIC # имя конфигурации ядра, можно # не указывать, будет GENERIC # не пересобирать модули при изменении конфигурации ядра CONF_WORLD=' MODULES_WITH_WORLD= ' NANO_DRIVE=acd0 # имя загрузочного устройства SRCS=/home/nanobsd/livecd # имя нашего каталога #NANO_PMAKE="make -j 3" # по дефолту - ускорение сборки # для двухядерных систем make_iso() { setup_nanobsd cd $NANO_WORLDDIR # для правильного монтирования корневой fs echo "/dev/$NANO_DRIVE / cd9660 ro 0 0" > conf/base/etc/fstab # не пытаться брать содержимое /etc откуда-либо кроме CD (напр., с NFS) rm -r conf/default/etc # memory disk 50Mb для /var echo 102400 > conf/default/var/md_size # о следующей строчке будет рассказано ниже # populate mkisofs -b boot/cdboot -no-emul-boot -R -J -o "$NANO_ISO" $NANO_WORLDDIR kill $$ } customize_cmd make_iso # EOF Сборка образа: sh /usr/src/tools/tools/nanobsd/nanobsd.sh -c generic.conf Скрипт nanobsd.sh запускает buildworld и buildkernel для создаваемой системы, так что в первый раз придется подождать. При последующих пересборках образа, если не требуется перекомпиляция (исходники не менялись, опции компиляции тоже), запускаем "nanobsd.sh -b -c generic.conf", ключ -b отменяет перекомпиляцию. Если менялся файл конфигурации ядра, тогда вместо -b надо задавать -w, тогда мир пересобираться не будет, а ядро будет. Полученный образ ISO можно проверить, например, при помощи qemu. Не рекомендую собирать его из портов, он тянет за собой сборку gcc 3.4, Гораздо быстрее поставить qemu пакетом и затем: # Запускаем на виртуальной машине с 512M памяти, видео VESA # сетевой fxp0, звуком es137x qemu -cdrom nanobsd.iso -boot d -m 512 -localtime \ -std-vga -soundhw all -net nic,model=i82559er \ -net tap,ifname=tap0 /usr/local/hdd.img Предварительно создав пустой образ винта hdd.img командой: dd if=/dev/zero of=hdd.img bs=1m oseek=4096 count=0 Он будет одной сплошной дыркой, на диске занимать совсем немного (у меня 48K), и вообще поначалу использовать его мы не будем, но qemu требует. Загруженная из ISO система его будет видеть как четырехгиговый винт. Полученный ISO (<210Mb) при загрузке дает нам полноценную, но совершенно голую систему. Её уже можно использовать для проверки, насколько хорошо она определяет оборудование (и грузится ли вообще) - кстати, для подхвата звука qemu после загрузки потребуется сказать "kldload snd_es137x", но голая система малополезна. Тут начинается самое интересное - настройка системы. Создадим в нашем каталоге подкаталог etc и поместим в него файлы, которые после во время загрузки образа будут находиться в /etc. Я копирую туда /etc/localtime (если часы хранят местное время) и создаю rc.conf примерно такого содержания: hostname="nanobsd" dumpdev="NO" newsyslog_flags="-CCN" ip6addrctl_enable="NO" sendmail_enable="NONE" font8x8="cp866-8x8" font8x14="cp866-8x14" font8x16="cp866-8x16" scrnmap="koi8-r2cp866" keyrate="fast" keymap="ru.koi8-r" moused_enable="YES" moused_flags="-r high" moused_port="/dev/psm0" moused_type="auto" mousechar_start="3" allscreens_flags="-m on" Ещё кладу туда свой /etc/ttys, в котором cons25 заменен на cons25r. Ну и до кучи туда же csh.cshrc с таким содержимым: setenv BLOCKSIZE K setenv EDITOR /путь/к/любимому/редактору setenv PAGER /usr/bin/less setenv LC_ALL ru_RU.KOI8-R Чтобы все эти файлы оказались в нужное время (при загрузке с образа) в нужном месте, в наш файл конфигурации добавляем такую функцию: populate() { cp -Rp $SRCS/etc/ conf/base/etc } Раскомментируем строчку с вызовом команды populate непосредственно перед вызовом mkisofs, см. выше. Система начинает приобретать признаки "ухоженности". Добавим в неё ещё обычного пользователя user, чтобы потом заходить им и запускать иксы и прочее не от рута. В конфигурацию добавляем функцию: add_users() { chroot $NANO_WORLDDIR \ pw useradd user -d /var/tmp -g wheel -s tcsh -w none -L russian } customize_cmd add_users Это нужно написать выше строчки customize_cmd make_iso, которая в конфигурации всегда должна быть последней. Ну и самое главное - добавление в образ софта из готовых пакетов. Создаем в нашем каталоге подкаталог Pkg, кладем в него нужные пакеты (со всеми зависимостями!) и дописываем в файл конфигурации функцию: install_packages() { echo Cleaning... dirs="usr/local tmp/Pkg var/db/pkg" cd "$NANO_WORLDDIR" || return 1 rm -rf $dirs mkdir $dirs echo '' echo Installing packages... pkgs="$SRCS/Pkg" trap "umount $pkgs" SIGHUP SIGINT SIGTERM mount_nullfs -o ro "$pkgs" tmp/Pkg chroot "$NANO_WORLDDIR" sh -c "cd /tmp/Pkg && pkg_add -vF *" || true umount "$pkgs" rmdir tmp/Pkg } customize_cmd install_packages (опять-таки, до строки customize_cmd make_iso) Положив туда пакетов на 172 мегабайта (иксы, firefox3 и mplayer с зависимостями, window manager AfterStep 1.8.11, драйвер nvidia), получил в итоге образ ISO в 742Mb размером, туда ещё добавлены файлы mp3 (копирование их в образ - ещё одна команда cp в функции populate). После загрузки можно залогиниться пользователем user, сказать startx, в поднявшихся иксах запустить firefox3 или glxgears. mplayer работает и в консоли. Таким образом можно, например, тестировать ноутбуки в магазинах :-)