在编写旨在完全自动化虚拟机 (Xen pv) 设置的 perl 脚本时,我遇到了一个可能非常简单的小问题。

使用 perl 的 chroot function 我在 guest 文件系统上做我的事情,然后我需要回到我最初的真实根。我他妈的怎么做?

脚本示例:

`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 是可能的,但我不知道正确处理从 child 到 child 的信息传递的好方法。
  • 最佳答案

    chrooted 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...
    

    它仍然缺少一些错误检查的思想。

    关于linux - 如何在 perl 脚本中退出 chroot?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7613325/

    10-13 06:37