Как скопировать ACL при переносе файлов на другой Linux-сервер
Ниже — рабочая последовательность переноса каталога /data со старого Linux-сервера на новый с сохранением владельцев, числовых UID/GID, POSIX ACL, extended attributes и hard links. Команды выполняются от root. Адрес new-server и пути замените своими.
1. Устанавливаем инструменты на обоих серверах
Debian и Ubuntu:
apt update
apt install rsync acl attr openssh-clientRHEL, AlmaLinux и Rocky Linux:
dnf install rsync acl attr openssh-clientsrsync --version
getfacl --version
getfattr --version2. Проверяем исходный каталог
findmnt -T /data
du -sh /data
df -h /data
df -i /data
getfacl -p /data
getfattr -d -m- /data 2>/dev/null3. Сохраняем UID/GID и отдельную копию ACL
mkdir -p /root/acl-migration-backup
getent passwd > /root/acl-migration-backup/passwd.txt
getent group > /root/acl-migration-backup/group.txt
find /data -xdev -printf '%U:%G\n' | sort -u > /root/acl-migration-backup/data-uid-gid.txt
getfacl -R -p /data > /root/acl-migration-backup/data-acl.txt
gzip -9 /root/acl-migration-backup/data-acl.txt
sha256sum /root/acl-migration-backup/data-acl.txt.gz > /root/acl-migration-backup/data-acl.txt.gz.sha256Файл ACL не заменяет резервную копию данных, но позволяет отдельно восстановить POSIX ACL.
4. Проверяем поддержку ACL и xattrs на новом сервере
ssh root@new-server mkdir -p /data
ssh root@new-server touch /data/.acl-test
ssh root@new-server setfacl -m u:nobody:rw /data/.acl-test
ssh root@new-server setfattr -n user.test -v ok /data/.acl-test
ssh root@new-server getfacl -p /data/.acl-test
ssh root@new-server getfattr -d /data/.acl-test
ssh root@new-server rm -f /data/.acl-testЕсли setfacl или setfattr завершается ошибкой, сначала исправьте файловую систему или параметры монтирования.
5. Проверяем числовые идентификаторы
cat /root/acl-migration-backup/data-uid-gid.txt
ssh root@new-server getent passwd
ssh root@new-server getent groupОдин и тот же UID должен обозначать одного и того же пользователя на обоих серверах. Для LDAP или Active Directory проверьте одинаковую схему разрешения пользователей и idmap-диапазоны.
6. Выполняем обязательный dry-run
rsync -aHAX --numeric-ids \
--itemize-changes \
--dry-run \
/data/ root@new-server:/data/-A сохраняет ACL, -X — extended attributes, -H — hard links, а --numeric-ids не заменяет UID/GID именами пользователей. Завершающий слэш после /data/ означает копирование содержимого каталога.
7. Запускаем первую синхронизацию
rsync -aHAX --numeric-ids \
--info=progress2,stats2 \
--partial \
--partial-dir=.rsync-partial \
/data/ root@new-server:/data/
echo $?Ожидаемый код возврата — 0. Коды 23 и 24 означают частично перенесённые данные и требуют проверки вывода rsync.
8. Сравниваем ACL
getfacl -R -p /data > /tmp/source-acl.txt
ssh root@new-server getfacl -R -p /data > /tmp/target-acl.txt
diff -u /tmp/source-acl.txt /tmp/target-acl.txt | less9. Сравниваем extended attributes
getfattr -R -d -m- /data 2>/dev/null > /tmp/source-xattrs.txt
ssh root@new-server getfattr -R -d -m- /data > /tmp/target-xattrs.txt
diff -u /tmp/source-xattrs.txt /tmp/target-xattrs.txt | less10. Проверяем содержимое файлов
rsync -aHAX --numeric-ids \
--checksum \
--dry-run \
--itemize-changes \
/data/ root@new-server:/data/Если команда ничего не выводит, rsync не видит различий. На больших объёмах --checksum создаёт заметную нагрузку.
11. Проверяем доступ реальным пользователем
sudo -u testuser touch /data/department/source-test.txt
ssh root@new-server sudo -u testuser touch /data/department/target-test.txt
ssh root@new-server ls -l /data/department/target-test.txt
ssh root@new-server sudo -u testuser rm /data/department/target-test.txtОтдельно проверьте пользователя с правами только на чтение и пользователя, которому доступ должен быть запрещён.
12. Финальная синхронизация
Остановите сервис, который пишет в каталог, либо переведите старую share в режим только для чтения. Сначала снова выполните dry-run:
rsync -aHAX --numeric-ids \
--delete-delay \
--itemize-changes \
--dry-run \
/data/ root@new-server:/data/После проверки списка удалений запускайте финальный перенос:
rsync -aHAX --numeric-ids \
--delete-delay \
--info=progress2,stats2 \
/data/ root@new-server:/data/13. Восстанавливаем ACL из отдельной копии
scp root@old-server:/root/acl-migration-backup/data-acl.txt.gz /root/
gzip -dc /root/data-acl.txt.gz > /root/data-acl.txt
cd /
setfacl --restore=/root/data-acl.txtФайл содержит абсолютные пути. Восстановление сначала проверяйте на копии данных.
14. Rollback
- остановите запись на новом сервере;
- верните DNS, IP или имя SMB/NFS-share на старый сервер;
- не удаляйте исходный каталог до окончания периода наблюдения;
- не запускайте обратный rsync с
--delete, пока не разобраны новые изменения.
Критерий успешного переноса
- rsync завершается с кодом 0;
- повторный dry-run не показывает неожиданных изменений;
- ACL и xattrs совпадают;
- UID/GID разрешаются одинаково;
- реальные пользователи получают прежние права;
- старый сервер остаётся рабочей точкой отката.