FreeBSD: Home NAS, part 6 – Samba server та підключення клієнтів

Автор |  27/12/2025
Click to rate this post!
[Total: 0 Average: 0]

Продовжуємо налаштовувати домашній NAS на FreeBSD.

Власне, NAS – Network System, і хочеться мати до нього доступ з інших девайсів – з Linux та Windows хостів, з телефонів, телевізорів.

Тут у нас на вибір дві основні опції – Samba та NFS. Можна, звісно, згадати і sshfs – але це рішення точно не для домашньої мережі (хоча простіше).

Я для себе вирішив для Windows (на ігровому ПК), Android телефонів та Android TV зробити доступ з Samba share – а NFS буде чисто для Linux систем для бекапів.

В цьому пості налаштуємо Samba на FreeBSD, а в наступному – додамо NFS.

Попередні пости цієї серії:

UPD: випадково нагуглив свій власний пост за 2012 рік – FreeBSD: установка и быстрая настройка сервера SAMBA… Зовсім забув, що колись вже це робив.

Установка Samba

Для Samba share створимо окремий ZFS dataset:

root@setevoy-nas:/home/setevoy # zfs create nas/share

Перевіряємо його:

root@setevoy-nas:/home/setevoy # zfs list nas/share
NAME        USED  AVAIL  REFER  MOUNTPOINT
nas/share    96K  3.51T    96K  /nas/share

Права доступу зараз – root:wheel:

root@setevoy-nas:/home/setevoy # ls -ld /nas/share
drwxr-xr-x  2 root wheel 2 Dec 26 15:46 /nas/share

Додаємо в систему нову групу:

root@setevoy-nas:/home/setevoy # pw groupadd smbshare

Додаємо нового юзера:

root@setevoy-nas:/home/setevoy # pw useradd smbshare -s /usr/sbin/nologin -g smbshare

Тут:

  • без домашньої директорії
  • без можливості логіна в систему – /usr/sbin/nologin
    • але якщо планується виконувати локальні операції від юзера – то створюємо з -s /bin/sh, а SSH все одно буде заблокований в sshd config (про SSH буде окремим постом)
  • і з -g smbshare вказуємо primary group

Перевіряємо юзера:

root@setevoy-nas:/home/setevoy # id smbshare
uid=1004(smbshare) gid=1004(smbshare) groups=1004(smbshare)

Міняємо права доступу на директорію для Samba:

root@setevoy-nas:/home/setevoy # chown smbshare:smbshare /nas/share

І права доступу до каталога тепер – можна глянути розширену інформацію з getfacl, аби отримати POSIX/NFSv4 ACL, які ZFS використовує замість класичних Unix-бітів:

root@setevoy-nas:/home/setevoy # getfacl /nas/share
# file: /nas/share
# owner: smbshare
# group: smbshare
            owner@:rwxp--aARWcCos:-------:allow
            group@:rwxp--a-R-c--s:-------:allow
         everyone@:------a-R-c--s:-------:allow

Тут для owner заданий повний доступ:

  • r: read data / list dir
  • w: write data / create file
  • x: execute / traverse
  • p: append
  • a: write ACL
  • A: read ACL
  • R: read attributes
  • W: write attributes
  • c: read named attributes
  • C: write named attributes
  • o: read ownership
  • s: write ownership

Налаштування ZFS ACL

Samba буде встановлювати власні права доступу, тому в параметрах ZFS ACL треба переключити режими.

Samba керує правами доступу самостійно, тому для ZFS ACL потрібно увімкнути режими passthrough, щоб ZFS не змінював ACL.

Перевіряємо параметри датасету зараз:

root@setevoy-nas:/home/setevoy # zfs get acltype,aclmode,aclinherit nas/share
NAME       PROPERTY    VALUE          SOURCE
nas/share  acltype     nfsv4          default
nas/share  aclmode     discard        default
nas/share  aclinherit  restricted     default

Задаємо aclmode та aclinherit в значення passthrough – тоді ZFS буде використовувати ті права, які задає Samba:

