Как сжать папку, сохранив право собственности на файл

У меня есть докер-сервер, для которого я хочу создать резервную копию. Моя папка развертывания имеет очень конкретные права собственности и разрешения для поддержки моих контейнеров:

$ ls -lhaF /opt/docker
total 32K
drwxr-xr-x  7 devops devops 4.0K Aug 23 02:34 ./
drwxr-xr-x  6 root   root   4.0K Aug 23 04:20 ../
drwxrwxr-x  2 devops devops 4.0K Aug 21 00:00 .certs/
drwxrwxr-x  2 devops devops 4.0K Aug 23 03:53 .scripts/
-rw-rw-r--  1 devops devops 1.2K Aug 21 01:52 docker-compose.yml
drwxrwxr-x  4   1000   1000 4.0K Aug 21 02:05 minecraft/
drwxrwxr-x  4 devops devops 4.0K Aug 20 23:38 pihole/
drwx------ 19     70     70 4.0K Aug 19 01:31 postgres/

Затем я пытаюсь сжать эту папку, используя следующую команду. Из того, что я читал, для сохранения прав доступа к файлам / владения требуется запуск tar от имени пользователя root / sudo:

$ sudo tar -czpf "/tmp/server-backup.tar.gz" --directory="/opt/docker" .

Эта команда сжимает папку, но при проверке файла .tar.gz она показывает, что права собственности на все папки теперь принадлежат root :

$ tar -tvf /tmp/server-backup.tar.gz
drwxr-xr-x root/root         0 2021-08-23 12:10 ./
drwxr-xr-x root/root         0 2021-08-23 12:10 ./minecraft/
-rw-r--r-- root/root         2 2021-08-23 12:10 ./minecraft/whitelist.json
-rw-r--r-- root/root       111 2021-08-23 12:10 ./minecraft/usercache.json
-rw-r--r-- root/root      1204 2021-08-23 12:10 ./minecraft/server.properties
-rw-r--r-- root/root  43626592 2021-08-23 12:10 ./minecraft/minecraft_server.1.17.1.jar
-rw-r--r-- root/root        68 2021-08-23 12:10 ./minecraft/eula.txt
-rw-r--r-- root/root         2 2021-08-23 12:10 ./minecraft/banned-players.json
-rw-r--r-- root/root         2 2021-08-23 12:10 ./minecraft/banned-ips.json
# -- Other minecraft files
drwxr-xr-x root/root         0 2021-08-23 12:10 ./.certs/
# -- Certs folder contents redacted
drwx------ root/root         0 2021-08-23 12:10 ./postgres/
drwx------ root/root         0 2021-08-23 12:10 ./postgres/pg_subtrans/
-rw------- root/root      8192 2021-08-23 12:10 ./postgres/pg_subtrans/0000
drwx------ root/root         0 2021-08-23 12:10 ./postgres/pg_multixact/
drwx------ root/root         0 2021-08-23 12:10 ./postgres/pg_multixact/offsets/
-rw------- root/root      8192 2021-08-23 12:10 ./postgres/pg_multixact/offsets/0000
drwx------ root/root         0 2021-08-23 12:10 ./postgres/pg_multixact/members/
-rw------- root/root      8192 2021-08-23 12:10 ./postgres/pg_multixact/members/0000
drwx------ root/root         0 2021-08-23 12:10 ./postgres/pg_xact/
-rw------- root/root      8192 2021-08-23 12:10 ./postgres/pg_xact/0000
# -- Other postgres files
drwxr-xr-x root/root         0 2021-08-23 12:10 ./pihole/
drwxr-xr-x root/root         0 2021-08-23 12:10 ./pihole/etc-pihole/
-rw-r--r-- root/root         0 2021-08-23 12:10 ./pihole/etc-pihole/custom.list
-rw-r--r-- root/root   5201920 2021-08-23 12:10 ./pihole/etc-pihole/gravity.db
-rw-r--r-- root/root       485 2021-08-23 12:10 ./pihole/etc-pihole/setupVars.conf
-rw-r--r-- root/root         0 2021-08-23 12:10 ./pihole/etc-pihole/setupVars.conf.update.bak
-rw-r--r-- root/root   1812161 2021-08-23 12:10 ./pihole/etc-pihole/list.1.raw.githubusercontent.com.domains
-rw-r--r-- root/root     73728 2021-08-23 12:10 ./pihole/etc-pihole/pihole-FTL.db
-rw-r--r-- root/root         0 2021-08-23 12:10 ./pihole/etc-pihole/pihole-FTL.conf
-rw-r--r-- root/root        37 2021-08-23 12:10 ./pihole/etc-pihole/local.list
-rw-r--r-- root/root        95 2021-08-23 12:10 ./pihole/etc-pihole/list.1.raw.githubusercontent.com.domains.sha1
-rw-r--r-- root/root        20 2021-08-23 12:10 ./pihole/etc-pihole/localbranches
drwxr-xr-x root/root         0 2021-08-23 12:10 ./pihole/etc-pihole/migration_backup/
-rw-r--r-- root/root        65 2021-08-23 12:10 ./pihole/etc-pihole/migration_backup/adlists.list
-rw-r--r-- root/root       618 2021-08-23 12:10 ./pihole/etc-pihole/dns-servers.conf
-rw-r--r-- root/root        20 2021-08-23 12:10 ./pihole/etc-pihole/GitHubVersions
-rw-r--r-- root/root        44 2021-08-23 12:10 ./pihole/etc-pihole/localversions
drwxr-xr-x root/root         0 2021-08-23 12:10 ./pihole/etc-dnsmasq.d/
-rw-r--r-- root/root      1475 2021-08-23 12:10 ./pihole/etc-dnsmasq.d/01-pihole.conf
drwxr-xr-x root/root         0 2021-08-23 12:10 ./.scripts/
-rwxr-xr-x root/root      1638 2021-08-23 12:10 ./.scripts/create-backup.sh
-rwxr-xr-x root/root       511 2021-08-23 12:10 ./.scripts/new-cert-pihole.sh
-rwxr-xr-x root/root       345 2021-08-23 12:10 ./.scripts/fix-permissions.sh
-rw-r--r-- root/root      1170 2021-08-23 12:10 ./docker-compose.yml

