Выйти из chroot-скрипта

Выйти из chroot-скрипта

Мой скрипт создает chrootкаркас для установки GRUB на USB-накопитель, запускаемый, конечно же, с помощью sudo:

SYSTEM_DIRS=(etc bin sbin var lib lib64 usr proc sys dev tmp)

boot_partition=/media/user/boot

for dir in ${SYSTEM_DIRS[@]}; do
  mount --bind /$dir ${boot_partition}/${dir}
done

Затем выполните несколько команд внутри chroot:

chroot ${boot_partition}/ touch foo # works fine
...

Но когда я хочу выполнить командуexit

chroot ${boot_partition}/ exit

Я получил:

chroot: failed to execute the command <<exit>>: No such file or directory

Почему это происходит и есть ли способ это исправить?

решение1

exitявляется встроенной оболочкой, а не отдельным исполняемым файлом, что означает, что он не может быть выполнен chroot. Однако, даже если бы это было возможно, ваша команда ничего не сделает.

Эта команда выполняется /executableв контексте chroot /path:

chroot /path /executable

Он не оставляет вызывающую программу внутри этого chroot; происходит неявный выход сразу после /executableзавершения выполнения:

mkdir -p /tmp/cr/{bin,lib,lib64}
cp -p /bin/pwd /tmp/cr/bin
cp -p $(find /lib* /usr/lib* -name 'libc.so*') /tmp/cr/lib
cp -p $(find /lib* /usr/lib* -name 'ld-linux-x86-64.so*') /tmp/cr/lib64

/bin/pwd                   # "/root"
chroot /tmp/cr /bin/pwd    # "/"
/bin/pwd                   # "/root"

решение2

Я столкнулся с тем же вопросом, мое решение — при запуске chroot добавить после него exit:

chroot /chroot_path && exit

тогда если пользователь выйдет из chroot, произойдет выход из всей оболочки

Связанный контент