При синхронизации данных между системами на базе FreeBSD (например, TrueNAS) и Linux-серверами через Rsync можно столкнуться с неочевидными ошибками, которые нарушают процесс резервного копирования. Одна из них — сообщение rsync: get_xattr_names: llistxattr(...) failed: Invalid argument (22)
, возникающее для отдельных файлов, хотя большинство синхронизируется успешно. Разберемся, почему это происходит и как решить проблему, не прибегая к сложным манипуляциям.
Почему Rsync ругается на расширенные атрибуты?
Ошибка связана с попыткой синхронизировать расширенные атрибуты файлов (Extended Attributes, xattr) — метаданные, которые используются для хранения дополнительной информации, например, прав доступа, цифровых подписей или тегов. В Linux и FreeBSD реализация xattr различается, что может вызывать конфликты.
Предположим, вы запускаете Rsync с ключом -X
, чтобы сохранить эти атрибуты. В таком случае система-источник (FreeBSD) пытается передать данные, которые получатель (Debian) не может корректно интерпретировать. Особенно часто это случается с файлами, созданными в macOS (которые используют свои специфические атрибуты, вроде com.apple.FinderInfo
), или если на стороне Linux не настроена поддержка определенных пространств имен xattr.
Кстати, если вы работаете под суперпользователем, Rsync по умолчанию копирует все атрибуты, кроме системных. Но для обычного пользователя доступно только пространство user.*
. Если на источнике есть атрибуты за пределами этого пространства (например, system.*
или security.*
), их синхронизация без прав root или специальных настроек завершится ошибкой.
Пошаговое решение: отключаем синхронизацию xattr
Самый простой способ устранить ошибку — исключить передачу расширенных атрибутов, убрав из команды Rsync опцию -X
. Например, исходная команда:
/usr/local/bin/rsync -a --delay-updates --delete-delay -X -p -r -t ...
Превращается в:
/usr/local/bin/rsync -a --delay-updates --delete-delay -p -r -t ...
Это решит проблему для большинства сценариев, особенно если расширенные атрибуты не критичны для вашей задачи. Однако если они всё же нужны (например, для сохранения метаданных резервных копий), есть альтернативы:
- Проверьте совместимость атрибутов. На Linux-сервере выполните команду, чтобы посмотреть, какие атрибуты поддерживаются:
lsattr /путь/к/файлу
. Если вывод пуст, возможно, файловая система (например, ext4) не настроена для xattr. Убедитесь, что при монтировании диска указана опцияuser_xattr
:mount -o remount,user_xattr /dev/sdX /точка/монтирования
- Используйте –fake-super для непривилегированных пользователей. Если вы синхронизируете данные без прав root, но хотите сохранить атрибуты, добавьте в команду Rsync параметр
--fake-super
. Он сохранит xattr в специальные записи внутри файлов, что обходит ограничения прав:rsync -a --fake-super ...
- Фильтруйте проблемные файлы. Если ошибка возникает только для определенных файлов (например, из macOS), исключите их из синхронизации через
--exclude
:--exclude '._*' --exclude '.DS_Store'
Дополнительные рекомендации
- Перед массовой синхронизацией проверьте атрибуты проблемных файлов на источнике. На FreeBSD это делается командой:
getfattr -d /путь/к/файлу
. Если атрибуты начинаются сsystem.*
или относятся к неподдерживаемым пространствам имен, их синхронизация без прав суперпользователя невозможна. - Учитывайте, что Rsync может некорректно обрабатывать символические ссылки или файлы с особыми правами (например, сокеты). Добавьте опцию
-L
(--copy-links
), если нужно копировать содержимое ссылок, или--no-l
, чтобы игнорировать их.
Для долгосрочной настройки резервного копирования между разными ОС рассмотрите альтернативы:
- Использование ZFS репликации (если обе системы поддерживают ZFS)
- Настройку
rsync
в режиме демона с предопределенными модулями - Инструменты вроде
rclone
с поддержкой облачных хранилищ как промежуточного звена
Если ошибка llistxattr
продолжает появляться после отключения -X
, проверьте журналы Rsync (--log-file=...
) на предмет других проблем — например, отсутствия свободного места на диске или некорректных разрешений для целевого каталога. Иногда достаточно вручную удалить проблемный файл на источнике (если он не нужен) или изменить его атрибуты через setfattr
.
Подводя итог: конфликт расширенных атрибутов — распространенная, но решаемая проблема при работе с разнородными системами. Начните с упрощения команды Rsync и постепенно добавляйте необходимые опции, проверяя совместимость на каждом этапе.