佐々木洋
平
![]() |
タイトルのままだと「アレやソレを install して、 コレを設定して」 かと思われるかもしれませんが、 そういう話ではありませ ん*1 。 こ こでは、 昨年の関西 Debian 勉強会で尊也さん発表した「chroot から始める sid」 (山下 2008) というネタを膨らませて、 普 段は stable を使いながら unstable とうまくおつきあいする方法を提案してみます。
「unstable を常用しないとは。 このヘタレめがっ!!」 という声がどこからともなく聞こ えてきそうですが、 いきなり unstable 環境に足を踏み入れるのって結構ドキドキですよ ね*2 。
簡単に言えば、 「コマンドを実行する際に、 実行プロセスおよびその子プロセスのルートディレクトリ (/) を変える」 コマンド (およびその ための関数) です*3 。 ルートディレクトリを別ディレクトリに変更されたプロセスは、 その範囲外のディレクトリにアクセスできなくなりま す*4 。 chroot を使用する利点は、 カーネル、 ハードウェア、 ネットワーク、 ポート、 メモリ空間、 プロセス空間等々を共有したまま ディレクトリ構造のみを (設定に応じて) 切り換えられることです。 VMware や VirutalBox と言った仮想マシン環境の場 合には API やハードウェアのエミュレーションを行ないますが、 これらを行なわない分だけ軽快に動作し ます。
例えば、
といった場合には非常に便利です。
ただし、 実際に何らかプログラムを実行する際には、 chroot で変更されたディレクトリ内にライブラリ等が揃ってい る必要があります。 これを実現するために、 Debian には cdebootstrap というパッケージが提供されてい ます。
では早速cdebootstrap を使用して chroot 環境を作成してみましょう。 とりあえず、 ここでは
として話を進めます。
先ず cdebootstrap を導入しましょう。
$ sudo aptitude install cdebootstrap
|
次に chroot 環境を作成します。
$ sudo -s
# mkdir -p /var/chroot/unstable-amd64 # cdebootstrap unstable /var/chroot/unstable-amd64 http://ftp.jp.debian.org/debian ...(表示割愛) |
cdebootstrap によって、 /var/chroot/unstable-amd64 以下に unstable の基本システムが展開されます。 実際に chroot で作成した環境に入ってみましょう。
# chroot /var/chroot/unstable-amd64
(# chroot /var/chroot/unstable-amd64 /bin/bash <-- shell が bash 以外の場合には chroot 内で起動する shell を指定する) |
... 無事 chroot されて, unstable 環境に入れたでしょうか?
この時点では最低限のパッケージしか導入されていないので、 幾つかのパッケージを入れたり抜いたりします。
# vi /etc/apt/sources.list <-- contrib, non-free を追記 # aptitude install locales # dpkg-reconfigure -plow locales # aptitude update # aptitude install ~pstandard ~t^japanese$ zsh ... ... # aptitude remove nfs-common portmap .... <-- 不要な物の削除 |
chroot 環境でパスワードを聞かれそうならば、 /etc/passwd,shadow などをコピーしておきます。
$ sudo cp /etc/passwd /var/chroot/unstable-amd64/etc
sudo sed ’s/\([^:]*\):[^:]*:/\1:*:/’ /etc/shadow \ | sudo tee /var/chroot/unstable-amd64/etc/shadow $ sudo cp /etc/group /var/chroot/unstable-amd64/etc $ sudo cp /etc/hosts /var/chroot/unstable-amd64/etc $ sudo cp /etc/sudoers /var/chroot/unstable-amd64/etc |
また、 プロセス空間やデバイスファイルを共有するために/etc/fstab を修正しておきます。
$ sudo vi /etc/fstab
...(以下を追記)... /home /var/chroot/unstable-amd64/home none rbind 0 0 /tmp /var/chroot/unstable-amd64/tmp none bind 0 0 proc-sid-amd64 /var/chroot/unstable-amd64/proc proc defaults 0 0 devpts-sid-amd64 /var/chroot/unstable-amd64/dev/pts dev/pts defaults 0 0 |
ここでは chroot の外側で /home 以下に別のファイルシステムをマウントしている場合でもそれに追従できるようにするた めに rbind にしています。
fstab に書いた内容を有効にした後に再び chroot 環境下に入ってみましょう。
$ sudo mount -a
$ sudo -s # chroot /var/chroot/unstable-amd64 |
/home 以下が chroot 環境下にもマウントされているでしょうか。 ここまでで /var/chroot/unstable-amd64 以下に unstable の環境が整いました。
さて、 ここまでは chroot コマンドを使用して chroot 環境下に入るためには root 権限が必要でした。 一般ユーザの権限でも (設定は必要ですが) chroot を用いて chroot 環境下のソフトウェアを使用するために、 schroot というパッケージが提供され ています。
man によれば schroot は
DESCRIPTION
schroot allows the user to run a command or a login shell in a chroot environment. If no command is specified, a login shell will be started in the user’s current working directory inside the chroot. The command is a program, plus as many optional arguments as required. Each argument may be separately quoted. The directory the command or login shell is run in depends upon the context. See --directory option below for a complete description. If the user is not an allowed user, or a member of the allowed groups (or if changing to root, the allowed root users or allowed root groups) for the specified chroot(s), the user will be required to authenticate themselves (typically with a password, but this depends upon the PAM configuration). All chroot usage will be logged in the system logs. If no chroot is specified, the chroot name or alias ’default’ will be used as a fallback. This is equivalent to ‘‘--chroot=default’’. |
とあります。
では schroot を導入してみましょう。
$ sudo aptitude install schroot
|
導入したら /etc/schroot/schroot.conf を設定します。
$ sudo vi /etc/schroot/schroot.conf
[unstable-amd64] description=Debian unstable amd64 <-- 適当で location=/var/chroot/unstable-amd64 <-- cdebootstrap で作成した場所を指定 priority=3 <-- とりあえず気にならさらず users=uwabami <-- chroot 環境下に login できるようにする user アカウント root-users=uwabami <-- chroot 環境下に login できるようにする user アカウント aliases=default,sid <-- schroot 実行時の alias |
description, priority はとりあえず気にしなくても良いです。
以上を設定しておくと、 例えば
$ schroot -c unstable <-- chroot 環境へ login
... $ schroot -c sid <-- aliases で login ... $ schroot -c unstable -p <-- 親の環境変数を引き継いで login ... $ schroot -c unstable -p xterm <-- 直接 chroot 環境下のプログラムを実行] ... $ schroot -c unstable -p -- xterm -e /bin/sh <-- option を渡したりできる。 ... $ schroot -c unstable -u root <-- root として login |
なんて事ができるようになります。
/etc/schroot 以下は次の様になっています。
$ ls -R /etc/schroot
/etc/schroot: chroot.d/ copyfiles-defaults exec.d/ mount-defaults schroot.conf script-defaults setup.d/ /etc/schroot/chroot.d: /etc/schroot/exec.d: 00check* /etc/schroot/setup.d: 00check* 05file* 05lvm* 10mount* 15killprocs* 20copyfiles* 50chrootname* |
/etc/schroot.conf において
type=directory
run-setup-scripts=true run-exec-scripts=true |
を追記した後に schroot を実行すると、 proc、 dev/pts、 /home の bind マウントが自動で行なわれます。 マウント先は /var/lib/schroot/$(hash)/ 以下です。 $(hash) は schroot 実行時に自動的に生成されます。 マウントの形式 は bind Mount になっています。 また、 先程コピーした /etc/{passwod, shadow}なども schroot 実行時 に自動的に親環境から copy されます。 copy されるファイルは /etc/schroot/copyfiles-default で設定でき ます。
run-{exec,setup}-scripts=true としておくと/etc/schroot/{setup.d, exec.d}以下に置いた script を実行してから chroot 環境下に login することもできます。 なので、 ちょっとかわった事をしたい場合にはこのあたりに script を転がしておくと良いでしょう (例えば、 親環境で mount した光学ドライブを自動で bind マウントする, 等)。
type には lvm-snapshot や block-device といった設定をすることもできます。 他にも setup.d 以下にファ イルを展開するスクリプトを用意しておくと、 chroot 環境を tar.gz で固めて置いておく、 なんて事もでき ます.
完全な仮想環境とまではいきませんが、 stable leftrightallow testing leftrightallow unstable (さらに experimental) まで をお手軽かつ安全に渡り歩く環境として chroot と schroot を紹介しました。
schroot は
最近は laptop でも 100 GB 越える HDD が搭載されていたりするので、 試しに unstable/experimental のパッケージを 使ってみたい、 という場合には是非試してみて下さい。
最後に、 結果として佐々木の /var/chroot 以下はどうなっているかと言うと
$ ls -lh /var/chroot
drwxrwxr-x 2 root root 4.0k 2007-06-26 12:33 etch-amd64/ drwxrwxr-x 2 root root 4.0k 2007-06-26 11:33 etch-i386/ drwxrwxr-x 2 root root 4.0k 2009-04-26 08:32 experimental-amd64/ drwxrwxr-x 2 root root 4.0k 2009-03-01 08:31 lenny-i386/ -rw-rw-r-- 2 root root 9.4G 2005-12-06 11:35 sarge-i386.tar.bz2 drwxrwxr-x 2 root root 4.0k 2009-04-16 12:33 squeeze-amd64/ drwxrwxr-x 2 root root 4.0k 2009-04-18 10:13 squeeze-i386/ drwxrwxr-x 2 root root 4.0k 2009-04-26 08:31 unstable-amd64/ drwxrwxr-x 2 root root 4.0k 2009-04-26 08:31 unstable-i386/ |
なんか自分でも残念な気持になりました。