![Резервное копирование данных с сохранением списков контроля доступа и разрешений POSIX](https://rvso.com/image/488051/%D0%A0%D0%B5%D0%B7%D0%B5%D1%80%D0%B2%D0%BD%D0%BE%D0%B5%20%D0%BA%D0%BE%D0%BF%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20%D1%81%20%D1%81%D0%BE%D1%85%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5%D0%BC%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%BE%D0%B2%20%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D1%8F%20%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%D0%B0%20%D0%B8%20%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B9%20POSIX.png)
Я ищу практичный способ резервного копирования данных с сервера и сохранения всех ACL и разрешений. Я рассматривал tar, но, согласно Google, tar не сохраняет ACL. Я знаю, что rsync может сохранять ACL и разрешения, но только если целевая система поддерживает POSIX ACL и имеет тех же пользователей. В моем случае я делаю резервное копирование в каталог, который находится на AFS, поэтому POSIX ACL не поддерживаются.
На данный момент я решил проблему, написав скрипт, который использует find для рекурсии по системе (я использую find, потому что мне нужно исключить некоторые каталоги) и сохраняет разрешения и ACL в текстовый файл. Это решение работает, но мучительно медленно. Есть ли лучшее решение?
решение1
apt-get install star
man star
star -acl -whatever -other -options -you -need
Star — это tar с поддержкой расширенных заголовков POSIX, то есть, возможность хранить некоторые дополнительные данные о файле в файле tar. Опция -acl
получает ACL; она нужна как для создания архива, так и для извлечения.
решение2
Если вы не хотите устанавливать еще одну программу, вы можете создать резервную копию списков ACL по отдельности:
getfacl -R somedir > acls.txt
Это позволит сохранить все списки ACL somedir
в файле acls.txt
.
Для восстановления используйте:
setfacl -R --set-file=acls.txt somedir
решение3
рядом со звездой вы можете использоватьbsdtar
решение4
Перепост моего ответа здесь:https://unix.stackexchange.com/a/725745/550161
При создании/извлечении архива необходимо использовать оба--acls
и --xattrs
опции и, конечно, иметь соответствующие разрешения на чтение/запись этихаклиxattr.
Примеры:
1. Создание архива:
ZSTD_CLEVEL=19 tar --acls --xattrs -caPf systemd-network-conf.tzst --directory=/etc systemd/network systemd/networkd.conf.d
Вышеприведенный код создаст zstd
сжатый tar
архив с использованием уровня сжатия 19
, сохраняя при этом ACL и расширенные атрибуты.
- Расширение
.tzst
означает «асмолаархив с использованиемзстдсжатие", как иtgz
дляgzip'ed версия и т.д. - Уровень сжатия, используемый неявным
zstd
компрессором, задается указаннойZSTD_CLEVEL
переменной окружения в начале той же строки. - См. страницы руководства:
tar(1)
иzstd(1)
.
2. Извлечение этого архива:
sudo tar --acls --xattrs -xvf systemd-network-conf.tzst
Вышеуказанная команда создаст в вашем текущем каталоге подкаталог, названный так, systemd
потому что это общий корневой каталог внутри архива.
- Все настройки, которые вы установили с помощьюЧаун/чмод/setfaclв оригиналах, будут сохранены в извлеченной версии.
3. Сравнение атрибутов исходного и извлеченного файла.
{cd /etc; getfacl -R systemd/network systemd/networkd.conf.d} >original.acl; cd -
getfacl -R systemd/network systemd/networkd.conf.d >extracted.acl
diff -u original.acl extracted.acl
- Вы не должны увидеть вывод из первых двух строк, поскольку он перенаправлен в файл.
(Исключение составляет первая строка, которая выведет ваш текущий каталог, поскольку последняя строкаcd -
является отдельной командой, которая просто восстанавливает ваш текущий каталог.) - Вы также не должны увидеть никаких выходных данных из строки diff, поскольку никакой разницы нет.