![POSIX ACLと権限を維持しながらデータをバックアップする](https://rvso.com/image/488051/POSIX%20ACL%E3%81%A8%E6%A8%A9%E9%99%90%E3%82%92%E7%B6%AD%E6%8C%81%E3%81%97%E3%81%AA%E3%81%8C%E3%82%89%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E3%83%90%E3%83%83%E3%82%AF%E3%82%A2%E3%83%83%E3%83%97%E3%81%99%E3%82%8B.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 は拡張 POSIX ヘッダーをサポートする tar です。つまり、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
オプションと、もちろんそれらの読み取り/書き込みの適切な権限を持っていることACLそして属性。
例:
1. アーカイブの作成:
ZSTD_CLEVEL=19 tar --acls --xattrs -caPf systemd-network-conf.tzst --directory=/etc systemd/network systemd/networkd.conf.d
上記は、ACL と拡張属性を保持しながら、圧縮レベルを使用してzstd
圧縮アーカイブを作成します。tar
19
- 拡張子
.tzst
は「タールアーカイブを使用して翻訳圧縮」はtgz
、圧縮'edバージョンなど - 暗黙的なコンプレッサーによって使用される圧縮レベルは、同じ行の先頭に
zstd
指定された環境変数によって設定されます。ZSTD_CLEVEL
- man ページを参照してください:
tar(1)
およびzstd(1)
。
2. アーカイブを抽出します。
sudo tar --acls --xattrs -xvf systemd-network-conf.tzst
systemd
上記の操作により、現在のディレクトリに、アーカイブ内の共通ルート ディレクトリである という名前のサブディレクトリが作成されます。
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
- 最初の 2 行はファイルにリダイレクトされるため、出力は表示されません。
(最初の行は例外で、最後の as 別個のコマンドにより現在のディレクトリが出力されますがcd -
、これは現在のディレクトリを復元するだけです。) - 違いがないので、 diff 行からの出力も表示されないはずです。