4

仮想マシン (Xen pv) のセットアップを完全に自動化するための perl スクリプトを作成しているときに、非常に単純な小さな問題に遭遇しました。

perl のchroot 機能を使用してゲスト ファイル システムで作業を行った後、最初の実際のルートに戻る必要があります。どうやってそれをするの?

スクリプト例:

`mount $disk_image $mount_point`;

chdir($mount_point);
chroot($mount_point);

#[Do my things...]

#<Exit chroot wanted here>

`umount $mount_point`;

#[Post install things...]

終了を試みました。しかし明らかにそれはスクリプト全体を終了します。

chroot を終了する方法を探していると、すでにセットアップされている chroot (権限昇格) を終了することを目的としたスクリプトがいくつか見つかりました。ここで chroot を行うため、これらの方法は適用されません。

次のようなクレイジーなことを試しました:

opendir REAL_ROOT, "/";
chdir($mount_point);
chroot($mount_point);
chdir(*REAL_ROOT);

しかし、行きません。

更新 考慮すべきいくつかの点:

  • スクリプトを複数のファイルに分割することはできません。(ばかげた理由ですが、実際にはできません)
  • chroot された部分では、スクリプトによって以前に (chroot の前に) 収集された大量のデータを使用する必要があるため、chroot 内で別のスクリプトを実行する必要がなくなります。
  • open、system、または backticks を使用するのは良くありません。コマンドを実行し、出力 (終了コードではなく、実際の出力) に基づいて他のことを行う必要があります。
  • chroot の後の手順は、chroot の内部で何が行われたかによって異なります。したがって、内部、外部で定義または変更したすべての変数が必要です。
  • fork は可能ですが、子との間の情報の受け渡しを正しく処理する良い方法がわかりません。
4

5 に答える 5

10

chroot された process() は、終了することによって自分自身を "unchroot" することはできません (終了するだけです)。

chroot する子プロセスを生成する必要があります。

次の行に沿った何かがうまくいくはずです:

if (fork())
{
   # parent
   wait;
}
else
{
   # children
   chroot("/path/to/somewhere/");
   # do some Perl stuff inside the chroot...
   exit;  
}

# The parent can continue it's stuff after his chrooted children did some others stuff...

エラーチェックの考え方がまだ欠けています。

于 2011-09-30T16:49:50.763 に答える
4

プロセスで元に戻すことはできませんchroot()-それがシステムコールの要点です。

chroot 環境で作業を行うには、2 番目のプロセス (子プロセス) が必要です。フォークし、子にchrootを実行させ、その処理を実行して終了させ、親にクリーンアップを任せます。

于 2011-09-30T16:48:10.577 に答える
2

chrootたとえば、必要に応じて、systemまたは必要に応じて、を実行する子プロセスを生成してみてください。子プロセスがforkメイン プログラムに戻るのを待ちます。

于 2011-09-30T16:29:44.200 に答える
2

これは有望なようです:

Perl を使用して chroot 刑務所から抜け出す

于 2011-09-30T17:00:23.077 に答える
0

元のルートを現在の作業ディレクトリまたはファイル記述子として保存します。

chdir "/";
chroot "/mnt";
# Do something
chroot ".";

また

open DIR, "<", "/";
chroot "/mnt";
# Do something
chdir DIR;
chroot ".";
close DIR;
于 2020-05-01T21:38:53.553 に答える