仮想OS「User Mode Linux」活用法
 〜 技術解説からカーネルカスタマイズまで 〜

宮本 久仁男<miyamotokn@nttdata.co.jp>
NTTデータ システム開発事業本部
基盤システム事業部 第一ソリューション技術担当

2002/5/25

UMLを動かしてみよう

 UMLを利用するには、Host OSが以下の条件を満たす必要があります。カーネル2.2系では逆立ちしても動かないのでご注意を。

  • Linuxカーネル 2.4.6以上
  • Universal TUN/TAPドライバがインストールされている

 TUN/TAPドライバがなくてもUMLは動きますが、これでは本当に「動くだけ」の状態しか見ることができません。最初にお試しで動かすならばともかく、この状態では単にメモリやCPU資源を食うだけの存在にしかならないので、ネットワーク経由でログインできるだけの環境はそろえておきましょう()。

注:別にシリアル経由でも構いませんが、ネットワークが使える方が数倍面白いと思います。

 また、root以外のユーザーによるUMLの起動を行い、かつTUN/TAPドライバを使ってネットワークを利用したいのであれば、/dev/net/tunデバイスファイルについて、すべてのユーザーによるread/writeを許可する必要があります。例えば、以下のように、

crw-rw-rw-    1 root     root      10, 200  5月  7 17:28 /dev/net/tun

というパーミッション設定になっている必要があります。

RPMによるインストール

 UMLを動かすための手段はいくつかあります。筆者が試した方法は以下の3つです。

  • UMLのRPMパッケージを使う
  • UMLカーネルの実行ファイルを使う
  • オリジナルのカーネルソースに適用するUMLパッチを適用し、自分でカーネルを構築

 最初の2つは、すでにコンパイルされたモジュールを取得する形になります。最後の1つは、自力でカーネルをコンパイルする必要があるので「多少」敷居が高いともいえますが、最も自由度の高い方法でもあります。とはいえ、いきなり自由度の高い方法を試して「動いている」状態を確認できないのも嫌なので、まずはRPMパッケージを使う方法を紹介します。

 http://user-mode-linux.sourceforge.net/からたどれるダウンロードページ(http://user-mode-linux.sourceforge.net/dl-sf.html)から、RPMパッケージをダウンロードします。今回は、user_mode_linux-2.4.18.15um-0.i386.rpmというパッケージをダウンロードしました。これを、

# rpm -ivh user_mode_linux-2.4.18.15um-0.i386.rpm

としてインストールします。

 UMLモジュールのインストールは終わりましたが、この状態ではUMLのカーネルが動いた後にマウントするファイルシステムがないので、ファイルシステムイメージもダウンロードします。ファイルシステムイメージも前述のダウンロードページで入手可能です。筆者は、root_fs.rh-7.2-anonsrv.pristine.20020312.bz2というファイルシステムイメージを使用しました。これは、本当に最小限の機能しか入っていませんが、サイズが小さいのでちょっとしたチェックには重宝します。

 ファイルシステムイメージは、圧縮ファイルのダウンロード後に、

$ gzip -dc filesystemimage.gz > rootfs

とでもして元のファイルを残しておくと、rootfsが壊れてもすぐに復旧できます。とはいえ、差分ファイルが使えるので別に気にする必要はないかもしれません。

動かしてみる

 準備が整ったら、実際にUMLを使ってみましょう。

$ /usr/bin/linux ubd0=./difffs,/home/hoge/rootfs eth0=tuntap,,,192.168.1.100

