FreeBSD. Маршрутизатор на флешке.
Жесткие диски – самое больное место современных серверов, не зря большинство аппаратных маршрутизаторов используют в качестве накопителей флешки. Флеш диск имеет меньше ресурсов перезаписи, но он не имеет движущихся частей, поэтому логичным является перенос роутера на флешку, запись нужной конфигурации и перевод диска в состояние read-only. Кроме всего прочего, я держу флешки в зеркале, с помощью gmirror и выход из строя одного диска, не приводит к прерыванию сервиса.
В принципе для установки достаточно флешки на 512 Мб, но большого смысла в такой экономии нет, можно конечно ставить CardRider и использовать SD карты, но у меня эта технология не прижилась. Использую обычные USB карты, монтирую их в сервере вместо дисков, используя внешние USB порты со старых системных блоков. Получается достаточно удобно, открываешь отсек меняешь флешку и все, продолжается работа.
Для того, что бы создать такой роутер нужн прежде всего компьютер с FreeBSD, а дальше вставляем в него флешку и начинаем с того, что создадим файловую систему(у меня флешка определилась как da0):
fdisk -BI /dev/da0 bsdlabel -B -w /dev/da0s1 newfs -U /dev/da0s1a
Файловую систему мы создали.
Можем примонтировать в /mnt, сюда мы будем инсталировать мир и ядро.
Монтируем:
mount /dev/da0s1a /mnt
В принципе смонтировать флешку можно и позже, потому что сейчас нужно в первую очередь собрать мир, а для этого нужно создать /etc/src.conf, в котором отключить все лишнее, что не обязательно иметь на флешке.
У меня он выглядит так:
WITHOUT_ASSERT_DEBUG=yes WITHOUT_ATM=yes WITHOUT_AUTHPF=yes WITHOUT_BLUETOOTH=yes WITHOUT_CVS=yes WITHOUT_DICT=yes WITHOUT_EXAMPLES=yes WITHOUT_GAMES=yes WITHOUT_HTML=yes WITHOUT_I4B=yes WITHOUT_INET6=yes WITHOUT_IPFILTER=yes WITHOUT_IPX=yes WITHOUT_KERBEROS=yes WITHOUT_LPR=yes WITHOUT_NCP=yes WITHOUT_NIS=yes WITHOUT_SHAREDOCS=yes WITHOUT_WPA_SUPPLICANT_EAPOL=yes
Я уверен можно еще много чего убрать из сборки, но в принципе достаточно и этого.
И теперь можно, почистить старую сборку мира:
cd /usr/src make clear
и собрать новый мир для флешки:
make buildworldи установить на флешку(она у нас примонтирована в /mnt):
make installworld DESTDIR=/mnt
Затем собрать и установить ядро:
make buildkernel KERNCONF=flashka make installkernel KERNCONF=flashka DESTDIR=/mnt
Конфиг ядра мало чем отличается от обычного, добавлены нужные опции:
options GEOM_MIRROR options NETGRAPH options NETGRAPH_NETFLOW options IPFIREWALL options IPFIREWALL_VERBOSE options IPFIREWALL_VERBOSE_LIMIT=100 options IPFIREWALL_DEFAULT_TO_ACCEPT options IPFIREWALL_FORWARD options ZERO_COPY_SOCKETS options HZ=2000
Ну и убрать максимум лишнего из ядра.
После того, как поставили ядро нужно установить файлы дистрибутива:
make distribution DESTDIR=/mnt
и теперь осталось создать недостающие файлы fstab и rc.conf, содержимое fstab:
/dev/da0s1a / ufs ro 1 1 md /tmp mfs rw,-s16M,nosuid 0 0
При этом, система при загрузке, определив, что / смонтирован в ro, создаст /var в памяти.
содержимое rc.conf стандартное:
hostname="flashka.hilik.org.ua" ifconfig_em0="inet 89.252.34.110/24" defaultrouter="89.252.34.107" gateway_enable="YES" sshd_enable="YES"
И теперь можно перезагружаться и настраивать как обычный сервер. Добавлять пользователей и тп.
Дополнительный софт(quagga, net-snmp) я добавляю пакетами(pkg_add), жесткие диски отключаются, добавляется вторая флешка и собирается в gmirror.
В fstab мы прописали опцию ro, в дальнейшем, если нужно перемонтировать в rw, для внесения изменений, то выполняется команда:
mount -o rw /dev/da0s1a /
После внесения изменений назад в ro:
mount /
При непредвиденной перезагрузке, время подъема системы минимально, что опять таки является плюсом и несмотря на кажущуюся кустарность, подбная технология хорошо себя проявила




By buryanov, 10.05.2010 @ 14:52
Спасибо, полезно, но.
Попробовал на 3-х флешках, и везде одна и таже проблема, млешка определяется позже, чем пытается моунтится фс.
By hilik, 10.05.2010 @ 17:39
Это баг во FreeBSD 8.0, используйте или FreeBSD 7.3 или воспользуйтесь вот этим советом:
http://www.hilik.org.ua/freebsd-usb-flash/
By Born in the USSR, 10.08.2010 @ 11:34
Вот тут опечатка
cd /usr/src
make clear
должно быть make clean
By msym, 18.08.2010 @ 08:36
to buryanov
в loader.conf kern.cam.boot_delay=10000
By hilik, 18.08.2010 @ 10:11
я пробовал этот метод, не помогает. Нужно патчить сорцы, это помогает гарантированно.