Перейти к содержанию

▍ Samba

Вводная информация

Переменные Значения
Samba сервер srv-nas 192.168.0.10
zpool Z2TB
dataset Z2TB/foto примонтирован в /z/foto

Установка и настройка Samba сервера

В данном примере настроем самбу с поддержкой теневых копий и наш сервер будет автоматически отображаться в файловых менеджерах как на стороне linux, так и windows клиентах.

Установка сервера:

sudo apt install samba

Конфиг:

sudo nano /etc/samba/smb.conf
[global]
   interfaces = lo 192.168.0.0/24
   bind interfaces only = yes
   workgroup = WORKGROUP
   dns proxy = no
   dos charset = cp866
   unix charset = UTF8
   log file = /var/log/samba/%m.log
   max log size = 1000
   netbios name = srv-nas
   server string = NAS
   client min protocol = SMB3
   client max protocol = SMB3
   server role = standalone server
   server services = +smb -s3fs
   dcerpc endpoint servers = +winreg +srvsvc
   passdb backend = tdbsam
   obey pam restrictions = yes
   unix password sync = yes
   passwd program = /usr/bin/passwd %u
   passwd chat = *New*UNIX*password* %n\n *ReType*new*UNIX*password* %n\n *passwd:*all*authentication*tokens*updated*successfully*
   pam password change = yes
   map to guest = Bad Password
   usershare allow guests = yes
   name resolve order = lmhosts bcast host wins
   security = user
   guest account = nobody
   usershare max shares = 100
   usershare owner only = yes
   force create mode = 0070
   force directory mode = 0070
   keepalive = 0
   load printers = no
   printing = bsd
   printcap name = /dev/null
#
   vfs objects = acl_xattr
   map acl inherit = yes


[foto]
    path = /z/foto
    valid users = daffin

    browsable = yes
    writable = yes
    printable = no
    read only = no
    guest ok = no
    public = no

    nfs4:mode = special
    nfs4:acedup = merge
    nfs4:chown = no

    store dos attributes = yes

    map hidden = no
    map system = no
    map archive = no
    map readonly = no

    vfs objects = shadow_copy2
    shadow:basedir = /z/foto
    shadow:snapdir = .zfs/snapshot
    shadow:format = GMT-%Y.%m.%d_%H.%M.%S
    shadow:sort = desc
    shadow:localtime = yes

Добавляем пользователя, который сможет подключиться к шаре:

sudo smbpasswd -a daffin

Посмотреть добавленного пользователя:

┌─( [email protected] ) - ( 29 files,  ) - ( ~ )
└─> sudo pdbedit -L
daffin:1000:daffin

Проверяем корректность конфига /etc/samba/smb.conf

sudo testparm

Если всё нормально, то рестартим сервер:

sudo systemctl restart smbd.service

Настройка теневых копий

Для их настройки необходимо включить просмотр списка снапшотов в виде файлов:

sudo zpool set listsnapshots=on Z2TB

, т.к. по умолчанию настройка выключена:

┌─( [email protected] ) - ( 29 files,  ) - ( ~ )
└─> zpool get listsnapshots 
NAME     PROPERTY       VALUE      SOURCE
Z2TB     listsnapshots  off        default

теперь увидеть наши снапшоты можем командой:

┌─( [email protected] ) - ( 29 files,  ) - ( ~ )
└─> ls -l /z/foto/.zfs/snapshot/
total 0
drwxrwxrwx 2 root root 2 авг 10 12:53 ./
drwxrwxrwx 1 root root 0 авг  9 12:02 ../
drwxrwxrwx 1 root root 0 авг 10 12:55 GMT-2023.08.10_12.49.49/
drwxrwxrwx 1 root root 0 авг 10 12:55 GMT-2023.08.10_12.50.41/
drwxrwxrwx 1 root root 0 авг 10 12:55 GMT-2023.08.10_12.53.57/

Скрипт создания снапшотов

sudo nano /root/bin/zfssnap.sh
#!/bin/bash

zpool="$1"
prefix="GMT-"

# Количество копий выше которых будут удаляться старые снапшоты
retention=60

if [ -z "$1" ]
  then
    echo "Укажите датасет для создания снапшота"
    exit 1;
