dadv: (Default)
[personal profile] dadv

Для создания 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.

Date: 2010-03-08 20:03 (UTC)
From: [identity profile] blacklion.livejournal.com
Не сказано ещё про конфиги пакетов ничего. А для меня вот это самый гемморой — сделать их подходящими заранее а не допиливать по мере работы.

Date: 2010-03-09 02:08 (UTC)
From: [identity profile] dadv.livejournal.com
Пакеты у каждого свои, что тут можно сказать? Я вообще не особенно рассматриваю LiveCD в качестве решения для десктопной работы или там для построения сервера - носитель read-only не шибко удобен. Вот для кастомной инсталляции, для ручных ремонтных работ, для исследования "совместимости" железа и софта -- самое то. А для "бездисковой" машины в работу лучше ставить систему на IDE/USB flash, они сейчас дешевы, особенно USB.

Вторая причина, по которой тут не упомянуты конфиги (и ещё кое-какие аспекты) -- объём поста, хотелось его сделать не слишком огромным. Скорее как proof-of-concept.

Date: 2011-04-11 10:03 (UTC)
From: [identity profile] mitlas.livejournal.com
идеальной была бы bootable usb-flash в ntfs, с exe-файлом в произвольной точке файлового дерева, при запуске которого, и в графическом, и в тестовом режиме, выводится предложение загрузки bsd. при согласии юзера, проверяется boot sequence в bios и, если usb стоит после hdd или в cd-драйве есть диск и cd стоит до usb, или network до usb - выводится предупреждение. если всё ок - машина бутится, boot loader монтирует тот самый exe-файл как шифрованную корневую fs, а на ней - у каждого пользователя имеется свой шифрованный файловый контейнер посредством true crypt (чтоб, если что, можно было копировать в другие системы)

размеры же рутовой fs было бы круто изменять из самой bsd. вот тогда получилась бы минималистичная, секьюрная, полезная, гибкая и удобная os

Date: 2011-04-11 11:40 (UTC)
From: [identity profile] dadv.livejournal.com
Непонятна цель такой системы (зачем в ней вообще ntfs?), но цель эта очевидно не та, для которой я делаю LiveCD/DVD/USB.

Date: 2011-04-11 14:49 (UTC)
From: [identity profile] mitlas.livejournal.com
LiveCD/DVD/USB - прошлый век. диски не позволяют модификаций системы, а usb - занимает весь объём носителя и не монтируется виндами

ntfs - потому что во всех обычных системах флешка будет определяться как носитель информации (удобно просто переносить файлы), система в виде виндового exe - для простоты использования (юзер просто запускает файл), чтоб иметь возможность при его запуске прописывать boot loader на флешку и проверять настройки bios на всех компах с самой распространенной ОС, чтобы переносить систему на новый носитель копированием одного файла, чтобы иметь N-кратную защищенность данных

Date: 2011-04-11 16:27 (UTC)
From: [identity profile] dadv.livejournal.com
> диски не позволяют модификаций системы

Для тестовых целей может быть достаточно. На самом деле диски просто жуткой

тормознутостью не годятся.

> usb - занимает весь объём носителя

У меня не занимает.

> не монтируется виндами

И это очень хорошо, не хватало ещё чтобы винда чего-нибудь там могла поменять.
Четвертый раздел на той же флешке - пусть монтирует, так и быть.

> ntfs - потому что во всех обычных системах флешка будет определяться как носитель информации (удобно просто переносить файлы)

NanoBSD (не забываем топик) служит не для переноса файлов под винду, для этого подойдет вообще любая пустая флешка.

> система в виде виндового exe - для простоты использования (юзер просто запускает файл)

NanoBSD делается ни разу не для десктопных виндовых юзеров.

> чтоб иметь возможность при его запуске прописывать boot loader на флешку

Не понял фразы. Boot loader на флешке с NanoBSD уже есть и может быть установлен с неё куда угодно.

> проверять настройки bios на всех компах с самой распространенной ОС

Проверка настроек BIOS выполняется вообще безо всяких флешек, средствами самого BIOS, независимо от наличия или отсуствия ОС и её состояния.

> чтобы переносить систему на новый носитель копированием одного файла

Лично я и так переношу NanoBSD на новый носитель одним копированием одного файла, командой dd.

> чтобы иметь N-кратную защищенность данных

Не понял фразы и отношения "защищенности данных" к ntfs.


Date: 2011-09-16 19:08 (UTC)
From: [identity profile] iamjaph.livejournal.com
А вы не знаете, зачем создается два раздела с образом?
${MD}s1 и ${MD}s2

Date: 2011-09-16 19:17 (UTC)
From: [identity profile] dadv.livejournal.com
По умолчанию, действительно, создаётся два раздела, хотя это можно и отменить и будет один. Два раздела дают возможность безопасного обновления системы путем загрузки обновленного образа раздела кода во второй раздел. После окончания успешной загрузки активным делается второй раздел и выпоняется перезагрузка. Такая схема гарантирует безопасное обновление по сети - даже если во время загрузки обновления пропадёт питание, ничего не сломается, загрузка останется с первого нетронутого раздела.

После такого обновления разделы меняются ролями и основным становится второй - до следующего обновления, которое будет писаться в первый раздел. И так далее. Я эту схему активно использую.

Date: 2011-09-17 07:37 (UTC)
From: [identity profile] iamjaph.livejournal.com
Спасибо, за подробное объяснение. Я изучил уже полностью создание, и увидел NANO_IMAGES и ключик -i. А вот об этой схеме обновления не догадался.
Кстати, а как nanoBSD догадывается о необходимости создавать var и ets в памяти? Может это активируется при сборке "мира" для nanoBSD?
Или обычный мир от нано по умолчанию не отличается? Думаю, может можно не собирать его, а когда выйдет 9, просто из бинарников взять.

Все время задавался вопросом почему для jail нет стандартного способа просто создать на основе существующий бинарников

Это я делаю себе тестовую флешку для покупки ноутбука.
Вот думаю, может с интегрированным видео заработает или нет. А то с матовым 15" экраном либо с интегрированное, либо ATI.

Date: 2011-09-17 12:34 (UTC)
From: [identity profile] dadv.livejournal.com
> Кстати, а как nanoBSD догадывается о необходимости создавать var и ets в памяти?

При наличии файла /etc/diskless на корневой файловой системе во время загрузки запускается особый режим загрузки. Его реализует скрипт /etc/rc.initdiskless, который и создаёт в памяти var и etc и разворачивает на них нужные структуры перед продолжением нормальной загрузки. В остальном "обычный мир от нано" не отличается (/etc/rc.initdiskless есть и в обычной системе, просто он не вызывается).

> просто из бинарников взять

Начиная с восьмой версии, дистрибутив выходит не только в виде образов CD/DVD, но и в виде образа для флешки.

Date: 2011-09-17 14:16 (UTC)
From: [identity profile] iamjaph.livejournal.com
Спасибо, я не знал об diskless.

FreeBSD LiveCD

Date: 2012-07-30 09:44 (UTC)
From: [identity profile] livejournal.livejournal.com
Пользователь [livejournal.com profile] victor_sudakov сослался на вашу запись в «FreeBSD LiveCD (http://victor-sudakov.livejournal.com/104961.html)» в контексте: [...] комплектацией в FreeBSD не нужен никакой сторонний софт... http://dadv.livejournal.com/89587.html [...]

Profile

dadv: (Default)
Choose your future

July 2024

M T W T F S S
12 34567
891011121314
15161718192021
22232425262728
293031    

Tags

Style Credit

Powered by Dreamwidth Studios