hack のためのネタ帳, etc,,,

はじめに

UML (User Mode Linux) ではフルセットの Linux 仮想環境を一般ユーザーのプロセスとして実行可能である。
ここでは主に Debian GNU/Linux における UML の利用方法について要点をまとめる。

コマンド入力に関して

以下、コマンド入力の説明では
root で行うべき入力は
# ls
一般ユーザーで行うべき入力は
$ ls
のように表記する。

コマンド入力と設定の断片は区別したい所ではあるが livedoor wiki では pre 要素に限らず class や style 等の修飾が不可能であるため、全て同一スタイルの pre 要素として表記しているので注意されたい。

UML のインストール

Debian では user-mode-linux パッケージを入れるだけで UML が使用可能になる。
具体的には以下のコマンドを root で実行すれば良い。
# apt-get install user-mode-linux
UML の実行コマンドは /usr/bin/linux である。

ただし現状(2006/09/09現在) user-mode-linux パッケージは sarge(stable)には用意されていない(参照:Debianパッケージ)。
このため stable では /etc/apt/apt.conf.d/99target を設定した上で /etc/apt/source.list に testing を追加しておく必要がある。

ディスクイメージの作成

UML では Linux のユーザランドがインストールされたディスクイメージが必要になる。
UML のデフォルトではカレントディレクトリの root_fs というファイルが読み込まれる。
未使用領域のブロック割当分を節約するためには
以下のようにして作成すると良い。
$ touch root_fs
$ dd if=/dev/zero of=root_fs bs=1 count=0 seek=512MB
実際に割当てられたブロック数は以下のようにして確認できる。
$ ls -ls
0 -rw-r--r--  1 kou kou 512000000 2006-09-09 17:40 root_fs
左端の 0 が使用ブロック数を意味している。

ファイルシステムの作成

ディスクイメージは HDD に相当する。
ディスクイメージを作っただけでは、開封直後の HDD のような物なので、
次にフォーマットに相当する作業として、ファイルシステムの作成が必要になる。
先程作ったディスクイメージに ext2 ファイルシステムを作成するには以下のようにする。
$ /sbin/mke2fs root_fs
ext2 ファイルシステムは、書き込み途中で止まってしまったような場合に不安が残るため、
ジャーナリング機能を搭載した ext3 ファイルシステムにしておく方が良いだろう。
ext2 ファイルシステムを ext3 ファイルシステムにするには以下のコマンドによりジャーナルを追加すれば良い。
$ /sbin/tune2fs -j root_fs

Debian の構築

初期化したファイルシステムに Debian のシステムを構築する。
これには debootstrap を用いる。
まず、root になり debootstrap パッケージを導入する。
# apt-get install debootstrap
次に、先程作成したファイルシステムをマウントし、debootstrap により Debian の最小システムを構築する。
# mount root_fs /mnt -o loop
# debootstrap sarge /mnt http://ftp.jp.debian.org/debian

UML ではディスクイメージのマウントのために ubd デバイスが必要である。
次のようにして dev ファイルを作成する。
# pushd .; cd /mnt/dev; MAKEDEV ubd; popd

最後に /mnt/etc/fstab に以下のように mount の設定をしておく。
# <file system> <mountpoint> <type> <options>                      <dump> <pass>
/dev/ubda1      /            ext3   defaults,errors=remount-ro       0      0
proc            /proc        proc   defaults                         0      0

/usr/lib/uml/modules/ 以下に user-mode-linux パッケージで導入された
UML kernel 用のモジュールが用意されている。
ホスト側で user-mode-linux を upgrade した場合、
自動的に追従してくれるので hostfs で mount した方が良い。
しかし、この場合、通常はホスト側の /usr/lib/ 以下への書き込み権限は持っていないため
depmod で modules.dep を書き込めない。
これが気にならないのであれば、
/mnt/etc/fstab に以下の設定を追加し mount すれば良い。
none            /lib/modules hostfs defaults,ro,/usr/lib/uml/modules 0      0
気になる場合は以下のようにコピーを置くようにすれば良い。
# cp -a /usr/lib/uml/modules/* /mnt/lib/modules/

以上でディスクイメージの準備は終了である。
最後にマウントを解除しておく。
# umount /mnt

UML の起動

以上の準備がきちんと終了していれば UML は以下のコマンドで起動する。
$ linux
初期状態では tty1〜tty6 まで 6 つの xterm が開くはず。
この時点では root にはパスワードは設定されていない。

tty の設定

xterm がいちいち 6 つも開くのは煩わしいかもしれない。
その場合、tty0 を一つだけ開くようにすると、起動時のコンソールだけになる。
ただし、tty0 は /etc/securetty に登録されていない。
/etc/securetty に tty0 を登録しておかないと、root でログイン出来ないので注意。

具体的には、初期状態の /etc/inittab には以下のエントリーが存在する。
1:2345:respawn:/sbin/getty 38400 tty1
2:23:respawn:/sbin/getty 38400 tty2
3:23:respawn:/sbin/getty 38400 tty3
4:23:respawn:/sbin/getty 38400 tty4
5:23:respawn:/sbin/getty 38400 tty5
6:23:respawn:/sbin/getty 38400 tty6
これを以下の 1 つにしておくと良い。
1:2345:respawn:/sbin/getty 38400 tty0
ただし /etc/securetty に tty0 を追加する事を忘れないように。

