web-dev-qa-db-ja.com

応援せずにtarをcpioに変換しますか?

Root:rootの所有者や特別なデバイスのiノードを持つ多くのファイルを含むtarballがあります。 cpioは、cpioアーカイブを作成するときにファイルシステムに存在するパスのみを受け入れます。また、tarをcpioに変換するためにSudoを実行する必要はありませんが、すべてのアクセス許可、所有者、および特別なiノードを保持したいと思います。

これを処理するクリーンな方法はありますか?

編集1:

fakerootはややクリーンな方法と見なすことができると思います。ただし、期待どおりにスケーリングされません-約1,000倍の速度差:

[user@computer root]$ ls -l ../fanbox.tar
-rw-rw-r-- 1 user user 56555520 May 22 03:33 ../fanbox.tar
[user@computer root]$ time tar -x --delay-directory-restore -f ../fanbox.tar
tar: dev/null: Cannot mknod: Operation not permitted
tar: dev/random: Cannot mknod: Operation not permitted
tar: dev/urandom: Cannot mknod: Operation not permitted
tar: Exiting with failure status due to previous errors

real    0m0.255s
user    0m0.062s
sys 0m0.193s
[user@computer root]$ rm -rf *
[user@computer root]$ time fakeroot tar -x --delay-directory-restore -f ../fanbox.tar

real    3m49.381s
user    0m0.812s
sys 0m2.760s
[user@computer root]$ 

timeコマンドの出力に基づくと、これはfakerootfakedの間の通信が原因だと思います。

参考までに、スクリプトでfakerootSudo bashに変更した場合、2Mtarballと50Mtarballの間に大きな違いはありません。また、問題はサイズではなく、tarball内のファイルの数にあると思います。2つの5Mバイナリを含む約1,000万のtarballで同じスクリプトを使用しましたが、スクリプトはそれほど遅くありません。

3
Thiner

fakeroot を使用できます。名前が示すように、LD_LIBRARY_PATH/LD_PRELOADライブラリラッパーでサーバーのシステムコールを傍受することにより、rootユーザーを偽造し、プロセスにrootとして実行されていると認識させます。これは、通常はルートとして実行されるmake installの使用など、ルートでなくてもアプリケーションを構築およびパッケージ化する目的で作成されています。アーカイブの作成に特に適しています。

この間、フォークされたデーモン faked が実行され、すべての偽造ファイルの所有権または子プロセスが作成したと信じる特別なファイルに関する情報が記憶されます。したがって、すべての操作は同じ「インスタンス」で実行する必要があります。そうしないと、fakedが終了し、記憶していたことを忘れてしまいます。

$ fakeroot
# tar xf ...
# find foo ... | cpio -o ...
# exit
$ 

fakedの相互作用を示す他の例:

$ mknod /tmp/vaporware b 8 0
mknod: /tmp/vaporware: Operation not permitted
$ fakeroot
# mknod /tmp/vaporware b 8 0
# ls -l /tmp/vaporware
brw-r--r-- 1 root root 8, 0 May 18 08:33 /tmp/vaporware
# exit
$ ls -l /tmp/vaporware
-rw-r--r--. 1 user user 0 May 18 08:33 /tmp/vaporware
3
A.B