Гид по технологиям

Как запускать несколько дистрибутивов Linux без виртуализации с помощью chroot

7 min read Linux Обновлено 03 Dec 2025
Запуск нескольких дистрибутивов Linux с помощью chroot
Запуск нескольких дистрибутивов Linux с помощью chroot

Коротко: что такое chroot

chroot (change root) — системная операция, которая меняет видимый для процесса корневой каталог на указанный каталог. Процесс и его потомки «видят» только файлы внутри этой директории, как если бы это была вся файловая система. Это не создаёт отдельное ядро или отдельный init-процесс — только отдельное файловое пространство.

Определение в одну строку: chroot — локальная изоляция файловой системы без запуска отдельного ядра.

Важно: chroot не заменяет виртуальную машину и не обеспечивает полноценную безопасность — процессы с правами root внутри chroot всё ещё могут воздействовать на хост при наличии соответствующих устройств или привязок.

Как это работает — развёрнутый обзор

Когда Linux загружается, загрузчик (GRUB) загружает ядро и монтирует корневой раздел, после чего запускается init. Обычная система работает «из» своего корневого раздела. chroot не запускает новый загрузочный цикл. Мы говорим хосту «воспринимай эту директорию как /» и запускаем в ней оболочку или отдельные процессы. Эти процессы используют уже загруженное ядро хоста, но все пути к бинарникам, библиотекам и конфигурации берутся из дерева файлов внутри chroot.

Пример файловой структуры до chroot:

Дерево файловых систем до chroot

После chroot указанная директория выглядит как корень для запущенных там процессов:

Дерево файловых систем после chroot

Если внутри chroot набрать ls или firefox, система попытается выполнить бинарники, найденные внутри этого корневого дерева — не те, что из хоста.

Пример: скачивание и запуск базовой файловой системы Gentoo

Ниже — минимальный пример создания директории и связывания её с chroot. В примере используется tarball с базовой системой Gentoo (stage3). В реальной работе вы можете использовать debootstrap для Debian-подобных систем или распаковку любого tarball с базовой FS.

mkdir /mnt/guest
cd /mnt/guest
wget http://distfiles.gentoo.org/releases/x86/2008.0/stages/stage3-x86-2008.0.tar.bz2
tar -jxvf stage3-x86-2008.0.tar.bz2
chroot /mnt/guest

Эти строки делают по порядку:

  1. Создают директорию для гостя.
  2. Переходят в неё.
  3. Скачивают tarball с базовой системой Gentoo.
  4. Распаковывают его.
  5. Запускают chroot, после чего указанная директория воспринимается как / внутри новой оболочки.

После chroot prompt и содержимое файловой системы будут браться из распакованной Gentoo-сущности:

Пример отображения pwd после chroot

На скриншоте видно, что оболочка берёт настройки (включая PS1) изнутри chroot — для неё это и правда корень.

Практические шаги для разумного chroot — подготовка

Перед выполнением chroot обычно полезно сделать несколько дополнительных шагов — это расширит возможности гостевой среды и снизит риск ошибок:

  1. Создайте директорию и распакуйте в неё базовую систему.
  2. Смонтируйте необходимые pseudo-файловые системы:
mount --bind /dev /mnt/guest/dev
mount --bind /dev/pts /mnt/guest/dev/pts
mount -t proc /proc /mnt/guest/proc
mount -t sysfs /sys /mnt/guest/sys
cp /etc/resolv.conf /mnt/guest/etc/resolv.conf
  1. При необходимости перенесите некоторые устройства или сокеты (например, /run или /var/run):
mount --bind /run /mnt/guest/run
  1. Запустите chroot и проверьте окружение:
chroot /mnt/guest /bin/bash --login
# затем проверяем
mount | grep proc
cat /etc/os-release
uname -a   # будет ядро хоста

Примечание: предоставление доступа к /dev и /run делает chroot более функциональным (например, для apt, emerge, systemctl внутри chroot), но повышает степень интеграции с хостом.

Как корректно выйти и очистить

Чтобы выйти из chroot, выполните exit или Ctrl-D в оболочке, затем размонтируйте ранее смонтированные pseudo- и bind-файловые системы. Пример:

