FreeBSD 4.11
Задача: собрать фрю минимального размера, поместить её на IDE Flash. При этом флеш должен использоваться только один раз при загрузке.
делается так:
1. собираем по мануалу
http://www.citytel.ru/minibsd/minibsd.html минифрю, дополняем нужными бинарниками, библиотеками и прочим - в общем собираем дерево файловой системы, содержащей всё что надо для работы. Без kernel. В этой файловой системе создаю директорию /flash Смотрим размер всего этого дела. В etc ложим один единственный файл следующего содержания:
#!/bin/sh
echo "==== pre-rc started ===>"
stty status '^T'
# Set shell to ignore SIGINT (2), but not children;
# shell catches SIGQUIT (3) and returns to single user after fsck.
#
trap : 2
trap : 3 # shouldn't be needed
HOME=/
PATH=/sbin:/bin:/usr/sbin:/usr/bin
export HOME PATH
fsck -p /dev/ad0s1a
mount /dev/ad0s1a /flash
cp -rf /flash/etc/* /etc/
umount /dev/ad0s1a
cd /etc
. rc
Реальные файлы конфигов будем ложить в /etc на самой флешке дабы их можно было менять, при старте этот rc будет монтировать флешку, переписывать в memory-disk реальные конфиги и стартовые скрипты и запускать их.
2. по п.10 создаем образ (например tokernel.bin) куда влезет вышеуказанное+небольшой запас
dd if=/dev/zero of=tokernel.bin bs=1024k count=кол-во мегабайт
vnconfig -s labels -c vn0 tokernel.bin
disklabel -Brw vn0 auto
disklabel -e vn0
newfs -b 8192 -f 1024 -U /dev/vn0c
mount /dev/vn0c /mnt
переписываем вышесобранное дерево файловой системы туда, отключаем
umount /mnt
vncoufig -u vn0
3. собираем ядро с поддержкой того что надо, указываем
options MFS
options MD_ROOT
options MD_ROOT_SIZE=размер образа в кб+запас
pseudo-device md
При этом в ядре будет зарезервированно указанный объем места под файловую систему
4. Идем в /usr/src/release(если нету, доставляем из дистрибутива), компилим write_mfs_in_kernel
5. вписываем полученный образ в ядро командой
write_mfs_in_kernel kernel tokernel.bin
Получился kernel, содержащий всю систему. Для экономии жмем gzip -9 kernel. (У меня в результате получилось около 10Мб). Получили kernel.gz Это файл ядра, содержащий образ файловой системы. Теперь если сделать загрузочный диск фри с этим файлом и в /etc/fstab не указывать корень, то при старте вписанный в ядро образ будет развернут как memory-disk и примонтирован корнем.
Поскольку у меня цель - поместить это на IDE Flash, и использовать его ОДИН раз при загрузке, дальше я форматирую флешку, размечаю. Задача - получить раздел adXs1a (т.к. согласно вышеприведенному скрипту монтируется именно ad0s1a).
Как это делается ручками до конца не знаю (по мануалу до конца не срастается) поэтому часть делал через sysinstall, часть по п.10 вышеприведенной ссылки. Если кто напишет как это делать руками - скажу спасибо
Монтирую, пишу туда кой-какие бинарники, /boot, реальный /etc c конфигами, помещаю туда kernel.gz. Всё. При старте - из ядра разворачивается образ файловой системы на md0c, он монтируется как корень, далее согласно вышеприведенному rc флешка монтируется как /flash, в md0c:/etc переписываются конфиги, и выполняются стартовые скрипты, после чего флешка демонтируется и больше вообще не используется. В принципе если система будет работать вечно и /etc меняться не будет никогда (ну-ну
) - можно поместить реальный /etc в п.1, вписать его в ядро вместе с образом файловой системы и всё. Итого на флешке имеем
/boot
/etc
/flash
kernel.gz
объем ~10Мб. С перлом и еще кой-какими бинарниками - 14Mb (в развернутом на md виде ~33Мб). Работает
Если собирать просто по вышеуказанному мануалу - будет еще меньше.
Буду признателен за подсказки и замечания