Часть первая: Исследование возможности импортозамещения файлового сервер
В этой части про практическую реализацию файлового сервера на отечественном стеке
Дисклеймер
Данная статья представляет собой личное мнение автора о требованиях и работе файловых серверов. Предназначена в первую очередь чтобы поделится собственным опытом. Информация, изложенная в статье, основана на собственных исследованиях и опыте работы, и может не отражать общепринятые мнения или практики. Автор не стремится выставить кого-либо в плохом свете и призывает к конструктивному обсуждению. Рекомендуется дополнительно изучать источники для более глубокого понимания темы.
Хотелось бы привести тут пару тройку скриншотов где было бы GUI с развёртыванием сервиса и сказать что всё довольно просто. Увы но очень много особенностей и текста в связи с этим максимально по верхам без глубокого погружения в темы.
Муки выбора
Как я упомянул в прошлой статье есть потребность в функционале также есть идеи их реализации, как можно сделать файловый сервер на Astra Linux, производитель к сожалению по сути «не предоставляет» готового решения, но есть конструктор.
Варианты конструктора и почему я выбрал то что выбрал:
Astra Linux GUI +LVM+ext4+ Samba Server + xattr — Многие скажут зачем усложнять и возможно будут правы. Да Samba умеет эмулировать права NTFS. Но права будут только в Samba никак использовать данные о правах кроме как в самбе не выйдет. Для управления этими правами потребуется Windows машина или смирение с RWX правами. Невозможностью использования указанных прав при отдачи по иным протоколам. Будут проблемы с регистра зависимостью. Также решение не позволит реализовать дедупликацию и сжатие данных. Проблема с длинной имён файлов останется не решённой. С реализацией теневых копий будут значимые проблемы.
Astra Linux GUI +btrfs+ Samba Server — Заметно веселее, Уже есть snapshot`ы и сжатие данных, но теже права rwx без перспектив появления чего-то более весёлого. Регистра зависимость. Проблема с длинной имён файлов останется не решённой (я не нашел как реализовать длину имени файла более 255 символов).
Astra Linux GUI +NTFS+ Samba Server — крайне заманчивая идея, но это очевидная заплатка и главное для управления нужна Windows машина.
Astra Linux GUI +ZFS+ Samba Server — по сути дела максимально приближенное решение к Windows Server. ОС Linux без патчей не поддерживает полноценно права по модели NFSv4 но фундаментально это возможно (см.TrueNAS от iXsystems), как заметил @xanto в комментарии к предыдущей статье в релизе ZFS 2.3 появится поддержка long names, а пока я понимаю как сделать RWX ( понимаю что NFSv4 можно ожидать в ближайших релизах очень надеюсь на содействие и необходимые патчи от Астры, Рэдсофт и Базальт СПО), есть snapshot`ы, дедупликация и сжатие данных, наследование прав и нечувствительность к регистру.
т.к. моё блокирующее правило выбора, реальное импортозамещение, выбран вариант с ZFS о нём далее:
План развёртывания:
->Разворачиваем актуальную версию Astra Linux 1.8.1.12 на ядре 6.1 (на ядре 6.6 не работает ZFS из коробки) 4vCPU+10Gb ОЗУ+ HDD 60Gb (astra) + НDD 2Tb (UserData) за пределами этой статьи
->поиск на источнике файлов длина имени файлов более 255 байт и решение проблем
->Устанавливаем необходимые пакеты
->Настройка Kerberos
->Настройка Samba server
->включение в домен MS AD
->Настройка ZFS
->Настройка утёных записей доменных администраторов для управления сервером
->Применение матрицы доступа на сетевую шару и последующая заливка данных.
Подложим соломку т.е. ищем длинные имена файлов
Для того чтобы не наступить на грабли того, что файловая система в Linux не может сохранить файл с длинной имени файла более 128 символов на кирилице предварительно в Windows Server рекомендую проверить шары на факт наличия в них файлов что не влезут в файловую систему Linux
Пример скрипта на PowerShell для этих целей.
# Укажите путь к папке, в которой нужно искать файлы
$folderPath = «C:\»
# Укажите файл в который сохранить результат
$ResultSaveToFile =»C:\FileToRename.txt»# Функция для получения размера имени файла в байтах
function Get-FileNameSizeInBytes {
param ( [string]$fileName )
return [System.Text.Encoding]::UTF8.GetByteCount($fileName)
}# Ищем файлы с не-латинскими символами в имени и длиной больше maxLength
$files = Get-ChildItem -Path $folderPath -Recurse -File | Where-Object { (Get-FileNameSizeInBytes $_.Name) -gt 255 }# Сохраним результаты в файл
$files | ForEach-Object { $_.FullName } | Set-Content -Path $ResultSaveToFile -Encoding UTF8
If ($files.count -ge 1) {
Write-Host «Поиск завершен. Результаты сохранены в FileToRename.txt» -ForegroundColor Green
} else {Write-Host «Поиск завершен. Не найдены файлы с длинной имени более 255 байт» -ForegroundColor Green}
Соответственно все найденные файлы нужно переименовать так чтобы у них были более короткие имена которые влезут в конечную файловую систему.
Настройка репозиториев:
После установки астра работает только с репой из диска, правим файл
/etc/apt/source.list
так чтобы стало:
nano /etc/apt/source.list
deb https://download.astralinux.ru/astra/stable/1.8_x86-64/repository-main/ 1.8_x86-64 main contrib non-free non-free-firmware
deb https://download.astralinux.ru/astra/stable/1.8_x86-64/repository-extended/ 1.8_x86-64 main contrib non-free non-free-firmware
Если вы в изолированной среде то можно с ISO образы астры подключить в них тоже самое.
Установка пакетов:
sudo apt install -y krb5-user winbind libpam-krb5 libpam-winbind libnss-winbind acl attr dnsutils chrony samba zfsutils-linux smbldap-tools zfs-$(uname -r) zfsutils-linux
sudo reboot
и подключение модуля ядра ZFS
sudo /sbin/modprobe zfs
sudo reboot
Настройка синхронизации времени
Создаём файл конфигурации для синхронизации времени:
nano /etc/chrony/conf.d/<имя домена>.conf
Содержимым (указываем все контроллеры домена + хотябы один IP адрес сервера с которым можем синхронизироваться метка prefer обозначает что этот узел предпочтителен для синхронизации времени):
server <FQDN имя вашего контроллера домена №1> prefer
server dc2.habr.ru.
server <IP адрес хотя бы одного контроллера домена>
Остальные серверы из конфига /etc/chrony/chrony.conf вероятно лучше закомментировать время важно! в целом может быть каким угодно, но главное чтобы одним в домене.
Настройка Kerberos
Переводим текущие настройки в резерв.
mv /etc/krb5.conf /etc/krb5.conf.backup
Формируем файл /etc/krb5.conf
Замените habr.ru на свой домен и контроллеры домена. Регистр написания имени домена важен, habr.ru неравен hAbr.RU из за этого могут быть проблемы при вводе в домен.
[libdefaults]
default_realm = HABR.RU
kdc_timesync = 1
ccache_type = 4
forwardable = true
proxiable = true
[realms]
HABR.RU = {
kdc = dc1.habr.ru
kdc = dc2.habr.ru
kdc = dc3.habr.ru
admin_server = dc3.habr.ru
default_domain = habr.ru
}
[domain_realm]
.habr.ru = HABR.RU
habr.ru = HABR.RU
[login]
krb4_convert = false
krb4_get_tickets = false
Проверяем как работает в (на этом этапе вам потребуется пользователь из домена)
kinit <имя пользователя из домена >
Должно спросить пароль и не выдать ошибок если выдаёт ошибки пробуйте различное написание помните linux регистразависимый.
Настройка Samba
nano /etc/samba/smb.conf
[global]
security = ADS
server string= Fileserver
workgroup = HABR
realm = habr.ru
idmap config * : backend = tdb
idmap config * : range = 3000-7999idmap config habr.ru : backend = rid
idmap config habr.ru : range = 10000-999999template shell = /bin/bash
template homedir = /home/%U@%Dclient min protocol = SMB2
client max protocol = SMB3
winbind enum groups = yes
winbind enum users = yes
winbind nested groups = yes
winbind use default domain = yes
winbind refresh tickets = yesunix charset = utf-8
dos charset = cp866
nt acl support = yes
acl group control = yes
map acl inherit = yes
unix password sync = yes
preferred master = No
local master = No
domain master = No
wide links = yes
Конфиг рабочий, описание параметров тут https://www.samba.org/samba/docs/man/ Вам нужно заменить имя домена. Также обращаю внимание что имя должно быть в томже регистре что ваш домен был записан во время создания. Регистр написания имени домена важен, habr.ru неравен hAbr.RU из за этого могут быть проблемы при вводе в домен.
К сожалению если тут всё писать то статья станет совсем монструозной
#Рестарт служб связанных с Samba server
sudo systemctl restart winbind smbd nmbd
Ввод в домен:
После того как у нас верно сконфигурированы Kerberos (получен билет) и Samba, можно подключаться к домену. При помощи утилиты net ads join
net ads join -U habr.adm
где,
— habr.adm это имя пользователя которому разрешено добавление в домен (также можно указывать с доменом в формате habr.adm@HABR.RU)
Если при подключении возникнет ошибка «DNS Update for test-astra-fs.habr.ru failed: ERROR_DNS_UPDATE_FAILED» не пугаемся вероятно у вас просто не обновилась DNS запись это к вопросу настройки вашего DNS но бывает относительно часто…
Проверяем статус
sudo net ads testjoin
Если вернёт «Join is OK» ваш компьютер в домене
Настройка ZFS
Веб справка по файловой системе и командам: https://openzfs.github.io/openzfs-docs/man/master/index.html#master . Также можно глянуть базовую справку по ZFS тут
Особо отмечу что ZFS жадная до ОЗУ, в случае если используется дедупликация 1Tb храниища требует дополнительно 2-5Gb ОЗУ. Также в ZFS можно настроить несколько уровней кеширования как в ОЗУ так и на SSD что позволит построить весьма весёлые файлохранилище
Создаём пул:
sudo zpool create \
-o ashift=12 \
-o autotrim=on \
-o compression=on \
-O acltype=posixacl \
-O xattr=on \
-O dedup=on \
-O recordsize=16 \
zpool vdb
где
— vdb имя диска/дисков на котором у нас данные
Создаём набор данных DataSet
sudo zfs create \
-o casesensitivity=insensitive \
-o aclmode=passthrough \
-o aclinherit=passthrough \
-o acltype=posix \
-o recordsize=8k \
-o quota=1G \
-o reservation=1G \
zpool/scan
casesensitivity — указание чувствительности к регистру файловой системы (может быть указано только при создании)
recordsize — размер блока данных (по умолчанию 128кб что не всегда оптимально, сложный параметр есть много аспектов связанных с дедупликацией и особенностями работы RAID) рекомендуется менять осознано после погружения в тему. Базово если в основном файлы мелкие docx/xlsx (по 10-100кб) и не используется RAID массив ZFS то имеет смысл сделать меньше 128 если хранятся файлы в среднем более 128 КБ то можно делать и больше моя личная рекомендация от 4k до 16k.
dedup — состояние де дупликации on/off (необязательно указывать)
compression — включение/отключение режима сжатия данных (необязательно указывать)
quota — указание квоты для этого набора данных (необязательно указывать)
reservation — резервирование места на диске под это конкретный датасет (необязательно указывать)
aclmode — тип наследования прав при создании папки файла.
acltype — тип используемых прав, три значения off | nfsv4 | posix нам сейчас нужен posixaclinherit — определяет, как наследуются права доступа (ACL) в каталогах.
Для создания снапшотов используется комманда
zfs snapshot pool_name/dataset_name@snapshot_name
я создал файл и дёргаю его из планировщика (старый снапшоты тоже удаляю)
#!/bin/bash
PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
zpool=»zpool/scan»
prefix=»UTC-«
zfs snapshot $zpool@$prefix`date -u +%Y%m%d-%H:%M:%S`
Создаём файловые шары
Тут магия
[scan]
path = /zpool/scan/scan read only =no
browseable = yes
valid users = @HABR\domain users»
admin users = @»HABR\domain admin»
force group = astra-admin
vfs objects = shadow_copy2 io_uring
inherit permissions = yes
inherit acls = yes
shadow:mountpoint = /zpool/scan/
shadow:snapdir = .zfs/snapshot
shadow:format = UTC-%Y%m%d-%H:%M:%S
shadow:sort = desc
shadow:localtime = no
чуть расшифрую:
[имя шары]
path = <путь к папке >
read only =no
browseable = yes
valid users = <Пользователи или группы имеющие доступ к шаре>
admin users = <Пользователи или группы имеющие доступ на администрирование шары>
inherit permissions = yes #передавать наследование в файловую систему
inherit acls = yes # передавать наследование в файловую систему
force group = astra-admin #если не сделать можно организовать дыру в безопасности, в связи с некоторыми особенностями реализации групп в linux и того что мы используем xattr как основной инструмент назначения прав.
vfs objects = <список подключаемых модулей>
Модуль io_uring — обеспечивает улучшенный механизм работы с диском
Модуль shadow_copy2 — включаем использование теневых копий
#Рестарт служб связанных с Samba server
sudo systemctl restart winbind smbd nmbd
Настройка прав доменного админа
После всех настроек наш Сервер хоть и находится в домене, доменный админ, всё ещё является просто пользователем, так что добавляем доменного админа в группу astra-admin чтобы ему был доступен sudo
sudo usermod -aG astra-admin habr.adm
Теперь можно залогинится в наш сервер через GUI от имени доменного пользователя и настроивать доменные права пользователя
и вместо:
Мы увидим:
Установка отдельных прав на папки и файлы для дружественных доменов можно сделать через консоль с использованием утилиты setfacl если вы хотите впустить доверенную группу
#просто назначение прав
setfacl -m g:»domain users»:rwx /zpool/scan
#назначение Default прав
setfacl -d -m g:»domain users»:rwx /zpool/scan
#Добавление прав для группы из доверенного домена в GUI астры такого не добавить
setfacl -m g:»DOMAIN2\domain users»:rwx /zpool/scan
setfacl -m g:»DOMAIN3\domain users»:r-x /zpool/scan
Настраиваем права на папки и копируем. Единственное это нужно сделать на сетевую шару т.к. в Астре есть маленький баг с локальным копированием файлов.
Про баги в Astra Linux
Про «БагоФичи» Астры можно говорить очень долго, но сейчас про интересующие нас. При копировании из SMB шары в локальную папку на ZFS нарушается маска файлов и папок RWX превратится в R-X. Судя по всему ковырясь в коде для реализации мандатной системе Бойцы из астры что-то «задели» в механизме копирования или билд ZFS, что лежит в репозитории Astra содержит ошибки. На Debian 12 такой проблемы нету.
В любом случае как SMB шара и сервис файлового обмена работает корректно, как с клиентов на Linux всего зоопарка «отечественных» систем, что с клиентов на Windows.
Копировать можно с правами. Умеют это farmanager, MC, синхронизировать могут FreeFileSync, Rsync и многие другие, но нужно учесть, что права будут упрощены до RWX и иногда могут возникнуть сложности. Тема прав и того как соотносить Windows права и Linux крайне обширна приведу в пример:
setfacl -m g:»domain users»:— /zpool/scan/Секретно
вот это запретит группе domain users доступ в папку /zpool/scan/Секретно
Для Windows админов хочется сделать маленькую но важную ремарку: в Windows создатель папки/файла это просто создатель «для галочки» кто создал. В Linux создатель имеет большие полномочия чем просто пользователь которому разрешен RWX. Главнее создателя только root!
В заключение
Жду когда выйдет новый релиз ZFS чтобы увидеть реализацию длинных имён файлов, и полными правами NFSv4 на уровне файловой системы (или кто то из отечественных производителей посмотрит на реализацию ZFS от TrueNAS и принесёт на свою систему, вероятно тогда многие реально заинтересуется покупкой этого продукта).
После добавления поддержки прав на уровне файловой системы по модели NFSv4:
Полный доступ,
Траверс папок/выполнение файлов,
Содержание папки/ чтение данных,
Чтение атрибутов,
Чтение дополнительных атрибутов,
Создание файлов/ запись данных,
Создание папок/ дозапись данных,
Запись атрибутов,
Запись дополнительных атрибутов,
Удаление подпапок и файлов,
Удаление,
Чтение разрешений,
Смена разрешений,
Смена владельца.
Станет возможен активный перевод на отечественные решения файловых серверов т.к. будут доступны права что необходимы бизнесу для работы. Появится возможность миграции с Windows «сложных» файловых серверов. Пока это требует колоссальных усилий на которые подавляющее большинство компаний неспособны даже не ограниченные в финансах.
P.S.
Хочется задать вопрос специалистам из ГК Astra ну вот какого …… вы это не автоматизировали за 15 лет очень жирных государственных контрактов, когда указаный файловый сервер является базовым, фундаментальным для инфраструктуры предприятия…. и должен условно разворачивать по клику ?!!!! А то что разворачивается у вас может работать только в очень маленькой ограниченной группе лиц. С низкой производительностью…
Почему приходится «колхозить»?!!!
P.S.S
новые приколы от Астры….
На этой недели (середина ноября 2024) перестали вытягиваться модули ядра 6.1 для ZFS… из оф. репозитория. Теперь при попытке установки ZFS ставится ядро 6.6…. и к нему модули но с ним всё также не работает… пользуйтесь для установки дисками…
ссылка на оригинал статьи https://habr.com/ru/articles/858080/
Добавить комментарий