在写一个 perl 脚本的时候,我遇到了一个小问题,也许是非常简单的问题,这个问题是为了完全自动化地设置虚拟机(Xen pv)。
使用perl的 根功能 我在客人文件系统上做我的事情,然后我需要回到我最初的真正的根。我到底该怎么做呢?
脚本的例子。
`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。
类似于下面的代码应该可以解决这个问题。
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...
它缺乏一些错误检查的思想。
你不能撤销一个 chroot()
进程上--这就是系统调用的全部意义。
你需要第二个进程(子进程)在chroot环境中完成工作。 分叉,并让子进程在系统调用中进行 chroot
并做它的事情并退出,让父进程来做清理工作。
试着生出一个子进程,让它来做它的 chroot
例如,与 system
或 fork
根据您的需求,并等待孩子返回主程序继续。
这个看起来可能很有希望。
将原来的根目录保存为当前的工作目录或文件描述符。
chdir "/";
chroot "/mnt";
# Do something
chroot ".";
或
open DIR, "<", "/";
chroot "/mnt";
# Do something
chdir DIR;
chroot ".";
close DIR;