fi

# Полные пути до утилит для запуске скрипта из cron
date=/usr/bin/date
grep=/usr/bin/grep
sed=/usr/bin/sed
sort=/usr/bin/sort
xargs=/usr/bin/xargs
zfs=/usr/bin/zfs


today="$prefix`date +%Y.%m.%d_%H.%M.%S`"
snap_today="$zpool@$today"
snap_old=`$zfs list -t snapshot -o name | $grep "$zpool@$prefix*" | $sort -r | $sed 1,${retention}d | $xargs -n 1`

log=/var/log/zfssnap

#### Добавляем дату запуска скрипта в лог
echo >> $log
$date >> $log
echo >> $log
####

echo "Делаем снапшот: $snap_today" >> $log
$zfs snapshot -r $snap_today >> $log 2>&1

echo >> $log

# Удаляем снапшоты старше, чем значение, присвоенное в $retention
echo "Пробуем удалить старые снапшоты..." >> $log

if [ -n "$snap_old" ]
then
    echo "Удаляем следующие снапшоты:" >> $log
    echo "$snap_old" >> $log
    $zfs list -t snapshot -o name | $grep "$zpool@$prefix*" | $sort -r | $sed 1,${retention}d | $xargs -n 1 $zfs destroy -r >> $log 2>&1
else
    echo "Пока нет снапшотов для удаления." >> $log
fi

echo "**********" >> $log
exit 0

делаем его исполняемым:

sudo chmod +x /root/bin/zfssnap.sh

и добавляем в cron

sudo crontab -e
0 12,18 * * * /root/bin/zfssnap.sh Z2TB/foto                         > /dev/null 2>&1
в данном примере скрипт будет запускаться два раза в день в 12 и в 18 часов.

На стороне самба сервера отображение теневых копий отвечает следующая часть из приведённого ранее конфига:

sudo nano /etc/samba/smb.conf
...
[foto]
...
    vfs objects = shadow_copy2
    shadow:basedir = /z/foto
    shadow:snapdir = .zfs/snapshot
    shadow:format = GMT-%Y.%m.%d_%H.%M.%S
    shadow:sort = desc
    shadow:localtime = yes
...

Samba win10 shadow copy

Настройка Avahi

Теперь чтобы наши шары были видны у linux клиентах необходимо на стороне сервера установить сервисы обнаружения, в частности Avahi:

sudo apt install avahi-utils

Список доступных серверов samba:

┌─( [email protected] ) - ( 107 files, 1,6M ) - ( ~ )
└─> sudo avahi-browse -r _smb._tcp

+   eth0 IPv4 SRV-NAS                                       Служба сети Microsoft local
+   eth0 IPv6 SRV-NAS                                       Служба сети Microsoft local
=   eth0 IPv4 SRV-NAS                                       Служба сети Microsoft local
   hostname = [srv-nas.local]
   address = [192.168.0.10]
   port = [445]
   txt = []
=   eth0 IPv6 SRV-NAS                                       Служба сети Microsoft local
   hostname = [srv-nas.local]
   address = [fe80::2726:1cff:feb7:3ceb]
   port = [445]
   txt = []

Настройка WSDD

Для windows клиентов необходимо установить wsdd (Web Service Discovery host daemon)

sudo apt install wsdd

По умолчанию служба работает на всех интерфейсах и протоколах, если мы хотим изменить данное поведение, то следует добавить необходимые опции в файл /etc/default/wsdd, в нем находится единственная допустимая опция:

WSDD_PARAMS=""

Так, например, если мы хотим ограничить работу службы только интерфейсом enp3s0 и протоколом IPv4, то добавим:

WSDD_PARAMS="--interface enp3s0 --ipv4only"

Рестартим службу

sudo systemctl restart wsdd

Для нормальной работы службы вам также нужно разрешить в брандмауэре входящие соединения для UDP 3702 и TCP 5357.

Со стороны Windows делать ничего не нужно, Samba сервера автоматически появятся в сетевом окружении. Samba win10 wsdd

Команды для диагностики

nmblookup -M WORKGROUP
smbclient -L localhost -d 9
smbclient -L srv-nas -N
smbstatus
К началу