Поднятие chroot-«виртуалки» с ubuntu для сборки пакетов

в 12:03, , рубрики: Arch Linux, archlinux, chroot, Debian, linux, Ubuntu, Настройка Linux, системное администрирование

Приветствую.

На днях надоело для сборки пакетов ходить по ssh на разные машинки и решил поднять парочку у себя. Расскажу о граблях, которые собрал по дороге и о костылях, которые смастерил.

Все действия выполнялись на Arch linux, но действия по настройке chroot-виртуалок и schroot должны быть очень схожими.

Всё, что описано далее, разумеется, разбросано по всей сети. Но проб и ошибок по пути много.

Bootstrap

Итак, начинается всё, можно сказать, банально, есть описание процесса bootstrap в этой статье
Для себя я ставлю 2 виртуалки — precise и trusty:

yaourt -S --nocnofirm --asdeps ubuntu-keyring gnupg1 # ставим пакеты, как зависимости
yaourt -S --nocnofirm debootstrap schroot
for distr in trusty precise
  do sudo debootstrap --include=vim,language-pack-ru,language-pack-ru-base,devscripts,subversion,git --arch amd64 $distr /home/ubuntu_$distr http://mirror.yandex.ru/ubuntu/
done
Спустя какое-то время, когда доезжают пакетики

Имеем ненастроенные сорсы, ненастроенную локаль, часовой пояс… всю гамму красок.
Настроим сорсы:

for distr in trusty precise
do sudo sh -c "cat > /home/ubuntu_$distr/etc/apt/sources.list <<EOF
deb http://mirror.yandex.ru/ubuntu $distr main restricted universe multiverse
deb http://mirror.yandex.ru/ubuntu $distr-updates main restricted universe multiverse
deb http://mirror.yandex.ru/ubuntu $distr-security main restricted universe multiverse
EOF"
done

К локали и тайм-зоне вернёмся чуть позже.

Следующие грабли...

Заботливо подпиленные на уровне паха: конфигурация schroot
Если кратко, эта штука позволяет делать chroot в директорию без прав суперпользователя, автоматически монтируя и копируя в дочернюю ОС то, что указано в конфиге (с оговорками). Мой пример конфига /etc/schroot/chroot.d/ubuntu.conf

[ubuntu-trusty]
description=Ubuntu 14.04
type=directory
directory=/home/ubuntu_trusty
users=clown,monkey,mrsam
root-users=clown
aliases=trusty,default
profile=ubuntu

[ubuntu-precise]
description=Ubuntu 12.04
type=directory
directory=/home/ubuntu_precise
users=clown,monkey,mrsam
root-users=clown
aliases=precise
profile=ubuntu

На что стоит обратить внимание в man schroot.conf: пункт «Plain and directory chroots» (стрелял в колено очень долго, хотелось выть)
Если вы выбираете «type=directory», то выполняется автомаунт из файла ($profile — параметр «profile=ubuntu» в конфиге) /etc/schroot/$profile/fstab, копируются все файлы из /etc/schroot/$profile/copyfiles, а также обновляются все «databases» из /etc/schroot/$profile/nssdatabases. На это обстоятельство даже жаловались на лаунчпаде.
По умолчанию «profile=default», а /etc/schroot/default/nssdatabases содержит такие строчки

# System databases to copy into the chroot from the host system.
#
# <database name>
passwd
shadow
group
gshadow
services
protocols
networks
hosts

Каждый раз эта сволочь перетирала мне группы и пользователей, что весьма негативно сказывалось на попытке установки в chroot даже vim, который требовал группы crontab. А также пункт networks убивает работу сети (для моего дистрибутива, отнюдь не факт, что везде так, особенно, если родительская ОС тоже убунту), такие дела.
На всякий случай, мои файлы /etc/schroot/ubuntu/*

$ cat copyfiles 
# Files to copy into the chroot from the host system.
#
# <source and destination>
/etc/resolv.conf
$ cat fstab 
# fstab: static file system information for chroots.
# Note that the mount point will be prefixed by the chroot path
# (CHROOT_PATH)
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
/proc           /proc           none    rw,bind         0       0
/sys            /sys            none    rw,bind         0       0
/dev            /dev            none    rw,bind         0       0
/dev/pts        /dev/pts        none    rw,bind         0       0
/home           /home           none    rw,bind         0       0
/tmp            /tmp            none    rw,bind         0       0

# It may be desirable to have access to /run, especially if you wish
# to run additional services in the chroot.  However, note that this
# may potentially cause undesirable behaviour on upgrades, such as
# killing services on the host.
#/run           /run            none    rw,bind         0       0
#/run/lock      /run/lock       none    rw,bind         0       0
#/dev/shm       /dev/shm        none    rw,bind         0       0
#/run/shm       /run/shm        none    rw,bind         0       0
$ cat nssdatabases 
# System databases to copy into the chroot from the host system.
#
# <database name>
protocols
hosts

Маленькие хитрости

Чтобы иметь всюду одинаковые кодировки, нужно сделать:

for distr in trusty precise
    do sudo cp /etc/locale.gen /home/ubuntu_$distr/var/lib/locales/supported.d/local # если etc и home на одном диске, можно ln -f
done

Можно перелинковать между собой некоторые файлы конфигураций, которые хотелось бы всегда иметь в одинаковом виде, например:

sudo ln -f /home/ubuntu_trusty/etc/bash.bashrc /home/ubuntu_precise/etc/bash.bashrc

А для того, чтобы небыло проблем при обновлении пакетов, необходимо запретить некоторым пакетам это делать:

apt-mark hold initscripts udev plymouth mountall

Да, в каждом из chroot…

Ну и напоследок, перегенерируем кодировки и tzdata:

sudo locale-gen
sudo dpkg-reconfigure tzdata

Спасибо за внимание. Надеюсь, позволит сократить время на поднятие окружения для сборки.

Автор: felix0id

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js