以下に簡単な使用例を挙げる。
nx
を UNIX システムとすると、
term% 9fs nx post ... # message term%
nx
のファイルシステムは /n/nx
の下に見える。term% ls /n/nx term% ls /n/nx ... /n/nx/bin /n/nx/dev /n/nx/etc /n/nx/home ... /n/nx/tmp /n/nx/usr term%
u9fs は認証方式として次の3種類をサポートしている。
また Linux や FreeBSD では (inetd ではなく) xinetd の下で動かす。Mac は全く方法が異なるので、独立して解説する。
/sys/src/cmd/unix/u9fs
に置かれている。unix$ make unix$ su root# cp u9fs /usr/local/sbin root# touch /var/log/u9fs.log
Mac にインストールするなら筆者のをダウンロードするのが良いだろう。
理由は
筆者のは
http:/netlib/u9fs/
に置かれている。
/etc/u9fs.key
に利用者のキーを設定する。(この場所は u9fs の -A
オプションで変更できる。
xxxxxxxx arisawa ddddddここに
xxxxxxxx
はパスワードで dddddd
は dom
の名称である。dom
の名称は適当に付けてよいが、パスワードが異なる他のシステムの名称と同じであってはならない。筆者の場合には u9fs をインストールしている Mac は家庭に設置されており、記憶力に乏しい筆者は mac
にしている。
さらに /etc/services
に
u9fs 564/tcp u9fs
/etc/xinetd.d/u9fs
の中でも可能になったようです)
まず
ps -axg|grep inetd
次に /etc/xinetd.d/
に以下の内容のファイル u9fs
を追加する
service u9fs { disable = no socket_type = stream protocol = tcp wait = no user = root server = /usr/local/sbin/u9fs server_args = -a p9any -l /var/log/u9fs.log groups = yes flags = REUSE }
xinetd の設定を変更した場合には root 権限で
-bash$ sudo /etc/init.d/xinetd restart
OSX Leopard になって xinetd が無くなって launchd による plist に一本化された。設定例は次の通りである。
/Library/LaunchDaemons/com.bell-labs.plan9.u9fs.plist
の内容
/Library/LaunchDaemons/
の com.bell-labs.plan9.u9fs.plist
の設定を変更した後、それを Launchd に反映させるには
-bash$ sudo launchctl unload /Library/LaunchDaemons/ -bash$ sudo launchctl load /Library/LaunchDaemons/ -bash$を実行すればよい。
/etc/services
で既に 9pfs
が定義されているので、"SockServiceName
" の値を 9pfs
にしたい所であるが、認識しない。次のエラーが出る。
sh-3.2# launchctl load /Library/LaunchDaemons/com.bell-labs.plan9.u9fs.plist getaddrinfo(): nodename nor servname provided, or not known
僕はこれまで plist を設定した事がなかった。このために今回は大変手間取った。
C プログラミングの世界に住んでいる者にとって、plist における、実行されるプログラムとその引数の指定の方法は "???" になりやすい。つまり "ProgramArguments
" を次のように書きやすいのである。
0 /usr/local/sbin/u9fs 1 u9fs 2 -l 3 /var/log/u9fs.log 4 -a 5 p9anyなぜ "
/usr/local/sbin/u9fs
" を "Program
" に指定しないで "ProgramArguments
" なんだ! と違和感を覚えつつ上記のように設定して、その為に 2 日程無駄な時間を費やした。僕は接続を検証するためにシンプルなプログラム "connect" を持っているが、それを使って 564 ポートにアクセスして、ようやくこの誤りに気付いた次第である。Plan 9 の "con" でも、あるいは OSX からtelnet loaclhost 564
initgroups (xinetd の groups) の値は YES でなくてはならない。Leopard でのデフォールトは YES であるが Tiger では NO なので、ここに上げた plist はそのまま Tiger では使えない。
マニュアルによると plist の置き場所は次の 5 カ所である。
~/Library/LaunchAgents Per-user agents provided by the user. /Library/LaunchAgents Per-user agents provided by the administrator. /Library/LaunchDaemons System wide daemons provided by the administrator. /System/Library/LaunchAgents Mac OS X Per-user agents. /System/Library/LaunchDaemons Mac OS X System wide daemons.最後の 2 つには多数の plist が置かれており、設定サンプルとして役に立つ。
マニュアルは次の 3 つが基本的である。
http://developer.apple.com/macosx/launchd.html
http://developer.apple.com/DOCUMENTATION/Darwin/Reference/ManPages/man5/launchd.plist.5.html
http://developer.apple.com/documentation/Darwin/Reference/ManPages/man1/launchctl.1.html
http://www.itmedia.co.jp/enterprise/articles/0704/26/news009.html
僕は NeXT 時代にから NetInfo を使っているが、Launchd の plist にせよ、このような複雑なものは苦手だ。
Plan9 であれば netstat -n
によってサービスが行われているポートが直ちに分かる。これに相当する UNIX のコマンドは netstat -na
である1。次に示すのはその出力例で
-bash$ netstat -na Active Internet connections (including servers) Proto Recv-Q Send-Q Local Address Foreign Address (state) tcp4 0 0 *.564 *.* LISTEN tcp6 0 0 *.564 *.* LISTEN tcp4 0 0 127.0.0.1.631 *.* LISTEN tcp6 0 0 ::1.631 *.* LISTEN564ポート(9pfs) が開いている事が分かる。ポート名を名前で表示させたい場合には
netstat -a
ラベル(例えば com.bell-labs.plan9.u9fs
)を指定して、launchd が実際に実行する plist の内容がダンプされるとありがたいのだが、launchctl にはその機能が見当たらない。
launchd のアクセスログは /var/log/system.log
に記録される。この内容はデバッグに役に立つ。
netstat -an64
なお u9fs のソースコードをコンパイルすると 2 つのファイルで warning が出る1。この warning は無視しても構わないが、いずれも include の追加で解決する。(以下の /* OSX,Linux */
の行)
oldfcall.c
:
#include <plan9.h> #include <stdlib.h> /* OSX,Linux */ #include <fcall.h> #include <oldfcall.h>
safecpy.c
:
#include <stdio.h> #include <string.h> /* OSX,Linux */
さらに次のエラーメッセージは(OSX の場合には) XCode がインストールされていない場合に発生する。
/usr/libexec/gcc/i686-apple-darwin8/4.0.1/ld: /usr/lib/gcc/i686-apple-darwin8/4.0.1/../../../libSystem.dylib unknown flags (type) of section 6 (__TEXT,__literal16) in load command 0 collect2: ld returned 1 exit status make: *** [u9fs] Error 1
/etc/u9fs.key
は一人分のキーしかサポートしていない1。この点は改善されるべきで、好ましい仕様はキーはユーザの責任で管理することとし$HOME/keys/u9fs
$HOME/.*
に置いており、いっこうに改善されない。
-bash$ kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGEMT 8) SIGFPE 9) SIGKILL 10) SIGBUS 11) SIGSEGV 12) SIGSYS 13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGURG 17) SIGSTOP 18) SIGTSTP 19) SIGCONT 20) SIGCHLD 21) SIGTTIN 22) SIGTTOU 23) SIGIO 24) SIGXCPU 25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGINFO 30) SIGUSR1 31) SIGUSR2 -bash$スーパーバイザモードで
root# kill -l HUP INT QUIT ILL TRAP ABRT EMT FPE KILL BUS SEGV SYS PIPE ALRM TERM URG STOP TSTP CONT CHLD TTIN TTOU IO XCPU XFSZ VTALRM PROF WINCH INFO USR1 USR2 root#そしてどちらのモードでも
-bash$ /bin/kill -l hup int quit ill trap abrt emt fpe kill bus segv sys pipe alrm term urg stop tstp cont chld ttin ttou io xcpu xfsz vtalrm prof winch info usr1 usr2 -bash$異なるプログラムが動いているのではないことは
which
コマンドで確認できる。
UNIX ホストが ssh によるログインを許していれば1もっとエレガントな方法で Plan 9 から UNIX ホストのファイルをマウントできる。この方法の利点は、UNIX ホストの管理者権限を必要とせず、完全にユーザレベルの設定でやって行ける事、さらに UNIX 側の設定が要らない事にある。
以下に筆者の Mac OSX を例に解説する。なお以下において mac は筆者の Mac のホスト名はである。
ssh -r mac
term% ssh -r mac Last login: Tue May 10 13:06:26 2005 from 192.168.1.2 Welcome to Darwin! -bash$となれば OK である。
Plan 9 端末から
ssh mac echo '$PATH'
$HOME/.bashrc
Plan 9 端末から
term% mntgen term% srvssh mac post...そして(この window はそのままにして)他のウィンドウから
term% mount /srv/mac /n/mac term% ls /n/mac /n/temp/.DS_Store /n/temp/.Trashes ...
srvssh はポート564(9fs ポート)を使わずに、ssh ポートを使った u9fs だと考えて良い。
この利点は、
ssh ポートの入出力は、古い(RS232C)時代の通信と相手が人間であると想定しており、そのために Byte 通過性が担保しずらい。通信路を Byte 透過にする方法は相手(unix)に依存する。旨く働くには多少の試行錯誤が要求されるかもしれない。その場合、やるべきことは
/rc/bin/srvssh
さて、「この window はそのままにして」と書いたが、srvssh の仕組みを考えると重要である。この window の中での I/O は srvssh でも使われており、干渉するリスクがある。
さて、このような嫌らしい Mac のファイル名が Plan9 に流れ込むのは嫌なので、パッチを当てることにしていた。今回、文字コードの対応を日本語文字だけではなく、全てのラテン系の文字、およびギリシャ文字に拡張した(2017/06/23)。
http:/p9p/index.html