05 November 2006

大容量HDDのFAT32でのフォーマット(Linux)

たまたまこのホームページを見た人のために、一応書いておきます。

Linuxで32GBytes以上のFAT32パーティションを作成する方法 (/dev/sdb で認識されていると仮定)

fdiskでパーティションを確保する


% fdisk /dev/sdb

新しいディスクに一つだけパーティションを確保するときは、「/dev/sdb1 = 基本区画」 として確保するか、「/dev/sdb/1 = 拡張区画、/dev/sdb5 = 論理区画」 として確保するかのどちらか

領域をフォーマットする


% mkfs.vfat -v -c -F 32 /dev/sdb1

-c スイッチは、不良ブロックをチェックするというヤツなので付けた方が良い。
-v スイッチは、詳細表示。不良ブロックのチェックがどのあたりにあるのか見える。これをつけないと、まるでパソコンが暴走しているのかと思ってしまう。(何百ギガのハードディスクでは何十分もかかるため)

コンソールでの表示など、詳しくは追記の方で。

Windows 2000/XP/Vistaでは、32GBytes (FAT32にちなんで 32Gigaを限界値にしたのか、26ビットに何らかの意味合いを感じたのか… 2^26*512=32Giga) までのパーティションしか確保できない。

でも、それ以上の容量であっても理論上の限界の8テラバイトまでは Windows 2000/XP/Vistaは認識するらしい。(Windows NT, 95OSR2 では認識できない)
http://support.microsoft.com/kb/314463/ja

何らかの制限があっても、警告メッセージを出してフォーマットくらいさせてくれてもいいじゃないか… 嫌がらせでしょうか。

NTFS 対 FAT: どちらを選ぶか (Microsoftのコラム)
http://www.microsoft.com/japan/windowsxp/expertzone/columns/russel/october01.mspx

Linuxでの実際の作業手順

USB接続のハードディスクの接続点のチェック

[root@localhost ~]# dmesg
Linux version 2.6.17-1.2187_FC5 (brewbuilder@hs20-bc2-2.build.redhat.com)
(gcc version 4.1.1 20060525 (Red Hat 4.1.1-1)) #1 Mon Sep 11 01:17:06 EDT 2006
BIOS-provided physical RAM map:
BIOS-e820: 0000000000000000 - 000000000009f800 (usable)

… 中略 …

scsi1 : SCSI emulation for USB Mass Storage devices
usb-storage: device found at 4
usb-storage: waiting for device to settle before scanning

… 中略 …

SCSI device sdb: 398297088 512-byte hdwr sectors (203928 MB)
sdb: test WP failed, assume Write Enabled
sdb: assuming drive cache: write through
sdb:

… 中略 …

[root@localhost ~]# cat /proc/bus/usb/devices

… 中略 …

