So-net無料ブログ作成
検索選択

UML(user mode linux)との格闘 [プログラム]

とある事情でlinuxの別のディストリビューションを動かさなければならなくなりました。マシンを別に用意するのが一番なのですが、今回はソフト的に解決してみようと、ものは試しでumlを使ってみることにしました。
これは、その格闘の要約です。記憶に頼っている部分もありますので、不正確、記憶違いがあるかもしれませんが、その点はご容赦ください。

まず、UMLでググってみたら、なんか別のものを検索しているみたいでしたので、正式名称の「user mode linux」でググってみました。ヒットしたところを見ていったのですが、どうも情報が古いようです。今、UMLは下火なんでしょうか? ヒットしたページの日付からすると、2004〜2005年ぐらいが一番ホットだったようです。

予備情報を仕入れた後で、とにかく、まず

# apt-get install user-mode-linux

です。他に、ルートファイルシステムイメージが必要です。これもググった結果の中で、簡単に書いてあるページを参考に、まず、FedoraCore5を使ってみることにします。

# wget http://uml.nagafix.co.uk/FedoraCore5/FedoraCore5-x86-root_fs.bz2
# bzip2 -d FedoraCore5-x86-root_fs.bz2 # about 1.3GB !?
# linux ubda=FedoraCore5-x86-root_fs mem=128M

私のところのlinuxでは、以下のエラーが出ました。ですので、linuxのバージョンなどによっては、同じエラーがでるかもしれません。

Checking PROT_EXEC mmap in /dev/shm/...failed: Operation not permitted
/dev/shm/ must be not mounted noexec

こういうときは、エラーメッセージをそのままググってみます。そうすると、同じようなエラーで困っている人がBBSなどで質問しているページなどにヒットしますので、そのFollow-Upを参照します。今回は、ある人がUMLについてまとめたページがありました。

http://www.jjoseph.org/linux_work/user_mode_linux_and_gentoo.html

このページに書かれてある原因を理解して、以下のコマンドで対処しました。

# mount -o remount,nodev,nosuid /dev/shm

再度UML(linux)を実行します。とりあえず、立ち上がっりましたので、一度止めて(halt)して、UML下でネットワークが動くようにしてみます。なお、UMLは一般ユーザでlinuxを動作できるため、割と安全性を確保しやすいので、一般ユーザ(uml)を作って、そのユーザで実行してみます。

# su uml -c "linux ubda=FedoraCore5-x86-root_fs mem=128M eth0=tuntap,,,192.168.0.254"

そうしたら、次のような表示がでました。もちろんUML下のネットワークは動いていません。

Determining IP information for eth0...SIOCSIFFLAGS: Operation not permitted

で、これを調べていくうちに、最終的に、これがもう、泥沼といますか、泥縄的対処が見て取れるといいますか、そんな場当たり的対処そのものというような回避策を目の当たりにすることになりとは、思ってもいませんでした(後述)。

さて、まず、最初の問題として、tapデバイスが作成できていません。ということで、

http://permalink.gmane.org/gmane.linux.uml.user/10632

などのページから、

# chgrp uml /dev/net/tun
あるいは
# chmod o+rw /dev/net/tun

とすればよいようですので、/dev/net/tunを一般ユーザ(uml)にもアクセス可能にしてみました。そして、一般ユーザで再度実行してみます。
ところが、これでもtapデバイスを作成できません。おそらく、linuxのバージョンアップの中で、セキュリティ強化されたのか、「root以外ではtapデバイスを作成できなくなった」のではないでしょうか。
しかし、USER-mode-linuxなのに、一般USERでは使えないとは、まるで「詐欺」ですね?
まあ、これについての対処は、最悪UMLのソースに手を入れるということにして、とりあえずrootでUMLを実行して様子をみてみることにします。
ということで、とりあえず、rootで実行することにします。
ふむ。super-userですので、当然のごとくtapデバイスが作成できて動きました。
では、次に、ホスト側のネットワークのフィルタリングを設定しましょう。UML下であっても、宅内LANが丸見えなのは安全とは言えません。
ですが、驚いたことに、ググってヒットしたページでは、UML下のネットワークデバイスとホストのネットワークデバイスでブリッジを組むという、「素薔薇しい」ことをしていました。まぁ、ポリシーの差といえばそれまでなんですが、それだと「UMLを使うと安全」という一番のメリットを台無しにしてしまいます。その一方で、UML下の「すべてが完全に信用できる」ならば、そうしたほうが設定は簡単になります。ですが、私はUML下で動かすアプリを信用しない方向で考えているのです。
つまり、基本方針として、
・UML下からは、WANへは自由にアクセスできるようにする
・UML下からは、宅内LANへはアクセスできないようにする
 ただし、DNSへの問い合わせはできるようにする
