Установка 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


    Поделиться публикацией

    Похожие публикации

    Комментарии 22

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

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

                Я имел в виду серьезную собственноручно оптимизированную кастомную сборку FreeBSD под конкретные задачи и нужды. А вопрос был про совместимость всяких Xorg-ов и Эклипсов с чувствительными к циклам чтения/записи флешдрайвами и их невысокой скоростью.
                Прошу прощения, в предыдущем комментарии написал много но непонятно.
                  0
                  Работать то будет, отказоустойчивость флешки вообще сомнительная, если часто использовать то умирают они быстро, а вот если только для чтения, а все остальное монтировать в оперативку, то вполне себе работать будет.
                  Вообще если вопрос стоит про собственноручно собранный образ, совет только один: пробуйте!
                0
                Да.
                Десктоп с Xfce4/VLC/Firefox/Thunderbird/Pidgin/OpenOffice3/JDK16/NetBeans6 поместится на USB-флэшку объёмом 4ГБ.
                  0
                  Да вопрос был совсем не про «поместится».
                  Вопрос был про способность системы и окружения нормально использовать ресурсы флешдрайва, и наоборот — про отказоустойчивость флешдрайвов к современным требованиям фри на десктопе.
                    +3
                    А чего там использовать? 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
                      Спасибо, добавил в update про rc.initdiskless.
                  0
                  TrueBSD?
                +1
                1. /etc/rc.initdiskless
                2. не портах а пакетах
                  0
                  По поводу 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
                    Насколько я понимаю, named не просто так chroot'ится по-умолчанию, и лучше не выкидывать его из песочницы.
                      0
                      В 4ке точно не чрутился, с какой ветки начал — не уверен. Вы много видели багов позволяющих исполнять код через бинд? Уж лучше торрент-клиент зачрутьте :P
                  0
                  в подобной ситуации (car-pc на базе FreeBSD) я сделал загрузку с двух флешек, объединенных в gmirror. Реально появилась отказоустойчивость — если с одной флешки система при дефолтных настройках периодически не могла смонтировать рут (таймаут), то с двух монтирует всегда железно. И скорость чтения возросла.
                    0
                    Столкнулся с проблемой, при загрузке система не успевала найти флэшку, соответственно не могла примонтировать корень. помогло добавление в /boot/loader.conf «kern.cam.boot_delay=10000»

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

                    Самое читаемое