Chroot в Linux


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 в linux


Видно, что после выполнения chroot поменялось приглашение к вводу. Если предварительно также подмонтировать /dev, /sys, /proc в системе можно будет управлять процессами.



Важно, что выполнив ps aux можно получить доступ к процессам всей системы, а не только chroot.

Это может являться угрозой безопасности и при запуске процессов только на изоляцию даваемую chroot полагаться не стоит.



chroot стоит использовать для сборки пакетов под разные системы на одном хосте или для тестирования какого-либо ПО.


Также он нужен чтобы запуститься со съемного носителя когда на основной машине неработоспособен загрузчик.

Для использования в качестве системы для восстановления подходит Linux Tiny Core.

Сказать спасибо