T: Bus=05 Lev=01 Prnt=01 Port=07 Cnt=02 Dev#= 4 Spd=480 MxCh= 0
D: Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs= 1
P: Vendor=05e3 ProdID=0702 Rev= 0.33
S: Product=USB TO IDE
C:* #Ifs= 1 Cfg#= 1 Atr=c0 MxPwr= 96mA
I: If#= 0 Alt= 0 #EPs= 2 Cls=08(stor.) Sub=06 Prot=50 Driver=usb-storage
E: Ad=81(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E: Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=125us

… 中略 …

[root@localhost ~]# cat /proc/scsi/scsi
Attached devices:
Host: scsi0 Channel: 00 Id: 00 Lun: 00
Vendor: ATA Model: ST3250823AS Rev: 3.03
Type: Direct-Access ANSI SCSI revision: 05
Host: scsi1 Channel: 00 Id: 00 Lun: 00
Vendor: Maxtor 6 Model: L200P0 Rev: 0811
Type: Direct-Access ANSI SCSI revision: 02

USBハードディスクが /dev/sdb に接続されていることが分かったので、パーティションの確保とFAT32でのフォーマットを行う。(クラスタのエラーをチェックするため、-c スイッチを付けている。-c を付けなければ、1分程度で終わる)

パーティションの確保とフォーマット

[root@localhost ~]# fdisk /dev/sdb

The number of cylinders for this disk is set to 24792.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
(e.g., DOS FDISK, OS/2 FDISK)

Command (m for help): p

Disk /dev/sdb: 203.9 GB, 203928109056 bytes
255 heads, 63 sectors/track, 24792 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System

Command (m for help): n
Command action
e extended
p primary partition (1-4)
e
Partition number (1-4): 1
First cylinder (1-24792, default 1):2
Last cylinder or +size or +sizeM or +sizeK (2-24792, default 24792):
Using default value 24792

Command (m for help): n
Command action
l logical (5 or over)
p primary partition (1-4)
l
First cylinder (2-24792, default 2):
Using default value 2
Last cylinder or +size or +sizeM or +sizeK (1-24792, default 24792):
Using default value 24792

Command (m for help): p

Disk /dev/sdb: 203.9 GB, 203928109056 bytes
255 heads, 63 sectors/track, 24792 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System
/dev/sdb1 2 24792 199133707+ 5 Extended
/dev/sdb5 2 24792 199133676 83 Linux


Command (m for help): t
Partition number (1-5):5
Hex code (type L to list codes): b
Changed system type of partition 5 to b (W95 FAT32)

Command (m for help): t
Partition number (1-5): 1
Hex code (type L to list codes): f
Changed system type of partition 1 to f (W95 Ext'd (LBA))

Command (m for help): p

Disk /dev/sdb: 203.9 GB, 203928109056 bytes
255 heads, 63 sectors/track, 24792 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System
/dev/sdb1 2 24792 199133707+ f W95 Ext'd (LBA)
/dev/sdb5 2 24792 199133676 b W95 FAT32

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

[root@localhost ~]# mkfs.vfat -v -c -F 32 /dev/sdb5
mkfs.vfat 2.11 (12 Mar 2005)
/dev/sdb5 has 255 heads and 63 sectors per track,
logical sector size is 512,
using 0xf8 media descriptor, with 398267352 sectors;
file system has 2 32-bit FATs and 32 sectors per cluster.
FAT size is 97186 sectors, and provides 12439779 clusters.
Volume ID is 454d8c63, no volume label.
Searching for bad blocks 134688... 268032... 401280... 534080...

… 中略 …

198624032... 198752224... 198880480... 199008032...
[root@localhost ~]#

シリンダ2から領域を確保しているのは、DOS/Windowsの慣例的なおまじない。(1から確保すると、環境によってエラーになる場合がある)

200ギガバイトのUSBハードディスクのフォーマット(ファイルシステムの作成)には、2時間以上かかった。

(参考) よく使うパーティション・タイプのコード一覧


0x01 FAT12
0x04 FAT16 (10MBytes < パーティションサイズ ≦ 32MBytes)
0x06 FAT16B (32MBytes < パーティションサイズ かつ
パーティションENDのシリンダ数 ≦1024)
0x0e FAT16LBA
0x0b FAT32 (パーティションENDのシリンダ数 ≦1024)
0x0c FAT32LBA

0x07 NTFS
0x83 Linux ext2/ext3
0x82 Linux Swap

0x05 拡張区画 (パーティションENDのシリンダ数 ≦1024)
0x0f 拡張区画LBA

参考:マイクロソフト MS-DOSのパーティションの概要

エラー

新しいハードディスクを購入して接続したところ、次のような表示でまったく認識しなかった。
USB-IDE アダプタ2種類、Fedora Core 5, Fedora Core 6, Vine 3.2, Knoppix 5の全てで試したが、全部ダメ。
”未フォーマット”がネックになっている可能性もあり、Windows XP でNTFSフォーマットしてから接続してもダメ。


[root@localhost ~]# dmesg
Linux version 2.6.18-1.2869.fc6 (brewbuilder@hs20-bc1-7.build.redhat.com) (gcc version 4.1.1 20061011 (Red Hat 4.1.1-30)) #1 SMP Wed Dec 20 14:51:46 EST 2006

 … 中略 …

[drm] Initialized i915 1.5.0 20060119 on minor 0
usb 3-2: new high speed USB device using ehci_hcd and address 2
usb 3-2: configuration #1 chosen from 1 choice
SCSI subsystem initialized
Initializing USB Mass Storage driver...
scsi0 : SCSI emulation for USB Mass Storage devices
usbcore: registered new driver usb-storage
USB Mass Storage support registered.
usb-storage: device found at 2
usb-storage: waiting for device to settle before scanning
usb 3-2: USB disconnect, address 2
scsi 0:0:0:0: scsi: Device offlined - not ready after error recovery

usb-storage: device scan complete

[root@localhost ~]# lsusb

Bus 001 Device 001: ID 0000:0000
Bus 001 Device 003: ID 1267:0103 Logic3 / SpectraVideo plc
Bus 002 Device 001: ID 0000:0000
Bus 004 Device 001: ID 0000:0000
Bus 005 Device 004: ID 1267:0212 Logic3 / SpectraVideo plc
Bus 005 Device 002: ID 05e3:0606 Genesys Logic, Inc.
Bus 005 Device 001: ID 0000:0000
Bus 003 Device 001: ID 0000:0000

USB-IDEアダプタを同一条件で、ハードディスクを違う物に取り替えると認識する。


[root@localhost ~]# dmesg

 … 中略 …

usb 5-7: new high speed USB device using ehci_hcd and address 7
usb 5-7: configuration #1 chosen from 1 choice
scsi2 : SCSI emulation for USB Mass Storage devices
usb-storage: device found at 7
usb-storage: waiting for device to settle before scanning
Vendor: Maxtor 6 Model: L200P0 Rev: 0811
Type: Direct-Access ANSI SCSI revision: 00
SCSI device sdb: 398297088 512-byte hdwr sectors (203928 MB)
sdb: test WP failed, assume Write Enabled
sdb: assuming drive cache: write through
SCSI device sdb: 398297088 512-byte hdwr sectors (203928 MB)
sdb: test WP failed, assume Write Enabled
sdb: assuming drive cache: write through
sdb: sdb1 < sdb5 >
sd 2:0:0:0: Attached scsi disk sdb
sd 2:0:0:0: Attached scsi generic sg1 type 0

usb-storage: device scan complete

[root@localhost ~]# lsusb

Bus 001 Device 001: ID 0000:0000
Bus 001 Device 003: ID 1267:0103 Logic3 / SpectraVideo plc
Bus 002 Device 001: ID 0000:0000
Bus 004 Device 001: ID 0000:0000
Bus 005 Device 007: ID 05e3:0702 Genesys Logic, Inc. USB 2.0 IDE Adapter
Bus 005 Device 004: ID 1267:0212 Logic3 / SpectraVideo plc
Bus 005 Device 002: ID 05e3:0606 Genesys Logic, Inc.
Bus 005 Device 001: ID 0000:0000
Bus 003 Device 001: ID 0000:0000

ハードディスクの故障だろうか、相性だろうか…
USB経由でなく、直接IDEポートに接続して認識するか試してみる。


knoppix@ttyp0[knoppix]$ dmesg
Linux version 2.6.17 (root@Knoppix) (gcc version 4.0.4 20060507 (prerelease) (Debian 4.0.3-3)) #4 SMP PREEMPT Wed May 10 13:53:45 CEST 2006

… 中略 …

Probing IDE interface ide0...
hda: Hitachi HDT725025VLAT80, ATA DISK drive
ide0 at 0x1f0-0x1f7,0x3f6 on irq 14

Probing IDE interface ide1...
hdc: AOPEN DVD RW ISU8484G, ATAPI CD/DVD-ROM drive
ide1 at 0x170-0x177,0x376 on irq 15
hda: max request size: 512KiB
hda: 488397168 sectors (250059 MB) w/7372KiB Cache, CHS=30401/255/63
hda: cache flushes supported
hda: hda1

hdc: ATAPI 24X DVD-ROM DVD-R CD-R/RW drive, 2048kB Cache
Uniform CD-ROM driver Revision: 3.20
libata version 1.20 loaded.

… 中略 …

e100: eth1: e100_watchdog: link up, 100Mbps, full-duplex
eth1: no IPv6 routers present

knoppix@ttyp0[knoppix]$ su

root@ttyp0[knoppix]# fdisk /dev/hda

このディスクのシリンダ数は 30401 に設定されています。
間違いではないのですが、1024 を超えているため、以下の場合
に問題を生じうる事を確認しましょう:
1) ブート時に実行するソフトウェア (例. バージョンが古い LILO)
2) 別の OS のブートやパーティション作成ソフト
(例. DOS FDISK, OS/2 FDISK)

