# Change root (Русский)

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

- Install bundled 32-bit system in Arch64
- proot
- systemd-nspawn

Эта страница нуждается в сопроводителе

Статья не гарантирует актуальность информации. Помогите русскоязычному сообществу поддержкой подобных страниц. См. Команда переводчиков ArchWiki

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

## Причины

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

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

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

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

- Basic Chroot

Categories:

- System recovery (Русский)
- Русский