Plan 9とGo言語のブログ

主にPlan 9やGo言語の日々気づいたことを書きます。

Plan 9 from User Space(plan9port)を使う

この記事はQiitaで公開されていました

INSTALL

ソースを取得

$ git clone https://github.com/9fans/plan9port plan9

ソースを取得したディレクトリに移動してビルドすれば終わりです。通常は、git pullしたディレクトリがplan9portのインストール先になりますが、異なる場所にインストールする場合は、INSTALL -rオプションを使うか、$PLAN9_TARGET環境変数にインストール先パスをセットしておく必要があります。

$ ./INSTALL
# または
$ ./INSTALL -r /usr/local/plan9

ローカルでカスタムする場合は、リポジトリルートにLOCAL.configファイルを置いておくと、INSTALLスクリプトがそれを読み込んでくれます。LOCAL.configは最終的に$PLAN9/configへマージされます。このファイルには、例えば以下のような値を書きます。

LDFLAGS=-L/usr/local/lib
CFLAGS=-pthread
SYSVERSION=2.6.x
OBJTYPE=x86_64   # 386, power, sparc
CC9=gcc
FONTSRV=fontsrv

また、リポジトリルートにLOCAL.INSTALLが存在し、実行属性が付いていれば、INSTALLスクリプトはインストールが終わった直後にLOCAL.INSTALLを実行します。これらのファイルは環境に合わせてカスタムする場合に便利だと思います。

いくつか警告が出ますけど無視しても大丈夫。

fontsrvのインストール

各OSのフォントにアクセスしたい場合、fontsrvのコンパイルが必要です。

$ cd plan9/src/cmd/fontsrv
$ mk install
$ mk clean # 必要なら

9pをマウント

9pファイルサーバをマウントしたい場合、FUSEが有効になっていなければなりません。 MacならMacFUSE(今はOSX FUSE)、LinuxならFUSEを導入してください。

exportfs/9import

まずは実験してみます。

# on Plan 9:
% aux/listen1 tcp!*!17007 /bin/exportfs -a -A tcp!*!0

exportfsに-rオプションを与えた場合、initial protocolをスキップするので挙動が変わります。

# on plan9port:
$ factotum
$ 9import host path mtpt
引数 意味
host exportfsが動作しているPlan 9ホスト
path Plan 9ホスト上にあるマウントしたいパス
mtpt ローカルのマウントポイント

mountと9importは微妙に異なるようで、上記の代わりにmount(9pfuse)を使うことはできません。 使うと"fsversion: muxrpc: unexpected eof"というエラーになります。 fossil等、tcp564なファイルサーバを直接マウントする場合はmountなのかなあと思いますが、試していませんし、 おそらく暗号化しない生のデータを送受信するため内部でのみ使うのがいいと思います。 少なくとも9importは-e clearを指定しない限り暗号化している様子。

OS X

OS Xは/etc/profileに環境変数を定義しても、シェルから起動するコマンドは反映されますが、Dockから起動するようなシェルを経由しないアプリでは/etc/profileが読まれないので定義されません。 また、OS X 10.10(Yosemite)からは、/etc/launchd.confも使えなくなったので、手間ですが自分でLaunchAgentsの設定を定義して、ユーザがログインした時にlaunchctl setenvを呼び出す必要があります。

~/Library/LaunchAgents/com.bell-labs.plan9.plist

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
    <dict>
        <key>Label</key>
        <string>localhost.plan9</string>
        <key>ProgramArguments</key>
        <array>
            <string>/bin/launchctl</string>
            <string>setenv</string>
            <string>PLAN9</string>
            <string>/usr/local/plan9</string>
        </array>
        <key>RunAtLoad</key>
        <true/>
    </dict>
</plist>

こうすると、ログイン時に環境変数PLAN9が定義されます。 シェル経由の場合であっても、PLAN9は定義されているのでそのまま使えます。

~/Library/LaunchAgents/com.bell-labs.plan9.fontsrv.plist

あった方が便利なのでfontsrvも起動しておきましょう。

<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
    <dict>
        <key>EnvironmentVariables</key>
        <dict>
            <key>PLAN9</key>
            <string>/usr/local/plan9</string>
            <key>PATH</key>
            <string>/usr/local/plan9/bin</string>
        </dict>
        <key>Label</key>
        <string>com.bell-labs.plan9.fontsrv</string>
        <key>ProgramArguments</key>
        <array>
            <string>/usr/local/plan9/bin/fontsrv</string>
        </array>
        <key>RunAtLoad</key>
        <true/>
    </dict>
</plist>

/etc/paths.d/plan9

PATHにも含めたい場合は、/etc/paths.d以下に適当なファイル名でパスを記述します。

/usr/local/plan9/bin

secstore

secstoredは$PLAN9/secstore以下を更新するので、rootで実行する必要があります。daemon型の(自前でforkする)サービスであるため、&等は不要です。

$ sudo chmod 700 $PLAN9/secstore
$ sudo secstored
$ secstore -p file -s 'net!localhost!secstore'

/Library/LaunchAgents/com.bell-labs.plan9.secstored.plist

launchdはdaemon型のサービスを扱えないのでsecstoredを管理できません。 ですが、secstoredは(manには記述されていませんが)-vオプションを与えるとforkしなくなるため、これでlaunchdから扱うことができるようになります。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>EnvironmentVariables</key>
    <dict>
        <key>PLAN9</key>
        <string>/usr/local/plan9</string>
    </dict>
    <key>Label</key>
    <string>com.bell-labs.plan9.secstored</string>
    <key>ProgramArguments</key>
    <array>
        <string>/usr/local/plan9/bin/secstored</string>
        <string>-v</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
</dict>
</plist>