
      
〜 技術解説からカーネルカスタマイズまで 〜
宮本 久仁男<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 | 
        
また、/mnt/homeを見てみると分かりますが、
# ls -l /mnt/home/ | 
        
となります。
ファイルのオーナーやグループは、Guest OS上に存在するものに置き換えられますが、Guest OSが動作しているユーザー権限を超えるアクセスはできません。これは、ユーザープロセスとして動いている以上、当然のことです。
|  
             2/5 
           | 
          
 
            
  | 
        ||||||||||
 
            
  | 
        ||||||||||
| 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カーネルの開発体制などについて伺った  | 
|
  | 
  
- 【 pidof 】コマンド――コマンド名からプロセスIDを探す (2017/7/27)
本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、コマンド名からプロセスIDを探す「pidof」コマンドです。 - Linuxの「ジョブコントロール」をマスターしよう (2017/7/21)
今回は、コマンドライン環境でのジョブコントロールを試してみましょう。X環境を持たないサーバ管理やリモート接続時に役立つ操作です - 【 pidstat 】コマンド――プロセスのリソース使用量を表示する (2017/7/21)
本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、プロセスごとのCPUの使用率やI/Oデバイスの使用状況を表示する「pidstat」コマンドです。 - 【 iostat 】コマンド――I/Oデバイスの使用状況を表示する (2017/7/20)
本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、I/Oデバイスの使用状況を表示する「iostat」コマンドです。 
 
  | 
 |





