仮想マシン (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 は可能ですが、子との間の情報の受け渡しを正しく処理する良い方法がわかりません。