Как выйти из chroot внутри Perl-скрипта? - PullRequest
3 голосов
/ 30 сентября 2011

При написании Perl-скрипта, предназначенного для полной автоматизации настройки виртуальных машин (Xen pv), я столкнулся с небольшой, возможно, очень простой проблемой.

Использование perl's chroot function Я делаю свои вещи в гостевой файловой системе, а затем мне нужно вернуться к моему первоначальному реальному корню. Как, черт возьми, я это делаю?

Пример сценария:

`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 Я нашел несколько сценариев, которые стремятся выйти из уже setup chroot (повышение привилегий). Так как я делаю chroot здесь, эти методы не применяются.

Пробовал некоторые сумасшедшие вещи, такие как:

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

Но не идти.

UPDATE Некоторые моменты для рассмотрения:

  • Я не могу разбить скрипт на несколько файлов. (Глупые причины, но на самом деле я не могу)
  • Часть chroot включает в себя использование большого количества данных, собранных ранее скриптом (до chroot), что исключает необходимость запуска другого скрипта внутри chroot.
  • Использование open, system или backticks нехорошо, мне нужно запускать команды и на основе вывода (не код выхода, фактический вывод) делать другие вещи.
  • Действия после chroot зависят от того, что было сделано внутри chroot, поэтому мне нужно иметь все переменные, которые я определил или изменил, находясь внутри, снаружи.
  • Возможна вилка, но я не знаю, как правильно обрабатывать передачу информации от ребенка к ребенку.

Ответы [ 4 ]

9 голосов
/ 30 сентября 2011

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

В ней все еще не хватает мысли о проверке ошибок.

4 голосов
/ 30 сентября 2011

Нельзя отменить chroot() в процессе - в этом весь смысл системного вызова.

Вам нужен второй процесс (дочерний процесс), чтобы выполнить работу в изолированной среде. Вилка, и пусть ребенок пройдет chroot и сделает все необходимое и выйдет, оставив родителя делать уборку.

2 голосов
/ 30 сентября 2011

Похоже, это может быть многообещающе:

Выход из тюрьмы с использованием PERL

2 голосов
/ 30 сентября 2011

Попробуйте порождать дочерний процесс, который выполняет chroot, например с system или fork в зависимости от ваших потребностей и ожидание возвращения ребенка основной программы продолжается.

...