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

Вітаю.

Днями набридло для складання пакетів ходити по 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 вірного 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 вірного 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-вірного]
description=Ubuntu 14.04
type=directory
directory=/home/ubuntu_trusty
users=clown,monkey,mrsam
root users=clown
aliases=вірного,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 path chroot
# (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 вірного 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


Дякую за увагу. Сподіваюся, дозволить скоротити час на підняття оточення для збірки.

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.