Если я попытаюсь извлечь файл .tar.gz, мы сможем подтвердить, что все права собственности были потеряны:

$ sudo mkdir /tmp/server-backup
$ sudo tar -xzpf /tmp/server-backup.tar.gz --directory=/tmp/server-backup
$ ls -lhaF /tmp/server-backup
total 32K
drwxr-xr-x  7 root root 4.0K Aug 23 12:10 ./
drwxrwxrwt 13 root root 4.0K Aug 23 12:16 ../
drwxr-xr-x  2 root root 4.0K Aug 23 12:10 .certs/
drwxr-xr-x  2 root root 4.0K Aug 23 12:10 .scripts/
-rw-r--r--  1 root root 1.2K Aug 23 12:10 docker-compose.yml
drwxr-xr-x  4 root root 4.0K Aug 23 12:10 minecraft/
drwxr-xr-x  4 root root 4.0K Aug 23 12:10 pihole/
drwx------ 19 root root 4.0K Aug 23 12:10 postgres/

Из того, что я обнаружил, сохранение прав собственности и разрешений должно быть поведением по умолчанию для tar . Что-то мне здесь не хватает? Я хотел бы иметь возможность делать резервную копию состояния моего сервера, не нарушая деликатного владения файлами, необходимого для некоторых из запущенных мной контейнеров докеров.

Системная информация:

$ lsb_release -d
Description:    Ubuntu 20.04.3 LTS
$ uname -a
Linux rpi-1 5.4.0-1042-raspi #46-Ubuntu SMP PREEMPT Fri Jul 30 00:35:40 UTC 2021 aarch64 aarch64 aarch64 GNU/Linux
3
задан 23 August 2021 в 15:53

1 ответ

Очевидно, tar здесь не виноват. Это была часть большого сценария для резервного копирования моей папки развертывания. Я копировал папку перед сжатием, чтобы избежать несоответствий при чтении, пока контейнеры еще работают. В сценарии было следующее:

cp -R "/opt/docker" "/tmp/server-backup"
tar -czf "/tmp/server-backup.tar.gz" --directory="/tmp/server-backup" .

Во время копирования папки терялось право собственности на файл. Флаг -p необходим для сохранения прав/собственности при копировании папки. Правильной командой была бы следующая:

cp -Rp "/opt/docker" "/tmp/server-backup"
tar -czf "/tmp/server-backup.tar.gz" --directory="/tmp/server-backup" .
1
ответ дан 4 September 2021 в 09:28

Другие вопросы по тегам:

Похожие вопросы: