![]() |
![]() |
2009/10/01
今年の5月にベル研の Geoff からアナウンスがあった。USB に関する改善を行ったらしい。
USB は Plan9 では遅れていた。そしてユーザインターフェースもイマイチであった。以下に新しい方法をメモしておく。
実験の対象は、もう使われなくなった古い USB disk である。この内部には 2個の disk:
が含まれている。一応は独立したディスクである。前者は明らかに FD を模している。
新しいカーネルでは
/srv/usb
が初めからサポートされている。そして
/dev/usb
に USB の原始的なインターフェースが見える。これは '#u' がマウントされたものである。
USB disk のファイル形式は殆どの場合 FAT であろう。FAT の場合には中のファイルにアクセスするには単に
usbfat:
を実行すればよい。
term% usbfat: /n/sdU5.0 /n/sdU5.1 term% ls -l /n/sdU* d-rwxrwxrwx M 113 bill trog 0 Oct 1 23:18 /n/sdU5.0/.Spotlight-V100 d-rwxrwxrwx M 113 bill trog 0 Oct 1 23:18 /n/sdU5.0/.Trashes --rw-rw-rw- M 113 bill trog 4096 Oct 1 23:18 /n/sdU5.0/._.Trashes --rw-rw-rw- M 113 bill trog 4096 Oct 1 23:20 /n/sdU5.0/._strfind alrw-rw-rw- M 113 bill trog 262108 Oct 1 23:14 /n/sdU5.0/9LOAD --rw-rw-rw- M 113 bill trog 2308561 Oct 1 23:15 /n/sdU5.0/9PC --rw-rw-rw- M 113 bill trog 3276040 Oct 1 23:15 /n/sdU5.0/9PCF --rw-rw-rw- M 113 bill trog 730 Oct 1 23:15 /n/sdU5.0/PLAN9.INI --rw-rw-rw- M 113 bill trog 807 Sep 27 04:25 /n/sdU5.0/STRFIND d-rwxrwxrwx M 116 bill trog 0 Oct 1 20:01 /n/sdU5.1/.Trashes --rw-rw-rw- M 116 bill trog 4096 Oct 1 20:01 /n/sdU5.1/._.Trashes alrw-rw-rw- M 116 bill trog 262108 Oct 1 19:56 /n/sdU5.1/9LOAD --rw-rw-rw- M 116 bill trog 990972 Oct 1 19:56 /n/sdU5.1/9PC.GZ --rw-rw-rw- M 116 bill trog 730 Oct 1 19:56 /n/sdU5.1/PLAN9.INI term% ls -l /dev/sdU* --r--r--r-- M 110 arisawa arisawa 0 Jan 1 1970 /dev/sdU5.0/ctl --rw-r----- M 110 arisawa arisawa 256376832 Jan 1 1970 /dev/sdU5.0/data --rw-r----- M 110 arisawa arisawa 0 Jan 1 1970 /dev/sdU5.0/raw --r--r--r-- M 110 arisawa arisawa 0 Jan 1 1970 /dev/sdU5.1/ctl --rw-r----- M 110 arisawa arisawa 1474560 Jan 1 1970 /dev/sdU5.1/data --rw-r----- M 110 arisawa arisawa 0 Jan 1 1970 /dev/sdU5.1/raw
USB デバイスをファイルシステムとして見えるようにするには
mount -a /srv/usb /dev
を実行する。
term% mount -a /srv/usb /dev term% ls -l /dev/sdU* --r--r--r-- M 39 arisawa arisawa 0 Jan 1 1970 /dev/sdU5.0/ctl --rw-r----- M 39 arisawa arisawa 256376832 Jan 1 1970 /dev/sdU5.0/data --rw-r----- M 39 arisawa arisawa 0 Jan 1 1970 /dev/sdU5.0/raw --r--r--r-- M 39 arisawa arisawa 0 Jan 1 1970 /dev/sdU5.1/ctl --rw-r----- M 39 arisawa arisawa 1474560 Jan 1 1970 /dev/sdU5.1/data --rw-r----- M 39 arisawa arisawa 0 Jan 1 1970 /dev/sdU5.1/raw term% disk/partfs -m /n/usb /dev/sdU5.0/data term% ls /n/usb /n/usb/sdXX term% ls -l /n/usb/sdXX --rw-rw-rw- M 42 partfs partfs 0 Oct 1 09:35 /n/usb/sdXX/ctl --rw-rw-rw- M 42 partfs partfs 256376832 Oct 1 09:35 /n/usb/sdXX/data term% disk/fdisk -p /n/usb/sdXX/data >/n/usb/sdXX/ctl term% ls -l /n/usb/sdXX --rw-rw-rw- M 42 partfs partfs 0 Oct 1 09:35 /n/usb/sdXX/ctl --rw-rw-rw- M 42 partfs partfs 256376832 Oct 1 09:35 /n/usb/sdXX/data --rw-rw-rw- M 42 partfs partfs 127909888 Oct 1 09:35 /n/usb/sdXX/dos --rw-rw-rw- M 42 partfs partfs 127926272 Oct 1 09:35 /n/usb/sdXX/plan9
もしも
disk/partfs -m /n/usb /dev/sdU5.0/data
の代わりに、単に
disk/partfs /dev/sdU5.0/data
とすれば、sdXX は /dev/ に見えるであろう。しかしこの場合には unmount しづらいのである。なぜなら
unmount /dev
しか方法が無いが、/dev の全てが unmount される。-m /n/usb が指定されていれば
unmount /n/usb
で sdXX だけ unmount できる。-m のデフォルトの設計ミスですね。(古い仕様がそのまま引き継がれている)
partfs はパーティションをファイルとして見えるようにしてくれるツールである。そのためには partfs はパーティションの区切りを知る必要がある訳であるが、その部分がプログラムの中ではサボられているらしい。パーティションの区切りを一番良く分かっているのは fdisk なので、fdisk を使って区切りの情報を手に入れている。いわゆる横着プログラムである。しかしその横着ぶりを表に出さないで、partfs の内部で行う方法もあったろうに...
Plan9 partition 内のサブディレクトリについても同様に
disk/prep -p /n/usb/sdXX/plan9 >/n/usb/sdXX/ctl
が使える。
term% mount -a /srv/usb /dev term% ls -l /dev/sdU* --r--r--r-- M 122 arisawa arisawa 0 Jan 1 1970 /dev/sdU5.0/ctl --rw-r----- M 122 arisawa arisawa 256376832 Jan 1 1970 /dev/sdU5.0/data --rw-r----- M 122 arisawa arisawa 0 Jan 1 1970 /dev/sdU5.0/raw --r--r--r-- M 122 arisawa arisawa 0 Jan 1 1970 /dev/sdU5.1/ctl --rw-r----- M 122 arisawa arisawa 1474560 Jan 1 1970 /dev/sdU5.1/data --rw-r----- M 122 arisawa arisawa 0 Jan 1 1970 /dev/sdU5.1/raw
FD イメージのような小さなディスクであればパーティションに分割しない。FAT12 でフォーマットする。
term% disk/format -b /386/pbs -df /dev/sdU5.0/data /386/9load /386/9pc.gz /tmp/plan9.ini add 9load at clust 2 add 9pc.gz at clust 202 add plan9.ini at clust 992 Initializing FAT file system type 3½HD, 80 tracks, 2 heads, 18 sectors/track, 512 bytes/sec Adding file /386/9load, length 262108 add 9load at clust 2 Adding file /386/9pc.gz, length 990972 add 9pc.gz at clust 202 Adding file /tmp/plan9.ini, length 730 add plan9.ini at clust 992 used 1254912 bytes term%
32MB 以上になれば FAT12 ではフォーマットできない。
term% disk/partfs -m /n/usb /dev/sdU5.0/data term% ls -l /n/usb/* --rw-rw-rw- M 141 partfs partfs 0 Oct 1 21:30 /n/usb/sdXX/ctl --rw-rw-rw- M 141 partfs partfs 256376832 Oct 1 21:30 /n/usb/sdXX/data term% disk/fdisk -p /n/usb/sdXX/data >/n/usb/sdXX/ctl term% ls -l /n/usb/* --rw-rw-rw- M 141 partfs partfs 0 Oct 1 21:30 /n/usb/sdXX/ctl --rw-rw-rw- M 141 partfs partfs 256376832 Oct 1 21:30 /n/usb/sdXX/data --rw-rw-rw- M 141 partfs partfs 255836160 Oct 1 21:30 /n/usb/sdXX/dos term% disk/fdisk /n/usb/sdXX/data # confirm FAT16 cylinder = 1048576 bytes * p1 0 244 (244 cylinders, 244.00 MB) FAT16 >>> q term% disk/format -b /386/pbslba -dfc8 /n/usb/sdXX/dos /386/9load /386/9pcf /386/9pc /tmp/plan9.ini add 9load at clust 2 add 9pcf at clust 42 add 9pc at clust 362 add plan9.ini at clust 596 Initializing FAT file system type hard, 243 tracks, 64 heads, 32 sectors/track, 512 bytes/sec Adding file /386/9load, length 262108 add 9load at clust 2 Adding file /386/9pcf, length 3276040 add 9pcf at clust 42 Adding file /386/9pc, length 2308561 add 9pc at clust 362 Adding file /tmp/plan9.ini, length 730 add plan9.ini at clust 596 used 5857280 bytes term%
format のオプションの
c8
は "8 sectors in a cluster" を意味する。256MB のサイズだと 4KB のクラスターが必要になる。partfs は c8 を省略しても必要なクラスターサイズを自動的に計算すべきであり、そして実際に自動的に計算しているのであるが、どうやら計算間違いをするらしく、エラーになる。従って明示的に与える必要がある。
僕はまだ成功していない。