概要
概要
目的は次のようなものです.
対象は次のものです.
結果は次のようになりました.
注意事項
目次
fdisk
までmount
と第二の問題FreeBSD においては,二つの問題が生じます. すなわち,
以下にこれらの問題の現われ方と対処法とを提示致します.
(注) 少なくとも FreeBSD 6.2 においては,Talk Mastet II の「使用メモリ」を「内蔵メモリ」[INT] にしておく必要があります. 「SD card」[SD] になっていると,3.2 節にて示した問題の対策が効きません. (Linux ではどちらでも大丈夫です.)
先ず install したそのままの FreeBSD 6.2 に Talk Master II を繋げると,次のような log が出ます.
ohci0: <OHCI (generic) USB controller> mem 0xfea6f000-0xfea6ffff irq 10 at device 15.2 on pci0 (中略) umass0: YOUNTEL CO.LTD. YMDC-407X UMS DEVICE, rev 1.10/1.00, addr 2 umass0: SCSI over Bulk-Only; quirks = 0x0000 umass0:1:0:-1: Attached to scbus1 da1 at umass-sim0 bus 0 target 0 lun 0 ← こちらは内蔵メモリーの drive です. da1: < TalkMasterII > Removable Direct Access SCSI-0 device da1: 1.000MB/s transfers da1: 997MB (2042880 512 byte sectors: 64H 32S/T 997C) da2 at umass-sim0 bus 0 target 0 lun 1 ← こちらは SD card の drive です. da2: < TalkMasterII > Removable Direct Access SCSI-0 device da2: 1.000MB/s transfers da2: Attempt to query device size failed: NOT READY, Medium not present ← SD card が入っていない.
SD card が入っている場合には,この最後の行は次のようになります.
da2: 974MB (1995777 512 byte sectors: 64H 32S/T 974C)
この後,次のような log が続きます.
umass0: BBB bulk-in clear stall failed, STALLED
umass0: BBB bulk-out clear stall failed, STALLED
(da1:umass-sim0:0:0:0): Synchronize cache failed, status == 0x4, scsi status == 0x0
umass0: BBB reset failed, STALLED
umass0: BBB bulk-in clear stall failed, STALLED
umass0: BBB bulk-out clear stall failed, STALLED
/dev に da1 も da2 も作られず,最後の三行が間欠的に繰り返し出力され続けます. この段階では fdisk /dev/da1 などは実行できません.
"Synchronize cache failed" に対処するため,/usr/src/sys/cam/scsi/scsi_da.c を修正し SYNCHRONIZE_CACHE を使わないようにします.
(FreeBSD 4.11 ではさらに /usr/src/sys/dev/usb/umass.c の修正も必要です. この修正なしに Talk Master II を繋げると shutdown ができなくなり,またそれを抜くと OS が落ちます. FreeBSD 6.2 ではこの問題は生じません.)
それらの修正のための patch はここです. → tm2.tgz
この修正をして kernel を再構築すれば,接続時に /dev/da1, /dev/da1s1 が作成され,fdisk /dev/da1 も実行できるようになります.
# fdisk /dev/da1 ******* Working on device /dev/da1 ******* parameters extracted from in-core disklabel are: cylinders=997 heads=64 sectors/track=32 (2048 blks/cyl) parameters to be used for BIOS calculations are: cylinders=997 heads=64 sectors/track=32 (2048 blks/cyl) Media sector size is 512 Warning: BIOS sector numbering starts with sector 1 Information from DOS bootblock is: The data for partition 1 is: sysid 6 (0x06),(Primary 'big' DOS (>= 32MB)) start 485, size 2042395 (997 Meg), flag 80 (active) beg: cyl 0/ head 7/ sector 38; end: cyl 999/ head 31/ sector 0 The data for partition 2 is: <UNUSED> The data for partition 3 is: <UNUSED> The data for partition 4 is: <UNUSED>
同様に,SD card が入っている場合には fdisk /dev/da2 が実行できます.
# fdisk /dev/da2 ******* Working on device /dev/da2 ******* parameters extracted from in-core disklabel are: cylinders=974 heads=64 sectors/track=32 (2048 blks/cyl) (中略) The data for partition 1 is: sysid 6 (0x06),(Primary 'big' DOS (>= 32MB)) start 107, size 1995669 (974 Meg), flag 80 (active) beg: cyl 0/ head 1/ sector 45; end: cyl 123/ head 254/ sector 63 (以下略)
どちらも heads=64, sectors/track=32 のように本来の値と違っているのが気になります. 実はこれらは /usr/src/sys/cam/cam.c にて意図的に変更されています.
void cam_calc_geometry(struct ccb_calc_geometry *ccg, int extended) { uint32_t size_mb, secs_per_cylinder; size_mb = ccg->volume_size / ((1024L * 1024L) / ccg->block_size); if (size_mb > 1024 && extended) { ccg->heads = 255; ccg->secs_per_track = 63; } else { ccg->heads = 64; ccg->secs_per_track = 32; }
ただし,この変更が行なわれた場合には,
start 485 と beg: cyl 0/ head 7/ sector 38 および
start 107 と beg: cyl 0/ head 1/ sector 45 とが辻褄が合わなくなります.
内蔵メモリの mount ですが,次のように失敗します.
# mount_msdosfs -o longnames -m 644 -M 755 /dev/da1s1 /mnt
mount: /dev/da1s1: Invalid argument
一方,SD card の mount は成功します.
# mount_msdosfs -o longnames -m 644 -M 755 /dev/da2s1 /mnt # mount /dev/da0s1a on / (ufs, local) devfs on /dev (devfs, local) /dev/da0s1e on /tmp (ufs, local, soft-updates) /dev/da0s1f on /usr (ufs, local, soft-updates) /dev/da0s1d on /var (ufs, local, soft-updates) procfs on /proc (procfs, local) /dev/da2s1 on /mnt (msdosfs, local) ← mount されている.
内蔵メモリの場合のエラーの原因は,pmp->pm_SecPerTrack = 64 であるがゆえに次の if に引っ掛かることです. (SD card がエラーにならないのはこの値が 63 だからです.)
--- sys/fs/msdosfs/msdosfs_vfsops.c.org Wed Dec 20 12:05:30 2006
+++ sys/fs/msdosfs/msdosfs_vfsops.c Tue May 31 23:38:06 2011
@@ -480,11 +480,11 @@
if (!pmp->pm_BytesPerSec || !SecPerClust
|| !pmp->pm_Heads
#ifdef PC98
|| !pmp->pm_SecPerTrack || pmp->pm_SecPerTrack > 255) {
#else
- || !pmp->pm_SecPerTrack || pmp->pm_SecPerTrack > 63) {
+ || !pmp->pm_SecPerTrack || pmp->pm_SecPerTrack > 64) {
#endif
error = EINVAL;
goto error_exit;
}
要するに,cam.c に変更されない Talk Master II 固有の sectors/track の値 (= 64) が使われて,それではダメだと言われるのです. 上記のように 63 を 64 に変更すれば,正常に動作します. (これを試したのは FreeBSD 6.2 のみで,FreeBSD 4.11 では未確認です.)
後で述べますが,この 64 という数値は CHS 方式の表現の規格外です.
上記の patch はそれを認めるように OS 側を修正したものですが,正しくフォーマットし直せば動くか否かも確認したいところです.
とはいえ,Talk Master II の内蔵メモリーを PC でフォーマットし直す根性はありません.
(メーカーさんの方で heads=64, sectors/track=32 でフォーマットして試していただければ,それが一番楽なのですが.)
/mnt を ls で見てみます. (以下の例では /mnt/TIMERREC を.) タイマー録音で作成される directory/file の日付や時刻は「固定値」です. それらの名前はすべて大文字です. 一方,FreeBSD にてそれらを作成した場合には,作成時の日付,時刻になります. 名前は大文字小文字を区別することができます.
# ls -l /mnt/TIMERREC/*
/mnt/TIMERREC/BOX01:
total 103200
-rw-r--r-- 1 root root 9577984 1970-01-01 00:00 01001_070427_0645A0693I.MP3
-rw-r--r-- 1 root root 9585152 1970-01-01 00:00 01002_070428_0645A0693I.MP3
-rw-r--r-- 1 root root 9563648 1970-01-01 00:00 01003_070430_0645A0693I.MP3
usbdevs, camcontrol の出力は各々次のとおりです.
# usbdevs -v
Controller /dev/usb0:
addr 1: full speed, self powered, config 1, OHCI root hub(0x0000), (0x1166)(0x0000), rev 1.00
port 1 addr 2: full speed, self powered, config 1, YMDC-407X UMS DEVICE(0x4100), YOUNTEL CO.LTD.(0x0dab), rev 1.00
# camcontrol devlist
<IBM DDYS-T36950N S96H> at scbus0 target 6 lun 0 (pass0,da0)
< TalkMasterII > at scbus1 target 0 lun 0 (da1,pass1)
< TalkMasterII > at scbus1 target 0 lun 1 (da2,pass2)
最後に,Talk Master II の USB ケーブルを抜けば,次のような log が出ます.
umass0: at uhub0 port 2 (addr 2) disconnected (da1:umass-sim0:0:0:0): lost device (da1:umass-sim0:0:0:0): removing device entry (da2:umass-sim0:0:0:1): lost device (da2:umass-sim0:0:0:1): removing device entry umass0: detached
内蔵メモリーの論理的な仕切りの情報は fdisk を使えば得られますが,「加工」されている場合があります.
(実際,Linux でも FreeBSD でもされていました.)
それらの情報を直接取得したい場合は次のようにします.
(FreeBSD について例示しますが,Linux でも同様です.)
先ず sector 0 と 485 の内容をファイルに書き出します.
# dd if=/dev/da1 bs=512 count=1 > s0 # dd if=/dev/da1s1 bs=512 count=1 > s485
sector 0 は MBR (Master Boot Record) と呼ばれています. その中身を見ます.
% hexdump -Cv s0 00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| (中略) 000001b0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 07 |................| 000001c0 26 00 06 1f c0 e7 e5 01 00 00 1b 2a 1f 00 00 00 |&.........*....| 000001d0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 000001e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 000001f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa |..............U|
ここで薄青色を付けた部分に 1 番目の partition の情報が書かれています. これは次のように区切ります.
80 07 26 00 06 1f c0 e7 e5 01 00 00 1b 2a 1f 00
07 26 00 の部分は,さらに 10, 6, 8 bit に三分割されます. (いわゆる CHS 方式の表現.)
002607 (hex) = 0000 0000 0010 0110 0000 0111 (bin) = 00, 26, 07 (hex) = 0, 38, 7
各々の意味は次の通りです. (これらは fdisk で表示される内容に一致してしています.)
80 : active である. 07 26 00 : 開始位置は cylinder 0, sector 38, head 7 である. 06 : file system は "Primary 'big' DOS (>= 32MB)" である. e5 01 00 00 : 開始位置は 1e5 (hex) = 485 sector である. 1b 2a 1f 00 : 大きさは 1f2a1b (hex) = 2042395 sector である.
位置を示すための sector は 0 からでなく 1 から数えます. 従って,開始位置は
0 x (32 x 64) + 7 x 64 + (38 - 1) = 485
であり,二通りの記述は一致していることが確認されます. (順序が逆だが,32, 64 の出所は下記.)
次に sector 485 の中身を見ます. ここは (partition 1 の) Boot Sector と呼ばれています.
# hexdump -Cv s485 00000000 e9 00 00 53 4d 46 53 33 2e 30 00 00 02 40 01 00 |...SMFS3.0...@..| 00000010 02 00 02 00 00 f8 7d 00 40 00 20 00 e5 01 00 00 |......}.@. .....| 00000020 1b 2a 1f 00 00 00 29 00 00 00 00 2d 2d 2d 2d 2d |.*....)....-----| 00000030 2d 2d 2d 2d 2d 2d 46 41 54 31 36 20 20 20 00 00 |------FAT16 ..| (中略) 000001f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa |..............U|
ここで薄青色を付けた部分にこの partition の情報が書かれています. 各々の意味は次の通りです,
00 02 : byte/sector 200 (hex) = 512 40 : number of sector = 64 01 00 : reserved sector = 1 02 : number of FAT = 2 00 02 : number of entry = 512 00 00 : sector on logical image = 0 f8 : media descriptor 7d 00 : number of FAT sector = 125 40 00 : sectors/track = 64 20 00 : number of head = 32 e5 01 00 00 : hidden sector = 485 1b 2a 1f 00 : size = 2042395
同様に,SD card の情報も見てみました. 抜粋すれば次の通りです.
# dd if=/dev/da2s1 bs=512 count=1 > t107 # hexdump -Cv t107 00000000 e9 00 00 53 4d 46 53 33 2e 30 00 00 02 40 01 00 |...SMFS3.0...@..| 00000010 02 00 02 00 00 f8 7a 00 3f 00 ff 00 6b 00 00 00 |......z.?...k...| 00000020 95 73 1e 00 00 00 29 00 00 00 00 2d 2d 2d 2d 2d |.s....)....-----| 00000030 2d 2d 2d 2d 2d 2d 46 41 54 31 36 20 20 20 00 00 |------FAT16 ..|
3f 00 : sectors/track = 63 ff 00 : number of head = 255
参考までに,FreeBSD や Linux を install した HDD はどちらも sectors/track=63, heads=255 で仕切られていました.
FreeBSD にて % man fdisk を見ると次のような記述があります.
It is an error if the following is not true: 1 <= number of cylinders 1 <= number of heads <= 256 1 <= number of sectors/track < 64
6 bit で表わせる数値の上限が 3f (hex) = 63,
8 bit で表わせる数値の上限が ff (hex) = 255 ですから,これらの制限は当然です.
(head に関しては "1 <= number of heads < 256" の間違いだと思います.)
例え OS の内部では CHS 方式を使っていないにしても,記憶媒体の側にはこの制限に従うようなダミーの値を設定しておくべきでしょう.
FreeBSD 6.2 にて FAT (すなわち VFAT) でフォーマットされた USB メモリーの接続を試みる機会がありましたが,Talk Master II の内蔵メモリーや SD crd と同様に mount することができました.