address Logo

USB Storage Device

目次

2009/10/01

今年の5月にベル研の Geoff からアナウンスがあった。USB に関する改善を行ったらしい。

USB は Plan9 では遅れていた。そしてユーザインターフェースもイマイチであった。以下に新しい方法をメモしておく。

実験の対象は、もう使われなくなった古い USB disk である。この内部には 2個の disk:

が含まれている。一応は独立したディスクである。前者は明らかに FD を模している。

カーネルレベル

新しいカーネルでは

    /srv/usb

が初めからサポートされている。そして

    /dev/usb

に USB の原始的なインターフェースが見える。これは '#u' がマウントされたものである。

A simple way to access files in FAT partition

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

Looking partitions in the USB disk

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

が使える。

Formating USB dos partition

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

1.4MB disk without partition

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% 

256MB disk with partitions

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 のクラスターが必要になる。partfsc8 を省略しても必要なクラスターサイズを自動的に計算すべきであり、そして実際に自動的に計算しているのであるが、どうやら計算間違いをするらしく、エラーになる。従って明示的に与える必要がある。

USB Boot Disk

僕はまだ成功していない。