Приветствую.
На днях надоело для сборки пакетов ходить по ssh на разные машинки и решил поднять парочку у себя. Расскажу о граблях, которые собрал по дороге и о костылях, которые смастерил.
Все действия выполнялись на Arch linux, но действия по настройке chroot-виртуалок и schroot должны быть очень схожими.
Всё, что описано далее, разумеется, разбросано по всей сети. Но проб и ошибок по пути много.
Итак, начинается всё, можно сказать, банально, есть описание процесса bootstrap в этой статье
Для себя я ставлю 2 виртуалки — precise и trusty:
Имеем ненастроенные сорсы, ненастроенную локаль, часовой пояс… всю гамму красок.
Настроим сорсы:
К локали и тайм-зоне вернёмся чуть позже.
Если кратко, эта штука позволяет делать chroot в директорию без прав суперпользователя, автоматически монтируя и копируя в дочернюю ОС то, что указано в конфиге (с оговорками). Мой пример конфига /etc/schroot/chroot.d/ubuntu.conf
На что стоит обратить внимание в 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 содержит такие строчки
Каждый раз эта сволочь перетирала мне группы и пользователей, что весьма негативно сказывалось на попытке установки в chroot даже vim, который требовал группы crontab. А также пункт networks убивает работу сети (для моего дистрибутива, отнюдь не факт, что везде так, особенно, если родительская ОС тоже убунту), такие дела.
На всякий случай, мои файлы /etc/schroot/ubuntu/*
Чтобы иметь всюду одинаковые кодировки, нужно сделать:
Можно перелинковать между собой некоторые файлы конфигураций, которые хотелось бы всегда иметь в одинаковом виде, например:
А для того, чтобы небыло проблем при обновлении пакетов, необходимо запретить некоторым пакетам это делать:
Да, в каждом из chroot…
Ну и напоследок, перегенерируем кодировки и tzdata:
Спасибо за внимание. Надеюсь, позволит сократить время на поднятие окружения для сборки.
На днях надоело для сборки пакетов ходить по 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
Спасибо за внимание. Надеюсь, позволит сократить время на поднятие окружения для сборки.
