*BSD

индекс
131,42

Установка FreeBSD на флешку для seedbox машины

На многие домашние 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 /


Полезные ссылки




UPDATE: Как отметили в комментариях, нет смысла вручную монтировать /var и /tmp. В случае, если при загрузке /var и /tmp доступны только на чтение, будет автоматически вызван /etc/rc.initdiskless, который, по-умолчанию, смонтирует эти разделы в оперативную память. Поэтому из fstab можно убрать строчки про /var и /tmp, а в /etc/rc.conf добавить параметры для скрипта rc.initdiskless:

tmpmfs=true
tmpsize=24M
varmfs=true
varsize=128M


_________
Текст подготовлен в ХабраРедакторе
+49
11 января 2010, 18:00
66

комментарии (22)

+3
JustLuckyGuy #
а еще с этой флешки можно скопировать фрю на боевой сервер в кратчайшие сроки.
0
xtender #
Для таких целей, наверное, лучше всего, т.к. seedbox все-таки подразумевает файловое хранилище и уж на него то систему и можно поставить, да и как роутер использовать при том, что есть железный роутер, тоже не фонтан.
0
Vass #
Полезно, переносите в тематический блог: habrahabr.ru/blogs/bsdelniki/
0
korsakov #
Скажите, дошел ли программный и аппаратный прогресс до той стадии, когда FreeBSD можно установить в виде легковесного dev-десктопа (xorg+flux+eclipse/pydev+opera+pidgin/irssi+atrem+vim) на флешку (4 или 16 гб, не важно), чтобы время от времени заменять ей виновс в портативном компьютере?

У меня нетбук выполняет две функции: словаря Lingvo и бравзинга хромом. Обе неплохо работают на виндовсе, и почти никак не работают в BSD, поэтому вопрос о полной замене нетбучной ОС не стоит. Но вот иногда, когда нужно срочно написать и закоммитить патч без отвлекающей возни, виндовс просто люто бесит. Хотелось бы иметь возможность вставить флешечку с кастомным live-дистрибутивом, быстро сделать работу, и отключиться до следующего алярма. Такое уже возможно без серьезных косяков, или всё еще сыро?
0
nixil #
Обязательна фря? или любая BSD сойдет?
Допилив напильником подойдет любая, но для декстопа — лучше всего: www.pcbsd.org/
0
iZENfire #
Нет. PC-BSD с флэшки очень долго грузится и имеет высокое время отклика GUI из-за KDE4. Я пробовал ставить, но использовать не хватило терпения.
0
korsakov #
Непонятно только чем она лучше.

Я имел в виду серьезную собственноручно оптимизированную кастомную сборку FreeBSD под конкретные задачи и нужды. А вопрос был про совместимость всяких Xorg-ов и Эклипсов с чувствительными к циклам чтения/записи флешдрайвами и их невысокой скоростью.
Прошу прощения, в предыдущем комментарии написал много но непонятно.
0
nixil #
Работать то будет, отказоустойчивость флешки вообще сомнительная, если часто использовать то умирают они быстро, а вот если только для чтения, а все остальное монтировать в оперативку, то вполне себе работать будет.
Вообще если вопрос стоит про собственноручно собранный образ, совет только один: пробуйте!
0
iZENfire #
Да.
Десктоп с Xfce4/VLC/Firefox/Thunderbird/Pidgin/OpenOffice3/JDK16/NetBeans6 поместится на USB-флэшку объёмом 4ГБ.
0
korsakov #
Да вопрос был совсем не про «поместится».
Вопрос был про способность системы и окружения нормально использовать ресурсы флешдрайва, и наоборот — про отказоустойчивость флешдрайвов к современным требованиям фри на десктопе.
+3
iZENfire #
А чего там использовать? UFS2+Soft_Updates == ФС без физического журналирования на носителе и без потери отказоустойчивости.

Можно ещё сделать для UFS2 монтирование с noatime и, как уже говорили, /var и /tmp вынести в RAM (это делается опциями в /etc/rc.conf, а не «костыльно» через md(4) в /etc/fstab, как написано в теме):

tmpmfs=true
tmpsize=24M
varmfs=true
varsize=128M


Ну и чтобы отвязаться от имени физического устройства, нужно монтировать ФС по метке раздела (GEOM_LABEL должен быть подгружен модулем или вкомпилирован в ядро, метка раздела может быть создана при форматировании раздела командой «newfs -U -L FBSD /dev/da0s1» или после форматирования с помощью команды «tunefs -L FBSD /dev/da0s1»).
Окончательный /etc/fstab:

# Device Mountpoint FStype Options Dump Pass#
/dev/ufs/FBSD / ufs rw,noatime 1 1


Дальше остаётся скопировать командой «cp -a» на флэшку каталог /usr/local из материнской системы и, конечно же, домашние каталоги пользователей в /usr/home. Проинспектировать отдельные файлы в каталоге /etc, файл /boot/loader.conf флэшки для работы будущей системы на предмет отвязывания от имён физического оборудования. И всё готово.
0
Pavel7 #
Спасибо, добавил в update про rc.initdiskless.
0
alekciy #
TrueBSD?
0
korsakov #
Да я уже впринципе выбрал оптимальный путь:

На днях вышел Frenzy 1.2 reincarnation
К нему есть SDK про то, как собрать свой кастомный liveCD
А потом останется только установить полученную Frenzy на Flash
+1
pgrishin #
1. /etc/rc.initdiskless
2. не портах а пакетах
0
nikoinlove #
По поводу named — суем в /etc/rc.conf

named_enable=«YES»
named_chrootdir=""

И ваш неймд перестает чрутится и его конфиги и файлы с зонами лежат в /etc/namedb.
Конфиг тоже можно немножко затюнить типа

options {
directory "/etc/namedb";
pid-file "/etc/namedb/pid";
dump-file "/etc/namedb/named_dump.db";
statistics-file "/etc/namedb/named.stats";
--crop--
0
Pavel7 #
Насколько я понимаю, named не просто так chroot'ится по-умолчанию, и лучше не выкидывать его из песочницы.
0
nikoinlove #
В 4ке точно не чрутился, с какой ветки начал — не уверен. Вы много видели багов позволяющих исполнять код через бинд? Уж лучше торрент-клиент зачрутьте :P
0
JustLuckyGuy #
эммм. Уязвимость в named (8 января 2010)
0
Pavel7 #
От этой уязвимости chroot никак не спасет.
0
Hemul #
в подобной ситуации (car-pc на базе FreeBSD) я сделал загрузку с двух флешек, объединенных в gmirror. Реально появилась отказоустойчивость — если с одной флешки система при дефолтных настройках периодически не могла смонтировать рут (таймаут), то с двух монтирует всегда железно. И скорость чтения возросла.
0
chusov #
Столкнулся с проблемой, при загрузке система не успевала найти флэшку, соответственно не могла примонтировать корень. помогло добавление в /boot/loader.conf «kern.cam.boot_delay=10000»

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.