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

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

2002/5/25

非標準カーネルモジュール/パッチの組み込み

 ここまでで、「取りあえず動かす」ことはできたと思います。Host OSに与える危険度も少なく、仮想OS環境としてはまずまずのものでしょう。しかし、これだけでは面白くない、という方もいらっしゃると思います。そこで、ここではUMLに対するカーネルモジュールの組み込みとして、

  • UMLに対するFreeS/WAN環境の組み込みと動作
  • USAGIカーネルの構築と動作(編注

について簡単に述べます。なお、筆者はFreeS/WANの組み込みやUSAGIカーネルの構築作業をroot権限で行いましたが、ソースコードを展開するディレクトリのパーミッションを適切に設定していればrootでなくても作業は可能です。

編注:USAGIとは、LinuxにおけるIPv6の実装。詳しくは、USAGI Projectのサイトを参照。
USAGI Project:http://www.linux-ipv6.org/

FreeS/WANの組み込みと動作

1.カーネルソースコードの展開

 今回は、kernel 2.4.18を使用しました。/usr/src配下にカーネルソースコードを展開します。

2.FreeS/WANのソースコードの展開

 今回は、FreeS/WAN 1.97を使用しました。これもまた、/usr/src配下にソースコードを展開します。

3.UMLパッチの適用

 /usr/src配下に展開されたLinuxカーネルのソースに対してUMLのパッチを適用します。

4.FreeS/WANパッチの適用

 FreeS/WAN対応カーネルの作成は、いくつかのフェイズに分けられます。FreeS/WANを展開したディレクトリ(例では/usr/src/freeswan-1.97)に移動し、以下のコマンドラインを順次実行します。

# make precheck
# make verset
# make insert

 ここまでのコマンド実行で、カーネルに対するFreeS/WANパッチが適用された状態になります。

5.カーネルのmake

 /usr/src/linuxにカレントディレクトリを移動(cd /usr/src/linux)し、

# make menuconfig ARCH=um

として、UMLのコンフィグレーションを実施します(画面2)。

画面2 FreeS/WANの設定画面

 その後、

# make dep ARCH=um; make linux ARCH=um

として、UMLのモジュールをコンパイルします。うまくコンパイルできていれば、/usr/src/linux配下に「linux」という実行ファイルが生成されています。

6.注意

 UML自体は、シングルプロセッサ対応のカーネルとして作成する必要があります(画面3)。筆者は、これを知らずにSMP対応のカーネルを作ろうとしてハマりました。

画面3 「Symmetric multi-processing support」のチェックはオフにすること

7.ブートとメッセージ確認

 さて、ブートしてみましょう。ブート時のメッセージをGuest OS上のdmesgコマンドで確認してみてください。筆者の場合の例をリスト4に示します。ファイルシステムイメージは、最初にダウンロードしたものを試しに使ってみました。

 例にKLIPSのメッセージが出てきていますが、これが確認できればIPSecの環境は組み込まれています。なお、IPSecの制御コマンド類は3の手順が終了した後の状態で、

# make programs
# make install

とすれば、/usr/local/lib/ipsec配下や/usr/local/sbin配下にインストールされるので、hostfs機能を利用するなどしてGuest OS環境に転送してください。

編注:FreeS/WANについては、FreeS/WANによるIPSecの導入と運用で詳しく解説している。

USAGI UMLカーネルの構築

1.ソースコードの展開

 この部分はFreeS/WANの場合と同様です。

2.USAGIパッチの適用

 ftp://ftp.linux-ipv6.org/pub/usagi/snap/split/からカーネルパッチを取得し、適用します。

 今回は、usagi-linux24-s20020429-2.4.18.diff.bz2というパッチファイルを用いました。カーネルソースを展開したディレクトリ(例:/usr/src/linux)にcdし、

# bzip2 -dc usagi-linux24-s20020429-2.4.18.diff.bz2 | patch -p1

とすることでパッチが適用されます。

3.UMLパッチの適用

 カーネルソースを展開したディレクトリに移動し、

# bzip2 -dc uml-patch-2.4.18-22.bz2 | patch -p1

としてカーネルソースにパッチを適用します。以下のように、一部のドキュメント類では「offset x lines」のようなメッセージが出ますが、特に問題はありません。

patching file Documentation/Configure.help
Hunk #1 succeeded at 14033 (offset 382 lines).
Hunk #3 succeeded at 14240 (offset 382 lines).
patching file MAINTAINERS
Hunk #1 succeeded at 1713 (offset 7 lines).

4.make

# make menuconfig ARCH=um

とすることで、カーネルコンフィグレーションを行います。ただし、IPv6関係のうち、IPSecはこの段階では設定できない()ので、チェックを外しておきます(画面4)。

注:設定すると、途中で不足するシンボルが発生してUMLカーネルが作成できませんでした。

画面4 「IPv6: IP Security Support (EXPERIMENTAL)」はオフに

 コンフィグレーションが終了したら、

# make dep ARCH=um ; make linux ARCH=um

としてUMLのモジュールをコンパイルします。

5.ブートとメッセージ確認

 筆者の環境でのブート時のメッセージをリスト5に示します。コマンド類は、別途コンパイルしてhostfs機能などを使ってGuest OS環境に転送します。

6.忘れてはいけないセキュリティ

 UML自体はかなり便利なものであり、見る限りハニーポットにも使えそうな印象を受けます。しかし、ハニーポットに使うにせよ、Guest OSを使用して不特定多数にサービスを提供するにせよ、セキュリティ面には気を使わなくてはいけません。

 今回使った範囲で、真っ先に気を付けなければならないと感じたのは、Host OSのセキュリティとhostfsの扱いでしょう。Host OSのセキュリティは固めるしかありません。hostfsについては、いろいろ考えようがあるとは思いますが、一番手っ取り早いのはjailのように個別の環境を割り当ててしまうことでしょう。それができない場合は、最低限各Guest OSやHost OS上のほかのユーザーのファイルを保護する観点からも、個々のGuest OSは独立したユーザー権限()で稼働させるなどすべきです。

注:Guest OS 1はユーザーuser1の権限、Guest OS 2はユーザーuser2の権限で動作させるようなイメージです。

 いずれにしても、偶然のhostfsマウントを避ける意味からも、第三者が使用するGuest OSには、hostfsドライバを組み込まない方がよいでしょう。

 また、Guest OSで外向けサービスを提供し、Host OSはGuest OSの制御に徹する場合、Guest OSにはグローバルIPアドレス(もしくはそれに準ずるアドレス)を付与し、Host OSには内部で必要な管理用IPアドレスを付与しておいて、Host OSへの接続はGuest OSからのみ可能にしておくという運用も考えられます。

 なお、ここで挙げたUMLに関するセキュリティについては、筆者がUMLに触った範囲で気付いたものにすぎません。このほかにもいろいろ気を付けるべき事項があると思います。皆さんの運用に合わせて注意点の洗い出しを心掛けてください。

4/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 記事ランキング

本日 月間