exit
umount /mnt/guest/dev/pts
umount /mnt/guest/dev
umount /mnt/guest/proc
umount /mnt/guest/sys
umount /mnt/guest/run

Если некоторые монтирования заняты, используйте lazy-umount:

umount -l /mnt/guest/dev

Когда chroot недостаточно: ограничения и случаи отказа

  • chroot не запускает отдельное ядро: если гость требует специфичного ядра (модули, параметры или версии), он может не работать.
  • Нет полноценной безопасности: root в chroot при наличии /dev или привязанных точек может получить доступ к хосту.
  • Системы, завязанные на systemd в собственном PID 1, могут некорректно работать внутри простого chroot.
  • Разные архитектуры: чтобы запускать бинарники другой архитектуры (arm на x86), потребуется qemu-user-static и соответствующие бинэты.

Пример, когда chroot не подходит: вы хотите полностью эмулировать отдельную сеть и ядро с иными параметрами — здесь нужна виртуализация или контейнеризация.

Альтернативы и сравнения

  • Контейнеры (Docker, LXC): дают лёгкую изоляцию процессов и сети, но требуют настроек cgroups и namespace; лучше подходят для продакшн-окружений.
  • Виртуальные машины (KVM, VirtualBox): предоставляют отдельное ядро, изолированную сеть и устройства, но с накладными расходами на производительность.
  • chroot: быстрее и проще для восстановления, тестов и работы с другой системой на том же железе.

Ментальная модель: chroot = «сменить видимые файлы», контейнер = «изолировать процессы и сеть», виртуальная машина = «имитировать новое устройство с собственным ядром».

Типичные сценарии применения

  • Тестирование сборки пакетов и окружений в «чистой» FS без влияния локальной конфигурации.
  • Запуск пакетов, собранных для другой дистрибуции.
  • Восстановление системы с Live CD (см. SOP ниже).
  • Доступ к файловой системе другого раздела, когда не хочется перезагружать ОС.
  • Запуск 32-битных приложений в 64-битной системе (при наличии нужных библиотек).

SOP: восстановление загрузчика и системы с Live CD

Ниже — упрощённый пошаговый план восстановления Debian/Ubuntu-подобной системы из Live CD.

  1. Загрузитесь с Live CD/USB и откройте терминал.
  2. Найдите корневой раздел целевой системы (например /dev/sda1):
lsblk
  1. Смонтируйте раздел и необходимые pseudo-файлы:
sudo mount /dev/sda1 /mnt
sudo mount --bind /dev /mnt/dev
sudo mount --bind /dev/pts /mnt/dev/pts
sudo mount -t proc /proc /mnt/proc
sudo mount -t sysfs /sys /mnt/sys
sudo cp /etc/resolv.conf /mnt/etc/resolv.conf
  1. Войдите в chroot и выполните восстановление GRUB:
sudo chroot /mnt /bin/bash
grub-install /dev/sda
update-grub
exit
  1. Отмонтируйте и перезагрузите:
sudo umount /mnt/dev/pts
sudo umount /mnt/dev
sudo umount /mnt/proc
sudo umount /mnt/sys
sudo umount /mnt
sudo reboot

Эта последовательность часто помогает восстановить загрузчик и исправить конфигурацию без полной переустановки.

Чек-листы по ролям

Для системного администратора:

  • Сделать бэкап важных данных с хоста.
  • Убедиться, что есть свободное место для распаковки FS гостя.
  • Смонтировать /proc, /sys, /dev с bind, если нужен доступ к устройствам.
  • Проверить /etc/resolv.conf внутри chroot для доступа в интернет.
  • После работы корректно отмонтировать все bind и pseudo FS.

Для разработчика:

  • Подготовить чистую базовую файловую систему (stage/debootstrap).
  • Установить необходимые инструменты (gcc, make) внутри chroot.
  • Настроить сетевые настройки и прокси, если требуется.
  • Тестировать сборку и зависимости без вмешательства хоста.

Для восстановления:

  • Идентифицировать разделы целевой системы.
  • Смонтировать и подготовить окружение как в SOP.
  • Восстановить grub и initramfs по необходимости.

