Chroot в Linux — способ запуска процессов, системный вызов и просто команда, позволяющая изменить корневой каталог в системе. chroot используется при восстановлении работы системы после сбоя когда система не грузится и приходится использовать внешний носитель.
Также через chroot иногда выполняется изначальная настройка, подготовка окружений. В chroot запускаются приложения и виртуальные машины для того чтобы добиться изоляции их процессов.
Использование Chroot в Linux
chroot — способ попасть в консоль системы, которая не может запуститься из другой системы (live usb, режима восстановления, сервера в файловую систему которого примонтирован корневой раздел сервера для которого нужен chroot).
chroot используется для создания изолированного окружения — jail для процессов, а также для сборки пакетов методом debootstrap.
Командой chroot с указанием каталога запускается механизм, создающий систему директорий в этом каталоге идентичную той, что существует в корне . Команда выполняется только от имени суперпользователя.
Рассмотрим пример выполнения смены корневого каталога на /mnt — chroot /mnt.
Это бывает нужно при работе с системой со съемного носителя или в режиме восстановления.
Допустим, что мы подготавливаем образ виртуальной машины, для неё нет загрузчика и она не может загрузиться, при этом нужно попасть в систему.
Всё описанное точно так же применимо к случаю когда chroot используется чтобы из режима восстановления попасть в консоль сервера, на котором произошел сбой и который не загружается.
Проверяем содержимое корневого каталога системы, из которой работаем.
ls /
bin boot dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
В /mnt при этом пока никаких каталогов и файлов нет.
В mnt с помощью mount /dev/vda2 /mnt примонтирован системный диск сервера, для которого будем выполнять chroot
ls /mnt/
lost+found
При выполнении chroot получаем ошибку
chroot /mnt
chroot: failed to run command ‘/bin/bash’: No such file or directory
Как устранить ошибку 'chroot: failed to run command ‘/bin/bash’: No such file or directory'
Ошибка возникает из-за отсутствия в каталоге, который делается корневым, необходимых библиотек и бинарных файлов. В частности, судя по ошибке, нет файла оболочки /bin/bash.
Исправить ошибку можно скопировав файлы хост системы в chroot. Это безопасно делать если используемая система и система, в которую выполняется chroot используют один дистрибутив.
cp /bin/bash /mnt/bin
Также может потребоваться скопировать зависимости /bin/bash, их можно посмотреть выполнив ldd /mnt/bin/bash
Теперь ошибок быть не должно, выполняя chroot /mnt попадаем в консоль системы, корень которой смонтирован в /mnt
chroot /mnt
bash-4.3#
bash-4.3# ls /
bin lib lib64 usr
Каталогов в новом корне нет, но их можно в зависимости от задачи создать, скопировать с другой системы или подмонтировать из основной системы.
В последнем случае chroot будут не копии, а именно каталоги из хост системы.
Так обычно делают для /dev, /sys, /proc чтобы получить возможность управлять процессами в chroot. По умолчанию её нет.
Как выполнить монтирование /dev, /sys, /proc
Выходим из chroot в основную систему через ctrl+c, ctrl+d, потом выполняем монтирование с ключом --bind
mount --bind /dev /mnt/dev
mount --bind /sys /mnt/sys
mount --bind /proc /mnt/proc
Теперь вернувшись в chroot видим, что стало доступно управление процессами
bash-4.3# ps
PID TTY TIME CMD
21294 ? 00:00:00 bash
21673 ? 00:00:00 bash
21689 ? 00:00:00 ps
Пример chroot в Linux системе для которой предупреждения про /bin/bash не возникло приведен на скриншоте:
Видно, что после выполнения chroot поменялось приглашение к вводу. Если предварительно также подмонтировать /dev, /sys, /proc в системе можно будет управлять процессами.
Важно, что выполнив ps aux можно получить доступ к процессам всей системы, а не только chroot.
Это может являться угрозой безопасности и при запуске процессов только на изоляцию даваемую chroot полагаться не стоит.
chroot стоит использовать для сборки пакетов под разные системы на одном хосте или для тестирования какого-либо ПО.
Также он нужен чтобы запуститься со съемного носителя когда на основной машине неработоспособен загрузчик.
Для использования в качестве системы для восстановления подходит Linux Tiny Core.