![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Для создания LiveCD с собственной комплектацией в FreeBSD не нужен никакой сторонний софт, кроме собственно mkisofs
для генерации ISO-образа (из пакета cdrtools
или порта /usr/ports/sysutils/cdrtools
).
Содержимое для образа можно сделать, например, при помощи /usr/src/tools/tools/nanobsd/nanobsd.sh
. Всё описанное ниже справедливо для FreeBSD 8.x и 7.x, а также (возможно, с незначительными изменениями) и для 6.x.
1. Создадим каталог, в который поместим конфигурацию сборки образа, и при необходимости, дополнительные файлы типа rc.conf
. Для определенности, пусть каталог будет называться /home/nanobsd/livecd
. В нём создаем конфигурационный файл, назовем его generic.conf
:
SRCS=/home/nanobsd/livecd # наш каталог
NANO_NAME=nanobsd # имя образа
NANO_ISO=$SRCS/${NANO_NAME}.iso # куда писать ISO
NANO_DRIVE=acd0 # имя загрузочного устройства
#NANO_KERNEL=GENERIC # имя конфигурации ядра, можно не указывать, будет GENERIC
#NANO_PMAKE="make -j 3" # по умолчанию -- ускорение сборки на двухядерных системах
CONF_BUILD='
LOADER_BZIP2_SUPPORT=yes # поддержка загрузки сжатого ядра
INSTALL_NODEBUG=yes # на LiveCD не нужны отладочные символы
MODULES_WITH_WORLD= # не пересобирать модули при изменении конфигурации ядра
'
CONF_INSTALL="
$CONF_BUILD
WITHOUT_CXX= # на LiveCD не нужен g++ и библиотеки (теряем только devd)
WITHOUT_TOOLCHAIN= # на LiveCD вообще не нужны средства разработки
WITHOUT_INSTALLLIB= # и статические библиотеки тоже не нужны
"
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
Сборка образа: 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 или VirtualBox. Образ размера порядка 200Mb (для FreeBSD 8.0) уже можно использовать для проверки, насколько хорошо она определяет оборудование (и грузится ли вообще) -- кстати, для подхвата звука qemu после загрузки потребуется сказать
kldload snd_es137x
, но голая система малополезна. Тут начинается самое интересное -- настройка системы.2. Создадим в нашем каталоге подкаталог
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)3. Собранная таким образом система являет собой полноценную инсталляцию FreeBSD, загружается и работает непосредственно с CD. Пакетами в неё можно добавить X.org, window managers, firefox, драйверы видео (nvidia etc.) и всё работает. Таким образом можно, например, тестировать ноутбуки в магазинах (что я с успехом и проделал со своим), но для выполнения ремонтных работ посредством LiveCD есть свои тонкости. Размер такой системы ограничен только размером носителя (CD/DVD), который система после загрузки активно использует и поэтому не даёт сменить, блокируя выброс лотка. Кроме того, работа с CD-RW, к примеру, не отличается высокой скоростью.
Поэтому можно усовершенствовать конфигурацию, создав систему, которая при загрузке читает себя в оперативную память полностью и далее уже не нуждается в носителе, диск можно вынуть. Для этого нужно уменьшить размер образа. Созданный в итоге образ загружается и работает на машине с 64Mb RAM (без X.org, для него потребуется больше памяти). Уменьшение размера достигается двумя приёмами.
4. Во-первых, убираем из системы ненужные для ремонтных целей компоненты: документацию и прочее. Для этого приводим параметр
CONF_BUILD
к следующему виду:CONF_BUILD='
LOADER_BZIP2_SUPPORT=yes # поддержка загрузки сжатого ядра
INSTALL_NODEBUG=yes # на LiveCD не нужны отладочные символы
MODULES_WITH_WORLD= # не пересобирать модули при изменении конфигурации ядра
WITHOUT_ACCT=
WITHOUT_AMD=
WITHOUT_APM=
WITHOUT_ASSERT_DEBUG=
WITHOUT_ATM=
WITHOUT_AUDIT=
WITHOUT_AUTHPH=
WITHOUT_BIND_ETC=
WITHOUT_BIND_DNSSEC=
WITHOUT_BIND_MTREE=
WITHOUT_BIND_NAMED=
#WITHOT_BIND_UTILS=
WITHOUT_BLUETOOTH=
WITHOUT_BSNMP=
WITHOUT_CALENDAR=
WITHOUT_CDDL=
WITHOUT_CPP=
WITHOUT_CTM=
WITHOUT_CVS=
WITHOUT_DICT=
WITHOUT_EXAMPLES=
#WITHOUT_FLOPPY=
WITHOUT_FREEBSD_UPDATE=
WITHOUT_GAMES=
WITHOUT_GCOV=
WITHOUT_GDB=
WITHOUT_GPIB=
WITHOUT_GROFF=
WITHOUT_GSSAPI=
WITGOUT_HESIOD=
WITHOUT_HTML=
WITHOUT_INFO=
WITHOUT_IPFILTER=
WITHOUT_IPX=
WITHOUT_JAIL=
WITHOUT_KERBEROS=
WITHOUT_LOCATE=
WITHOUT_LPR=
WITHOUT_MAIL=
WITHOUT_MAKE=
WITHOUT_MAN=
WITHOUT_NCP=
WITHOUT_NDIS=
WITHOUT_NETCAT=
WITHOUT_NIS=
WITHOUT_NLS=
WITHOUT_NLS_CATALOGS=
WITHOUT_NS_CACHING=
WITHOUT_NTP=
WITHOUT_OBJC=
WITHOUT_PF=
WITHOUT_PMC=
WITHOUT_PORTSNAP=
WITHOUT_PPP=
WITHOUT_PROFILE=
WITHOUT_QUOTAS=
WITHOUT_RCS=
WITHOUT_RESCUE=
WITHOUT_ROUTED=
WITHOUT_SENDMAIL=
WITHOUT_SHAREDOCS=
WITHOUT_TEXTPROC=
WITHOUT_WIRELESS=
WITHOUT_ZFS=
'
Все эти директивы документированы в man src.conf
Это сильно уменьшает размер OS без существенного уменьшения функциональности, а если какая-то часть отключенной функциональности вам нужна, то легко убрать соответствующую
WITHOUT_XXX
(например, WITHOUT_CDDL
влечёт за собой исключение поддержки ZFS). А также значительно ускоряет первую сборку образа (повторные сборки при неизменной конфигурации многократно быстрее первой из-за ненужности перекомпиляции OS).6. Во-вторых, всю файловую систему образа, за исключением каталога
/boot
мы упакуем в файл /root.uzip
, который при загрузке полностью читается в память и файловая система монтируется из этого сжатого образа. Тут используется умение FreeBSD монтировать (в режиме read-only) такие сжатые образы файловых систем посредством ядерного модуля geom_uzip
, написанного бывшим моим сокурсником Максом Хоном (привет, Макс! :)Для этого полностью переписываем блок
make_iso
:make_iso() {
setup_nanobsd
cd $NANO_WORLDDIR
cat > boot/loader.conf << EOF
geom_uzip_load="YES"
mfsroot_load="YES"
mfsroot_type="mfs_root"
mfsroot_name="/root.uzip"
vfs.root.mountfrom="ufs:/dev/md0.uzip"
EOF
# для правильного монтирования корневой fs
cat > conf/base/etc/fstab << EOF
/dev/md0.uzip / ufs ro 0 0
/dev/$NANO_DRIVE /cdrom cd9660 ro,noauto 0 0
EOF
# не пытаться брать содержимое /etc откуда-либо кроме образа
rm -r conf/default/etc
# memory disk 50Mb для /var
echo 102400 > conf/default/var/md_size
populate
rm -rf ../boot ../root
mv boot ..
ln -s /cdrom/boot boot
mkdir cdrom
makefs -t ffs -o bsize=4096 -o fsize=512 -o minfree=3 -o optimization=time \
../root .
find . -maxdepth 1 | grep -v '^\.$' | xargs rm -rf >/dev/null 2>&1 || true
chflags -R noschg .
find . -maxdepth 1 | grep -v '^\.$' | xargs rm -rf
mv ../boot ../root .
bzip2 -1 boot/kernel/kernel
mkuzip -v root
rm root
mkisofs -b boot/cdboot -no-emul-boot -R -J -o "$NANO_ISO" $NANO_WORLDDIR
kill $$
}
customize_cmd make_iso
Для FreeBSD 8.0, собранный по такой схеме LiveCD грузится гораздо быстрее, чем в случае без компресии. Диск включает в себя каталог /boot
размером в 34Mb (из них 29Mb -- полный комплект ядерных модулей) и файл /root.uzip
чуть меньше 14Mb размером -- всё остальное содержимое образа в сжатом виде, включая все остальные файлы OS и пакеты joe, mc и perl-5.8.9 со всеми зависимостями (пакеты в нежатом виде суммарно занимают 54Mb). Итоговый размер ISO-файла меньше 48Mb. После загрузки такого CD на машине с 64Mb памяти свободно остаётся более 12Mb :-)Nanobsd полностью документирована в
man nanobsd
.
no subject
Date: 2010-03-08 20:03 (UTC)no subject
Date: 2010-03-09 02:08 (UTC)Вторая причина, по которой тут не упомянуты конфиги (и ещё кое-какие аспекты) -- объём поста, хотелось его сделать не слишком огромным. Скорее как proof-of-concept.
no subject
Date: 2011-04-11 10:03 (UTC)размеры же рутовой fs было бы круто изменять из самой bsd. вот тогда получилась бы минималистичная, секьюрная, полезная, гибкая и удобная os
no subject
Date: 2011-04-11 11:40 (UTC)no subject
Date: 2011-04-11 14:49 (UTC)ntfs - потому что во всех обычных системах флешка будет определяться как носитель информации (удобно просто переносить файлы), система в виде виндового exe - для простоты использования (юзер просто запускает файл), чтоб иметь возможность при его запуске прописывать boot loader на флешку и проверять настройки bios на всех компах с самой распространенной ОС, чтобы переносить систему на новый носитель копированием одного файла, чтобы иметь N-кратную защищенность данных
no subject
Date: 2011-04-11 16:27 (UTC)Для тестовых целей может быть достаточно. На самом деле диски просто жуткой
тормознутостью не годятся.
> usb - занимает весь объём носителя
У меня не занимает.
> не монтируется виндами
И это очень хорошо, не хватало ещё чтобы винда чего-нибудь там могла поменять.
Четвертый раздел на той же флешке - пусть монтирует, так и быть.
> ntfs - потому что во всех обычных системах флешка будет определяться как носитель информации (удобно просто переносить файлы)
NanoBSD (не забываем топик) служит не для переноса файлов под винду, для этого подойдет вообще любая пустая флешка.
> система в виде виндового exe - для простоты использования (юзер просто запускает файл)
NanoBSD делается ни разу не для десктопных виндовых юзеров.
> чтоб иметь возможность при его запуске прописывать boot loader на флешку
Не понял фразы. Boot loader на флешке с NanoBSD уже есть и может быть установлен с неё куда угодно.
> проверять настройки bios на всех компах с самой распространенной ОС
Проверка настроек BIOS выполняется вообще безо всяких флешек, средствами самого BIOS, независимо от наличия или отсуствия ОС и её состояния.
> чтобы переносить систему на новый носитель копированием одного файла
Лично я и так переношу NanoBSD на новый носитель одним копированием одного файла, командой dd.
> чтобы иметь N-кратную защищенность данных
Не понял фразы и отношения "защищенности данных" к ntfs.
no subject
Date: 2011-09-16 19:08 (UTC)${MD}s1 и ${MD}s2
no subject
Date: 2011-09-16 19:17 (UTC)После такого обновления разделы меняются ролями и основным становится второй - до следующего обновления, которое будет писаться в первый раздел. И так далее. Я эту схему активно использую.
no subject
Date: 2011-09-17 07:37 (UTC)Кстати, а как nanoBSD догадывается о необходимости создавать var и ets в памяти? Может это активируется при сборке "мира" для nanoBSD?
Или обычный мир от нано по умолчанию не отличается? Думаю, может можно не собирать его, а когда выйдет 9, просто из бинарников взять.
Все время задавался вопросом почему для jail нет стандартного способа просто создать на основе существующий бинарников
Это я делаю себе тестовую флешку для покупки ноутбука.
Вот думаю, может с интегрированным видео заработает или нет. А то с матовым 15" экраном либо с интегрированное, либо ATI.
no subject
Date: 2011-09-17 12:34 (UTC)При наличии файла /etc/diskless на корневой файловой системе во время загрузки запускается особый режим загрузки. Его реализует скрипт /etc/rc.initdiskless, который и создаёт в памяти var и etc и разворачивает на них нужные структуры перед продолжением нормальной загрузки. В остальном "обычный мир от нано" не отличается (/etc/rc.initdiskless есть и в обычной системе, просто он не вызывается).
> просто из бинарников взять
Начиная с восьмой версии, дистрибутив выходит не только в виде образов CD/DVD, но и в виде образа для флешки.
no subject
Date: 2011-09-17 14:16 (UTC)FreeBSD LiveCD
Date: 2012-07-30 09:44 (UTC)