さて、Vmware 2.0 の ports が更新されていたため、 以前はテスト版 ports を使っていたのだが、 ports-current を FreeBSD-current 上で使ってみることにしたのでありました (UNIX USER の記事でもテスト版ベースでした)。
ところがこれが結構難しかった。 いきなり、起動した途端にこんなメッセージが出てきたのでありました。 しかも、Vmware の起動画面のイメージが表示されず、 単に白いウィンドウが表示されるだけ。うーむ。
"Cannot open vmware executable file. Possibly an installation error?" と言われても困るんですけど…。 で、かまわず実行を続けて、 「Power On」を選択すると、 今度はこんな謎のメッセージが表示されてしまいます。
確かに /usr/local/lib/vmware/lib/vmm なんてファイルはないんだけどさ、 前はそんなファイルなくても全く問題なく動いていたんだけどなぁ?
結局、結論は ktrace (1) することで発見されました。 FreeBSD-current では、linux エミュレータを有効にしていると、 何となく /usr/compat/linux/proc に、 Linux の procfs らしきものが出来ていて、 しかもきちんと cpuinfo というファイルが出来ているため、 emulator/vmware2 の files/vmware の中の、 Linux procfs 検知のための次のコードを通ってしまうのです (ちなみに、 生粋の FreeBSD procfs である /proc には、 cpuinfo などというファイルはありません)。
if [ ! -e @@LINUX_DIR@@/proc/cpuinfo ]; then echo "************************************************************" echo "It seems Linux procfs is not mounted on @@LINUX_DIR@@/proc." echo "VMware does not work without Linux procfs mounted." echo echo "For details, see linprocfs(5) manpage." echo "************************************************************" exit 1 fi
ところが実際は、 この Linux procfs がインチキ臭い。 FreeBSD-current は man linproc でわかるように、 最初から Linux procfs サポートを持っているのですが、 これは明示的にマウントしないと使えないようだ。 ところが、問題の状態では、 df を取ると次のようになっている。
ringo# df Filesystem 1K-blocks Used Avail Capacity Mounted on /dev/ad0s1a 8130540 7185700 294397 96% / /dev/ad0s1e 3105518 2703101 153976 95% /0 procfs 4 4 0 100% /proc
従って、この状態では Linux procfs はマウントされていないのです。 そこで、/etc/fstab に次のように書き足してみます (最終行が追加した行)。
# Device Mountpoint FStype Options Dump Pass# /dev/ad0s1b none swap sw 0 0 /dev/ad0s1a / ufs rw 1 1 /dev/ad0s1e /0 ufs rw 2 2 /dev/acd0c /cdrom cd9660 ro,noauto 0 0 /dev/ad8s1 /flash msdos rw,noauto 0 0 proc /proc procfs rw 0 0 linproc /usr/compat/linux/proc linprocfs rw 0 0
で、ここで mount /usr/compat/linux/proc するなり、 再起動するなりすると、 /modules/linprocfs.ko で提供される Linux procfs がマウントされる。 この場合の df は次のようになる。
ringo# df Filesystem 1K-blocks Used Avail Capacity Mounted on /dev/ad0s1a 8130540 7185701 294396 96% / /dev/ad0s1e 3105518 2703101 153976 95% /0 procfs 4 4 0 100% /proc linprocfs 4 4 0 100% /usr/compat/linux/proc
双方の内容は、次のように全く異なったものとなっています。
ringo% ls /proc/ 0 156 217 245 260 269 287 309 4 1 2 218 256 261 27 293 319 46 116 201 219 257 262 272 298 321 5 132 215 220 258 263 277 3 338 520 153 216 244 259 268 282 304 345 curproc ringo% ls /proc/1 cmdline ctl file mem note notepg rlimit status ringo% ls /usr/compat/linux/proc/ 0 156 217 245 260 269 287 309 4 meminfo 1 2 218 256 261 27 293 319 46 self 116 201 219 257 262 272 298 321 5 132 215 220 258 263 277 3 338 521 153 216 244 259 268 282 304 345 cpuinfo ringo% ls /usr/compat/linux/proc/1 exe mem
で、この状態から vmware を実行すると、 きちんと実行できるのです。 実は、最初のエラーは、 /usr/compat/linux/proc/vmwareのプロセスID/exe がオープンできなかったために出ていたエラーだったのです。 めでたしめでたし。