2009/06/01
hardware: macbook
OS: OSX 10.5.7
ここに紹介する問題は僕が USB メモリを使っていて気がついた問題であるが、多分 USB は本質的ではないだろう。
僕が使っていた USB は 256MB の容量から想像されるように、数年前のものである。この USB には 2 つのディスクが含まれている。
調べてみるとそれらの容量は各々 244.5 MB と 1.4 MB である。後者は明らかに FD イメージに合わせてある。
各々を Mac の「ディスクユーティリティ.app」で FAT としてフォーマットする。
以下で問題にするのは 244.5MB 側だ。
「ディスクユーティリティ.app」の情報を次に示す。
ディスクユーティリティの画面
つまり FAT16 としてフォーマットされている。これは、僕が望んでいたフォーマット形式で、小さい USB ディスクだから、FAT32 にしないのは当然の事と思っていた。
確かに FAT16 だ。この事はファインダの「情報を見る」でも確認できる。
ファインダの「情報を見る」の画面
ところが、この USB ディスクのパーティションを Plan9 で見た時に FAT32 になっていたのだ!
念のためにフォーマットした Mac (OSX 10.5.7) でも、(今度は他のツールを使って)確認した。
Mac の標準ディスクツール diskutil では...
-bash$ diskutil list /dev/disk0 #: TYPE NAME SIZE IDENTIFIER 0: GUID_partition_scheme *149.1 Gi disk0 1: EFI 200.0 Mi disk0s1 2: Apple_HFS Macintosh HD 148.7 Gi disk0s2 /dev/disk1 #: TYPE NAME SIZE IDENTIFIER 0: FDisk_partition_scheme *244.5 Mi disk1 1: DOS_FAT_32 UNTITLED 242.9 Mi disk1s1 /dev/disk2 #: TYPE NAME SIZE IDENTIFIER 0: NONAME *1.4 Mi disk2 -bash$
FAT32 になっているではないか!
USB を外すと
-bash$ ls -l /dev/disk* brw-r----- 1 root operator 14, 0 May 31 11:12 /dev/disk0 brw-r----- 1 root operator 14, 1 May 31 11:12 /dev/disk0s1 brw-r----- 1 root operator 14, 2 May 31 11:12 /dev/disk0s2 -bash$
USB を差し込むと
-bash$ ls -l /dev/disk* brw-r----- 1 root operator 14, 0 May 31 11:12 /dev/disk0 brw-r----- 1 root operator 14, 1 May 31 11:12 /dev/disk0s1 brw-r----- 1 root operator 14, 2 May 31 11:12 /dev/disk0s2 brw-r----- 1 arisawa operator 14, 3 Jun 1 06:43 /dev/disk1 brw-r----- 1 arisawa operator 14, 4 Jun 1 06:43 /dev/disk1s1 brw-r----- 1 arisawa operator 14, 5 Jun 1 06:43 /dev/disk2
ディスクの実体を明らかにする。
-bash$ df Filesystem 512-blocks Used Available Capacity Mounted on /dev/disk0s2 311909984 145489696 165908288 47% / devfs 217 217 0 100% /dev fdesc 2 2 0 100% /dev map -hosts 0 0 0 100% /net map auto_home 0 0 0 100% /home /dev/disk1s1 497432 1080 496352 1% /Volumes/UNTITLED /dev/disk2 2829 20 2809 1% /Volumes/NONAME -bash$ fdisk /dev/disk1 Disk: /dev/disk1 geometry: 993/8/63 [500736 sectors] Signature: 0xAA55 Starting Ending #: id cyl hd sec - cyl hd sec [ start - size] ------------------------------------------------------------------------ *1: 0B 0 1 1 - 1023 254 63 [ 63 - 497952] Win95 FAT-32 2: 00 0 0 0 - 0 0 0 [ 0 - 0] unused 3: 00 0 0 0 - 0 0 0 [ 0 - 0] unused 4: 00 0 0 0 - 0 0 0 [ 0 - 0] unused
ここでも FAT32 になっている。
-bash$ fdisk /dev/disk2 fdisk: /dev/disk2: Resource busy
つまり /dev/disk2
は読み取れない。root でも読み取れない!
sh-3.2# fdisk /dev/disk2 fdisk: /dev/disk2: Resource busy
/dev/disk1
をダンプ。xd は Plan9 のツールであるが、僕は OSX でも使っている。
-bash$ xd -c /dev/disk1 0000000 fa 1 c0 8e d0 bc ec { 89 e5 8e d8 be 00 | 8e 0000010 c0 bf 00 06 b9 00 01 fc f3 a5 ea 1f 06 00 00 0 0000020 c0 8 c2 u 02 b2 80 88 V 12 be 90 07 bf 07 0000030 ff d7 be be 07 b9 04 00 b4 80 0 c0 8a \ 00 8 0000040 dc t 13 8 d8 u 1f 81 c6 10 00 I u ee be 3 0000050 07 bf fd 06 ff d7 89 f7 81 c6 10 00 I t 0f 8a 0000060 \ 00 8 dc u f2 be J 07 bf fd 06 ff d7 b4 A 0000070 bb aa U 8a V 12 cd 13 r P 81 fb U aa u J 0000080 81 e1 01 00 t D c6 F 00 10 c6 F 01 00 c6 F 0000090 02 01 c6 F 03 00 c7 F 04 00 | c7 F 06 00 00 00000a0 8b 85 \b 00 89 86 \b 00 8b 85 \n 00 89 86 \n 00 00000b0 c7 F 0c 00 00 c7 F 0e 00 00 89 ee b4 B cd 13 00000c0 s $ be V 07 bf fd 06 ff d7 8a u 01 8b 8d 02 00000d0 00 b8 01 02 8a V 12 bb 00 | cd 13 s \b be V 00000e0 07 bf fd 06 ff d7 bb 00 | 8b 87 fe 01 81 f8 U 00000f0 aa u 07 89 fe ea 00 | 00 00 be ` 07 bf 07 0000100 ff d7 be l 07 bf 07 ff d7 1 c0 cd 16 1 db 0000110 8e c3 bb r 04 b8 4 12 & 89 07 ea 00 00 ff ff 0000120 ` 1 db ac \b c0 t \t b4 0e cd 10 ac \b c0 u 0000130 f7 a c3 N o a c t i v e e n t 0000140 r y i n M B R 00 I n v a l i 0000150 d M B R 00 I / O e r r o r 00 0000160 I n v a l i d P B S 00 \r \n P r 0000170 e s s a l m o s t a n y k 0000180 e y t o r e b o o t . . . 00 0000190 M B R . . . 00 00 00 00 00 00 00 00 00 00 00001a0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00001b0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 01 00001c0 01 00 0b fe ff ff ? 00 00 00 99 07 00 00 00 00001d0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00001e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00001f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 U aa 0000200 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ...
アドレス 01be からの 16B がパーティション情報。この 16B は(文字をコードに直すと)、
80 01 01 00 0b fe ff ff 3f 00 00 00 20 99 07 00
読み方は次の通り[1]。
Offset | Field length (bytes) |
Description |
---|---|---|
0x00 |
1 | status (0x80 = bootable, 0x00 = non-bootable, other = invalid) |
0x01 |
3 | CHS address of first block in partition. The format is described in the next 3 bytes. |
0x01 |
1 | head |
0x02 |
1 | sector is in bits 5–0; bits 9–8 of cylinder are in bits 7–6 |
0x03 |
1 | bits 7–0 of cylinder |
0x04 |
1 | partition type |
0x05 |
3 | CHS address of last block in partition. The format is described in the next 3 bytes. |
0x05 |
1 | head |
0x06 |
1 | sector is in bits 5–0; bits 9–8 of cylinder are in bits 7–6 |
0x07 |
1 | bits 7–0 of cylinder |
0x08 |
4 | LBA of first sector in the partition |
0x0C |
4 | number of blocks in partition, in little-endian format |
パーティションタイプは 0b
なので、確かに FAT32 である[3]。
第一パーティションの LBA 情報は 0x1c6 = 0x1be + 0x08
からの 4B (little endian) である
3f 00 00 00
これは little endian なので順序を逆にして解釈しなくてはならない
00 00 00 3f
つまり、0x3f = 63 から始まる。これは 64 番目のセクターだから 63 個のセクターをスキップしてダンプすればよい。
-bash$ dd ibs=512 skip=63 if=/dev/disk1 |xd -c|p 0000000 eb < 90 B S D 4 . 4 00 02 \b 01 00 0000010 02 00 02 00 00 f0 f3 00 00 00 00 00 00 00 0000020 99 07 00 00 00 ) da 1a g 84 U N T I T 0000030 L E D F A T 1 6 fa 1 0000040 c0 8e d0 bc 00 | fb 8e d8 e8 00 00 ^ 83 c6 19 0000050 bb 07 00 fc ac 84 c0 t 06 b4 0e cd 10 eb f5 0 0000060 e4 cd 16 cd 19 \r \n N o n - s y s t e 0000070 m d i s k \r \n P r e s s a n 0000080 y k e y t o r e b o o t \r 0000090 \n 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00000a0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00000b0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ... 00001e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00001f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 U aa
パーティションの内部構造の解説は fatgen103.doc
に載っている。このドキュメントは Microsoft のホームページで手に入る[2]。
以下にこの文書と付き合わせたいくつかの情報を示す。
offset | size | value | description |
---|---|---|---|
0x00 |
3 | eb 3c 90 |
jump 命令 |
0x03 |
8 | "BSD 4.4 " |
OEM name (format したシステムの名前) |
0x0b |
2 | 00 02 |
0x0200 (=512) (byte/sector) |
0x0d |
1 | 08 (= \b ) |
4KB (number of sectors per allocation unit) |
0x0e |
1 | 01 |
FAT12 と FAT16 では 1, (FAT32 では普通 32) |
0x2b |
11 | "UNTITLED " |
disk label |
0x36 |
8 | "FAT16 " |
file system type (単にメモ的) |
0x1fe |
2 | 55 aa |
PBS signature (固定) |
つまり、当たり前の事であるが、実際にどのようにフォーマットしたかの正確な情報は(パーティションテーブルにではなく)パーティションの内部に存在するのであって、Mac OSX 10.5.7 の GUI インターフェースではパーティションの中の情報に基づいて実際のファイルシステムのタイプを表示しているのである。(だからと言って、パーティションテーブルの方を FAT32 にしても良いと言う事にはならないだろう...)
同様な情報を表示するコマンドが存在するのか否かは僕は知らない。
2009/06/07
既に述べたように、この USB メモリは 1.4MB のディスクを内部に持っている。僕の持っている USB メモリはどれもそうであるから、一般的な傾向かもしれない。
僕が今使っている macbook (OSX 10.5.7) では、この内部をダンプできなかった。しかし、UNIX 系の OS であれば、ダンプできるはずである。(OSX は UNIX のように見えて UNIX ではない)
この部分はフロッピーディスク(3.5インチ 2DD)と同サイズである。基本的には FD のイメージを置く場所であろう。 OSX ではパーティションに分ける事はできない。(しかし OSX の「ディスクユーティリティ.app」では1個のパーティションを含んでいるかのように表示される)
Linux(Ubuntu) では USB メモリは次のように見える。以下の /dev/sdd
と /dev/sde
がそれだ。
root@ken# ls -l /dev/sd* brw-rw---- 1 root disk 8, 0 2009-06-07 18:57 /dev/sda brw-rw---- 1 root disk 8, 1 2009-06-07 18:57 /dev/sda1 brw-rw---- 1 root disk 8, 2 2009-06-07 18:57 /dev/sda2 brw-rw---- 1 root disk 8, 16 2009-06-07 18:57 /dev/sdb brw-rw---- 1 root disk 8, 17 2009-06-07 18:57 /dev/sdb1 brw-rw---- 1 root disk 8, 32 2009-06-07 18:57 /dev/sdc brw-rw---- 1 root disk 8, 33 2009-06-07 09:57 /dev/sdc1 brw-rw---- 1 root disk 8, 34 2009-06-07 18:57 /dev/sdc2 brw-rw---- 1 root disk 8, 37 2009-06-07 18:57 /dev/sdc5 brw-rw---- 1 root disk 8, 48 2009-06-07 10:01 /dev/sdd brw-rw---- 1 root disk 8, 49 2009-06-07 10:01 /dev/sdd1 brw-rw---- 1 root disk 8, 50 2009-06-07 10:01 /dev/sdd2 brw-rw---- 1 root disk 8, 64 2009-06-07 10:01 /dev/sde
今回の USB メモリは /dev/sdd
は内部に 2 つのパーティションを持っている。このパーティションは Plan9 で切っておいたものだ。各々のパーティションは /dev/sdd1
は FAT16
に、/dev/sd2
は PLAN9
になっている。FAT12
の方(/dev/sde
) はパーティションを持たない事に注意しよう。
root@ken:/home/arisawa# fdisk /dev/sdd コマンド (m でヘルプ): p Disk /dev/sdd: 256 MB, 256376832 bytes 64 heads, 32 sectors/track, 244 cylinders Units = シリンダ数 of 2048 * 512 = 1048576 bytes Disk identifier: 0x00000000 デバイス Boot Start End Blocks Id System /dev/sdd1 * 1 48 49136 4 FAT16 <32M /dev/sdd2 49 244 200704 39 Plan 9
次は Linux(Ubuntu) での /dev/sde
のダンプである。この部分は今日 OSX でフォーマットをやり直した。なお、ダンプに使われている xd は Plan9 からのポート(plan9port)である。もちろん Plan9 からも同じ結果が得られるだろう。
root@ken# xd -c /dev/sde 0000000 eb < 90 B S D 4 . 4 00 02 01 01 00 0000010 02 00 02 @ 0b f0 \t 00 00 10 00 00 00 00 00 0000020 00 00 00 00 00 00 ) eb 0e 17 03 N O N A M 0000030 E F A T 1 2 fa 1 0000040 c0 8e d0 bc 00 | fb 8e d8 e8 00 00 ^ 83 c6 19 0000050 bb 07 00 fc ac 84 c0 t 06 b4 0e cd 10 eb f5 0 0000060 e4 cd 16 cd 19 \r \n N o n - s y s t e 0000070 m d i s k \r \n P r e s s a n 0000080 y k e y t o r e b o o t \r 0000090 \n 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00000a0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00000b0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00000c0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00000d0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00000e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00000f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0000100 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0000110 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0000120 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0000130 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0000140 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0000150 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0000160 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0000170 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0000180 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0000190 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00001a0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00001b0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00001c0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00001d0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00001e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00001f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 U aa 0000200 f0 ff ff ff O 00 05 ` 00 07 80 00 \t a0 00 ff 0000210 0f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0000220 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0000230 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ...
僕の EeePc は立ち上がり時にブートディスクを簡単に選べるようになっている。EeePC のグラフィック画面が現れた時に ESC を押せばよい。この USB メモリを差し込んで電源を入れると、
USB FALSH DRIVE
が 2 つメニューに追加され、2 番目のを選ぶと
Non-system disk
Pree any key to reboot
が表示される。このメッセージは FAT12 側から発生しているのであり、確かに FAT12 が最初のブートディスクとして選ばれ、その中のブートコードが実行された事を意味する。
2009/06/01
OSX Leopard では MBR の形式が異なる。GUID と呼ばれるこの形式は EFI 規格の一部で、実際の情報は二番目のセクター(LBA1)から始まっている。
次のダンプは macbook での実行である。
sh-3.2# xd -c /dev/disk0 0000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0000020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0000030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0000040 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0000050 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0000060 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0000070 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0000080 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0000090 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00000a0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00000b0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00000c0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00000d0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00000e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00000f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0000100 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0000110 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0000120 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0000130 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0000140 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0000150 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0000160 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0000170 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0000180 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0000190 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00001a0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00001b0 00 00 00 00 00 00 00 00 V E 00 00 00 00 00 fe 00001c0 ff ff ee fe ff ff 01 00 00 00 af 9e a1 12 00 00 00001d0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00001e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00001f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 U aa 0000200 E F I P A R T 00 00 01 00 \ 00 00 00 0000210 ^ * 1e 81 00 00 00 00 01 00 00 00 00 00 00 00 0000220 af 9e a1 12 00 00 00 00 " 00 00 00 00 00 00 00 0000230 8e 9e a1 12 00 00 00 00 d5 h 00 00 3 K 00 00 0000240 f9 " 00 00 b6 . 00 00 02 00 00 00 00 00 00 00 0000250 80 00 00 00 80 00 00 00 ff P f2 c7 00 00 00 00 0000260 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0000270 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0000280 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0000290 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00002a0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00002b0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ... ...
GUID に関しては [4],[5],[6] が参考になる。
[1] Master boot record
http://en.wikipedia.org/wiki/Master_boot_record
[2] fatgen103.doc
http://www.microsoft.com/whdc/system/platform/firmware/fatgendown.mspx?
[3] List of partition identifiers for PCs
http://www.win.tue.nl/~aeb/partitions/partition_types-1.html
[4] GUIDパーティションテーブル
Wikipedia 「GUID」
[5] GUIDパーティションテーブル
http://technet.microsoft.com/ja-jp/library/cc773223.aspx
[6] Apple Partition Map【アップルパーティションマップ】
http://macosxgloss.seesaa.net/article/30329673.html