Change root (Русский)
Chroot — операция изменения корневого каталога диска для запущенного процесса и его дочерних процессов. Программа, запущенная в таком окружении не может получить доступ к файлам вне нового корневого каталога. Это измененное окружение называется chroot jail.
Contents
Причины
Изменение корневого каталога обычно производится для выполнения действий по обслуживанию систем, загрузка и/или вход в которых стали невозможны. В таком режиме, например, могут быть выполнены:
- Переустановка загрузчика.
- Пересборка образа initramfs.
- Обновление или откат пакетов.
- Сброс пароля root.
Смотрите также Wikipedia:Chroot#Limitations.
Требования
- Наличие привелегий суперпользователя.
- Возможность загрузки с другой среды Linux, например, LiveCD, загрузочного USB-носителя или другого установленного дистрибутива.
- Совпадение архитектур двух сред: с которой производится загрузка и в которую происходит изменение корня. Архитектуру текущей среды можно узнать командой
# uname -m
(например, i686 или x86_64).
- Если среде chroot необходимы какие-нибудь модули ядра, они должны быть загружены.
- Если нужен раздел подкачки, он должен быть включен:
swapon /dev/sdxY
.
- Интернет-соединение установлено, если нужно.
Монтирование разделов
Корневой раздел среды Linux, в которую вы хотите войти с chroot, должен быть первым делом смонтирован. Чтобы найти имя раздела, выполните:
# lsblk
Затем создайте каталог для монтирования корневого раздела и смонтируйте его:
# mkdir /mnt/arch # mount /dev/sdx1 /mnt/arch
Если отдельные системные каталоги были вынесены на отдельные разделы, их также нужно смонтировать в файловую систему корневого раздела:
# mount /dev/sdx2 /mnt/arch/boot/ # mount /dev/sdx3 /mnt/arch/home/
Изменение корневого раздела
Используя arch-chroot
Bash-скрипт arch-chroot является частью пакета arch-install-scripts из официальных репозиториев. Перед тем, как запускать /usr/bin/chroot
, этот скрипт монтирует интерфейсные файловые системы вроде /proc
и делает /etc/resolv.conf
доступным из под окружения chroot.
Запустите arch-chroot с указанием нового корневого каталога:
# arch-chroot /mnt/arch
Чтобы запустить командную оболочку bash вместо sh:
# arch-chroot /mnt/arch /bin/bash
Чтобы запустить mkinitcpio -p linux
в окружении chroot минуя создание сеанса в командной оболочке:
# arch-chroot /mnt/arch /usr/bin/mkinitcpio -p linux
Используя chroot
Смонтируйте временные интерфейсные файловые системы:
# cd /mnt/arch # mount -t proc proc proc/ # mount --rbind /sys sys/ # mount --rbind /dev dev/
И, опционально:
# mount --rbind /run run/
Чтобы использовать интернет-соединение в chroot может понадобиться скопировать resolv.conf:
# cp /etc/resolv.conf etc/resolv.conf
Чтобы запустить bash в окружении chroot:
# chroot /mnt/arch /bin/bash
После входа в сеанс chroot может понадобиться проинициализировать среду командной оболочки в новой среде:
# source /etc/profile # source ~/.bashrc
Используя systemd-nspawn
systemd-nspawn может использоваться для запуска команды или операционной системы в легковесном контейнере. Во многих случаях он похож на chroot, но является более мощным инструментом, так как он полностью эмулирует отдельную иерархию файловой системы и дерево процессов, различные системы межпроцессного взаимодействия, имя хоста и домена.
Перейдите в точку монтирования нового корневого раздела и запустите systemd-nspawn:
# cd /mnt/arch # systemd-nspawn
Нет необходимости самостоятельно монтировать интерфейсные файловые системы вроде /proc
,
так как systemd-nspawn запускает новый процесс init в созданной виртуальной среде, который берет на себя эту задачу. Это похоже на загрузку второй операционной системы внутри основной, но без создания виртуальной машины.
Чтобы вернуться в основную систему, просто разлогиньтесь или запустите команду poweroff. После этого вы можете размонтировать разделы, как показано в #Выход из среды chroot.
Запуск графических приложений в среде chroot
Если у вас есть запущенный X-сервер, вы сможете запускать даже графические приложения в среде chroot.
Чтобы разрешить среде chroot соединение с сервером X, откройте виртуальный терминал внутри сервера (то есть, внутри рабочего стола пользователя, который в данный момент вошел в систему), запустите команду xhost, которая даст права каждому подключаться к X-серверу пользователя:
$ xhost +local:
Теперь, для соединения приложений с сервером X, установите переменной окружения DISPLAY в сеансе chroot значение, совпадающее с переменной окружения DISPLAY пользователя, от имени которого запущен сервер. То есть, выполните
$ echo $DISPLAY
от имени этого пользователя для того, чтобы узнать значение переменной, и выполните
# export DISPLAY=:0
в среде chroot, установив переменной нужное значение (в данном примере это :0
).
Выход из среды chroot
После завершения работы, выйдите из сеанса chroot:
# exit
Теперь размонтируйте временные файловые системы и корневой раздел:
# cd / # umount --recursive /mnt/arch/
Без прав суперпользователя
Chroot требует привелегий суперпользователя, что может быть нежелательно. Однако, есть несколько способов симулировать работу chroot, используя альтернативные реализации.
PRoot
PRoot может использоваться для изменения корневого раздела и использовать mount --bind
без привелегий суперпользователя. Это полезно для ограничивания доступа приложений до единственного каталога или запуска программ, собранных для другой архитектуры. Однако PRoot имеет ограничения, связанные с тем, что все файлы принадлежат пользователю на основной системе. PRoot предоставляет опцию --root-id
, которая может быть использована в качестве обходного пути для этих ограничений, по тому же принципу (хотя и более ограниченно), что и в fakeroot.
Fakechroot
fakechroot является небольшой прослойкой, которая перехватывает системные вызовы chroot и симулирует поведение системы, на самом деле не выполняя реальных вызовов (на которые все равно нет прав). Он может использоваться вместе с fakeroot для создания видимости того, что chroot запускается суперпользователем.
# fakechroot fakeroot chroot ~/my-chroot bash