Критерии приёмки

  1. После chroot успешный запуск bash и чтение /etc/os-release внутри гостя.
  2. uname -a показывает ядро хоста (что ожидаемо).
  3. Пакетный менеджер внутри chroot может обновлять метаданные (при наличии сети).
  4. После выхода все bind-монтирования размонтированы без ошибок.

Отладка и типичные ошибки

  • Ошибка «No such file or directory» при запуске бинарника — проверьте, что бинарник существует и что у него правильные динамические библиотеки (ldd).
  • Если внутри chroot нет сети — убедитесь, что вы скопировали /etc/resolv.conf или настроили соответствующие сетевые настройки.
  • Если systemctl падает — systemd ожидает быть PID 1; в chroot systemd в большинстве случаев не будет работать как в полноценно поднятой системе.

Безопасность и приватность

  • chroot не даёт безопасности уровня контейнера/VM. Не доверьте chroot подозрительному коду от неизвестных источников.
  • Всегда проверяйте, какие каталоги и устройства вы привязываете в chroot — /dev и /run могут дать процессам внутри доступ к хосту.

Важно: выполнение chroot и монтирование /dev требует прав root. Работайте осторожно и понимайте последствия.

Советы и лучшие практики

  • Для многоразовых окружений используйте шаблонные tarball или debootstrap для Debian-стилей.
  • Если нужно запускать приложения другой архитектуры, установите qemu-user-static и зарегистрируйте его в binfmt_misc.
  • Для изолированного тестирования сервисов используйте контейнеры — они легче управляются и безопаснее.

Примеры дополнительных команд

Установка qemu-user-static на Debian-подобных системах для поддержки другой архитектуры:

sudo apt-get install qemu-user-static
# затем распаковка guest FS и регистрация
sudo update-binfmts --enable qemu-arm

Пример распаковки и подготовки Debian-образа через debootstrap:

sudo apt-get install debootstrap
sudo debootstrap --arch=amd64 stable /mnt/guest http://deb.debian.org/debian

Часто задаваемые вопросы

Q: Будет ли внутри chroot работать systemd как на полноценной системе?

A: Обычно нет. systemd ожидает, что он —PID 1 и управляет cgroups; в простом chroot это поведение нарушается. Для тестирования systemd лучше использовать контейнер или полноценную VM.

Q: Можно ли использовать chroot для запуска GUI-приложений?

A: Да, но нужно обеспечить доступ к X-серверу/Wayland (например, через проброс сокета /tmp/.X11-unix и DISPLAY) и соответствующие библиотеки внутри chroot.

Q: Как безопасно выполнить chroot, если гость — непроверенный код?

A: chroot не обеспечивает безопасности от злонамеренного кода. Для непроверенных приложений используйте контейнер или виртуальную машину.

Краткое резюме

chroot — простой и мощный инструмент для изоляции файловой системы, восстановления и тестирования окружений без перезагрузки. Он даёт быстрый доступ к альтернативным дистрибутивам и системам, но не заменяет контейнеры или виртуальные машины, если вам нужно отдельное ядро, полноценная изоляция или сетевые namespace. Используйте chroot для восстановления, отладки и простых экспериментов; для продакшна и безопасности выбирайте контейнеры или VM.

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

Если у вас есть опыт использования chroot для запуска нескольких дистрибутивов или восстановления системы с Live CD, поделитесь вашими сценариями и советами в комментариях.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Автоматическая очистка Linux с Cruftbuster
Linux утилиты

Автоматическая очистка Linux с Cruftbuster

Master PDF Editor на Linux: создание и редактирование
PDF редакторы

Master PDF Editor на Linux: создание и редактирование

Многокамерная трансляция бесплатно
Стриминг

Многокамерная трансляция бесплатно

Открыть Configuration Manager (SCCM) в Windows 11
Системное администрирование

Открыть Configuration Manager (SCCM) в Windows 11

Внешнее Featured Image по URL в WordPress
WordPress

Внешнее Featured Image по URL в WordPress

Отключить автозапуск USB в Windows XP и выше
Безопасность

Отключить автозапуск USB в Windows XP и выше