mfsBSD with Frenzy boot style - is not forgotten...

Предыстория

Прошло уже почти 4 года с тех пор, как я брался за SDK-скрипты от Frenzy и стругал «полешко» )))

Однако события последних 2-х месяцев и вроде бы случайные стечения обстоятельств привели к написанию данного опуса.

Итак - есть три отличных на мой взгляд URL-ссылки:

Есть потребности:

  1. Сделать USB-флешку с полноценной инсталляцией FreeBSD (Install-to-USB)
  2. Сделать USB-флешку либо DVD-диск с Frozen-состоянием (LiveUSB либо LiveCD) - а точнее:
    • Грузим с флешки/cd-диска систему
    • Используем, делаем что хотим (например ставим софт дополнительный)
    • После перезагрузки/выключения ничего на флешке не изменяется, ничего не можем сломать (случайно или злонамеренно).

Первый вариант настолько прост, что и опус писать бы не стоило (решается штатным инсталлятором FreeBSD). Ну разве что можно малость потом подрихтовать /etc/fstab/:

fstab

/dev/ufs/USBroot        /               ufs     rw,noatime              1       1
md                      /tmp            mfs     rw,-s256M,nosuid,noatime 0       0
md                      /var/run        mfs     rw,-s4M,nosuid,noatime  0       0
md                      /var/log        mfs     rw,-s256M,nosuid,noatime 0       0
/tmp                    /var/tmp        nullfs  rw                      0       0

Собственно такую флешку я и сделал (32 Гб, USB 3.0) на базе FreeBSD 11.0 CURRENT. Отлично работает, проверил загрузку на 11 различных конфигурациях (включая 3 ноутбука и ультрабук Dell XPS 12). Графика тоже везде завелась (xorg + mate), UTF в консоли и в GUI. К слову - аналогичная флешка у меня есть теперь и на Xubuntu 15.04 - отличный инструмент.

Со вторым вариантом оказалось сложнее + хотелось немного поразминать мозг. Что и было сделано в дальнейшем.

Итак - решить вторую задачу предлагается модификацией готового mfs-образа с FreeBSD от Martin-а. Плюс использовать некоторые идеи из Frenzy.

Краткое описание того, что было сделано:

  1. Установка чистой FreeBSD 10.3
  2. Установка jail-окружения, установка необходимого софта
  3. Упаковка каталогов /var и /usr из jail в var.uzip и usr.uzip
  4. Подготовка каталогов для модификации mfsBSD
  5. Модификация mfsBSD, добавление var.uzip и usr.uzip, изменение скриптов
  6. Сборка образа, проверка

Данное HOW-TO позволит довольно просто и быстро повторить проделанные шаги, внеся на любом шаге необходимые лично Вам изменения.

Установка чистой FreeBSD 10.3

Правило 1: Устанавливаемая версия и разрядность FreeBSD должны совпадать с выбранным образом mfsBSD.

Причина этого правила простая - из установленной FreeBSD в образ mfsBSD мы будем добавлять минимум два модуля ядра (geom_uzip и unionfs). Вообще у меня возникло ощущение, что Martin «халявит» и собирает свои образы, не используя build world… )))) НО - нам это только на руку - можно использовать модули ядра, просто копируя их в образ.

Что делаем:

  1. Устанавливаем FreeBSD 10.3 AMD64 на реальную либо на виртуальную машину
  2. можно ставить на UFS, можно на ZFS - без разницы
  3. Размер свободного места на корневой FS (/) минимум 20 Гб

Установка jail-окружения, установка необходимого софта

Так как в будущем сборок планируется несколько - удобно разные наборы ПО располагать отдельно друг от друга. Использовать jail - самый оптимальный вариант на мой взгляд.

Создаем каталог для JAIL-ов и устанавливаем первую клетку:

mkdir -vp /JAILS/jail1/
bsdinstall jail /JAILS/jail1/

# В клетку стоит поставить самый минимум - только libs32. Ни src, ни ports в клетке не нужны!!!
# Пароль пользователя root, запускаемые сервисы и дополнительные пользователи - это по вкусу.

Теперь настраиваем запуск jail1:

echo 'jail_enable="YES"' >> /etc/rc.conf
echo 'jail_list="jail1"' >> /etc/rc.conf

Пишем конфигурацию клетки - в файле /etc/jail.conf:

/etc/jail.conf

jail1 {
        path = /JAILS/jail1;
        mount.devfs;
        allow.raw_sockets;
        host.hostname = jail1;
        ip4.addr = 192.168.10.211;
        interface = em0;
        exec.start = "/bin/sh /etc/rc";
        exec.stop = "/bin/sh /etc/rc.shutdown";
}
 
