Установка FreeBSD на флешку
Среда, 13 Янв 2010 18:44
На домашние seedbox’ы очень часто ставятся древние жесткие диски, из соображения «не жалко». Особо важных данных туда все равно не записывается, и когда они ломаются, ничего страшного не происходит, кроме как проблем с перестановкой ОС.
Для минимизирования опасности паломки ОС, вполне возможно вынести ее на отдельный физический носитель. Как вариант — на небольшую флешку. Дальше речь пойдет об установке и настройке FreeBSD (7.0-8.0) на флеш накопитель.
Размер флешки
Поэкспериментировав, в 200 мегабайт (на 256 меговую флешку) свободно влезает вполне рабочий роутер с dhcp/dns/vpn демонами. Так же из ядра выкидываются все ненужные драйвера, ну и опции отладки и профилирования, а из мира удаляются manы. Естественно, исходники (/usr/src) и порты (/usr/ports) туда не влезут, но их можно без проблем монтировать и с другого носителя.
Под роутер с функциями seedbox лучше, конечно, иметь флешку белее объёмную, так как, там потребуется и apache, и perl, и php. Для данного примера попроюуем использовать глючную флешку на 4 гигабайта
.
Проблемы с надежностью
В результате того что флешки очень не любят перезапись секторов, гайдбук рекомендует монтировать корень исключительно на чтение,разделы, требующие доступа на запись, выносить в память. В результате, /var будет смонтирован как диск в оперативной памяти и каждая последующая перезагрузка удалит все его содержимое.
Подготовка разделов
Установку удобнее делать из под FreeBSD (я делал с виртуалки), в которой уже собрано необходимое ядро и мир.
Вставляем флешку, смотрим как она определилась в dmesg (далее da0). Для начала отформатируем флэшку. Создадим flash_disk.proto:
# slice type start length
# создаем два слайса
p 1 0xa5 63 1429722
p 3 0xa5 2040255 6072570
# делаем первый активным
a 1
Так как флешка у меня глюкавая (попытка чтения из участка между 700 и 1000 мегабайтами вызывает отваливание контроллера), то пространство у меня дробится на два слайса. Со стабильной флешкой можно создавать один кусок на всю флешку.
Форматируем:
fdisk -f flash_disk.proto -i da0
Создаем загрузчик:
# создаем MBR
boot0cfg -B da0
# по-умолчанию грузимся с первого slice
boot0cfg -s 1 da0
# запрещаем загрузчику перезаписывать себя
boot0cfg -o noupdate da0
Далее разметим наш слайс. Создаем flash_labels.proto:
# size offset fstype [fsize bsize bps/cpg]
a: 1429722 0 4.2BSD 0 0 0
c: * 0 unused 0 0 # «raw» part, don’t edit
Размечаем диск,создаем файловую систему:
# Размечаем в соответствии с созданным файлом
bsdlabel -R da0s1 flash_labels.proto
# Создаем файловую систему
newfs -U da0s1a
Монтируем слайс
mount /dev/da0s1 /mnt/flash
Установка системы и портов
Для того чтоб каждый раз при make install не указывать путь, временно установим DESTDIR флаг в make.conf на рабочей системе:
DESTDIR=/mnt/flash
Ну а теперь ставим на флешку ядро, мир, системные конфиги и скрипты (etc):
cd /usr/src
make installkernel
make installworld
cd /usr/src/etc
make distrib-dirs
make distribution
У меня в make.conf, помимо всего прочего, выключена сборка info и man (NO_INFO=YES NO_MAN=YES), поэтому, для нормальной установки портов на флешку, необходимо вручную поставить texinfo, как описано здесь.
cd /usr/src/gnu/usr.bin/texinfo
make install
После, исправим fstab на флешке:
# Device Mountpoint FStype Options Dump Pass#
/dev/da0s1a / ufs ro 1 1
md /tmp mfs rw,-s24M,noatime 0 0
md /var mfs rw,-s128M,noatime` 0 0
Так как /var будет смонтирован в память, требуется перенести /var/db на флешку, чтобы данные об установленных портах не потерялись между перезагрузками. Для этого создаем ссылку:
mkdir /mnt/flash/etc/pkg
ln -s ../../etc/pkg /mnt/flash/var/db/pkg
Далее можно настраивать систему, править конфиги и ставить порты с рабочей системы (необходимо только в resolv.conf на флешке прописать dns-сервера).
Например:
cd /usr/ports/net/isc-dhcp30-server
make
make install
Директива DESTDIR в make.conf укажет make install что ставить порт нужно на флешку.
Проблемы с dns-сервером named
По-дефолту демон named запускается системой в песочнице (chroot’ом) в каталоге /var/named. Вынести этот каталог на флешку нельзя, так как named`у нужно иметь возможность записывать в свой маленький /var. Вариант, который я использовал, заключается в следующем,я добавил в rc.local копирование конфига named всякий раз при старте системы:
# копируем конфиг named
mkdir -p /var/named/etc
cp -Rp /usr/local/etc/namedb /var/named/etc
/etc/rc.d/named start
Это несколько криво и я с удовольствием выслушаю другие варианты решения.
Загрузка установленной системы
Подключаем флешку к роутеру и делаем её загрузочной, биосе. На некоторых материнских платах возможена ошибка, когда флешка не успевает определиться к моменту, когда загрузчик начинает монтировать корень. Хак для этой проблемы расписан в конце этой статьи.
После загрузки системы можно продолжить ее настройку. Для этого нужно перемонтировать корень на запись:
mount -uw /
После внесения изменений (установки портов/правки конфигов/добавления пользователей и т.д.) необходимо возвратить корень в доступ только на чтение:
mount -ur /
Полезные ссылки
FreeBSD and Solid State Devices
FreeBSD System on USB flash stick
miniBSD — reducing FreeBSD
Как выяснилось,нет особого смысла вручную монтировать /var и /tmp. В случае, если при загрузке /var и /tmp доступны только на чтение, будет автоматически вызваться /etc/rc.initdiskless, который, по-дефолту, примонтирует эти разделы в оперативную память. Следовательно из fstab можно удалить строчки про /var и /tmp, а в /etc/rc.conf добавить нужные параметры для rc.initdiskless:
tmpmfs=true
tmpsize=24M
varmfs=true
varsize=128M
Похожие посты:
- Храним письма в базе mysql
- RAID1 под FreeBSD на живой системе с помощью atacontrol
- Утилиты мониторинга в OS FreeBSD
- Двухнодовый кластер MySQL на FreeBSD
- Подключение FreeBSD к IPv6 - поднимаем туннель через IPv4-сети провайдера
- Три серьезные уязвимости во FreeBSD
- Вышел релиз FreeBSD 8.0

- Вышел PC-BSD 8.0
- Подробная инструкция как обновить php 5.1.6 до 5.2.9 на CentOS 5.2
- Используем архиватор 7zip для бэкапа данных