FreeBSD: налаштування ZFS RAID1 для домашнього NAS

Автор |  07/12/2025
 

Є в мене ідея підняти собі вдома 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 для tmptfsmount -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 тільки root
  • proc_debug: дозволяємо ptrace тільки root
  • random_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.