CORY's twilight zone > 98備忘録 (tips)[an error occurred while processing this directive] > SDXCメモリカードをFAT32でフォーマットする

SDXCメモリカードをFAT32でフォーマットする

SDXCメモリカードの論理フォーマットをFAT32に変更して、多種OS間でのデータ交換用に使うためのメモ書き。

目次

はじめに―なぜFAT32を使うのか 主な OS の exFAT への対応状況 SDXCメモリカードをFAT32でフォーマットする

はじめに―なぜ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バイト/セクタの場合)対応している。

▲目次に戻る▲

主な OS の exFAT への対応状況

Windows

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, iOS

Mac OS X 10.6.6 以降で対応。

iPhone, iPad, iPod touch は iOS 7 以降で対応。

FreeBSD, Linux

FreeBSD は exFAT には対応していない(fusefs を入れて対応する場合があるが、試した範囲では動作が不安定なのでお勧めしない)

Linux 向けの実装は Sumsung より GPL で提供されているが、上記ライセンスの問題もあり、対応を控えている distribution が多いと思われる。

Android

(26KB)
▲FAT32で論理フォーマットした 
64GB SDXCメモリカードを 
Android 2.2 で認識させた 
(NEC LifeTouch NOTE) 

Android は Linux の一種だが、機器メーカーが Microsoft とライセンス契約を結んで個別に実装している場合がある。

機器メーカーが公式に SDXCメモリカードへの対応を謳っている場合は exFAT に対応している。それ以外の機器では対応していないと考える方が良い。とりわけ Android 4.0 までの機器では exFAT を誤認識しデータを壊してしまうので、重要なデータが入っているSDXCメモリカードを Android 機器に接続するのは避けたい。

一方、FAT32 でフォーマット済みの SDXCメモリカードについては、(よほど古い物を除き)OSを問わず幅広く使うことができる。1ファイルあたりの最大サイズが4GBまでに制限されることが問題にならない用途であれば、後述の手順で FAT32 フォーマットに変換することで、32GBを超えるメモリカードを使うことができる場合が多い。

その他の機器

カメラなどの機器で使う場合は、SDXC メモリカードを FAT32 でフォーマットし直した物は、SDメモリカードの規格外となり誤動作の可能性があるので、推奨されない。

関連情報

▲目次に戻る▲

SDXCメモリカードをFAT32でフォーマットする

Windows

Windows OS に含まれているフォーマッタでは、SDXCメモリカードを exFAT(またはNTFS)以外でフォーマットすることはできない。

Windows XP までは(また以前の Windows 7 でも)、3rd party 製のフォーマッタを使うことでSDXCメモリカードをFAT32にできたが、いつの間にか 3rd party 製のフォーマッタも誤動作するようにOSが変更されたようで、現在は Windows 7 以降で SDXCメモリカードをFAT32フォーマットに変換することは難しくなっている。

もし手元に Windows しか無い場合は、FreeBSDKNOPPIX など他のOSを Live CD などで動作させて作業するのが確実だろう。

なお、上記変更が施された Windows 7 でも、他のOSでフォーマットされた FAT32 メディアの読み書きは支障なく出来ている。

Android 機器を使う

exFAT に対応していない Android 機器でフォーマットを行うと FAT32 になるので、特定の機器で使うことを想定しているメモリカードの場合は、最初にこの方法で試してみると良い。(ただし機器により正常終了しない場合がある。)

なお、この方法でフォーマットに失敗した場合、一般にはパソコンやSDXC対応機器で再フォーマットすることで修復できる(データは消去される)

▲目次に戻る▲

FreeBSD fdisk

まずは伝統的な 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) に設定している。

▲目次に戻る▲

FreeBSD gpart

続いて 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 (gparted)

KNOPPIX を DVD-R に焼いて起動し、gparted を実行。 (詳しい手順は省略)

▲目次に戻る▲

改版履歴

2014.12.20
初版

更新日 : 2014年12月20日 (12743)

CORY's twilight zone > 98備忘録 (tips)[an error occurred while processing this directive] > SDXCメモリカードをFAT32でフォーマットする


« 短絡線 »
[ CORY's twilight zone | PC-98, FreeBSD(98), Mac OS X, Android | 鉄道・街 | 自然 | flickr | twitter (log) | YouTube | Contact ]

Copyright © 1996-2024 CORY / Kimagurenote. Some rights reserved:
Creative Commons Attribution-Noncommercial-Share alike 2.1 Japan.