chroot (Русский)
Chroot — операция изменения корневого каталога диска для запущенного процесса и его дочерних процессов. Программа, запущенная в таком окружении, не может получить доступ к файлам вне нового корневого каталога. Это измененное окружение называется chroot jail.
Причины
Изменение корневого каталога обычно производится при обслуживании системы, загрузка и/или вход в которую стали невозможны. В таком режиме, например, могут быть выполнены:
- Переустановка загрузчика.
- Пересборка образа initramfs.
- Обновление или откат пакетов.
- Сброс пароля root.
- Сборка пакетов в чистом окружении, смотрите DeveloperWiki:Building in a clean chroot.
Смотрите также Wikipedia:Chroot#Limitations.
Требования
- Наличие привилегий суперпользователя.
- Возможность загрузки с другой среды Linux, например, LiveCD, загрузочного USB-носителя или другого установленного дистрибутива.
- Совпадение архитектур двух сред: с которой производится загрузка и в которую происходит изменение корня. Архитектуру текущей среды можно узнать командой
uname -m
(например, i686 или x86_64). - Если среде chroot необходимы какие-нибудь модули ядра, они должны быть загружены.
- Если нужен раздел подкачки, он должен быть включен:
# swapon /dev/sdxY
. - Интернет-соединение установлено, если нужно.
Использование
- Некоторые инструменты systemd, такие как hostnamectl, localectl и timedatectl, не работают внутри внутри chroot, поскольку они требуют активного dbus-соединения.
- Файловая система, которая станет новым корнем (
/
), должна быть доступна (т.е. расшифрована, смонтирована).
Есть два варианта использования chroot.
Используя arch-chroot
Bash-скрипт arch-chroot
является частью пакета arch-install-scripts. Перед запуском он монтирует нужные виртуальные файловые системы, например , и делает доступным из chroot.
Переход в chroot
Запустите arch-chroot с указанием нового корневого каталога:
# arch-chroot /путь/к/новому/корню
Например, руководство по установке использует каталог /mnt
:
# arch-chroot /mnt
Выход из chroot простой:
# exit
Запуск одной команды и выход
Чтобы запустить команду из chroot и сразу выйти, добавьте команду в конец строки:
# arch-chroot /путь/к/новому/корню команда
Чтобы запустить в окружении chroot минуя создание сеанса в командной оболочке:
# arch-chroot /mnt/arch /usr/bin/mkinitcpio -p linux
Используя chroot
В данном примере /путь/к/новому/корню
является каталогом, который станет корнем файловой системы внутри chroot.
Смонтируйте временные интерфейсные файловые системы:
# cd /путь/к/новому/корню # mount -t proc proc proc/ # mount -t sysfs /sys sys/ # mount --rbind /dev dev/
И, опционально:
# mount --rbind /run run/
Если у вас UEFI, вам также может поднадобиться доступ к переменным EFI. Без них попытка установки GRUB приведёт к ошибке вроде :
# mount --rbind /sys/firmware/efi/efivars sys/firmware/efi/efivars/
Чтобы использовать интернет-соединение в chroot может понадобиться скопировать resolv.conf:
# cp /etc/resolv.conf etc/resolv.conf
Чтобы запустить bash в окружении chroot:
# chroot /путь/к/новому/корню /bin/bash
После входа в сеанс chroot может понадобиться проинициализировать среду командной оболочки в новой среде:
# source /etc/profile # source ~/.bashrc
После завершения работы выйдите из сеанса chroot:
# exit
Теперь размонтируйте временные файловые системы и корневой раздел:
# cd / # umount --recursive /путь/к/новому/корню
Запуск графических приложений в среде chroot
Если у вас есть запущенный X-сервер, вы сможете запускать даже графические приложения в среде chroot.
Чтобы разрешить среде chroot соединение с сервером X, откройте виртуальный терминал внутри сервера (то есть, внутри рабочего стола пользователя, который в данный момент вошел в систему), запустите команду xhost, которая даст права каждому подключаться к X-серверу пользователя:
$ xhost +local:
Теперь, для соединения приложений с сервером X, установите переменной окружения DISPLAY в сеансе chroot значение, совпадающее с переменной окружения DISPLAY пользователя, от имени которого запущен сервер. То есть, выполните
$ echo $DISPLAY
от имени этого пользователя для того, чтобы узнать значение переменной, и выполните
# export DISPLAY=:0
в среде chroot, установив переменной нужное значение (в данном примере это ).
Без прав суперпользователя
Chroot требует привелегий суперпользователя, что может быть нежелательно. Однако, есть несколько способов симулировать работу chroot, используя альтернативные реализации.
PRoot
PRoot может использоваться для изменения корневого раздела и использовать без привелегий суперпользователя. Это полезно для ограничивания доступа приложений до единственного каталога или запуска программ, собранных для другой архитектуры. Однако PRoot имеет ограничения, связанные с тем, что все файлы принадлежат пользователю на основной системе. PRoot предоставляет опцию , которая может быть использована в качестве обходного пути для этих ограничений, по тому же принципу (хотя и более ограниченно), что и в fakeroot.
Fakechroot
fakechroot является небольшой прослойкой, которая перехватывает системные вызовы chroot и симулирует поведение системы, на самом деле не выполняя реальных вызовов (на которые все равно нет прав). Он может использоваться вместе с для создания видимости того, что chroot запускается суперпользователем.
# fakechroot fakeroot chroot ~/my-chroot bash
Unshare
Unshare можно использовать для создания нового пространства имён в ядре. Он входит в состав пакета . Он работает с обычной командой chroot. Пример:
$ unshare --map-root-user chroot ~/namespace /bin/sh
Решение проблем
arch-chroot: /путь/к/новому/корню is not a mountpoint. This may have undesirable side effects.
При выполнении может появиться такое предупреждение:
==> WARNING: /путь/к/новому/корню is not a mountpoint. This may have undesirable side effects.
Объяснение этого можно прочитать в ; там же вы найдёте пример, как превратить каталог в точку монтирования с помощью bind mount.