Є в мене ідея підняти собі вдома NAS на FreeBSD.
Для цього купив машинку Lenovo ThinkCentre M720s SFF – тиха, компактна, є можливість встановити 2 SATA III SSD + окремо M.2 слот під NVMe SSD.
Що планується:
- на NVMe SSD: UFS і FreeBSD
- на SATA SSD: ZFS з RAID1
Поки чекаю на диски, можна спробувати на віртуальній машині як це все буде працювати.
Встановлювати будемо FreeBSD 14.3, хоча вже вийшла 15, але там є цікаві зміни, з нею окремо пограюсь.
Звісно, можна було взяти TrueNAS, яка базується на FreeBSD – але хочеться “ванільної” FreeBSD і все поробити ручками.
Зміст
Установка FreeBSD через SSH
Установку будемо робити по SSH з bsdinstall – завантажимо систему в режимі LiveCD, включимо SSH, і далі вже з робочого ноута виконаємо установку системи.
На віртуальній машині є три диски – аналогічно тому, як це буде на ThinkCentre:
Вибираємо Live System:
Логінимось з root:
Піднімаємо мережу:
# ifconfig em0 up # dhclient em0
Налаштування SSH на FreeBSD LiveCD
Для SSH нам треба буде задати пароль root і робити зміни в /etc/ssh/sshd_config, але зараз це все не працює, бо система змонтована в read-only:
Дивимось, які розділи є зараз:
І робимо “dirty hack:
- монтуємо нову файлову систему
tmpfsв RAM на/mnt - копіюємо туди вміст
/etcз LiveCD - монтуємо
tmpfsповерх/etc(перекриваючи read-only каталог з ISO) - копіюємо підготовлені файли з
/mntназад у новий/etc
Виконуємо:
# mount -t tmpfs tmpfs /mnt # cp -a /etc/* /mnt/ # mount -t tmpfs tmpfs /etc # cp -a /mnt/* /etc/
Синтаксис mount для tmptfs – mount -t <fstype> <source> <mountpoint>, в source значення обов’язкове, тому ще раз вказуємо tmpfs.
Тепер задаємо пароль з passwd і стартуємо sshd з onestart:
# passwd # service sshd onestart
Але SSH все ще не пустить, бо по дефолту логін root заборонений:
$ ssh [email protected] ([email protected]) Password for root@: ([email protected]) Password for root@: ([email protected]) Password for root@:
Задаємо PermitRootLogin yes в /etc/ssh/sshd_config, ще раз рестартимо sshd:
# echo "PermitRootLogin yes" >> /etc/ssh/sshd_config # service sshd onerestart
Тепер можемо залогінитись:
$ ssh [email protected] ([email protected]) Password for root@: Last login: Sun Dec 7 12:19:25 2025 FreeBSD 14.3-RELEASE (GENERIC) releng/14.3-n271432-8c9ce319fef7 Welcome to FreeBSD! ... root@:~ #
Установка з bsdinstall
Запускаємо bsdinstall:
# bsdinstall
Вибираємо що будемо додавати в систему – ports треба, src опціонально, на реальному NAS точно варте:
Disk partitioning
Будемо робити мінімальну розбивку диска, тому вибираємо Manual:
Встановлювати систему будемо на ada0, вибираємо його і Create:
Далі треба вибрати схему, тут, в принципів, стандартно для 2025 року – GPT:
Підтверджуємо зміни, і маємо нову partition table на системному ada0:
Розділ freebsd-boot
Далі треба створити самі розділи.
Ще раз вибираємо ada0, Create, і створюємо розділ під freebsd-boot.
Це тільки зараз на віртуальній машині, на самому ThinkCentre тут будемо робити тип efi з розміром мегабайт у 200-500.
Зараз задаємо:
- Type:
freebsd-boot - Size: 512K
- Mountpoint: empty
- Label: empty
Підтверджуємо, йдемо до наступного розділу.
Розділ freebsd-swap
Ще раз Create, додаємо Swap.
Враховуючи що у нас на ThninkCentre будуть:
- 8 – 16 GB RAM
- без sleep/hibernate
- буде UFS і ZFS
То 2 гігабайти вистачить.
Задаємо:
- Type:
freebsd-swap - Size: 2GB
- Mountpoint: empty
- Label: empty
Розділ root з UFS
Основна система буде на UFS, бо вона дуже стабільна, не потребує для роботи RAM, швидко монтується, проста у відновленні, без складних механізмів кешування.
Задаємо:
- Type:
freebsd-ufs - Size: 14GB
- Mountpoint: /
- Label: rootfs – просто ім’я для нас
Решту дисків налаштуємо пізніше, зараз вибираємо Finish і Commit:
Finihsing installation
Чекаємо завершення копіювання:
Налаштовуємо мережу:
Таймзону:
В System Configuration – sshd, без мишки, включаємо ntpd і powerd:
System Hardening – враховуючи що це буде домашній NAS, але буду, мабуть, відкривати доступ ззовні, хоч і за фаєрволом – то є сенс трохи затюнити security:
read_msgbuf: дозволяємоdmesgтільки rootproc_debug: дозволяємоptraceтільки rootrandom_pid: номера PID в більш рандомному порядкуclear_tmp: чистимо/tmpпри ребутахsecure_console: вимагаємо парольrootпри логіні з фізичної консолі
Додаємо юзера:
Все готово – ребутаємо машину:
Створення ZFS RAID
Логінимось вже під звичайним юзером:
$ ssh [email protected] ... FreeBSD 14.3-RELEASE (GENERIC) releng/14.3-n271432-8c9ce319fef7 Welcome to FreeBSD! ... setevoy@test-nas-1:~ $
Встановлюємо vim 🙂
# pkg install vim
Перевіряємо що у нас з дисками.
З geom disk – інформація по фізичним девайсам, з gpart show – подивитись розділи на дисках.
Перевіряємо диски – три штуки:
root@test-nas-1:/home/setevoy # geom disk list Geom name: ada0 Providers: 1. Name: ada0 Mediasize: 17179869184 (16G) Sectorsize: 512 Mode: r2w2e3 descr: VBOX HARDDISK ident: VB262b53f7-adc5cd2c rotationrate: unknown fwsectors: 63 fwheads: 16 Geom name: ada1 Providers: 1. Name: ada1 Mediasize: 17179869184 (16G) Sectorsize: 512 Mode: r0w0e0 descr: VBOX HARDDISK ident: VB059f9d08-4b0e1f56 rotationrate: unknown fwsectors: 63 fwheads: 16 Geom name: ada2 Providers: 1. Name: ada2 Mediasize: 17179869184 (16G) Sectorsize: 512 Mode: r0w0e0 descr: VBOX HARDDISK ident: VB3941028c-3ea0d485 rotationrate: unknown fwsectors: 63 fwheads: 16
І з gpart – поточний ada0, на який встановлювали систему:
root@test-nas-1:/home/setevoy # gpart show
=> 40 33554352 ada0 GPT (16G)
40 1024 1 freebsd-boot (512K)
1064 4194304 2 freebsd-swap (2.0G)
4195368 29359024 3 freebsd-ufs (14G)
Диски ada1 та ada2 будуть під ZFS і його mirror (RAID1).
Якщо там щось було – все видаляємо:
root@test-nas-1:/home/setevoy # gpart destroy -F ada1 gpart: arg0 'ada1': Invalid argument root@test-nas-1:/home/setevoy # gpart destroy -F ada2 gpart: arg0 'ada2': Invalid argument
Але так як це віртуалка, і диски пусті – то маємо “Invalid argument”, зараз це ОК.
Створюємо GPT розмітку на ada1 та ada2:
root@test-nas-1:/home/setevoy # gpart create -s gpt ada1 ada1 created root@test-nas-1:/home/setevoy # gpart create -s gpt ada2 ada2 created
Перевіряємо:
root@test-nas-1:/home/setevoy # gpart show ada1
=> 40 33554352 ada1 GPT (16G)
40 33554352 - free - (16G)
Створюємо розділи під ZFS:
root@test-nas-1:/home/setevoy # gpart add -t freebsd-zfs ada1 ada1p1 added root@test-nas-1:/home/setevoy # gpart add -t freebsd-zfs ada2 ada2p1 added
Ще раз перевіряємо:
root@test-nas-1:/home/setevoy # gpart show ada1
=> 40 33554352 ada1 GPT (16G)
40 33554352 1 freebsd-zfs (16G)
Створення ZFS mirror із zpool
Вся “магія” ZFS – що в ньому все йде “з коробки” – не треба окремий LVM і його групи, не треба mdadm для RAID.
Для роботи з дисками в ZFS основна утиліта – zpool, для роботи з даними (datasets, файловими системами, снапшотами) – zfs.
Для об’єднання одного або кількох дисків у єдиний логічний storage ZFS використовує pool – в Linux LVM аналог volume group.
Створюємо пул:
root@test-nas-1:/home/setevoy # zpool create tank mirror ada1p1 ada2p1
Тут tank – ім’я пула, в mirror вказуємо, що це буде RAID1, і передаємо список розділів, які в цей пул включаються.
Перевіряємо:
root@test-nas-1:/home/setevoy # zpool status
pool: tank
state: ONLINE
config:
NAME STATE READ WRITE CKSUM
tank ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
ada1p1 ONLINE 0 0 0
ada2p1 ONLINE 0 0 0
errors: No known data errors
ZFS відразу монтує цей пул в /tank:
root@test-nas-1:/home/setevoy # mount /dev/ada0p3 on / (ufs, local, soft-updates, journaled soft-updates) devfs on /dev (devfs) tank on /tank (zfs, local, nfsv4acls)
Перевіряємо розділи зараз:
root@test-nas-1:/home/setevoy # gpart show
=> 40 33554352 ada0 GPT (16G)
40 1024 1 freebsd-boot (512K)
1064 4194304 2 freebsd-swap (2.0G)
4195368 29359024 3 freebsd-ufs (14G)
=> 40 33554352 ada1 GPT (16G)
40 33554352 1 freebsd-zfs (16G)
=> 40 33554352 ada2 GPT (16G)
40 33554352 1 freebsd-zfs (16G)
Якщо хочемо змінити маунтпоінт – виконуємо zfs set mountpoint:
root@test-nas-1:/home/setevoy # zfs set mountpoint=/data tank
І він відразу монтується в новий каталог:
root@test-nas-1:/home/setevoy # mount /dev/ada0p3 on / (ufs, local, soft-updates, journaled soft-updates) devfs on /dev (devfs) tank on /data (zfs, local, nfsv4acls)
Налаштовуємо компресію даних – корисно для NAS, див. Compression і Compressing ZFS File Systems.
lz4 – дефолтний варіант зараз, включаємо її:
root@test-nas-1:/home/setevoy # zfs set compression=lz4 tank
Так як саму систему ми встановлювали з UFS, то для роботи ZFS треба додати пару параметрів в автозапуск.
Налаштування boot loader в /boot/loader.conf аби завантажити модулі ядра:
zfs_load="YES"
Або, щоб не лазити руками – sysrc і з -f ім’я файлу:
root@test-nas-1:/home/setevoy # sysrc -f /boot/loader.conf zfs_load="YES"
І до /etc/rc.conf, аби запустити демон zfsd і змонтувати файлові системи:
root@test-nas-1:/home/setevoy # sysrc zfs_enable="YES" zfs_enable: NO -> YES
Ребутаємось, перевіряємо:
root@test-nas-1:/home/setevoy # zpool status
pool: tank
state: ONLINE
config:
NAME STATE READ WRITE CKSUM
tank ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
ada1p1 ONLINE 0 0 0
ada2p1 ONLINE 0 0 0
Все нам місці.
Тепер можна поробити всякий тюнінг – налаштувати окремі datasets, snapshots тощо.
Для Web UI можна буде спробувати Seafile чи FileBrowser.