root@setevoy-nas:/home/setevoy # zfs set aclmode=passthrough nas/share
root@setevoy-nas:/home/setevoy # zfs set aclinherit=passthrough nas/share

Перевіряємо тепер:

root@setevoy-nas:/home/setevoy # zfs get acltype,aclmode,aclinherit nas/share
NAME       PROPERTY    VALUE          SOURCE
nas/share  acltype     nfsv4          default
nas/share  aclmode     passthrough    local
nas/share  aclinherit  passthrough    local

На відміну від acltype=off, який повністю вимикає ACL і залишає лише POSIX-права, режим passthrough дозволяє Samba керувати ACL без втручання ZFS.

Надалі зміни в директорії /nas/share краще виконувати від імені smbshare або root, а не звичайного користувача, щоб не порушувати модель прав доступу Samba.

Samba – налаштування загального доступу

Встановлюємо стабільну для FreeBSD версію 4.16:

root@setevoy-nas:~ # pkg install samba416

Додаємо до /etc/rc.conf:

root@setevoy-nas:~ # sysrc samba_server_enable=YES 
samba_server_enable: -> YES

Створюємо файл /usr/local/etc/smb4.conf з мінімальним конфігом:

[global]
   workgroup = WORKGROUP
   security = user

[shared]
   path = /nas/share
   read only = no

Тут:

  • workgroup: задаємо дефолтне WORKGROUP, тоді не треба буде вказувати на клієнтах
  • security = user: аутентифікацію та перевірку прав доступів виконує сама Samba
  • [shared]: ім’я шари (share name), яке потім будемо використовувати для підключень
  • path = /nas/share: реальний шлях на сервері

Див. smb4.conf.

Або більше детально, просто явно вказуємо деякі дефолтні опції:

[global]
   workgroup = WORKGROUP
   security = user

[shared]
   path = /nas/share
   read only = no
   browseable = yes
   valid users = @smbshare
   create mask = 0660
   directory mask = 2770

Перевіряємо синтаксис:

root@setevoy-nas:/home/setevoy # testparm
Load smb config files from /usr/local/etc/smb4.conf
Loaded services file OK.
Weak crypto is allowed

Server role: ROLE_STANDALONE

Press enter to see a dump of your service definitions

# Global parameters
[global]
        security = USER
        idmap config * : backend = tdb


[shared]
        create mask = 0660
        directory mask = 02770
        path = /nas/share
        read only = No
        valid users = @smbshare

Додаємо Samba-юзера:

root@setevoy-nas:/home/setevoy # smbpasswd -a smbshare
New SMB password:
Retype new SMB password:
Added user smbshare.

smbpasswd збереже його пароль в /var/db/samba4/private/passdb.tdb.

Запускаємо сервіс:

root@setevoy-nas:~ # service samba_server start 
Performing sanity check on Samba configuration: OK 
Starting nmbd. 
Starting smbd.

Перевіряємо порт:

root@setevoy-nas:/home/setevoy # sockstat -4 | grep smb
root     smbd       17621 31  tcp4   *:445                 *:*
root     smbd       17621 32  tcp4   *:139                 *:*

Пробуємо підключитись локально:

root@setevoy-nas:/home/setevoy # smbclient //localhost/shared -U smbshare
Password for [WORKGROUP\smbshare]:
Try "help" to get a list of possible commands.
smb: \>

Робимо list files – поки тут пусто:

smb: \> ls
  .                                   D        0  Fri Dec 26 15:46:55 2025
  ..                                  D        0  Fri Dec 26 15:46:55 2025

                3771191492 blocks of size 1024. 3771191396 blocks available

Копіюємо щось із системи:

smb: \> put /etc/hosts hosts.test
putting file /etc/hosts as \hosts.test (252.7 kb/s) (average 252.7 kb/s)
smb: \> ls hosts.test
  hosts.test                          A     1035  Fri Dec 26 16:14:29 2025

                3771191480 blocks of size 1024. 3771191380 blocks available

І тепер маємо файл в /nas/share:

