chroot (Русский)

From ArchWiki
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

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

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

Причины

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

Смотрите также 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/
Примечание: Если вы пытаетесь смонтировать зашифрованную файловую систему, не забудьте первым делом открыть ее контейнер (например, командой # cryptsetup open /dev/sdX# имя для шифрования на основе dm-crypt/LUKS), затем смонтируйте устройство используя указанное имя (например, # mount /dev/mapper/имя /mnt/arch/...). Подробнее смотрите на странице: Dm-crypt/Device encryption#Unlocking/Mapping LUKS partitions with the device mapper.

Изменение корневого раздела

Используя 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: cannot run command '/usr/bin/bash': Exec format error, это значит, что архитектуры основной среды и среды нового корневого каталога не совпадают.
  • chroot: '/usr/bin/bash': permission denied, перемонтируйте раздел с разрешением exec: mount -o remount,exec /mnt/arch.

После входа в сеанс chroot может понадобиться проинициализировать среду командной оболочки в новой среде:

# source /etc/profile
# source ~/.bashrc
Совет: Вы также можете установить другое приглашение командной оболочки для того, чтобы отличать среду chroot от основной:
# export PS1="(chroot) $PS1"

Используя 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/
Примечание: Если возникает ошибка наподобие: umount: /path: device is busy, обычно это значит, что либо какая-то программа в среде chroot все еще запущена, либо что-то пошло не так при размонтировании внутренних по отношению к корневому разделу. Выйдите из программы и используйте команду mount чтобы найти и размонтировать подразделы. Может быть несколько непросто размонтировать некоторые вещи, и вам может посчастливиться форсировать размонтирование опцией umount --force. В качестве последнего средства используйте опцию umount --lazy, которая просто освобождает устройства. В любом случае, чтобы обезопасить себя, перезагрузитесь как можно быстрее.

Без прав суперпользователя

Chroot требует привелегий суперпользователя, что может быть нежелательно. Однако, есть несколько способов симулировать работу chroot, используя альтернативные реализации.

PRoot

PRoot может использоваться для изменения корневого раздела и использовать mount --bind без привелегий суперпользователя. Это полезно для ограничивания доступа приложений до единственного каталога или запуска программ, собранных для другой архитектуры. Однако PRoot имеет ограничения, связанные с тем, что все файлы принадлежат пользователю на основной системе. PRoot предоставляет опцию --root-id, которая может быть использована в качестве обходного пути для этих ограничений, по тому же принципу (хотя и более ограниченно), что и в fakeroot.

Fakechroot

fakechroot является небольшой прослойкой, которая перехватывает системные вызовы chroot и симулирует поведение системы, на самом деле не выполняя реальных вызовов (на которые все равно нет прав). Он может использоваться вместе с fakeroot для создания видимости того, что chroot запускается суперпользователем.

# fakechroot fakeroot chroot ~/my-chroot bash

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