chroot (Русский)

Chroot — операция изменения корневого каталога диска для запущенного процесса и его дочерних процессов. Программа, запущенная в таком окружении, не может получить доступ к файлам вне нового корневого каталога. Это измененное окружение называется chroot jail.

Состояние перевода: На этой странице представлен перевод статьи chroot. Дата последней синхронизации: 30 января 2022. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.

Причины

Изменение корневого каталога обычно производится при обслуживании системы, загрузка и/или вход в которую стали невозможны. В таком режиме, например, могут быть выполнены:

Смотрите также 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.

Смотрите также

gollark: Because if I was, then that would mean that I would be, but I am not.
gollark: If I am, then explain why I'm not.
gollark: Wrong. Utterly false. Incorrect. Invalid. Untrue.
gollark: I have absolutely no business or nonbusiness relations with any pizza companies whatsoever, nor do I engage in subliminal pizza advertising.
gollark: This is actually false, as I'm a person and I do it.
This article is issued from Archlinux. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.