・ホスト側からは、UML下へ自由にアクセスできるようにする
としたいわけです。UML下を信用できないものとして、宅内LANを隠して、直接外部(WAN)に接続されているように設定します。実際には、直接外部には接続できませんので、ホストをルータとして、一般的なNAT+MASQUERADEで外部につながるようにします。
これらは、ホスト側のiptablesで設定することになります。主な設定は次のようなものでしょう。

# iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
# # DNS問い合わせは通す
# iptables -A FORWARD -i tap1 -p tcp --dport domain -d $DNS_IP -j ACCEPT
# iptables -A FORWARD -i tap1 -p udp --dport domain -d $DNS_IP -j ACCEPT
# # uml->WANは通す
# iptables -A FORWARD -i tap1 -o eth0 -j ACCEPT
# # uml->LANは通さない
# iptables -A FORWARD -i tap1 -d $LAN_NET -j DROP
# # NAT+MASQUERADE
# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

# iptables -I INPUT 1 -m state --state ESTABLISHED,RELATED -j ACCEPT
# # umlからホストへのアクセスを禁止する
# iptables -I INPUT 2 -i tap1 -d $HOST_IP -j DROP
# iptables -I INPUT 3 -i tap1 -d $WAN_IP -j DROP

これで、フィルタリングはOKです。他にftpプロトコル対応とかありますが、それはマニュアルをみたり、ググって調べたりして設定しましょう。
そうそう、forwardをonにしないと、UML下から外部へ通信できません。

# echo '1' >/proc/sys/net/ipv4/ip_forward
# # Debianでは、正式には/etc/sysctl.confに書く

UMLを起動して、gateway(route)とDNSを設定します。そして、外部と通信できることを確認します。

さて、ここまでUML下で動かしてきたものはFedoraでした。そうです、Debianを動かせませんか? I NEED DEBIAN!

http://www.eggdrop.ch/texts/uml/index.htm

このページによりますと、

# wget http://uml.nagafix.co.uk/Debian-3.1/Debian-3.1-x86-root_fs.bz2

で取得できるルートファイルシステムのイメージが使えそうです。取得して、これを展開します。
そして、実行してみます。

# linux ubda=Debian-3.1-x86-root_fs mem=128M eth0=tuntap,,,192.168.0.254

おお、動きます。では、UML下で必要な設定をしましょう。が、なにはともあれaptです。
/etc/apt/sources.listを設定して、apt-get updateして、必要なものを次々とインストールします。
そうこうしているうちに、ディスクが不足気味になってきました。とりあえず、apt-get cleanして少し空きを増やします。
また、メモリも不足気味なので、swapを追加しましょう。UMLをhaltで止めて、ホスト側でスワップのイメージファイルを作ります。

# dd if=/dev/zero of=swap_fs bs=1M count=256

そして、どこかに書いてあったようにubdb=swapfsとしてUMLを起動します。

# linux ubda=Debian-3.1-x86-root_fs ubdb=swapfs mem=128M eth0=tuntap,,,192.168.0.254

おや? 起動はしますがswapが見えません。mkswapで初期化してないからということではありません。なにしろ/dev/ubdbがないのですから。それどころか/dev/ubdaすらありません。どういうことでしょう? debfsがないからでしょうか? とにかく、UML下でデバイスファイルを作っておきます。

# UML下で
# mknod /dev/ubda b 98 0
# mknod /dev/ubdb b 98 16
# mknod /dev/ubdc b 98 32
# mkswap /dev/ubdb
# swapon /dev/ubdb

うむ、これでswapが使えるようになりました。
さて、不足気味のディスクをどうするかですが、ググってみると、なんと、UML下から「ホスト側の任意のディレクトリをマウントできる」という機能(hostfs)があることがわかりました。目が点です。驚きました。こうなると、「UMLを使うと安全」と思っていることは「完全な間違い」です。そもそもUMLのポリシーに「安全」というものが含まれていないと考えるべきでしょう。絶対にUMLをrootで動かしてはいけません。UMLをrootで動かしたら、UML下のrootは、ホストに対して「なんでもできる」ようになります。これは、どうしても一般ユーザでUMLを動作させなければなりません。

先に保留しておいた、UMLを一般ユーザで使えるようにする方法を考えなければなりません。でなければ、UML下で「信頼できるもの」しか使えないことになります。
さて、UMLがrootでしか使えないのは、そもそも、一般ユーザでtapデバイスを作れないことが問題なのでした。ならば、UMLを起動する前にrootでtapデバイスを作成しておいたらどうでしょう? そうすれば、UMLはtapデバイスを作らなくてよく、一般ユーザでも動きそうではないでしょうか?
この方法は、一見、問題なく動きそうなのですが、実際にはダメでした。理由はわかりませんが、UML下からtapデバイスへパケットは出ているようなのですが、逆にUML側がパケットを拾えないようです。つまり、UML下のネットワークが使えません。
こうなると、もうUMLのソースの手直ししか方法がないのでしょうか? そんなバカなことはありません。第一、こんな「危険」を知らないでUMLを使っているとは思えません… で、再度ググってみたら、次のページがヒットしました。

