在编写一个旨在完全自动化虚拟机(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 或反引号不好,我需要运行命令并根据输出(不是退出代码,实际输出)做其他事情。
- chroot 之后的步骤取决于 chroot 内部所做的事情,因此我需要在内部和外部拥有我定义或更改的所有变量。
- Fork 是可能的,但我不知道正确处理与孩子之间的信息传递的好方法。