Chroot

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 09:03, 7 декабря 2016.

Chroot (Change root) - операция изменения корневого каталога диска для запущенного процесса и его дочерних процессов в Unix-подобных операционных системах. Программа, запущенная в таком окружении не может получить доступ к файлам вне нового корневого каталога. Это измененное окружение называется chroot jail.[1]

Причины

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

  • Переустановка загрузчика.
  • Пересборка образа initramfs.
  • Обновление или откат пакетов.
  • Сброс пароля root.

Требования

  • Наличие привелегий суперпользователя.
  • Возможность загрузки с другой среды 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/...

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

Используя 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

Если вы получили ошибки:

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

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

# source /etc/profile
# source ~/.bashrc

Используя systemd-nspawn

systemd-nspawn может использоваться для запуска команды или операционной системы в легковесном контейнере. Во многих случаях он похож на chroot, но является более мощным инструментом, так как он полностью эмулирует отдельную иерархию файловой системы и дерево процессов, различные системы межпроцессного взаимодействия, имя хоста и домена.

Перейдите в точку монтирования нового корневого раздела и запустите systemd-nspawn:

# cd /mnt/arch
# systemd-nspawn

Нет необходимости самостоятельно монтировать интерфейсные файловые системы вроде /proc, так как systemd-nspawn запускает новый процесс init в созданной виртуальной среде, который берет на себя эту задачу. Это похоже на загрузку второй операционной системы внутри основной, но без создания виртуальной машины. Чтобы вернуться в основную систему, просто разлогиньтесь или запустите команду poweroff. После этого вы можете размонтировать разделы, как показано в #Выход из среды chroot. [2]

Запуск графических приложений в среде 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.

  • необходимо скачать какую-либо операционную систему. Воспользуемся Slitaz (размер образа всего 35МБ).
  • далее необходимо извлечь файловую систему из образа
  • для этого смонтируем образ в папку slitaz с помощью команды
# mount
  • после чего разархивировать ее из файла rootfs4.gz
  • т.к. файл rootfs4.gz имеет расширение .gz воспользуемся командой unlzma с опциями -S и -gz.
# unlzma -S -gz

В итоге получаем несжатый файл rootfs4

  • теперь нужно извлечь файловую систему. Прописываем cplo -l < rootfs4.

Как мы видим файловая система извлечена и ждет дальнейших действий.

Пишем
# chroot . sh
где chroot - это сама команда, . - месторасположение файловой системы (мы уже находимся в папке с файловой системой, поэтому пишем просто .), а sh - это файл, который является исполняемым shell’ом операционной системы Slitaz.

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

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

Proot

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

Fakechroot

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

# fakechroot fakeroot chroot ~/my-chroot bash

Ссылки по теме

  1. Chroot Вики[Электронный ресурс]:Chroot / Дата обращения 04.11.2016 — Режим доступаВики
  2. Arch Linux[Электронный ресурс]: Arch / Дата обращения 05.11.2016 — Режим доступаArch Linux
  3. Basic Chroot [Электронный ресурс]:Chroot / Дата обращения 05.11.2016 — Режим доступаBasic Chroot