http://forums.gentoo.org/viewtopic-t-401381-highlight-.html?sid=a32fa0f102ba74b13d31844e5c2761cb

このページによると、「uml_switchを使え」ということでした。ははぁ、ホスト側でいつの間にかuml_switchというプロセスが起動されていて「なんだろう?」と思っていたのですが、なるほど、これだったわけですか。
UMLはtapデバイスを作成せずに、uml_switchと通信をしてtapデバイスにパケットを送受信する。つまり、UMLで必要だったroot権限をuml_switchに移したわけです。なんか、もう、泥縄、場当たり対処と言われても仕方ないような逃げ方ですね。いや、確かに、root権限が必要な部分を切り分けるというその方法自体は間違っていませんし、正しい方法だと思います。が、行き当たりばったり的なニオイがするように感じているのは私だけでしょうか。
さて、Debianでは、uml_switchは、/etc/init.d/uml-utilitiesから起動できるようになっています。設定は/etc/default/uml-utilitiesでできます。これを修正して、uml_switchを再起動してみます。

# /etc/init.d/uml-utilities start

あれっ? tapデバイスが作成されませんね。なんででしょう? uml-utilitiesスクリプトを調べてみると、uml-netユーザでuml_switchが起動されるようになっています。おいおい、これは、前述と同じ理由(root以外ではtapデバイスを作成できない)からrootで起動する必要があるんですけど…。
ところで、uml_switchはネットワークの橋渡しですので、これをrootで実行しても問題は生じないはずです。なぜならUMLからuml_switchプロセスを直接操作できないからです。
なので、uml_switchをrootで起動できるように設定を変えて試してみます。

# /etc/init.d/uml-utilities restart

そして、UMLを一般ユーザで実行します。

# su uml -c "linux ubda=Debian-3.1-x86-root_fs ubdb=swap_fs mem=128M eth0=daemon"

UML下のネットワークがやっと動き出しました。やれやれです。
じゃ、カーネルを最新版に変えてみましょうか? kernel.orgから2.6.22.3を取得します。カーネルコンフィグレーションをなんとか設定しなければなりませんが、簡単に済ますにはaptを使用するのが一番です。

# apt-get source --compile user-mode-linux
# # カーネルのコンパイルが始まったら、停止させる
# tar xjf linux-2.6.22.3.tar.bz2
# cd linux-2.6.22.3
# make mrproper
# cp ../user-mode-linux-2.6.21-1um/linux-source-2.6.21/.config .
# make oldconfig ARCH=um
# # 自分が必要なオプションではmかyを、それ以外ではnを答える。
# make linux ARCH=um
# # カーネルのコンパイルが終わるまで待つ
# strip linux

できあがったlinuxを使って試してみます。

# su uml -c "linux-2.6.22.3/linux ubda=Debian-3.1-x86-root_fs ubdb=swap_fs mem=128M eth0=daemon"

大丈夫そうです。cat /proc/versionして、カーネルのバージョンが2.6.22.3になったことを確認します。
では、次に、実際に使っているシステムをuml下で動かすことを試してみます。
私のところには、現行RedHatをインストールしたマシンがあります。これを他のマシンのUML下で動かしてみます。
基本的には、
1) 現行RedHatのシステムをイメージファイルとして書き出す
2) イメージファイルをumlを動かすマシンへ持ってくる
3) loopbackマウントを使ってネットワークの設定、fstabの設定等を直す
4) umlを起動
で済むはずです。それぞれ簡単にできることですので、ここでは詳細は省きますが、3)の項だけメモしておきます。

/etc/sysconfig/networking/ifcfg-eth0:
# なんとかかんとか

/etc/resolv.conf
nameserver DNSのIPアドレス

/etc/fstab:
# 以下みたいな感じで
/dev/ubda / auto defaults 1 1
/dev/ubdb none swap defaults 0 0
none /dev/pts devpts gid=5,mode=620 0 0
none /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults,size=768M 0 0

/dev/ubd[abc]:
# デバイスがない場合に困るので
mknod /dev/ubda b 98 0
mknod /dev/ubdb b 98 16
mknod /dev/ubdc b 98 32

/etc/inittab:
# これがないとumlで起動後login:が出ない
c0:1235:respawn:/sbin/getty 38400 tty0 linux

これらの変更をして起動します。現行RedHatが6.5GBと小さかったので、イメージファイルは7GBとしました。

# su uml -c "linux-2.6.22.3/linux ubda=RedHat-root_fs ubdb=swap_fs mem=128M eth0=daemon"

で、問題点がひとつありました。

・iptablesのコマンドでエラーが起こった

これはカーネルのバージョン違いか、linuxのbuildのときのconfigの違いか、モジュールがインストールされていないか、によるものでしょう。これについては、まぁ、いずれ必要になったら、調査してみることにします。
さて、次はCopyOnWriteを試してみましょうかね…。 (未完のまま終了です)



共通テーマ:パソコン・インターネット

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。