Создание chroot-окружения в Debian средствами debootstrap
Опубликовано 20.01.2010
Для тестирования различных версий нашего продукта (внутри — БД под управлением mysql и интерфейс к ней на PHP под Apache2) требуется быстро создавать многочисленные chroot-окружения на выделенном сервере и управляться с ними.
В базовой системе (lenny) оставляем только функционал, необходимый для управления всем хозяйством, лично мне необходимы mc, openssh, vim, bash_completion и иногда svn. Также неплохо поиметь где-нибудь (да хоть на этой же машине) кэширующий прокси для репозиториев debian, типа apt-proxy или apt-cacher, чтобы не создавать излишнюю нагрузку на региональные зеркала. У нас используется apt-cacher, работающий по адресу http://apt:3142.
Debootstrap — основная рабочая лошадка:
apt-get install debootstrap
debootstrap --include=mc,ssh,vim lenny /systems/lenny http://apt:3142/ftp.debian.org/debian/
Первый аргумент — название релиза, второй — путь, куда устанавливается система, третий — адрес репозитория. В опции –include через запятую указываются пакеты, которые необходимы, но не входят в минимальную базовую систему. Debootstrap выкачивает из репозитория и устанавливает минимальный набор пакетов, теоретически сразу после этого можно делать chroot /systems/lenny и переходить к работе, но осталась еще несколько немаловажных доделок:
Добавляем идентификатор системы, который будет отображаться в скобках в приглашении шелла (читай — bash), выполняемом в chroot-окружении:
echo lenny > /systems/lenny/etc/debian_chroot
Но работа в основном ведется от имени root, а в squeeze и sid у root’а в .bashrc переменная окружения PS1 переопределяется и этот идентификатор пропадает. Поэтому если делаем виртуалку squeeze, то строчку с PS1 в /root/.bashrc лучше закомментировать:
sed -i 's/^\(export PS1.*\)$/#\1/g' /systems/squeeze/root/.bashrc
Монтируем /dev/pts — виртуальную файловую систему, которая динамически создаёт файлы терминалов /dev/pts/X для каждого нового подключения; это необходимо для нормального функционирования многих программ, работающих с терминалом, в т.ч. скриптов postinst и config пакета mysql-server:
mount -t devpts devpts /systems/lenny/dev/pts
Монтируем /proc (реально proc в новом месте будет содержать ту же информацию, что и общесистемный /proc):
mount -t proc proc /systems/lenny/proc
Чтобы apt-get не ругался на неподписанные пакеты при установке, необходимо обновить файл Release.gpg, т.к. по умолчанию debootstrap его не устанавливает. Это проще всего сделать обновлением индексных файлов репозитория:
chroot /systems/lenny apt-get update
После этого уже можно делать chroot /systems/lenny
, устанавливать и настраивать пакеты, запускать/останавливать сервисы и т.д. Главная проблема при этом — следить за тем, чтобы сервисы в разных chroot’ах не конфликтовали, пытаясь занять порт на одном IP-адресе. Обычно добавляются виртуальные сетевые интерфейсы и им назначаются виртуальные же IP-адреса, которые и указываются в настройках сервисов.
Disclaimer: данная заметка описывает мой персональный опыт и не претендует на полноту. Комментарии и дополнения приветствуются.
Одним из примером использования debootstrap можно назвать создание загрузочной флешки для ОС Debian GNU/Linux .
> Монтируем /dev/pts
А вот это интересно. /dev/pts в основной и гостевой системе – это разные каталоги?
Я ещё читал другие инструкции. Там советовали смонтировать (причём bind-ом) в гостевую систему весь dev. Как правильнее?
Начиная с 2.6.29, виртуальная ФС devpts поддерживает несколько виртуальных контейнеров для создания ссылок на устройства терминалов, о чем можно подробно почитать тут. А до 2.6.29 все примонтированные devpts ссылались на одну и ту же область памяти, и по сути не было никакой разницы, монтировать ли devpts заново или биндить существующий каталог /dev/pts
Спасибо.