address Logo

仮想環境とホストPCとのインターフェース

僕は 2 つのノートパソコンを持っている。PowerBook と MacBook である。PowerBook には VirtualPC、MacBook には Parallels がインストールされ、そこでは Plan 9 が動いている。Plan 9 はもっぱら僕のサーバーにアクセスするために使われているが、時々ホストである PowerBook や MacBook のデータにアクセスしたくなる。原理的にはホスト側に u9fs を走らせておいて 9fs でホストのファイルをマウントすればよいのであるが、これまでは

-bash$ ifconfig
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
        inet 127.0.0.1 netmask 0xff000000 
        inet6 ::1 prefixlen 128 
        inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1 
gif0: flags=8010<POINTOPOINT,MULTICAST> mtu 1280
stf0: flags=0<> mtu 1280
en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
        ether 00:14:51:2e:80:a6 
        media: autoselect (none) status: inactive
        supported media: none autoselect 10baseT/UTP <half-duplex> 10baseT/UTP <full-duplex> 10baseT/UTP <full-duplex,hw-loopback> 100baseTX <half-duplex> 100baseTX <full-duplex> 100baseTX <full-duplex,hw-loopback>
en1: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
        inet6 fe80::211:24ff:fea8:a9d8%en1 prefixlen 64 scopeid 0x5 
        inet 192.168.1.101 netmask 0xffffff00 broadcast 192.168.1.255
        ether 00:11:24:a8:a9:d8 
        media: autoselect status: active
        supported media: autoselect
fw0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 2030
        lladdr 00:14:51:ff:fe:2e:80:a6 
        media: autoselect <full-duplex> status: inactive
        supported media: autoselect <full-duplex>
-bash$ 

のように ifconfig を使って IP アドレスを見つけ、仮想 PC 上の Plan 9 で

    9fs 192.168.1.101

を実行していた。このプロセスを自動化できないかと言うのが今回のテーマである。

ホストの IP アドレス情報をどのようにして仮想 PC の Plan 9 に渡すか? フロッピーディスクイメージ(FD image)を作成しておいて、それを通じて渡すのが簡便であろう。OSX で FD image を作成する方法を僕は知らない。そこで Plan 9 側で作成する。

最初に 1474560B のファイルを作成する必要がある。dd コマンドを使えば次のようにして作成できる。

    echo | dd -conv sync -bs 1474560 >bar.flp

"bar" は何でもよい。これを OSX 側に移し仮想 PC で FD image として Plan 9 に渡すのであるが、念のためにフォーマットしておく。これも OSX ではやれないので Plan 9 側で行う。

    disk/format bar.flp

Plan 9 は bar.flp からブートする必要は無いから、bar.flp はブートセクターである最初の 512B が余っている。そこでここにホスト側の IP アドレスを OSX を使って書き込み、それを Plan 9 側で読み取ればよい。

さて ifconfig から IP アドレスを読み取るには、僕の場合には

    ifconfig en0
    ifconfig en1

の二つを試す必要がある。次はその実行例である。

en1: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
        inet6 fe80::211:24ff:fea8:a9d8%en1 prefixlen 64 scopeid 0x5 
        inet 192.168.1.101 netmask 0xffffff00 broadcast 192.168.1.255
        ether 00:11:24:a8:a9:d8 
        media: autoselect status: active
        supported media: autoselect

従ってこの場合には OSX で

    echo 192.168.1.101 | dd of=$HOME/vpc/bar.flp conv=notrunc count=1

が実行されればよいのだが次のようなスクリプトを作っておけばよい。

$HOME/bin/puthostid

#!/usr/local/plan9/bin/rc
for(x in en0 en1){
  ip=`{ifconfig $x | awk '/inet /{print $2}'}
  if(~ $ip [0-9]*){
    echo $ip | dd 'of='^$HOME/vpc/blank.flp 'conv=notrunc' 'count=1'    
    echo $ip
    exit
  }
}
echo no IP

Plan 9 側では

$home/bin/rc/getpostip

#!/bin/rc
hip=`{dd -quiet 1 -if /dev/fd0disk -count 1 | read}
echo 'hip='^$hip

これで gethostip を

    . /bin/gethostip

で実行すれば

    9fs $hip

でマウントできる。