root@setevoy-nas:/home/setevoy # ls -l /nas/share
total 5
-rw-rw----  1 smbshare smbshare 1035 Dec 26 16:14 hosts.test

Відкриваємо доступ до Samba на pf firewall (див. FreeBSD: Home NAS, part 2 – знайомство з Packet Filter (PF) firewall):

...
### SMB
pass in on em0 proto tcp from { 192.168.0.0/24, 192.168.100.0/24, 10.8.0.0/24 } to any port 445 keep state
...

Перевіряємо конфіг pf, виконуємо reload:

root@setevoy-nas:/home/setevoy # pfctl -vnf /etc/pf.conf && service pf reload

Arch Linux та Samba share

Встановлюємо пакети:

[setevoy@setevoy-work ~] $ sudo pacman -S smbclient cifs-utils
  • smbclient: Samba CLI
  • cifs-utils: утиліти для роботи з Samba share через CIFS:
    • mount -t cifs
    • запису в /etc/fstab
    • systemd automount

Перевіряємо підключення з Linux до Samba на FreeBSD:

[setevoy@setevoy-work ~]  $ smbclient //192.168.0.2/shared -U smbshare
Can't load /etc/samba/smb.conf - run testparm to debug it
Password for [WORKGROUP\smbshare]:
Try "help" to get a list of possible commands.
smb: \>

Ще раз list – все на місці:

smb: \> ls hosts.test
  hosts.test                          A     1035  Fri Dec 26 16:14:29 2025

                3771191480 blocks of size 1024. 3771191380 blocks available

Налаштування /etc/fstab та systemd-automount

Якщо хочемо, аби шара підключалась автоматично – налаштуємо /etc/fstab та systemd-automount.

На клієнті створюємо каталог, в який буде підключатись /nas/share з серверу:

[setevoy@setevoy-work ~] $ sudo mkdir -p /mnt/nas-shared

Створюємо файл /root/.smbcredentials з логіном та паролем:

username=smbshare
password=<PASSWORD>

Задаємо доступ тільки для root:

[setevoy@setevoy-work ~] $ sudo chmod 600 /root/.smbcredentials

Отримуємо user id:

[setevoy@setevoy-work ~]  $ id setevoy
uid=1000(setevoy) gid=1000(setevoy) groups=1000(setevoy),998(wheel),964(ollama),962(docker)

Редагуємо /etc/fstab:

...
# NAS Samba share
//192.168.0.2/shared  /mnt/nas-shared  cifs  credentials=/root/.smbcredentials,iocharset=utf8,uid=1000,gid=1000,nofail,_netdev,noauto,x-systemd.automount,serverino,noperm  0  0

Тут:

  • 192.168.0.2/shared: адреса хоста та ім’я шари з /usr/local/etc/smb4.conf
  • /mnt/nas-shared: куди монтуємо локально
  • cifs: ти файлової системи
  • credentials=/root/.smbcredentials: де брати логін та пароль
  • iocharset=utf8: використовувати UTF-8 для імен файлів (коректні кирилиця та спецсимволи).
  • uid=1000: файли на клієнті відображаються як власність користувача з UID 1000 (робили id setevoy вище)
  • gid=1000: файли відображаються з групою GID 1000
  • nofail: система завантажиться навіть якщо ресурс недоступний (must have для мережевих систем)
  • _netdev: мережевий ресурс, монтується після підняття мережі
  • noauto: не монтувати автоматично під час boot
  • x-systemd.automount: монтувати автоматично при першому доступі через systemd-unit (див. далі)
  • serverino: використовувати inode-номери сервера
  • noperm: ігнорувати локальну перевірку прав доступу, покладаючись на сервер (Samba)

Зберігаємо зміни, виконуємо sudo systemctl daemon-reload, і тепер у нас є два нових файли в /run/systemd/generator/:

[setevoy@setevoy-work ~]  $ ll /run/systemd/generator/ | grep share
-rw-r--r-- 1 root root 176 Dec 27 07:41 mnt-nas\x2dshared.automount
-rw-r--r-- 1 root root 342 Dec 27 07:41 mnt-nas\x2dshared.mount