# IP-адрес и имя сетевого адаптера измените так, чтобы у клетки был доступ в сеть Интернет

Запускаем клетку: /etc/rc.d/jail start

Входим внутрь: jexec 1 csh

Инициализируем pkg и устанавливаем нужное Вам ПО:

pkg
pkg update
pkg install mc xorg mate

# Сейчас мы по сути подготавливаем каталоги /var и /usr.
# Если Вам нужен будет какой-либо софт, либо настройки пользователей (не root), то
# самое время их сейчас сделать

Когда все сделали - выходим из jail в основную систему (exit/logout).

Подготовка каталогов для модификации mfsBSD

Нам потребуется множество каталогов для модификации образа mfsBSD:

mkdir -vp /MFSBSD
mkdir -vp /MFSBSD/mount-iso
mkdir -vp /MFSBSD/iso
mkdir -vp /MFSBSD/copy-iso
mkdir -vp /MFSBSD/mfsroot-mounted
mkdir -vp /MFSBSD/usrtmp
mkdir -vp /MFSBSD/vartmp

Также нужен ISO-образ с mfsBSD:

cd /MFSBSD/iso/
pkg install wget
wget -c "http://mfsbsd.vx.sk/files/iso/10/amd64/mfsbsd-10.3-RELEASE-amd64.iso"

Упаковка каталогов /var и /usr из jail в var.uzip и usr.uzip

Важный этап - из клетки с jail1 нужно взять каталоги /var и /usr и загнать их в сжатые образы файловых систем.

Для начала нужно создать файлы, заполненные 0-ми. При этом нужно учитывать, что в данные образы должны поместиться Ваши каталоги из jail.

# Архивируем кэш пакетов FreeBSD из клетки и переносим его в /JAIL на будущее:
cd /JAILS/jail1/var/cache/
tar -cf jail-pkg.tar pkg/
mv jail-pkg.tar /JAILS
cd pkg/
rm -rf *.txz

# Оцениваем размер каталогов /var и /usr:
du -h -s /JAILS/jail1/var/
du -h -s /JAILS/jail1/usr/

В моем случае размеры вышли такими:
 79M    /JAILS/jail1/var/
2,3G    /JAILS/jail1/usr/

# Создаем .img файлы (делайте с запасом!!!):
cd /MFSBSD/
dd if=/dev/zero of=var.img bs=1k count=102400
dd if=/dev/zero of=usr.img bs=1k count=3000000

# Ассоциируем с данными файлами блочные md устройства:
mdconfig -a -t vnode -f var.img
mdconfig -a -t vnode -f usr.img

# Размечаем var диск:
gpart create -s GPT /dev/md0
gpart add -t freebsd-ufs md0
newfs -m 0 -O2 md0p1

# Размечаем usr диск:
gpart create -s GPT /dev/md1
gpart add -t freebsd-ufs md1
newfs -m 0 -O2 md1p1

# Монтируем во временные каталоги:
mount /dev/md0p1 /MFSBSD/vartmp/
mount /dev/md1p1 /MFSBSD/usrtmp/

# Переносим содержимое из jail (тут можно смело идти варить кофе!):
cd /JAILS/jail1/var/
cp -Rp * /MFSBSD/vartmp/
cd /JAILS/jail1/usr/
cp -Rp * /MFSBSD/usrtmp/

# Отмонтируем:
umount /MFSBSD/vartmp/
umount /MFSBSD/usrtmp/

# Отключаем MD привязку:
mdconfig -d -u 1
mdconfig -d -u 0

# Сжимаем с помощью mkuzip, чтобы при загрузке FreeBSD монтировать с помощью geom_uzip:
cd /MFSBSD/
mkuzip var.img
mkuzip usr.img

Модификация mfsBSD, добавление var.uzip и usr.uzip, изменение скриптов

Теперь настало время разобраться с оригинальным mfsBSD образом:

# Монтируем ISO-образ mfsbsd-10.3-RELEASE-amd64.iso
mdconfig -a -t vnode -f /MFSBSD/iso/mfsbsd-10.3-RELEASE-amd64.iso
mount_cd9660 /dev/md0 /MFSBSD/mount-iso

# Переходим в каталог и копируем все содержимое:
cd /MFSBSD/mount-iso/
cp -Rp * /MFSBSD/copy-iso/

# Копируем сжатые файлы с /var и /usr:
cp /MFSBSD/var.img.uzip /MFSBSD/copy-iso/
cp /MFSBSD/usr.img.uzip /MFSBSD/copy-iso/

