Снапшоты на ZFS и Samba
В рамках данной инструкции мы рассмотрим:
- Создание снапшотов на диске с файловой системой ZFS.
- Написание скрипта для автоматического создания снапшотов.
- Настройку Samba для работы со снапшотами в оконном интерфейсе.
Предполагается, что у нас уже настроен файловый сервер Samba. В противном случае можно воспользоваться инструкциями Установка и настройка файлового сервера Samba на Ubuntu или Установка и настройка файлового сервера Samba на CentOS 8.
Приступим.
Создание снапшотов
Скрипт для создания снапшотов
Настройка Samba
Проверка настройки
Автоматическая чистка
Настройка ZFS и создание снапшотов
В инструкции не будет подробно рассмотрена работа с файловой системой ZFS — только основные команды, которые нужны для решения нашего вопроса.
Предположим, у нас есть диск /dev/sdb, на котором мы планируем создать ZFS. Вводим команду:
zpool create data /dev/sdb
* в результате будет создан пул data (имя задается произвольно), а диск /dev/sdb отформатирован в файловой системе ZFS. Также последняя будет примонтирована в раздел /data (название зависит от название пула).
Если мы хотим изменить точку монтирования для нашего пула, отмонтируем его:
zfs umount data
Задаем в настройке точку монтирования:
zfs set mountpoint=/mnt/data data
* в данном примере, мы хотим пул data монтировать в раздел /mnt/data.
Снова монтируем пул:
zfs mount data
Он будет примонтирован уже по новому пути.
Файловая система настроена. Идем дальше.
Автоматическое создание снапшотов
Создадим каталог для размещения скрипта:
mkdir /scripts
Создадим скрипт:
vi /scripts/mksnapshot.sh
#!/bin/bash
PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
zpool="data"
prefix="GMT-"
zfs snapshot $zpool@$prefix`date +%Y.%m.%d_%H.%M.%S`
* данный небольшой скрипт будет создавать снапшот для пула data. Формат для именования зависит от даты и времени и задается маской <год>.<месяц>.<день>_<час>.<минута>.<секунда>.
Разрешаем запуск скрипта на выполнение:
chmod u+x /scripts/mksnapshot.sh
Пробуем создать снапшот:
/scripts/mksnapshot.sh
Посмотреть список снапшотов можно командой:
zfs list -t snapshot
Теперь внесем изменения в файловой системе, например, создадим или отредактируем файл.
Снова создаем снапшот:
/scripts/mksnapshot.sh
Посмотрев список снапшотов:
zfs list -t snapshot
... мы увидим, что их стало больше.
Разрешим просмотр списка снапшотов:
zpool set listsnapshots=on data
Посмотрим содержимое каталога со снапшотами:
ls -l /data/.zfs/snapshot/
Обратите внимание, что каталог .zfs команда ls не отображает, даже, с опцией -a. Но если прописать путь с каталогом .zfs, система вернет список папок с предыдущими версиями файлов.
Мы должны увидеть два каталога с созданными нами снапшотами. Если походить по ним, то мы увидим файлы и изменениями. Таким образом можно убедиться, что наша настройка работает.
Теперь откроем на редактирование крон, чтобы настроить автоматический запуск скрипта:
crontab -e
0 13,19 * * * /scripts/mksnapshot.sh
* в данной настройке мы будет запускать создание снапшота дважды в день — в 13:00 и в 19:00.
По части файловой системы работы завершены. Переходим к Samba.
Настройка Samba
Открываем конфигурационный файл, чтобы настроить нашу шару:
vi /etc/samba/smb.conf
Предполагается, что наш файловый сервер уже настроен и в нем есть общая папка Архив. Чтобы у нас была возможность просматривать ее снапшоты, добавляем:
[Архив]
...
vfs objects = shadow_copy2
shadow:basedir = /data
shadow:snapdir = .zfs/snapshot
shadow:format = GMT-%Y.%m.%d_%H.%M.%S
shadow:sort = desc
shadow:localtime = yes
* где:
- vfs objects — дополнения, которые используются Samba в операциях ввода вывода VFS. Если мы используем несколько подсистем, то перечисляем их через запятую.
- shadow:basedir — корневой каталог, относительно которого выполняется поиск снапшотов.
- shadow:snapdir — каталог, в котором находятся снапшоты. Мы его задаем относительно shadow:basedir. Итого, в нашем примере будет /data/.zfs/snapshot.
- shadow:format — формат созданного снапшота. Тут важно, чтобы он совпадал с форматом создания (который мы задали в скрипте).
- shadow:sort — в каком порядке сортируем список. В нашем примере сверху будут наиболее свежие.
- shadow:localtime — определяет используются ли имена моментальных снимков в формате UTC/GMT или по местному времени.
Перезапускаем самбу, чтобы применить настройки:
systemctl restart smbd
Настройка завершена. Проверим.
Просмотр предыдущих версий в свойствах папки
Откроем шару, например, с компьютера Windows. Кликнем правой кнопкой мыши внутри нашей папки (Архив) и выберем Свойства. Перейдем на вкладку Предыдущие версии — мы должны увидеть, примерно, такую картину:
Как видим, у нас есть три снапшота.
Автоматическая чистка
Также приведем пример скрипта для автоматической чистки снапшотов:
vi /scripts/clean_snaphots.sh
#!/bin/bash
PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
count_to_live=30
count_snapshots=$(zfs list -t snapshot | wc -l)
if [ $count_snapshots -gt $count_to_live ]
then
count_to_delete=$(($count_snapshots - $count_to_live))
zfs list -t snapshot -o name -S creation | tail -n +$count_to_delete | xargs -n 1 zfs destroy -r
fi
* в данном примере мы намерены хранить последние 30 снапшотов (переменная count_to_live).