Рейтинг:3

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

флаг mx

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

$ ls -lhaF /opt/докер
всего 32К
drwxr-xr-x 7 devops devops 4.0K 23 августа 02:34 ./
drwxr-xr-x 6 root root 4.0K 23 авг 04:20 ../
drwxrwxr-x 2 devops devops 4.0K 21 авг 00:00 .certs/
drwxrwxr-x 2 devops devops 4.0K 23 авг 03:53 .scripts/
-rw-rw-r-- 1 devops devops 1.2K 21 авг 01:52 docker-compose.yml
drwxrwxr-x 4 1000 1000 4.0K 21 авг 02:05 майнкрафт/
drwxrwxr-x 4 devops devops 4.0K 20 авг 23:38 pihole/
drwx------ 19 70 70 4.0K 19 авг 01:31 postgres/

Затем я пытаюсь сжать эту папку, используя следующую команду. Из того, что я читал, для сохранения прав доступа к файлам / прав собственности требуется запуск смола как 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 23.08.2021 12:10 ./
drwxr-xr-x root/root 0 23.08.2021 12:10 ./minecraft/
-rw-r--r-- root/root 2 23 августа 2021 г. 12:10 ./minecraft/whitelist.json
-rw-r--r-- root/root 111 23 августа 2021 г. 12:10 ./minecraft/usercache.json
-rw-r--r-- root/root 1204 23 августа 2021 г. 12:10 ./minecraft/server.properties
-rw-r--r-- root/root 43626592 23 августа 2021 г. 12:10 ./minecraft/minecraft_server.1.17.1.jar
-rw-r--r-- root/root 68 23 августа 2021 г. 12:10 ./minecraft/eula.txt
-rw-r--r-- root/root 2 23 августа 2021 г. 12:10 ./minecraft/banned-players.json
-rw-r--r-- root/root 2 23 августа 2021 г. 12:10 ./minecraft/banned-ips.json
# -- Другие файлы майнкрафта
drwxr-xr-x root/root 0 23.08.2021 12:10 ./.certs/
# -- Содержимое папки Certs отредактировано
drwx------ root/root 0 23.08.2021 12:10 ./postgres/
drwx------ root/root 0 23.08.2021 12:10 ./postgres/pg_subtrans/
-rw------- root/root 8192 23 августа 2021 г. 12:10 ./postgres/pg_subtrans/0000
drwx------ root/root 0 23.08.2021 12:10 ./postgres/pg_multixact/
drwx------ root/root 0 23.08.2021 12:10 ./postgres/pg_multixact/offsets/
-rw------- root/root 8192 23 августа 2021 г. 12:10 ./postgres/pg_multixact/offsets/0000
drwx------ root/root 0 23.08.2021 12:10 ./postgres/pg_multixact/members/
-rw------- root/root 8192 23 августа 2021 г. 12:10 ./postgres/pg_multixact/members/0000
drwx------ root/root 0 23.08.2021 12:10 ./postgres/pg_xact/
-rw------- root/root 8192 23 августа 2021 г. 12:10 ./postgres/pg_xact/0000
# -- Другие файлы postgres
drwxr-xr-x root/root 0 23.08.2021 12:10 ./pihole/
drwxr-xr-x root/root 0 23.08.2021 12:10 ./pihole/etc-pihole/
-rw-r--r-- root/root 0 23.08.2021 12:10 ./pihole/etc-pihole/custom.list
-rw-r--r-- root/root 5201920 23.08.2021 12:10 ./pihole/etc-pihole/gravity.db
-rw-r--r-- root/root 485 23 августа 2021 г. 12:10 ./pihole/etc-pihole/setupVars.conf
-rw-r--r-- root/root 0 23.08.2021 12:10 ./pihole/etc-pihole/setupVars.conf.update.bak
-rw-r--r-- root/root 1812161 23 августа 2021 г. 12:10 ./pihole/etc-pihole/list.1.raw.githubusercontent.com.domains
-rw-r--r-- root/root 73728 23 августа 2021 г. 12:10 ./pihole/etc-pihole/pihole-FTL.db
-rw-r--r-- root/root 0 23.08.2021 12:10 ./pihole/etc-pihole/pihole-FTL.conf
-rw-r--r-- root/root 37 23.08.2021 12:10 ./pihole/etc-pihole/local.list
-rw-r--r-- root/root 95 23.08.2021 12:10 ./pihole/etc-pihole/list.1.raw.githubusercontent.com.domains.sha1
-rw-r--r-- root/root 20 23 августа 2021 г. 12:10 ./pihole/etc-pihole/localbranches
drwxr-xr-x root/root 0 23.08.2021 12:10 ./pihole/etc-pihole/migration_backup/
-rw-r--r-- root/root 65 23.08.2021 12:10 ./pihole/etc-pihole/migration_backup/adlists.list
-rw-r--r-- root/root 618 23.08.2021 12:10 ./pihole/etc-pihole/dns-servers.conf
-rw-r--r-- root/root 20 23 августа 2021 г. 12:10 ./pihole/etc-pihole/GitHubVersions
-rw-r--r-- root/root 44 23 августа 2021 г. 12:10 ./pihole/etc-pihole/localversions
drwxr-xr-x root/root 0 23.08.2021 12:10 ./pihole/etc-dnsmasq.d/
-rw-r--r-- root/root 1475 23.08.2021 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 23 августа 2021 г. 12:10 ./.scripts/create-backup.sh
-rwxr-xr-x root/root 511 23 августа 2021 г. 12:10 ./.scripts/new-cert-pihole.sh
-rwxr-xr-x root/root 345 23 августа 2021 г. 12:10 ./.scripts/fix-permissions.sh
-rw-r--r-- root/root 1170 23 августа 2021 г. 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
всего 32К
drwxr-xr-x 7 root root 4.0K 23 авг 12:10 ./
drwxrwxrwt 13 root root 4.0K 23 авг 12:16 ../
drwxr-xr-x 2 root root 4.0K 23 авг 12:10 .certs/
drwxr-xr-x 2 root root 4.0K 23 авг 12:10 .scripts/
-rw-r--r-- 1 root root 1.2K 23 авг 12:10 docker-compose.yml
drwxr-xr-x 4 root root 4.0K 23 авг 12:10 майнкрафт/
drwxr-xr-x 4 root root 4.0K 23 авг 12:10 pihole/
drwx------ 19 root root 4.0K 23 авг 12:10 postgres/

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

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

