Мой скрипт создает 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, произойдет выход из всей оболочки