Через файл mnt-nas\x2dshared.automount systemd відстежує доступ до /mnt/nas-shared, і як тільки ми виконаємо якусь дію (наприклад, cd /mnt/nas-shared) – systemd виконає mnt-nas\x2dshared.mount, який власне підключить розділ.

Див. systemd.automount та Understanding systemd Automounts: Why /dev/sda1 Becomes systemd-1 and How to Tame It.

Перевіряємо:

[setevoy@setevoy-work ~]  $ ls -l /mnt/nas-shared/
total 10626126
-rwxr-xr-x 1 setevoy setevoy 1359900672 Dec 26 17:03  FreeBSD-15.0-RELEASE-amd64-disc1.iso
-rwxr-xr-x 1 setevoy setevoy 9817684824 Dec 26 14:35 'Odin.doma.(1990).BDRip.1080p.[envy].[60fps].mkv'
-rwxr-xr-x 1 setevoy setevoy       1035 Dec 26 16:14  hosts.test

І тепер каталог є в mounted:

[setevoy@setevoy-work ~]  $ findmnt /mnt/nas-shared
TARGET          SOURCE FSTYPE OPTIONS
/mnt/nas-shared systemd-1
                       autofs rw,relatime,fd=94,pgrp=1,timeout=0,minproto=5,maxproto=5,direct,pipe_ino=17332707
/mnt/nas-shared //192.168.0.2/shared
                       cifs   rw,relatime,vers=3.1.1,cache=strict,upcall_target=app,username=smbshare,uid=1000,forceuid,gid=1000,forcegid,addr=192.168.0.2,file_mode=0755,dir_mode=0755,iocharset=utf

Перевірка швидкості запису

Робив, аби порівняти з NFS – різниці не побачив, але нехай тут буде приклад.

Самий надійний варіант – копіювати з dd, додавши oflag=direct та status=progress:

$ dd if=Downloads/FreeBSD-15.0-RELEASE-amd64-disc1.iso of=/mnt/nas-shared/FreeBSD-15.0-RELEASE-amd64-disc1.iso bs=16M oflag=direct status=progress
1325400064 bytes (1.3 GB, 1.2 GiB) copied, 23 s, 57.5 MB/s1359900672 bytes (1.4 GB, 1.3 GiB) copied, 23.5906 s, 57.6 MB/s

81+1 records in
81+1 records out
1359900672 bytes (1.4 GB, 1.3 GiB) copied, 23.7558 s, 57.2 MB/s

57.2 MB/s, тобто 457.6 Mbit/s. При тому, що ноут зараз на WiFi – цілком нормальна швидкість.

Підключення Samba клієнтів

І приклади того, як до Samba підключитись з різних девайсів.

Samba та KDE Dolphin

Взагалі, ми вже зробили automount через systemd, але можна відкрити напряму з KDE Dolphin file manager – вказуємо адресу smb://192.168.0.2, вводимо логін-пароль:

І маємо доступ до файлів на сервері:

Samba та Android phone

Спробував Solid Explorer File Manager – простий, все працює.

Додаємо в ньому нове підключення LAN/SMB:

Вказуємо адресу та порт сервера:

Вибираємо аутентифікацію по логіну-паролю:

Вказуємо їх:

Підтверджуємо:

І підключаємось:

Файли на сервері тепер доступні з телефону:

Samba та Android TV

Доступ з File Manager

Для Android TV є додаток File Manager, встановлюємо:

Вибираємо новий location, тип Remote:

Вибираємо тип SMB:

Вказуємо тільки адресу, без порта, логін та пароль:

І тепер файли доступі з телевізора:

Відео-файли можна запускати прямо звідси – або налаштувати MX Player.

Доступ з MX Player

Аналогічно – встановлюємо додаток, відкриваємо налатування, вибираємо Local network:

Вказуємо IP, логін, пароль:

І маємо доступ до відеофайлів:

Готово.