別の環境を動かすschrootが超便利なのでメモった

amd64な環境でi386なバイナリを動かそうと思ったのだけど、multiarchだとライブラリのパッケージがバッティングしてインストールできなかったのでschrootを使ってみた。
chrootな環境は、仮想環境の中でもう一つの環境を動かしたり、いろいろゴニョゴニョする事は多いと思うのでメモ。
インストール
schrootのインストールはサクっとaptで。debootstrapはすでに入ってるいる人は多いと思うけど念のため。
$ apt-get install schroot debootstrap
debootstrapでschroot環境を作る
debootstrapを使ってschrootをする環境を作ります。 ここで注意ですが、debootstrapを実行するとき --include=sudo とオプションを指定してsudoもインストールしておきましょう。
なぜかというと、debootstrapでインストールした状態ではsudoはインストールされません。 今どきのDebian環境では、rootを作成せずsudoを使ってユーザーに管理者権限を持たせてある場合があると思いますが*1、その状態のままschroot環境に入ると、sudoがないので管理者権限が使えないという悲しい状態になります。
ということでdebootstrapには --include=sudo をつけて実行しておきましょう。
# mkdir -p /srv/chroot/squeeze-i386
# debootstrap --arch=i386 --include=sudo squeeze /srv/chroot/squeeze-i386 http://ftp.jp.debian.org/debian
schrootの設定
/etc/schroot/schroot.confを編集してschrootの設定をします。
# vi /etc/schroot/schroot.conf
コメントアウトされた設定を見るといろんな使い方ができるようですが、とりあえずはシンプルにschroot.confの末尾にこんな感じで設定を書きます。
[squeeze]
description=Debian Squeeze i386
type=directory
directory=/srv/chroot/squeeze-i386
users=(ユーザー名)
groups=(グループ名)
aliases=stable,default
schroot環境を使ってみる
登録している環境のリストを見る
-l オプションをつけるとschroot.confに登録している設定一覧が表示されます。
$ schroot -l
chroot:default
chroot:squeeze
chroot:stable
登録している環境の状態を見る
-c オプションで環境の名前と -i オプションで環境の状態が表示されます。
$ schroot -c sid -i
─── Chroot ───
Name squeeze
Description Debian squeeze i386
Type directory
Message Verbosity normal
Users (ユーザー名)
Groups (グループ名)
Root Users
Root Groups
Aliases stable default
Preserve Environment false
Default Shell
Environment Filter ^(BASH_ENV|CDPATH|ENV|HOSTALIASES|IFS|KRB5_CONFIG|KRBCONFDIR|KRBTKFILE|KRB_CONF|LD_.*|LOCALDOMAIN|NLSPATH|PATH_LOCALE|RES_OPTIONS|TERMINFO|TERMINFO_DIRS|TERMPATH)$
Run Setup Scripts true
Configuration Profile default
Script Configuration
Session Managed true
Session Cloned false
Session Purged false
Directory /srv/chroot/squeeze-i386
Personality linux32
User Modifiable Keys
Root Modifiable Keys
User Data
setup.config default/config
setup.copyfiles default/copyfiles
setup.fstab default/fstab
setup.nssdatabases default/nssdatabases
Filesystem Union Type none
schroot環境にログインする
ログインする場合はschrootするだけでログインできます。 schroot環境に入っているときはコマンドプロンプトに「(環境名)」がつくので、すぐにわかると思います。
$ schroot -c squeeze
(squeeze)hoge@machine:~$
schroot環境のプログラムを実行する
$ schroot -c squeeze /bin/ls
と、こんな感じで実行できるのならXを使うプログラムを実行したくなると思いますが、実行するとこうなります。
$ schroot -c squeeze icedove
Error: no display specified
慣れた人なら、xhostコマンドでXサーバーのアクセス許可をしたり、環境変数DISPLAYを設定したり面倒なことをしなきゃなんないのかと思うかもしれませんが、親の環境を引き継いでコマンドを実行する -p オプションをつけると、この問題もあっさり回避できます。
$ schroot -p -c squeeze icedove
これで親の環境とシームレスにschroot環境のプログラムを実行できますね。
おわりに
schrootは普通のディレクトリにchrootする以外に、aufsでCOWな環境にできたり、ブロックデバイスにも使えるみたいなので、もうちょっといじってみよう。 あと、いろいろ/homeとかマウントされたり親環境からコピーされるファイルなどの設定は/etc/schroot/以下にあるので、それを見ると良いよ。
*1 Debianインストール時にrootのパスワードを空にするとなるんですよ