UNPKG

arch-wiki-md-repo

Version:

All arch-wiki articles in markdown format, updated every two days.

233 lines (139 loc) 16.2 kB
Ссылки по теме * [Install bundled 32-bit system in Arch64](/index.php/Install_bundled_32-bit_system_in_Arch64 "Install bundled 32-bit system in Arch64") * [PRoot](/index.php/PRoot "PRoot") * [systemd-nspawn](/index.php/Systemd-nspawn "Systemd-nspawn") [Chroot](https://en.wikipedia.org/wiki/ru:chroot "wikipedia:ru:chroot") — операция изменения корневого каталога диска для запущенного процесса и его дочерних процессов. Программа, запущенная в таком окружении не может получить доступ к файлам вне нового корневого каталога. Это измененное окружение называется *chroot jail*. ## Contents * [1 Причины](#.D0.9F.D1.80.D0.B8.D1.87.D0.B8.D0.BD.D1.8B) * [2 Требования](#.D0.A2.D1.80.D0.B5.D0.B1.D0.BE.D0.B2.D0.B0.D0.BD.D0.B8.D1.8F) * [3 Монтирование разделов](#.D0.9C.D0.BE.D0.BD.D1.82.D0.B8.D1.80.D0.BE.D0.B2.D0.B0.D0.BD.D0.B8.D0.B5_.D1.80.D0.B0.D0.B7.D0.B4.D0.B5.D0.BB.D0.BE.D0.B2) * [4 Изменение корневого раздела](#.D0.98.D0.B7.D0.BC.D0.B5.D0.BD.D0.B5.D0.BD.D0.B8.D0.B5_.D0.BA.D0.BE.D1.80.D0.BD.D0.B5.D0.B2.D0.BE.D0.B3.D0.BE_.D1.80.D0.B0.D0.B7.D0.B4.D0.B5.D0.BB.D0.B0) * [4.1 Используя arch-chroot](#.D0.98.D1.81.D0.BF.D0.BE.D0.BB.D1.8C.D0.B7.D1.83.D1.8F_arch-chroot) * [4.2 Используя chroot](#.D0.98.D1.81.D0.BF.D0.BE.D0.BB.D1.8C.D0.B7.D1.83.D1.8F_chroot) * [4.3 Используя systemd-nspawn](#.D0.98.D1.81.D0.BF.D0.BE.D0.BB.D1.8C.D0.B7.D1.83.D1.8F_systemd-nspawn) * [5 Запуск графических приложений в среде chroot](#.D0.97.D0.B0.D0.BF.D1.83.D1.81.D0.BA_.D0.B3.D1.80.D0.B0.D1.84.D0.B8.D1.87.D0.B5.D1.81.D0.BA.D0.B8.D1.85_.D0.BF.D1.80.D0.B8.D0.BB.D0.BE.D0.B6.D0.B5.D0.BD.D0.B8.D0.B9_.D0.B2_.D1.81.D1.80.D0.B5.D0.B4.D0.B5_chroot) * [6 Выход из среды chroot](#.D0.92.D1.8B.D1.85.D0.BE.D0.B4_.D0.B8.D0.B7_.D1.81.D1.80.D0.B5.D0.B4.D1.8B_chroot) * [7 Без прав суперпользователя](#.D0.91.D0.B5.D0.B7_.D0.BF.D1.80.D0.B0.D0.B2_.D1.81.D1.83.D0.BF.D0.B5.D1.80.D0.BF.D0.BE.D0.BB.D1.8C.D0.B7.D0.BE.D0.B2.D0.B0.D1.82.D0.B5.D0.BB.D1.8F) * [7.1 PRoot](#PRoot) * [7.2 Fakechroot](#Fakechroot) * [8 Смотрите также](#.D0.A1.D0.BC.D0.BE.D1.82.D1.80.D0.B8.D1.82.D0.B5_.D1.82.D0.B0.D0.BA.D0.B6.D0.B5) ## Причины Изменение корневого каталога обычно производится для выполнения действий по обслуживанию систем, загрузка и/или вход в которых стали невозможны. В таком режиме, например, могут быть выполнены: * Переустановка [загрузчика](/index.php/Boot_loaders "Boot loaders"). * Пересборка образа [initramfs](/index.php/Mkinitcpio_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9) "Mkinitcpio (Русский)"). * Обновление или [откат пакетов](/index.php/%D0%9E%D1%82%D0%BA%D0%B0%D1%82_%D0%BF%D0%B0%D0%BA%D0%B5%D1%82%D0%BE%D0%B2 "Откат пакетов"). * [Сброс пароля root](/index.php/%D0%A1%D0%B1%D1%80%D0%BE%D1%81_%D0%BF%D0%B0%D1%80%D0%BE%D0%BB%D1%8F_root "Сброс пароля root"). Смотрите также [Wikipedia:Chroot#Limitations](https://en.wikipedia.org/wiki/Chroot#Limitations "wikipedia:Chroot"). ## Требования * Наличие привелегий суперпользователя. * Возможность загрузки с другой среды 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/ ``` **Примечание:** Если вы пытаетесь смонтировать [зашифрованную](/index.php/Disk_encryption "Disk encryption") файловую систему, не забудьте первым делом открыть ее контейнер (например, командой `# cryptsetup open /dev/sdX# *имя*` для шифрования на основе [dm-crypt/LUKS](/index.php/Disk_encryption#Block_device_encryption "Disk encryption")), затем смонтируйте устройство используя указанное *имя* (например, `# mount /dev/mapper/*имя* /mnt/arch/...`). Подробнее смотрите на странице: [Dm-crypt/Device encryption#Unlocking/Mapping LUKS partitions with the device mapper](/index.php/Dm-crypt/Device_encryption#Unlocking.2FMapping_LUKS_partitions_with_the_device_mapper "Dm-crypt/Device encryption"). ## Изменение корневого раздела ### Используя arch-chroot Bash-скрипт *arch-chroot* является частью пакета [arch-install-scripts](https://www.archlinux.org/packages/?name=arch-install-scripts) из [официальных репозиториев](/index.php/Official_repositories_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9) "Official repositories (Русский)"). Перед тем, как запускать `/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](#.D0.92.D1.8B.D1.85.D0.BE.D0.B4_.D0.B8.D0.B7_.D1.81.D1.80.D0.B5.D0.B4.D1.8B_chroot). ## Запуск графических приложений в среде chroot Если у вас есть запущенный [X-сервер](/index.php/Xorg "Xorg"), вы сможете запускать даже графические приложения в среде chroot. Чтобы разрешить среде chroot соединение с сервером X, откройте виртуальный терминал внутри сервера (то есть, внутри рабочего стола пользователя, который в данный момент вошел в систему), запустите команду [xhost](/index.php/Xhost "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](/index.php/PRoot "PRoot") может использоваться для изменения корневого раздела и использовать `mount --bind` без привелегий суперпользователя. Это полезно для ограничивания доступа приложений до единственного каталога или запуска программ, собранных для другой архитектуры. Однако PRoot имеет ограничения, связанные с тем, что все файлы принадлежат пользователю на основной системе. PRoot предоставляет опцию `--root-id`, которая может быть использована в качестве обходного пути для этих ограничений, по тому же принципу (хотя и более ограниченно), что и в *fakeroot*. ### Fakechroot [fakechroot](https://www.archlinux.org/packages/?name=fakechroot) является небольшой прослойкой, которая перехватывает системные вызовы chroot и симулирует поведение системы, на самом деле не выполняя реальных вызовов (на которые все равно нет прав). Он может использоваться вместе с [fakeroot](https://www.archlinux.org/packages/?name=fakeroot) для создания видимости того, что chroot запускается суперпользователем. ``` # fakechroot fakeroot chroot ~/my-chroot bash ``` ## Смотрите также * [Basic Chroot](https://help.ubuntu.com/community/BasicChroot)