ホスト(UMLを走らせているPC)にあるファイルにアクセスしたいなら、仮想ネットワーク越しでNFSでマウントするとか、scp/rcpでファイルをコピーするとかの手段があります。しかし、それ以外の方法もあります。 hostfs を使えば、ホストのファイルシステムをUMLから直接マウントすることも可能です。
(訳注:この仕様があるので、hostfs ありでコンパイルされているUMLは、ルート権限さえあればホスト側のファイルを(ユーザ権限ではあるが)自由にアクセスできる可能性がある。UMLの内部ならヤバいソフトでも安心して実行できる、というのは単なるでたらめではないが、それは、すくなくとも、「正しく設定すれば」の話である。利便性と安全性の二律背反はここでも存在する。サーカムのような類のウイルスとの疑いがあるアプリを走らせるような、特殊な状況の際には、hostfs を無効にしてコンパイルしたUMLを使うと同時に、UMLの中においてもユーザ権限で走らせるべき。)
まず、UMLにhostfs があるかどうかをチェックします。
cat /proc/filesystems
ここで、hostfs が出てこないなら、hostfs を有効にしてUMLを再コンパイルするか、hostfs がモジュールになっていれば、それをinsmodしてください。
UMLに hostfs があれば、あとは、マウントするだけです。
mount none /mnt/host -t hostfs
これは、ホスト側Linuxの / を 仮想マシンの /mnt/host にマウントします。
さすがに、/ をマウントするのはまずいでしょ、とかおもうなら、こんな風。
mount none /mnt/home -t hostfs -o /home
これは、ホスト側Linuxの /home を 仮想マシンの /mnt/home にマウントします。
(訳注:この章はいまいち意味がわからなかったので、大幅に意訳してます。今後改良予定ですが、急ぐ方は原文を参照のこと。そうでなくても、実行前にかならず
原文
を参照してください。ルート権限でディスクをいじっている部分があるので、ちょっとした操作ミス、解釈の誤りなどでシステムの崩壊を招く恐れがあります。)
ホストPCからは単なる馬鹿でかいファイルとしてしか認識できない例のディスクイメージではなく、ホストLinuxからみて、普通のディレクトリ構造と認識できる存在をブート用ディスクイメージとしてUMLに認識させることもできます。
まず、そんなディレクトリ構想をホストLinuxに作ります。簡単な方法としては、ループバックデバイスを使い、ホストLinuxに対し、UMLのディスクイメージを普通のファイルシステムとしてマウントします。こんな風に。これにより、./uml_root_dir 以下に、root_fs の内容がマウントされます。
# mount root_fs uml_root_dir -o loop
次に、(UML内部のLinuxカーネルが認識する)/etc/fstab を、以下のように変えます。普通は、UML内部のLinuxカーネルは、/ が ext2 とかになってるとおもいますが、そこを hostfs にします。
/dev/ubd/0 / hostfs defaults 1 1
(UMLはホストLinuxにおけるあなたの権限で走っているので、それでアクセスできるように)ループバックしてマウントした、UMLにとってのルートファイルシステムになるはずのホストLinuxのなかのディレクトリツリーの所有権を適切に変更します。たとえば、Jeff Dike にとってはこんな風。
ループバックでマウントしたディレクトリイメージのマウントポイントが
カレントディレクトリだとして、
# find . -uid 0 -exec chown jdike {} \;
なお、hostfs は、UML 内部のLinuxカーネルに対し、スタティックに組み込まれている必要性があります。insmod でモジュールとして起動後にダイナミックに組み込むのはまずいです。(訳注:理由は、起動時に認識しないとまずいファイルシステムを認識するのは、起動後にダイナミックに組み込むモジュールになるので・・・)。
ubd0=/path/to/uml/root/directory
あとは普通にやってください。
UMLを自分でコンパイルする場合で、hostfs を有効にした形でコンパイルするには、二つの方法があります。今お使いのUMLで hostfs が有効でない場合などにご参考まで。
UMLのコンパイルの時の設定で、 'Processor features'にある 'Host filesystem'を 'Y'にしてください。あとはコンパイルしてリブートです。
同様に、 'Processor features' にある 'Host filesystem' で、今度は、 'M'を選択してください。これにより、モジュールとしてhostfs が作られます。 多分、モジュールのパスはこれです:arch/um/fs/hostfs/hostfs.o。 これを、バーチャルマシン内部の /lib/modules/`uname -r`/fs にコピーし、 バーチャルマシン上で、
insmod hostfs
を実行すれば hostfs が組み込まれます。