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

Posted by nogajun - 2013/01/04

_

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のパスワードを空にするとなるんですよ