ITWindows

Как скопировать 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-client

RHEL, AlmaLinux и Rocky Linux:

dnf install rsync acl attr openssh-clients
rsync --version
getfacl --version
getfattr --version

2. Проверяем исходный каталог

findmnt -T /data
du -sh /data
df -h /data
df -i /data
getfacl -p /data
getfattr -d -m- /data 2>/dev/null

3. Сохраняем 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 | less

9. Сравниваем 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 | less

10. Проверяем содержимое файлов

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 разрешаются одинаково;
  • реальные пользователи получают прежние права;
  • старый сервер остаётся рабочей точкой отката.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *