![]() |
![]() |
僕は 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
でマウントできる。