また、tty0 では vi 等が正常にレンダリングしない場合がある。
この場合、環境変数 TERM をその都度以下のように設定すると良い。
# export TERM=vt100
/etc/login.defs で /etc/ttytype を有効にして "vt100 tty0" を設定しておけば良い気がするのだが、
なぜかこの設定は上手く反映されない。
どうもobsoleteだと言う話もある模様。

ネットワークの設定

Debian では user-mode-linux の導入と同時に uml-utilities が導入される。
この際 /etc/rc2.d/S20uml-utilities にて uml_switch が自動的に daemon として起動されるよう設定されている。
uml_switch は User-mode networking switch つまり仮想スイッチングハブである。

uml_switch を外部ネットワークと接続するためには tap と接続する必要がある。
tap と接続しない場合 uml_switch に繋った UML 同士は外部と接続を持たない出来ない閉じたネットワークを形成する。
ホスト側の設定
/etc/default/uml-utilities においてデフォルトでコメントアウトされている以下の設定を有効にしておく。
UML_SWITCH_OPTIONS="-tap tap0"

次に tap0 を有効にするため /etc/network/interfaces に以下の設定を追加する。
auto tap0
iface tap0 inet static
	address 192.168.0.1
	netmask 255.255.255.0
	tunctl_user uml-net
address と netmask は環境よって適当な値を設定する事。

以上の準備を整えたら、次のようにして tap0 を有効にした後、uml_switch を再起動する。
# ifup tap0
# /etc/init.d/uml-utilities restart
ゲスト側の設定
UML の起動は以下のようにする。
$ linux eth0=daemon

UML 側の /etc/network/interfaces の設定も適切に行う。
通常 address は tap0 のサブネット内の適当なアドレス、gateway は tap0 のアドレスを指定すれば良い。
例えば以下のように設定しておく。
auto lo eth0
iface lo inet loopback
iface eth0 inet static
	address 192.168.0.2
	netmask 255.255.255.0
	gateway 192.168.0.1

DNS 参照のため /etc/resolv.conf も適切に書換えておく。
通常はホスト側と同じ値を設定しておけば良い。
ホスト側に dnsmasq を入れておけくと、tap0 のアドレスを指定するだけで良くなる。
search
nameserver 192.168.0.1

あとは UML 側のネットワークを次のように再起動してやれば良い。
# /etc/init.d/networking restart

apt の設定

以上で、ネットワークに接続して Debian を運用する準備が整ったはずなので、
apt の設定を行っておく。設定は apt-setup で行うと楽だろう。
# apt-setup
あとは http で Japan の ftp.jp.debian.org 辺りを選んでおけば良い。

設定が成功したら、dist-upgrade してシステムを最新状態に更新しておく。
# apt-get -u dist-upgrade

UML の操作

起動中の UML を外部から操作するには uml_mconsole を用いる。
~/.uml/ 以下に、起動中の UML への socket が作られている。
起動中の UML が 1 つならば以下のようにして起動すると良い。
$ uml_mconsole `ls ~/.uml | head -n 1`
uml_mconsole が起動すると help コマンドで使用可能なコマンドが表示出来る。

UML を強制停止するには halt コマンドを用いる。ただし UML の停止は可能な限り UML 側から通常の Linux と同じように shutdown コマンドで行なう方が良いだろう。具体的には root でログインした状態で以下のようにすれば良い。
# shutdown -h now

runlevel

runlevel を指定したい場合、起動時のコマンドラインに runlevel を追加しておけば良い。
runlevel S で UML を起動したいなら以下のようにする。
$ linux S eth0=daemon

ディスクイメージのスリム化

まず現在の root_fs と同じ大きさで新しいイメージにファイルシステムを作成する。
$ touch new_fs
$ dd if=/dev/zero of=new_fs bs=1 count=0 seek=512MB
$ /sbin/mke2fs new_fs 
$ /sbin/tune2fs -j new_fs 
次に、UML を次のように起動。
$ linux ubd1=root_fs ubd2=new_fs init=/bin/sh
UML で sh が起動したら、次のようにして root_fs の内容を new_fs に全コピー。
# mount -t ext3 /dev/ubdb /mnt
# mount -t ext3 /dev/ubdc /opt
# cp -a /mnt/* /opt
UML を exit で終了。
# exit
コピーした結果の比較。
$ ls -ls
262892 -rw-r--r--  1 kou kou 512000000 2006-09-10 00:55 new_fs
354868 -rw-r--r--  1 kou kou 512000000 2006-09-10 00:55 root_fs
かなり減っている事が分る。

因みに上記のイメージは debootstrap で sarge をインストール後 dist-upgrade した直後くらいの状態で使用率は以下。
/dev/ubda             473M  241M  208M  54% /

ディスクイメージの差分記録

次のように UML を起動するとディスクイメージの差分記録が可能。
$ linux hda=root_fs.diff,root_fs eth=daemon
root_fs は変更されず、差分が root_fs.diff に記録される。
root_fs.diff がない場合は自動的に作成される。

関連

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Wiki内検索

フリーエリア

管理人/副管理人のみ編集できます