$ lsb_release -d
Описание: Ubuntu 20.04.3 LTS
$ uname -a
Linux rpi-1 5.4.0-1042-raspi #46-Ubuntu SMP PREEMPT Пт, 30 июля, 00:35:40 UTC 2021 aarch64 aarch64 aarch64 GNU/Linux
muru avatar
флаг us
Что произойдет, если вы не используете флаг `-p`? Просто `czf` и `xzf`?
Artur Meinild avatar
флаг vn
Я только что проверил в случайной папке, и если я запускаю tar на двух файлах с флагами `-czpf`, он правильно сохраняет разрешения.
флаг cn
Могу подтвердить: для этого и предназначена `-p` (строчная буква, а не заглавная P). есть также `--preserve-permissions` / `--same-permissions` и `--atime-preserve` и `--same-owner`. Из того, что я читал, для сохранения прав доступа/владения файлом требуется запуск tar как root/sudo:" нет, у вас есть варианты, чтобы предотвратить это.
sudodus avatar
флаг jp
Я заметил, что вы указываете Ubuntu 20.04.3 LTS для Raspberry Pi. Релиз Point 3 еще не выпущен (но очень близок к выпуску). Какую версию tar вы используете? Проверьте с помощью `apt-cache policy tar`; возможно, вы нашли ошибку, потому что ваши результаты противоречат тому, что испытали многие из нас.Это может быть новая ошибка, но также возможно, что ошибка затрагивала версию tar для RPi в течение многих лет, потому что большинство из нас использует версию «amd64» для ПК и никогда не будет затронута ею.
Artur Meinild avatar
флаг vn
Я только что снова проверил на Raspberry Pi, и разрешения для меня все еще сохранены. Запуск Ubuntu `20.04.3 LTS` (для существующих установок) и tar `1.30+dfsg-7ubuntu0.20.04.1` на обеих платформах.
Phil H avatar
флаг mx
После дальнейшего расследования оказалось, что виновником на самом деле является не команда tar. Я использовал `cp` для копирования папки развертывания перед сжатием, чтобы избежать ошибок чтения. Я не понимал, что вы должны явно сохранять разрешения с помощью чего-то вроде `cp -Rp`. Спасибо, что помогли мне сузить это.
Рейтинг:1
флаг mx

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

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

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

cp -Rp "/opt/docker" "/tmp/server-backup"
tar -czf "/tmp/server-backup.tar.gz" --directory="/tmp/server-backup" .
sudodus avatar
флаг jp
Спасибо, что показали и объяснили решение :-)
Artur Meinild avatar
флаг vn
Обычно я копирую с параметром `-a` (архив), который равен `-dR --preserve=all`. Это единственный вариант, который сохраняет все, что вы хотите сохранить для резервной копии — у меня даже есть псевдоним для него: `alias cpa='cp -a'`
Phil H avatar
флаг mx
@ArturMeinild Спасибо! Я буду иметь это в виду.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.