CORY's twilight zone > 98備忘録 (tips)[an error occurred while processing this directive] > SDXCメモリカードをFAT32でフォーマットする
SDXCメモリカードの論理フォーマットをFAT32に変更して、多種OS間でのデータ交換用に使うためのメモ書き。
◆ はじめに―なぜFAT32を使うのか ◆ 主な OS の exFAT への対応状況 ◆ SDXCメモリカードをFAT32でフォーマットする
SDメモリカードの論理フォーマットにはMicrosoft社の FAT (File Allocation Table) が採用されている。SDメモリカード(2GBまで)は FAT16、SDHCメモリカード(32GBまで)は FAT32、32GBを超えるSDXCメモリカードでは exFAT が使われている。
2013年には 64GB のSDXCメモリカードが、2014年には 128GB も一部安売店で4桁の価格帯に入ってきて、手頃になりつつあるが、SDXCメモリカードが規格化される以前のOSでは exFAT に対応していないし、しかも Microsoft社が exFAT の利用にライセンス料を要求していることから、依然としてUnix系OSを中心に利用が難しい状況になっている。
一方、SDHCメモリカードで採用されている FAT32 はWindows以外の現行OSでも幅広く対応しており、1つのファイルサイズが4GBまでに制限される(のでバックアップや動画ファイルなどには使いにくい)ものの、そうした用途でなければ互換性に優れており、データ交換用メディアに向いている。
なお、Windows 2000, XP では FAT32 で 32GB より大きいボリューム(論理ドライブ)をフォーマットできない仕様になっているが、規格上は2TBまで(512バイト/セクタの場合)対応している。
Windows 7, Windows Server 2008 以降は標準対応。
Windows Vista はSP1以降で対応。
Windows XP, Windows Server 2003 はSP2以降かつ KB955704 (XP x86, x64, Server) で対応。
Windows CE 6.0 以降は標準対応。
上記以外は対応しない。
Mac OS X 10.6.6 以降で対応。
iPhone, iPad, iPod touch は iOS 7 以降で対応。
FreeBSD は exFAT には対応していない(fusefs を入れて対応する場合があるが、試した範囲では動作が不安定なのでお勧めしない)。
Linux 向けの実装は Sumsung より GPL で提供されているが、上記ライセンスの問題もあり、対応を控えている distribution が多いと思われる。
Android は Linux の一種だが、機器メーカーが Microsoft とライセンス契約を結んで個別に実装している場合がある。
機器メーカーが公式に SDXCメモリカードへの対応を謳っている場合は exFAT に対応している。それ以外の機器では対応していないと考える方が良い。とりわけ Android 4.0 までの機器では exFAT を誤認識しデータを壊してしまうので、重要なデータが入っているSDXCメモリカードを Android 機器に接続するのは避けたい。
一方、FAT32 でフォーマット済みの SDXCメモリカードについては、(よほど古い物を除き)OSを問わず幅広く使うことができる。1ファイルあたりの最大サイズが4GBまでに制限されることが問題にならない用途であれば、後述の手順で FAT32 フォーマットに変換することで、32GBを超えるメモリカードを使うことができる場合が多い。
カメラなどの機器で使う場合は、SDXC メモリカードを FAT32 でフォーマットし直した物は、SDメモリカードの規格外となり誤動作の可能性があるので、推奨されない。
Windows OS に含まれているフォーマッタでは、SDXCメモリカードを exFAT(またはNTFS)以外でフォーマットすることはできない。
Windows XP までは(また以前の Windows 7 でも)、3rd party 製のフォーマッタを使うことでSDXCメモリカードをFAT32にできたが、いつの間にか 3rd party 製のフォーマッタも誤動作するようにOSが変更されたようで、現在は Windows 7 以降で SDXCメモリカードをFAT32フォーマットに変換することは難しくなっている。
もし手元に Windows しか無い場合は、FreeBSD と KNOPPIX など他のOSを Live CD などで動作させて作業するのが確実だろう。
なお、上記変更が施された Windows 7 でも、他のOSでフォーマットされた FAT32 メディアの読み書きは支障なく出来ている。
exFAT に対応していない Android 機器でフォーマットを行うと FAT32 になるので、特定の機器で使うことを想定しているメモリカードの場合は、最初にこの方法で試してみると良い。(ただし機器により正常終了しない場合がある。)
なお、この方法でフォーマットに失敗した場合、一般にはパソコンやSDXC対応機器で再フォーマットすることで修復できる(データは消去される)。
まずは伝統的な fdisk を使う方法から。 ただし FreeBSD 10 以降では fdisk が削除されているので、後述の gpart を使う方法のみになる。
rootになって作業する。SDXCメモリカード(以下の例は購入直後の 128GB SDXCメモリカードを使った例)をUSB接続のリーダライタに入れてパソコンに接続すると、コンソールにデバイス名が表示されるので確認しておく。
# dmesg | tail ... umass0: <Generic Mass Storage Device, class 0/0, rev 2.00/1.00, addr 3> on usbus8 umass0: SCSI over Bulk-Only; quirks = 0x4001 umass0:8:0:-1: Attached to scbus8 da0 at umass-sim0 bus 0 scbus8 target 0 lun 0 da0: <Multi Flash Reader 1.00> Removable Direct Access SCSI-0 device da0: 40.000MB/s transfers da0: 122751MB (251394048 512 byte sectors: 255H 63S/T 15648C) da0: quirks=0x2<NO_6_BYTE>
この例では da0 で認識しているドライブのスライス(パーティション)テーブルの内容を確認する。
# fdisk da0 ******* Working on device /dev/da0 ******* parameters extracted from in-core disklabel are: cylinders=15648 heads=255 sectors/track=63 (16065 blks/cyl) Figures below won't work with BIOS for partitions not in cyl 1 parameters to be used for BIOS calculations are: cylinders=15648 heads=255 sectors/track=63 (16065 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 7 (0x07),(NTFS, OS/2 HPFS, QNX-2 (16 bit) or Advanced UNIX) start 8192, size 251385856 (122747 Meg), flag 0 beg: cyl 0/ head 130/ sector 3; end: cyl 1023/ head 254/ sector 63 The data for partition 2 is: <UNUSED> The data for partition 3 is: <UNUSED> The data for partition 4 is: <UNUSED>
exFAT のため、パーティション識別子(sysid)は 0x07(NTFSと同じ)に設定されている。この状態では通常、FreeBSD で読み書きできない。
<注意>
以下の作業を行うと、メモリカード内のデータは全て消去される(使えなくなる)ので、必要なデータが残っている場合は予め保存しておくこと。
また、作業を間違えると、最悪、他のドライブのデータを壊すことにもつながる。
以下の作業は慎重に、自己責任において行うこと。
そこで、まずはパーティション識別子(sysid)を、FAT32 (LBA) を示す 12 (0x0c) に書き換える。
# fdisk -u da0 ******* Working on device /dev/da0 ******* parameters extracted from in-core disklabel are: cylinders=15648 heads=255 sectors/track=63 (16065 blks/cyl) Figures below won't work with BIOS for partitions not in cyl 1 parameters to be used for BIOS calculations are: cylinders=15648 heads=255 sectors/track=63 (16065 blks/cyl) Do you want to change our idea of what BIOS thinks ? [n] (return) 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 7 (0x07),(NTFS, OS/2 HPFS, QNX-2 (16 bit) or Advanced UNIX) start 8192, size 251385856 (122747 Meg), flag 0 beg: cyl 0/ head 130/ sector 3; end: cyl 1023/ head 254/ sector 63 Do you want to change it? [n] y Supply a decimal value for "sysid (165=FreeBSD)" [7] 12(return) Supply a decimal value for "start" [8192] (return) Supply a decimal value for "size" [251385856] (return) fdisk: WARNING: partition does not start on a head boundary fdisk: WARNING: partition does not end on a cylinder boundary fdisk: WARNING: this may confuse the BIOS or some operating systems Correct this automatically? [n] (return) Explicitly specify beg/end address ? [n] y(return) Supply a decimal value for "beginning cylinder" [0] (return) Supply a decimal value for "beginning head" [130] (return) Supply a decimal value for "beginning sector" [3] (return) Supply a decimal value for "ending cylinder" [288] 1023(return) Supply a decimal value for "ending head" [141] 254(return) Supply a decimal value for "ending sector" [45] 63(return) sysid 12 (0x0c),(DOS or Windows 95 with 32 bit FAT (LBA)) start 8192, size 251385856 (122747 Meg), flag 0 beg: cyl 0/ head 130/ sector 3; end: cyl 1023/ head 254/ sector 63 Are we happy with this entry? [n] y(return) The data for partition 2 is: <UNUSED> Do you want to change it? [n] (return) The data for partition 3 is: <UNUSED> Do you want to change it? [n] (return) The data for partition 4 is: <UNUSED> Do you want to change it? [n] (return) Do you want to change the active partition? [n] (return) We haven't changed the partition table yet. This is your last chance. parameters extracted from in-core disklabel are: cylinders=15648 heads=255 sectors/track=63 (16065 blks/cyl) Figures below won't work with BIOS for partitions not in cyl 1 parameters to be used for BIOS calculations are: cylinders=15648 heads=255 sectors/track=63 (16065 blks/cyl) Information from DOS bootblock is: 1: sysid 12 (0x0c),(DOS or Windows 95 with 32 bit FAT (LBA)) start 8192, size 251385856 (122747 Meg), flag 0 beg: cyl 0/ head 130/ sector 3; end: cyl 1023/ head 254/ sector 63 2: <UNUSED> 3: <UNUSED> 4: <UNUSED> Should we write new partition table? [n] y(return) (書き換え終了)
通常はパーティション識別子(sysid) を 12 (0x0c) に変更するだけで良いが、今回のメディアは最終 C/H/S が 1023/254/63(8GB上限)に設定されていた(互換性確保のため)ので、同様に設定し直している。(これをしないと、FreeBSD の fdisk は size から C/H/S を再計算して書き換えてしまう。)
この後、一旦USB接続を抜いて10秒ほど待ち、もう一度接続する。 先ほどと同じく、認識されたデバイス名を確認しておく。
# dmesg | tail ... ugen8.3: <Generic> at usbus8 umass0: <Generic Mass Storage Device, class 0/0, rev 2.00/1.00, addr 3> on usbus8 umass0: SCSI over Bulk-Only; quirks = 0x4001 umass0:8:0:-1: Attached to scbus8 da0 at umass-sim0 bus 0 scbus8 target 0 lun 0 da0: <Multi Flash Reader 1.00> Removable Direct Access SCSI-0 device da0: 40.000MB/s transfers da0: 122751MB (251394048 512 byte sectors: 255H 63S/T 15648C) da0: quirks=0x2<NO_6_BYTE>
FAT32 で論理フォーマット。ついでにボリュームラベルを "SDXC128GB" に設定している。
# newfs_msdos -u 16 -L SDXC128GB /dev/da0s1 /dev/da0s1: 251324416 sectors in 3926944 FAT32 clusters (32768 bytes/cluster) BytesPerSec=512 SecPerClust=64 ResSectors=32 FATs=2 Media=0xf0 SecPerTrack=16 Heads=255 HiddenSecs=0 HugeSectors=251385856 FATsecs=30680 RootCluster=2 FSInfo=1 Backup=2
ここで -u パラメータを付けない場合、昔のHDDの仕様に合わせて1トラック63セクタで計算した境界に調整されるが、シリコンドライブでは無駄になるので、1トラック16セクタ (8KB) に設定している。
続いて gpart を使う方法。9.2-RELEASE 以降では標準で対応している。(FreeBSD 7.x 以降で対応しているが、kernel再構築が必要。)
rootになってから作業する。 SDXCメモリカード(以下の例は購入直後の 64GB SDXCメモリカードを使った例)をUSB接続のリーダライタに入れてパソコンに接続すると、コンソールにデバイス名が表示されるので確認しておく。
# dmesg | tail ... ugen8.3: <Generic> at usbus8 umass0: <Generic Mass Storage Device, class 0/0, rev 2.00/1.00, addr 3> on usbus8 umass0: SCSI over Bulk-Only; quirks = 0x4001 umass0:8:0:-1: Attached to scbus8 da0 at umass-sim0 bus 0 scbus8 target 0 lun 0 da0: <Multi Flash Reader 1.00> Removable Direct Access SCSI-0 device da0: 40.000MB/s transfers da0: 59504MB (121864192 512 byte sectors: 255H 63S/T 7585C) da0: quirks=0x2<NO_6_BYTE>
この例では da0 で認識しているドライブのスライス(パーティション)テーブルの内容を確認する。
gpart では標準でパーティションタイプ名(ラベル)での表示になっているが、-r を付けるとパーティション識別子(数字)で表示される。GPTでは識別子が長いのでラベル表示が有効だが、MBRでは数字で扱う方が確実。
# gpart show da0
( start size slice sysid )
=> 63 121864129 da0 MBR (58G)
63 121864129 1 ntfs (58G)
# gpart show -r da0
=> 63 121864129 da0 MBR (58G)
63 121864129 1 7 (58G)
exFAT のため、パーティション識別子(sysid)は 0x07(NTFSと同じ)に設定されている。
<注意>
以下の作業を行うと、メモリカード内のデータは全て消去される(使えなくなる)ので、必要なデータが残っている場合は予め保存しておくこと。
また、作業を間違えると、最悪、他のドライブのデータを壊すことにもつながる。
以下の作業は慎重に、自己責任において行うこと。
パーティション識別子を、FAT32 (LBA) を示す 12 (0x0c) に書き換える。
gpart では、パーティション識別子をラベルではなく数値で指定する場合は、先頭に ! を付ける必要がある。しかし ! はシェルで置き換えられてしまうので、さらにその手前に \ を付ける。
# gpart modify -i 1 -t \!12 da0
da0s1 modified (書き換え終了)
# gpart show -r da0
=> 63 121864129 da0 MBR (58G)
63 121864129 1 12 (58G)
パーティション識別子を 12 (0x0c) 書き換えている。書き換えは即時終了するので、再び gpart show で確認しておく。
ちなみに、ここで数値ではなくラベル "fat32" を指定した場合は、11 (0x0b)(LBAアクセスではなくCHSアクセス)になる。この場合の挙動は未確認(容量が大きいほど、機器による相性問題が出やすくなるかもしれない)。
この後、一旦USB接続を抜いて10秒ほど待ち、もう一度接続する。 先ほどと同じく、認識されたデバイス名を確認しておく。
# dmesg | tail ... ugen8.3: <Generic> at usbus8 umass0: <Generic Mass Storage Device, class 0/0, rev 2.00/1.00, addr 3> on usbus8 umass0: SCSI over Bulk-Only; quirks = 0x4001 umass0:8:0:-1: Attached to scbus8 da0 at umass-sim0 bus 0 scbus8 target 0 lun 0 da0: <Multi Flash Reader 1.00> Removable Direct Access SCSI-0 device da0: 40.000MB/s transfers da0: 59504MB (121864192 512 byte sectors: 255H 63S/T 7585C) da0: quirks=0x2<NO_6_BYTE>
論理フォーマット。ボリュームラベルを "SDXC64GB" に設定している。
# newfs_msdos -u 16 -L SDXC64GB /dev/da0s1 newfs_msdos: trim 1 sectors to adjust to a multiple of 16 /dev/da0s1: 121834304 sectors in 1903661 FAT32 clusters (32768 bytes/cluster) BytesPerSec=512 SecPerClust=64 ResSectors=32 FATs=2 Media=0xf0 SecPerTrack=16 Heads=255 HiddenSecs=0 HugeSectors=121864128 FATsecs=14873 RootCluster=2 FSInfo=1 Backup=2
これで終わり。FreeBSD 9.2-RELEASE 以降であれば、fdisk を使うより幾分手軽にできる。
KNOPPIX を DVD-R に焼いて起動し、gparted を実行。 (詳しい手順は省略)
更新日 : 2014年12月20日 (13260)
CORY's twilight zone > 98備忘録 (tips)[an error occurred while processing this directive] > SDXCメモリカードをFAT32でフォーマットする