arch-wiki-md-repo
Version:
All arch-wiki articles in markdown format, updated every two days.
233 lines (139 loc) • 16.2 kB
Markdown
Ссылки по теме
* [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)