などとすると、UMLが起動します。このコマンドラインが意味するのは、

  • ルート・ファイルシステムとして「/homme/hoge/rootfs」をマウントする。その際に、差分ファイルとして./difffsを指定(
  • eth0としてTUN/TAPドライバを利用する
  • Host OSのtap0インターフェイスに「192.168.1.100」というIPアドレスを割り当てる

注:/difffsファイルが存在しない場合は、起動時に作成されます。

というものです。Host OSのtap0インターフェイスに割り当てるIPアドレスと、Guest OS に割り当てられる(Guest OSが使用する)アドレスはまったく無関係です。UMLの起動コマンドラインで「eth0=tuntap,,,192.168.1.100」と指定してtap0に192.168.1.100というアドレスを割り当てても、起動後のGuest OS上でifconfigコマンドを実行するとeth0にこのアドレスは割り当てられていません(もしそうなっていたとしても、偶然です)。

動かした後のHost OSとGuest OSの状態

 上記の手順でうまくいったら、Guest OSが起動します。起動時のメッセージをリスト1に示します。起動した後のHost OSの状態とGuest OSの状態を見比べてみましょう。実際に、Guest OS上のプロセスの状態をリスト2、この状態におけるHost OS上のプロセスの状態をリスト3に示します。

 なお、ネットワークを利用する場合は、起動したGuest OSにrootでログインし、ifconfigコマンドで設定し直す必要があります。起動時のネットワーク設定をユーザー指定のものにする場合は、適宜ネットワーク設定を変更する必要があります。筆者の場合は、直接/etc/sysconfig/network-scripts/ifcfg-eth0を編集しましたが、この部分は使用するファイルシステムイメージに依存します。

Host Filesystemの利用

 Host Filesystem(以下Hostfs)とは、UMLによるGuest OSの環境から、Host OS上のファイルを参照したりするときに有効な機能です。

 ここまでに利用したRPMパッケージに入っているカーネルは、Hostfsの機能が有効になっていますが、ソースコードからカーネルを作成する場合は、画面1に示すような形でカーネルに組み込むなどする必要があります。

画面1 Host Filesystem設定画面

 Hostfsの機能が有効になっているカーネル上で、

# mount none /mnt/home -t hostfs

としてやることで、Host OSのルートディレクトリがGuest OSの/mnt/homeにマウントされます。マウントするHost OS上のディレクトリを指定する場合は、

# mount none /mnt/home -t hostfs -o /home/kmiya

などと-oオプションで指定可能です。筆者の環境で上記のコマンドラインを実行した場合のマウント状況とdfの状況を示します。

# mount
/dev/ubd/0 on / type ext2 (rw)
/proc on /proc type proc (rw)
devfs on /dev type devfs (rw)
devpts on /dev/pts type devpts (rw,mode=0622)
none on /mnt/home type hostfs (rw,/home/kmiya)
# df
Filesystem           1k-blocks      Used Available Use% Mounted on
/dev/ubd/0              175508    148590     17856  90% /
none                   1786760   1602032     93964  95% /mnt/home

 また、/mnt/homeを見てみると分かりますが、

# ls -l /mnt/home/
total 525848
drwxr-xr-x   5 user  user     4096 Apr 22 04:20 Desktop
drwxrwxr-x  18 user  user     4096 Apr 30 22:59 Python-2.2.1
-rw-rw-r--   1 user  user  6535104 Apr 30 22:37 Python-2.2.1.tgz
drwxrwxr-x   2 user  user     4096 May 16 03:34 auth
drwxrwxr-x  12 user  user     4096 May  1 00:42 cadaver-0.19.0
-rw-rw-r--   1 user  user   463968 Jan  6 16:31 cadaver-0.19.0.tar.gz
-rw-rw-r--   1 user  user     2693 Apr 23 06:08 cert.key
-rw-rw-r--   1 user  user      952 Apr 23 05:11 cert.pem
-rw-rw-r--   1 user  user       56 Apr 30 04:41 cmdline
-rw-------   1 user  user 10833920 May 13 05:44 core

となります。

 ファイルのオーナーやグループは、Guest OS上に存在するものに置き換えられますが、Guest OSが動作しているユーザー権限を超えるアクセスはできません。これは、ユーザープロセスとして動いている以上、当然のことです。

2/5

Index
仮想OS「User Mode Linux」活用法
 〜 技術解説からカーネルカスタマイズまで 〜
  Page 1
User Mode Linuxとは?
 UMLの機能概要
 UMLのプロセス/メモリ管理
  Page 2
UMLを動かしてみよう
 RPMによるインストール
 動かしてみる
 動かした後のHost OSとGuest OS
 Host Filesystemの利用
  Page 3
UMLで使用可能なツール
 uml_mconsole
 uml_switch
  Page 4
非標準カーネルモジュール/パッチの組み込み
 FreeS/WANの組み込みと動作
 USAGI UMLカーネルの構築
  Page 5
UMLの展望と問題点
参考資料

Linux Square全記事インデックス


 Linux Squareフォーラム Linuxカーネル関連記事
連載:Linux Kernel Watch(連載中)
Linuxカーネル開発の現場ではさまざまな提案や議論が交わされています。その中からいくつかのトピックをピックアップしてお伝えします
連載:Linuxファイルシステム技術解説
ファイルシステムにはそれぞれ特性がある。本連載では、基礎技術から各ファイルシステムの特徴、パフォーマンスを検証する
特集:全貌を現したLinuxカーネル2.6[第1章]
エンタープライズ向けに刷新されたカーネル・コア
ついに全貌が明らかになったカーネル2.6。6月に正式リリースされる予定の次期安定版カーネルの改良点や新機能を詳しく解説する
特集:/procによるLinuxチューニング[前編]
/procで理解するOSの状態

Linuxの状態確認や挙動の変更で重要なのが/procファイルシステムである。/procの概念や/procを利用したOSの状態確認方法を解説する
特集:仮想OS「User Mode Linux」活用法
Linux上で仮想的なLinuxを動かすUMLの仕組みからインストール/管理方法やIPv6などに対応させるカーネル構築までを徹底解説
Linuxのカーネルメンテナは柔軟なシステム
カーネルメンテナが語るコミュニティとIA-64 Linux
IA-64 LinuxのカーネルメンテナであるBjorn Helgaas氏。同氏にLinuxカーネルの開発体制などについて伺った

MONOist組み込み開発フォーラムの中から、Linux関連記事を紹介します


Linux & OSS フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Linux & OSS 記事ランキング

本日 月間