rootなしでtarをcpioに変換しますか?

rootなしでtarをcpioに変換しますか?

ルート:ルート所有者および/または特別なデバイスinodeを持つ多くのファイルを含むtarballがあります。cpiocpioアーカイブを作成するときは、ファイルシステムに存在するパスのみが許可されます。sudoすべての権限、所有者、および特別なinodeを維持しながらtarをcpioに変換したくありません。

この問題を解決するためのクリーンな方法はありますか?

編集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コマンドの出力によると、fakerootこれはfaked

ちなみに、スクリプトで変更してみると、fakeroot2Mタールボールと50Mタールボールの間に大きな違いはありません。sudo bashそして問題はサイズではなく、タルボールにあるファイル数だと思います。 2つの5Mバイナリを含む〜10Mタールボールで同じスクリプトを使用しましたが、スクリプトはそれほど遅くはありませんでした。

答え1

あなたはそれを使用することができますfakeroot。名前が示すように、LD_LIBRARY_PATH/LD_PRELOADライブラリラッパーを使用して複数のシステムコールを傍受し、rootユーザーを偽造し、プロセスがrootとして実行されていると信じさせます。make install通常、rootとして実行されているアプリケーションの使用を含む、ルートなしでアプリケーションを構築およびパッケージ化するために作成されました。特にアーカイブの作成に適しています。

この間にフォークされたデーモンは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

答え2

bsd tarを試してみてください(GNU tarではない) -魔法@tarballファイル名の前に以下を追加してください。

bsdtar --format=cpio -cf - @root.tar.gz > root.cpio

答え3

lxc-usernsexecアーカイブを抽出して再生成する環境として使用できます。

lxc-usernsexec
mkdir tmp
cd tmp
tar xf ../archive.tar
find . -print0 | cpio -0o > ../archive.cpio
exit

$HOME/.config/lxc/default.confこれは、Linuxコンテナが存在するように正しく設定されていると仮定します(正しく/etc/subuid設定されています/etc/subgid)。詳細については、次を参照してください。

https://wiki.debian.org/LXC#Unprivileged_container

Debian Busterに関する注意:

$ lxc-usernsexec 
Failed to find subuid or subgid allocation

これはバグのようですが、次のスクリプトを使用すると問題が解決します。

#!/bin/bash

ARGS=()

while read -ru6 what equals rest
do
        [ ".$what" = ".lxc.idmap" ] || continue
        [ ".$equals" = ".=" ] || continue
        ARGS+=(-m "${rest// /:}")
done 6<"$HOME/.config/lxc/default.conf"

exec /usr/bin/lxc-usernsexec "${ARGS[@]}" -- "$@"

関連情報