Установка FreeBSD на флешку

Среда, 13 Янв 2010 18:44
Posted in category FreeBSD

FreeBSD на флэшкуНа домашние 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

Google Bookmarks Digg Reddit del.icio.us Ma.gnolia Technorati Slashdot Yahoo My Web News2.ru БобрДобр.ru RUmarkz Ваау! Memori.ru rucity.com МоёМесто.ru Mister Wong



Похожие посты:

Комментарии и пинг сейчас закрыты.