Теперь нужно внести ряд изменений в исходные настройки образа mfsBSD:

# Копируем два недостающих модуля ядра (geom_uzip и unionfs).
# Кстати говоря - можно и другие скопировать, если они Вам могут понадобится - например графику.
cp /boot/kernel/geom_uzip.ko /MFSBSD/copy-iso/boot/kernel/
cp /boot/kernel/unionfs.ko /MFSBSD/copy-iso/boot/kernel/

# Добавим автозагрузку этих модулей при старте:
echo 'geom_uzip_load="YES"' >> /MFSBSD/copy-iso/boot/loader.conf
echo 'unionfs_load="YES"' >> /MFSBSD/copy-iso/boot/loader.conf

Также нужно будет внести ряд изменений в сжатый образ mfsroot.gz, что располагается в корне mfsBSD диска:

# Разархивируем:
cd /MFSBSD/copy-iso/
gzip -d mfsroot.gz

# Монтируем:
mdconfig -a -t vnode -f /MFSBSD/copy-iso/mfsroot
mount /dev/md1 /MFSBSD/mfsroot-mounted

Каталог /root

Если нужно что-то изменить пользователю root - то именно сейчас это и нужно сделать:

echo 'exec mate-session' >> /MFSBSD/mfsroot-mounted/root/.xinitrc

Скрипты автомонтирования - каталог /etc/rc.d/

Если проанализировать каталог /MFSBSD/mfsroot-mounted/etc/rc.d/, то Вы увидите, что Martin добавил 4 своих скрипта, не изменяя никакие из базовых, входящих в FreeBSD:

cd /MFSBSD/mfsroot-mounted/etc/rc.d/
ls -l | grep -v "25"

# Получили:
-r-xr-xr-x  1 root  wheel    780  5 апр 17:06 interfaces
-r-xr-xr-x  1 root  wheel    729  5 апр 17:06 mdinit
-r-xr-xr-x  1 root  wheel   2341  5 апр 17:06 mfsbsd
-r-xr-xr-x  1 root  wheel    493  5 апр 17:06 packages

Для решения моей задачи я изменяю только файл mdinit - комментирую три строки, связанные с монтированием каталогов /var/db/pkg и /var/cache/pkg:

#       /sbin/mount -t tmpfs tmpfs /var/db/pkg
#       mkdir -p /var/cache/pkg
#       /sbin/mount -t tmpfs tmpfs /var/cache/pkg

А также добавляю по аналогии новый скрипт mfsusr. Его содержимое:

#!/bin/sh
# $Id$

# PROVIDE: mfsusr
# BEFORE:
# REQUIRE: automount
# KEYWORD: FreeBSD

. /etc/rc.subr

name="mfsusr"
start_cmd="mfsusr_start"
stop_cmd=":"

mfsusr_start()
{
        echo "Creating CD-ROM dir"
        mkdir /cdrom
        sleep 1
        echo "Mounting CD-ROM image"
        mount_cd9660 /dev/cd0 /cdrom
        sleep 1
        echo "Mounting /usr compressed image"
        mdconfig -a -f /cdrom/usr.img.uzip >/dev/null 2>&1
        sleep 1
        echo "Mounting /var compressed image"
        mdconfig -a -f /cdrom/var.img.uzip >/dev/null 2>&1
        echo "Creating TEMP dir for zipper /usr and /var"
        mkdir /usrtemp
        mkdir /vartemp
        sleep 1
        echo "Mounting temporary /usr and /var to temp dir"
        mount -r /dev/md1.uzipp1 /usrtemp
        mount -r /dev/md2.uzipp1 /vartemp
        sleep 1
        echo "Mounting rooted /usr and /var"
        mount_nullfs /usrtemp /usr
        mount_nullfs /vartemp /var
        sleep 1
        echo "Create MFS disk to 512 Mb"
        /sbin/mdconfig -a -t malloc -o compress -s 512m >/dev/null 2>&1
        sleep 1
        echo "Formatting MFS disk"
        /sbin/newfs -m 0 -n -b 8192 -f 1024 /dev/md3 >/dev/null 2>&1
        sleep 1
        echo "Mounting MFS disk"
        mkdir /ramdisk
        /sbin/mount -o noatime /dev/md3 /ramdisk
        sleep 1
        MFSLIST="etc var root usr"
        for d in ${MFSLIST}; do
                echo "Mounting UnionFS to ${d}"
                mkdir /ramdisk/$d
                # unionfs enabled
                mount_unionfs -o noatime -o copymode=transparent /ramdisk/$d /$d
                sleep 1
        done
        echo "Updating Shared Library Cache"
        /etc/rc.d/ldconfig restart
        sleep 1
        echo "Starting Dbus and HAL"
        /usr/local/etc/rc.d/dbus start
        /usr/local/etc/rc.d/hald start
}