コマンド (m でヘルプ): p

Disk /dev/hda: 250.0 GB, 250059350016 bytes
255 heads, 63 sectors/track, 30401 cylinders
Units = シリンダ数 of 16065 * 512 = 8225280 bytes

デバイス Boot Start End Blocks Id System
/dev/hda1 1 30401 244196001 7 HPFS/NTFS

WindowsXPでフォーマット済みのため
NTFSと表示される


コマンド (m でヘルプ):

Linux の scsi ドライバ付近に大容量ディスクに対する相性問題がありそう…?。
200GBytesが認識して、250GBytesがエラー。

IDE 直挿しで、fdisk で領域再確保・ mkfs.vfat でフォーマットを行ったら、IDE-USBアダプタを介して認識するようになった。
なんとも難しい問題です…

正しく認識された時の状態


[root@localhost ~]# dmesg
Linux version 2.6.18-1.2869.fc6 (brewbuilder@hs20-bc1-7.build.redhat.com) (gcc version 4.1.1 20061011 (Red Hat 4.1.1-30)) #1 SMP Wed Dec 20 14:51:46 EST 2006
BIOS-provided physical RAM map:

… 中略 …

[drm] Initialized i915 1.5.0 20060119 on minor 0
usb 3-2: new high speed USB device using ehci_hcd and address 2
usb 3-2: configuration #1 chosen from 1 choice
SCSI subsystem initialized
Initializing USB Mass Storage driver...
scsi0 : SCSI emulation for USB Mass Storage devices
usb-storage: device found at 2
usb-storage: waiting for device to settle before scanning
usbcore: registered new driver usb-storage
USB Mass Storage support registered.
Vendor: Hitachi Model: HDT725025VLAT80 Rev: 0811
Type: Direct-Access ANSI SCSI revision: 00
usb-storage: device scan complete
scsi 0:0:0:0: Attached scsi generic sg0 type 0
SCSI device sda: 488397168 512-byte hdwr sectors (250059 MB)
sda: test WP failed, assume Write Enabled
sda: assuming drive cache: write through
SCSI device sda: 488397168 512-byte hdwr sectors (250059 MB)
sda: test WP failed, assume Write Enabled
sda: assuming drive cache: write through
sda: sda1
sd 0:0:0:0: Attached scsi disk sda


