У меня есть клиент macOS (12.6.7) с файловой системой APFS, которая поддерживает большие расширенные атрибуты (в тесте одно значение атрибута превышало 68 МБ).
У меня есть NAS-сервер с Ubuntu Server 22.04.2 LTS с файловой системой ZFS и Samba версии 4.15.13-Ubuntu.
ZFS имеет xattr=sa set. Поэтому расширенные атрибуты включены на NAS.
Я настроил Samba для работы vfs fruit
следующим образом:
ea support = yes
vfs objects = catia fruit streams_xattr
fruit:resource = stream
fruit:metadata = stream
Благодаря этой конфигурации мне удалось записать меньшие расширенные атрибуты и ветви ресурсов (менее 64 КБ) на общий ресурс NAS.
Но с большими расширенными атрибутами и форками ресурсов (более 64 КБ) это не работало.
После множества тем, страниц руководства и кода я наткнулся на эту маленькуюпримечаниена странице руководства zfs:
xattr = вкл | выкл | sa
Значение по умолчанию on включает расширенные атрибуты на основе каталога. Этот стиль расширенных атрибутов не накладывает практических ограничений ни на размер, ни на количество атрибутов, которые могут быть установлены для файла. Хотя в Linux системные вызовы getxattr(2) и setxattr(2) ограничивают максимальный размер до 64 КБ.
Здорово, что у нас есть ZFS на Linux без «практических ограничений», просто ядро Linux (будучи практичной вещью) ограничивает размер расширенных атрибутов на практике.
Хорошо, я не могу исправить это ни на стороне ZFS, ни на стороне Linux.
Следующим шагом былоСамбаконкретно.
Из-за ограничения размера расширенных атрибутов мне понадобилось альтернативное хранилище для них. Для форков ресурсов есть настройка для записи их в файлы:
fruit:resource = file
Включив эту функцию, я могу записывать в общий ресурс большие ответвления ресурсов.
Но у fruit нет возможности записывать другие метаданные (например, расширенные атрибуты) в сопутствующий файл:
фрукты:метаданные = [поток | netatalk]
- netatalk (по умолчанию) — использовать Netatalk-совместимый xattr
- stream — передать поток следующему модулю в стеке VFS
stream
не работает, потому что streams_xattr пытается записать его в расширенный атрибут.
netatalk
не работает, потому что fruit пытается записать его в совместимый с netatalk именованный расширенный атрибут.
Почему нет возможности записывать метаданные в файлы?
Это сделало бы Samba более независимой от предоставляемой базовой файловой системы (даже если у нее вообще нет расширенных атрибутов).
Мое текущее решение — использовать:
ea support = no
Это заставляет клиентов macOS создаватьAppleДвойные файлыдля их ответвлений ресурсов и расширенных атрибутов.
При этом сохраняются ветка ресурса и расширенные атрибуты клиента.
Конечно, это несовместимо с клиентами Windows, что меня сейчас вполне устраивает, но это существенно ограничивает то, как я могу использовать это устройство.
Также, поскольку vfs fruit
потребности ea support = yes
, я не могу использовать его. Из того, что я читал о фруктах, это означает замедление производительности NAS, и я также не получаю легкой настройки Time Machine. Я даже не знаю о других последствиях. Кажется, фрукт реализует возможность FULLSYNC (см. fruit:time machine
). Изустаревшие документы Appleпохоже, что это необходимо для чистого резервного копирования Time Machine при отключении питания.
Я также думал о записи потоков в базу данных, но это значительно усложнит исправление ошибок, если что-то пойдет не так с этим объектом VFS (для получения дополнительной информациивидеть). Обратите внимание на «Не используйте этот модуль в производстве».
Переход на ОС без ограничений расширенных атрибутов для работы Samba невозможен… по крайней мере, на данный момент.
Есть ли другой вариант полной поддержки ветвей ресурсов macOS и расширенных атрибутов в системах Linux без отключения расширенных атрибутов на общем ресурсе samba (и, следовательно, vfs fruit)?