address Logo

OSX パーティションタイプの怪

目次

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 側だ。

FAT16

ディスクユーティリティ.app

「ディスクユーティリティ.app」の情報を次に示す。

part1

ディスクユーティリティの画面

つまり FAT16 としてフォーマットされている。これは、僕が望んでいたフォーマット形式で、小さい USB ディスクだから、FAT32 にしないのは当然の事と思っていた。

確かに FAT16 だ。この事はファインダの「情報を見る」でも確認できる。

part2

ファインダの「情報を見る」の画面

ところが、この 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 になっているではないか!

OSX 10.5.7

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 にしても良いと言う事にはならないだろう...)

同様な情報を表示するコマンドが存在するのか否かは僕は知らない。

FAT12

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/sdd1FAT16 に、/dev/sd2PLAN9 になっている。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 が最初のブートディスクとして選ばれ、その中のブートコードが実行された事を意味する。

GUID

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