[root@localhost ~]# lsusb
Bus 003 Device 002: ID 05e3:0702 Genesys Logic, Inc. USB 2.0 IDE Adapter
Bus 003 Device 001: ID 0000:0000
Bus 001 Device 001: ID 0000:0000
Bus 002 Device 001: ID 0000:0000

[root@localhost ~]# fdisk /dev/sda

The number of cylinders for this disk is set to 30401.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
(e.g., DOS FDISK, OS/2 FDISK)

Command (m for help): p

Disk /dev/sda: 250.0 GB, 250059350016 bytes
255 heads, 63 sectors/track, 30401 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System
/dev/sda1 1 30401 244196001 b W95 FAT32

Command (m for help):

フォーマットにかかる時間
IDE(SATA)-USB アダプタを介して、フォーマット(全セクタでの不良セクタのチェック付き)を行ったところ、一向に進まない。 チェックしているブロックの経過表示から逆算すると、5~10時間くらいかかりそうな勢い…


% mkfs.vfat -v -c -F 32 /dev/sdb1

M/BのSATAポートに直付けして、Knoppixを起動してフォーマットしました。

HDD : ST3320620AS (Seagate 320GB SATA)
M/B : AOpen i915GMm-HFS
パーティション : 2個(160GBずつ)
フォーマットにかかった時間 : 約47分