load_rc_config $name
run_rc_command "$1"

Не забудьте сделать скрипт mfsusr исполняемым!!! chmod +x mfsusr

Прочие настройки - каталог /etc/

Ну и осталось совсем немного.

Добавляю в rc.conf строки автоматического запуска dbus и hald:

echo 'dbus_enable="YES"' >> /MFSBSD/mfsroot-mounted/etc/rc.conf
echo 'hald_enable="YES"' >> /MFSBSD/mfsroot-mounted/etc/rc.conf

Заменяю 5 файлов из каталога /JAILS/jail1/etc/ - чтобы изменить пароли и добавить пользователей (этот шаг для меня обязателен, иначе не будут запускаться DBUS/HALd):

cp /JAILS/jail1/etc/master.passwd /MFSBSD/mfsroot-mounted/etc/
cp /JAILS/jail1/etc/passwd /MFSBSD/mfsroot-mounted/etc/
cp /JAILS/jail1/etc/pwd.db /MFSBSD/mfsroot-mounted/etc/
cp /JAILS/jail1/etc/spwd.db /MFSBSD/mfsroot-mounted/etc/
cp /JAILS/jail1/etc/group /MFSBSD/mfsroot-mounted/etc/

Прочее по вкусу (motd, hosts и т.д.).

Подготовка к сборке

Почти все готово.

Теперь нужно отмонтировать mfsroot образ и упаковать его обратно. В дальнейшем можно этот цикл (распаковать, подмонтировать, изменить, отмонтировать, упаковать) повторять бесконечно - пока не надоест и чувство прекрасного не будет удовлетворено…

# Отмонтируем
cd /MFSBSD
umount /MFSBSD/mfsroot-mounted
mdconfig -d -u 1

# Упаковываем
cd /MFSBSD/copy-iso/
gzip mfsroot

Сборка образа, проверка

Для начала нам нужен комплект утилит для работы с ISO-образами:

pkg install cdrtools

Теперь нам нужен boot.img - загрузочная запись для ISO-диска (в случае, когда собираем ISO-образ). Подробности тут:

dd if=/MFSBSD/iso/mfsbsd-10.3-RELEASE-amd64.iso bs=2048 count=1 skip=20 of=/MFSBSD/copy-iso/boot.img

Собираем образ:

cd /MFSBSD/
mkisofs -J -R -no-emul-boot -boot-load-size 4 -b boot.img -o mfsbsd-modified.iso copy-iso/

Проверяем

Копируем образ, создаю виртуальную машину, настраиваю загрузку с ISO:

Демонстрационный образ

Выкладываю образ, полученный в ходе написания данного HOW-TO: mfsBSD-frenzy.iso. Можно по данной статье изменять его содержимое по аналогии - тогда не придется собирать jail клетку и ставить софт. Логин и пароль одинаковые: root.

А как же Frenzy??? Будут ли продолжения работ и релиз 1.5 ???

Если такие вопросы возникнут - заранее отвечаю: Frenzy 1.5 пока не планируется. Причины:

  1. На всех современных ПК грузятся USB-флешки, поэтому просто делаете себе Install-to-USB систему и вперед
  2. Если нужно грузить Live-образ на старых ПК, не поддерживающих загрузку с USB (это что-то вроде P3/P4) - то варианты такие:
    1. Frenzy любой версии
    2. mfsBSD
    3. mfsBSD с модификацией по данному HOW-TO

Кстати говоря у меня возникала мысль - на mfsBSD натянуть все то, что было реализовано в Frenzy SDK. Но, посидев несколько часов и заново просмотрев все скрипты я эту идею отложил, так как переписать придется практически каждый скрипт (с моим КПД это минимум 2-3 недели работы). Поэтому увы и ах - Frenzy 1.5 пока не будет.

НО - это не значит, что идеи Frenzy забыты!!! Как раз наоборот - идея использовать сжатые образы, монтировать их поверх + использовать unionfs это и есть родная фишка Frenzy (использованная в данной статье).

Так что в заключение хочу сказать - хотите сделать что-то хорошо - сделайте это сами. А данное руководство надеюсь поможет.

 
/usr/local/www/frenzy/data/pages/mfsbsd-custom.txt · Последние изменения: 2016/04/18 09:07 От vershinin
 
За исключением случаев, когда указано иное, содержимое этой вики предоставляется на условиях следующей лицензии:CC Attribution-Noncommercial-Share Alike 3.0 Unported
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki