Установка FreeBSD на USB-Flash

Подготовка флешки (разметка)

Размечаем всю флешку под FreeBSD:

fdisk -BI /dev/da0

Если хочется разбить на несколько разделов, то тогда так (fdisk в интерактивном режиме):

fdisk -i /dev/da0

Создаём BSD-слайс:

bsdlabel -w -B da0s1

Создаём файловую систему, с меткой FBSD, чтобы при монтировании устройства не зависеть от его имени в конкретной системе:

newfs -n -U -L FBSD /dev/da0s1a

Записываем MBR:

boot0cfg -B da0

Устанавливаем загрузку по умолчанию с первого слайса:

boot0cfg -s 1 da0

Запрещаем загрузчику перезаписывать себя:

boot0cfg -o noupdate da0

Установка FreeBSD

Монтируем флешку:

mount /dev/ufs/FBSD /mnt/flash-disk

Долгий способ установки — сборка мира

echo 'DESTDIR=/mnt/flash-disk' >> /etc/make.conf
cd /usr/src
make installkernel
make installworld
cd /usr/src/etc
make distrib-dirs
make distribution

Быстрый способ — копирование

cp -r /boot /bin /sbin /etc /root /mnt/flash-disk
mkdir /mnt/flash-disk/usr
cp -r /usr/bin /usr/sbin /usr/lib /usr/lib32 /usr/libdata /usr/libexec /usr/share /mnt/flash-disk/usr

Настройка после установки

Создаём на флешке файл fstab (/mnt/flash-disk/etc/fstab):

Device Mountpoint FStype Options Dump Pass#
/dev/ufs/FBSD / ufs ro 1 1

Подправляем rc.conf (/mnt/flash-disk/etc/rc.conf):

# Запрещаем fsck в фоновом режиме
background_fsck="NO"

# Запрещаем запись состояния системной энтропии 
entropy_dir="NO" 
entropy_file="NO" 
 
# Запрещаем создавать дампы
dumpdev="NO" 
dumpdir="NO" 

virecover_enable="NO"
ifconfig_DEFAULT="DHCP"

# Важный момент! если / монитирует read-only, то /tmp и /var создаются в виде ram-дисков,
# ниже мы указываем их размер в памяти
tmpsize="8m"
varsize="8m"
# Наполняем /var 
populate_var="YES"

Дополнительно

Проблемы с FreeBSD 8.0-Stable — на некоторых материнских платах флешка определяется уже после того, как ядро пытается смонтировать корневую ФС, чтобы избежать этой неприятности надо в /usr/src/sys/kern/vfs_mount.c добавить одну строчку и пересобрать ядро, вот патч:

Index: sys/kern/vfs_mount.c
===================================================================
RCS file: /usr/src/sys/kern/vfs_mount.c,v
retrieving revision 1.308
diff -u -r1.308 vfs_mount.c
--- sys/kern/vfs_mount.c 5 Jun 2009 14:55:22 -0000 1.308
+++ sys/kern/vfs_mount.c 29 Sep 2009 17:08:25 -0000
@@ -1645,6 +1645,9 @@
options = NULL;
+ /* NASTY HACK: wait for USB sticks to appear */
+ pause("usbhack", hz * 10);
+
root_mount_prepare();
mount_zone = uma_zcreate("Mountpoints", sizeof(struct mount));

Ещё раз «дополнительно»

Как заметили в каментах — можно обойтись и без патча к ядру (на 8й ветке), надо добавить в /boot/loader.conf следующую строку:

kern.cam.boot_delay=10000

Ссылки: 1, 2, 3 и 4.