このときのアクセス速度 160*1024/47*60 = 58 MBytes/sec
(メーカーの規格表の最大転送速度 : 100 MBytes/sec)


■ USB接続でのフォーマットにかかる時間 (2011年1月追記)

データを最新版にアップデートしておく。

Ubuntu 10.04でUSB接続 500GBytesハードディスクをNTFSでフォーマット。ディスクを2つのパーティションに区切ってフォーマットしたときの時間は…
(スクリプトファイルで時刻を記録しながら自動実行してみた)


# fdisk /dev/sdb

コマンド (m でヘルプ): p

ディスク /dev/sdb: 500.1 GB, 500107862016 バイト
ヘッド 255, セクタ 63, シリンダ 60801
Units = シリンダ数 of 16065 * 512 = 8225280 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O size (minimum/optimal): 512 bytes / 512 bytes
ディスク識別子: 0xa5b0651a

デバイス ブート 始点 終点 ブロック Id システム
/dev/sdb1 1 30400 244187968+ 7 HPFS/NTFS
/dev/sdb2 30401 60800 244188000 7 HPFS/NTFS

# date
2011年 1月 14日 金曜日 23:10:43 JST

# mkfs.ntfs -L USB500G_1 -v /dev/sdb1

Cluster size has been automatically set to 4096 bytes.
Initializing device with zeroes: 100% - Done.
Creating NTFS volume structures.
Creating root directory (mft record 5)
Creating $MFT (mft record 0)
Creating $MFTMirr (mft record 1)
Creating $LogFile (mft record 2)
Creating $AttrDef (mft record 4)
Creating $Bitmap (mft record 6)
Creating $Boot (mft record 7)
Creating backup boot sector.
Creating $Volume (mft record 3)
Creating $BadClus (mft record 8)
Creating $Secure (mft record 9)
Creating $UpCase (mft record 0xa)
Creating $Extend (mft record 11)
Creating system file (mft record 0xc)
Creating system file (mft record 0xd)
Creating system file (mft record 0xe)
Creating system file (mft record 0xf)
Creating $Quota (mft record 24)
Creating $ObjId (mft record 25)
Creating $Reparse (mft record 26)
Syncing root directory index record.
Syncing $Bitmap.
Syncing $MFT.
Updating $MFTMirr.
Syncing device.
mkntfs completed successfully. Have a nice day.

# date
2011年 1月 15日 土曜日 01:41:24 JST

# mkfs.ntfs -L USB500G_2 -v /dev/sdb2

〜 中略( /dev/sdb1 とほぼ同じため)

# date
2011年 1月 15日 土曜日 04:13:19 JST

244187968 kBytes のフォーマット時間 → 2時間30分41秒(9041秒)
244188000 kBytes のフォーマット時間 → 2時間31分55秒(9115秒)

それぞれ、26.4 MBytes/sec, 26.2 MBytes/sec (210 MBits/sec)

USB2.0の規格上の転送速度は480MBits/secなので、フォーマットの実行転送速度は43%だが、USB接続ディスクのベンチマークの結果

hts545025b9a300-bench.jpg

では、300MBits/sec 程度なので、フォーマットの実行速度は通常のディスクアクセス速度に比べて 70% 程度ということになるだろうか。