schroot:お手軽コンテナ(?)


Related Index Debian

始めに.

前は 「sid の中で lenny を飼う」でしたけど. まあ, やっている事は同じです.

chrootはカーネル、ハードウェア、ネットワーク、ポート、メモリ、 プロセス等々を共有しつつ, ルートディレクトリ(/)を切り替えることでシステムを分離する技術です. 作成しているパッケージの後方互換の為に, 親環境は sid だけど chroot の中で stable 環境を作成します.

親環境は amd64 の sid で, chroot で持つのは

  • /src/chroot/stable-amd64
  • /src/chroot/stable-i386

とします.

パッケージの導入

debootstrapschroot を導入しておきます.

% suro aptitude install debootstrap schroot

chroot 環境作成

以下は stable-amd64 を作成する場合のお話.

先ず debootstrap/src/chroot/stable-amd64 に必要なパッケージを導入しておきます.

% sudo mkdir -p /src/chroot/stable-amd64
% sudo debootstrap --variant=minbase \
                   --arch=amd64 \
                   jessie
                   /srv/chroot/jessie-amd64 http://ftp.jp.debian.org/debian
...
I: Base system installed successfully.

で終了.

minbase で作成すると locale が設定されてなかったりするので, schroot でログイン後に適宜設定すると良いだろう.

schroot の設定

schroot では, 個々の環境毎に「profile」を指定することで, 柔軟な環境設定が可能となっている. 例えば, 何も指定しない場合には /etc/schroot/default 以下のファイルが設定に使用され,

  • /etc/schroot/default/copyfiles: /etc/resolv.conf のコピー
  • /etc/schroot/default/fstab: $HOME 等の bind mount
  • /etc/schroot/default/nssdatabases: 認証に使用するファイル等のコピー

が行なわれる(以前は /etc/shadow をコピーして, なんてやっていたが, 今は不要).

作成した /src/chroot/stable-amd64 の設定を /etc/schroot/schroot.conf に, 例えば以下の様に書いておく:

[stable-amd64]
description=Debian stable amd64
directory=/src/chroot/stable-amd64
users=[この schroot 環境を利用できるユーザの名前]
root-groups=[root としてログインできる親環境のグループの指定]
aliases=stable,default
type=directory
profile=desktop

この場合,

  • chroot 環境として実 directory を利用
  • profile として /etc/schroot/desktop 以下のファイルを利用

となる.

以上が終わったら,

% schroot -c default             [chroot 環境へ login]
...
% schroot -c default -p          [環境変数を引き継いで login]
...
% schroot -c default -p icedove     [直接 chroot 環境下の プログラムを起動]
...
% schroot -c default -u root     [root として login]

なんて事ができるようになる.

type には lvm-snapshot や aufs も指定できるので, その気になれば割と便利に使える筈(試していないけれど).

chroot 環境の log 管理

親環境が rsyslogd ならば, etc/rsyslog.d あたりに

$AddUnixListenSocket /var/chroot/stable-amd64/dev/log

と書いておくと chroot 環境の /dev/log も見に行ってくれる.

chroot 環境のデーモンの起動

以前のメモ.

武藤さんが載せていたスクリプトをそのまま仕込むことにする. とりあえずは syslog-ng と cron だけ.

#!/bin/sh
revw(){
  set -- "$@"
  r=""
  while [ $# -gt 0 ]; do
    w=$1; shift
    r="$w $r"
  done
  echo "$r"
}
echo "start services (chroot sid):"
services="anacron cron"
if [ "$1" = "stop" ]; then
  services=$(revw $services)
fi
for s in $services; do
  schroot -q -c stable-amd64 /etc/init.d/$s $1
done

systemd 環境下だと systemctl で起動するのが良いのかなぁ. 試していないけれど.

参考文献