GNU/Linux >> Linux の 問題 >  >> Linux

発根せずにtarをCpioに変換しますか?

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

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

編集1:

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

[[email protected] root]$ ls -l ../fanbox.tar
-rw-rw-r-- 1 user user 56555520 May 22 03:33 ../fanbox.tar
[[email protected] 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
[[email protected] root]$ rm -rf *
[[email protected] root]$ time fakeroot tar -x --delay-directory-restore -f ../fanbox.tar

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

timeの出力に基づく コマンドfakeroot間の通信が原因だと思います および偽造

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

承認された回答:

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

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

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

偽造を示す他の例 の相互作用:

$ 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

Linux
  1. 最大サイズのブロックに分割されたtarアーカイブを作成しますか?

  2. ルートプロパティなしでコマンドを実行する方法は?

  3. ディレクトリ構造を保持せずにディレクトリを tar するにはどうすればよいですか?

  1. ディレクトリが git リポジトリであるかどうかを確認します (cd を実行する必要はありません)。

  2. root 権限なしで PostgreSQL データベースを作成する

  3. sudo なしで ifconfig を実行する

  1. SuなしでSudoによってrootパスワードを変更しますか?

  2. Tar:サブフォルダーを作成せずに単一のファイルをディレクトリに抽出しますか?

  3. RPM パッケージをインストールせずに抽出する方法