アドバンスドフォーマット
ハードディスクドライブ (HDD) における最小の物理記憶単位はセクタです。ソリッドステートドライブ (SSD) ではページがこれと等価です。[1] ストレージデバイスのファームウェアは物理セクタを、ソフトウェアが操作できる論理セクタに抽象化します。論理セクタのサイズは、ディスク上のアドレッシング可能な最小単位のサイズとなります。
- 物理セクタサイズ
- これは、物理ストレージデバイスがアトミックに書き込めるとする最小単位です。HDD の場合、これはプラッタにおけるセクタの実際のサイズです。従来、HDD の物理セクタサイズは 512 バイトでした。つまり、各セクタは 512 バイトのデータを格納できることを意味します。しかし、Advanced Format HDD の登場により、物理セクタサイズは 4096 バイト (4 KiB) に増え、誤り訂正機能が向上しました。SSD は NAND フラッシュメモリの実際のページサイズ (典型的には 4 KiB から 16 KiB ) を公開せず、報告される物理セクタサイズは論理セクタサイズと同じです。NVMe SSD の場合は、利用可能であれば、Atomic Write Unit Power Fail (AWUPF) パラメータの値が使用されます。
- 論理セクタサイズ
- 論理セクタサイズ (別名、オペレーティングシステムセクタサイズ) は、オペレーティングシステムとアプリケーションに公開されるセクタサイズを表します。ソフトウェアのレベルでストレージデバイスに読み書きする際に用いられるセクタサイズです。論理セクタサイズは物理セクタサイズと異なる可能性があります。例えば、物理セクタサイズが 4096 バイトの Advanced Format HDD は、古いシステムとアプリケーションとの互換性のために、依然として 512 バイトの論理セクタサイズを使用する場合があります。
異なる "レイヤー" (つまり、デバイス、スタックブロックデバイス、ファイルシステム) は、同じセクタサイズを使用するべきです。そうしないと、ファームウェアの変換レイヤーからのマッピングプロセス (通常は透過的ですが) で回避可能なオーバーヘッドが発生します。
現在の物理セクタサイズと論理セクタサイズは lsblk で見られます:
$ lsblk -td
NAME ALIGNMENT MIN-IO OPT-IO PHY-SEC LOG-SEC ROTA SCHED RQ-SIZE RA WSAME sda 0 4096 0 4096 4096 1 mq-deadline 64 128 0B nvme1n1 0 4096 0 4096 4096 0 none 1023 128 0B nvme0n1 0 4096 0 4096 4096 0 none 1023 128 0B
PHY-SEC
は物理セクタサイズを、LOG-SEC
は論理セクタサイズを指します。
あるいは、以下の sysfs エントリから特定のドライブのセクタサイズを読み取ることができます:
$ cat /sys/class/block/drive/queue/physical_block_size $ cat /sys/class/block/drive/queue/logical_block_size
セクタサイズは、fdisk、smartctl、そして hdparm の出力からも得られます。
目次
ハードディスクドライブ – Advanced Format
Advanced Format とは、ハードディスクドライブ内の磁気ディスク上でデータを格納する際に、従来の512バイトセクタではなく4キロバイトセクタを使用するディスクセクターフォーマットの総称です。4096バイトセクタの背景には各トラックのビット密度を上げるという狙いがあります。データセクタの間には Sync/DAM と ECC (Error Correction Code) 情報が挟まっているので、その間隙の数を減らすのです。古いフォーマットでのフォーマット効率は 88.7% であったのに対し、Advanced Format では 97.3% のフォーマット効率を達成できます。
Advanced Format ドライブには2つの種類が存在します:
- オレンジの "AF" ロゴが付いている Advanced Format ドライブ: 内部的には 4k セクタを使用しますが、4k セクタのサポートがないオペレーティングシステムとの互換性のためにエミュレーションレイヤーを提供します。
- 青い "4Kn" ロゴが付いている Advanced Format 4k ネイティブドライブ: オペレーティングシステム (Windows 8 以降、Linux 2.6.31 以降) からのサポートを必要とします。このドライブには変換レイヤーが必要ないため、より安くなっています。しかし、古いツールと互換性がないかもしれません。
サポートされているセクタサイズを調べる
ハードディスク /dev/sdX
の物理・論理セクタサイズは以下の sysfs エントリで確認することができます:
$ cat /sys/class/block/sdX/queue/physical_block_size $ cat /sys/class/block/sdX/queue/logical_block_size
変換レイヤーのあるドライブ (上記を見てください) の場合は通常、論理ブロックサイズ 512 (後方互換性のため) と物理ブロックサイズ 4096 (そのドライブが Advanced Format ドライブであることを示す) が報告されます。
以下のツールは (ドライブが正しい値を報告しているのを前提として) ドライブの物理セクタを報告します:
- fdisk:
# LC_ALL=C fdisk -l /dev/sdX | grep 'Sector size'
- smartmontools:
# smartctl -a /dev/sdX | grep 'Sector Size'
- hdparm:
# hdparm -I /dev/sdX | grep 'Sector size:'
USB 接続のディスクでも上記のツールは使えます (USB ブリッジが SAT、別名 SCSI/ATA Translation または ANSI INCITS 431-2007 に対応している場合)。
ソリッドステートドライブ
ほとんどのソリッドステートドライブ (SSD) は、セクタサイズを 512 バイトと報告します。しかし、SSD はより大きなセクタ (典型的には 4 KiB、8 KiB、さらに大きいこともあります) を使用します。その結果として、ファイルシステムはネイティブなセクタサイズに自動的に最適化できません。パフォーマンスを最適化するには:
NVMe ドライブのサポートされているセクタサイズを調べる
smartmontools を使って、サポートされているセクタサイズを確認してください:
# smartctl -a device
... Supported LBA Sizes (NSID 0x1) Id Fmt Data Metadt Rel_Perf 0 + 512 0 2 1 - 4096 0 1 ...
ネイティブなセクタサイズを設定する
自動検出されたセクタサイズを手動でオーバーライドする代わりに、一部の SSD ではフォーマット時にセクタサイズを変更でき、真のセクタサイズに近い値を報告させることができます。
NVMe
NVMe デバイスがこれをサポートしているかどうか調べるには、Identify Namespace コマンドを使ってください。
# nvme id-ns -H /dev/nvme0n1 | grep "Relative Performance"
LBA Format 0 : Metadata Size: 0 bytes - Data Size: 512 bytes - Relative Performance: 0x2 Good (in use) LBA Format 1 : Metadata Size: 0 bytes - Data Size: 4096 bytes - Relative Performance: 0x1 Better
Metadata Size
は (おそらく) セクタ毎の追加メタデータのバイト数です。これは Linux ではあまり良くサポートされていないため、0 の値をここに持つフォーマットを選択するのが最良です。Relative Performance
は、どのフォーマットが最高のパフォーマンスを提供するかを表します。
セクタサイズを変更するには、nvme format
を使い、--lbaf
パラメータで好ましい値を指定してください:
# nvme format --lbaf=1 /dev/nvme0n1
You are about to format nvme0n1, namespace 0x1. WARNING: Format may irrevocably delete this device's data. You have 10 seconds to press Ctrl-C to cancel this operation. Use the force [--force] option to suppress this warning. Sending format operation ... Success formatting namespace:1
この処理には数秒しかかからないはずです。
nvme format
が失敗する場合、マシンを (例えば systemctl suspend
などで) スリープ状態にして、復帰させたあとにもう一度 nvme format
を実行してみてください。nvme format
が依然として失敗する場合、BIOS の設定をいじると解決するかもしれません。
SATA
SATA デバイスの場合、メーカー固有のプログラムを使用する必要があります。すべての SATA デバイスがセクタサイズを変更できるわけではありません。
Intel
Intel の場合、-set PhysicalSectorSize=4096
オプションと共に Intel Memory and Storage (MAS) Tool (intel-mas-cli-toolAUR) を使ってください。
Seagate
Seagate の場合、seagate-seachestAUR を使ってください。
すべてのドライブをスキャンし、適切なものを探してください。そして、見つけたドライブの情報を表示してください:
# SeaChest_Basics --scan # SeaChest_Basics -d /dev/sgX -i
ドライブの情報が出力されるはずです。シリアル番号を確認してください。
そのドライブによってサポートされている論理ブロックサイズを確認してください:
# SeaChest_Format -d /dev/sgX --showSupportedFormats
4096 が一覧に載っている場合、論理セクタサイズを 4096 バイトに変更できます:
# SeaChest_Format -d /dev/sgX --setSectorSize=4096 --confirm this-will-erase-data
このコマンドは完了するまで2分かかります。その後、ドライブは 4K ネイティブセクタサイズを使用するようになります。
パーティションのアライメント
パーティションを正しくアライメントすることで、読み込み・変更・書き込みの過剰なサイクルを回避できます。家庭用のコンピュータでは、各パーティションの開始位置とサイズを 1 MiB (1 048 576 バイト) 境界にアライメントするのが一般的です。これは、一般的に使用されているすべてのサイズ (1 MiB、512 KiB、128 KiB、4 KiB、512 B) で割り切ることができるので、一般的なページサイズとブロックサイズのシナリオすべてをカバーします。
- fdisk、cfdisk、sfdisk はアライメントを自動的に管理します。
- gdisk と cgdisk はアライメントを自動的に管理します。
- sgdisk はデフォルトで、パーティションの開始位置のみをアライメントします。パーティションのサイズや終了位置のアライメントも有効化するには、
-I
/--align-end
オプションを使ってください。
- sgdisk はデフォルトで、パーティションの開始位置のみをアライメントします。パーティションのサイズや終了位置のアライメントも有効化するには、
- Parted はパーティションの開始位置のみをアライメントし、サイズと終了位置はアライメントしません。パーティションを作成するときは、パーティションの終了位置をメビバイトかより大きな IEC 2進接頭辞で指定するようにしてください。
dm-crypt
Cryptsetup 2.4.0 では、luksFormat
は自動的に LUKS2 フォーマットに最適な暗号化セクタサイズを検出します [3]。
しかし、これが機能するには、デバイスが正しいデフォルトセクタサイズを報告する必要があります。#セクタサイズを変更する を見てください。
cryptsetup luksFormat
を使用したあとに、LUKS2 ボリュームによって使用されているセクタサイズを確認できます:
# cryptsetup luksDump device | grep sector
デフォルトのセクタサイズが正しくない場合、4K のセクタサイズをそれ以外のデフォルトのオプションで LUKS2 コンテナを強制的に作成することができます:
# cryptsetup luksFormat --sector-size=4096 device
このコマンドは、要求されたサイズがデバイスと一致しない場合、エラーでアボートします:
# cryptsetup luksFormat --sector-size 4096 device (...) Verify passphrase: Device size is not aligned to requested sector size.
デバイスを間違ったセクタサイズで暗号化してしまった場合、以下のコマンドでそのデバイスを再暗号化できます:
# cryptsetup reencrypt --sector-size=4096 device
ファイルシステム
mkfs.btrfs(8)、mkfs.jfs(8)、mkfs.nilfs2(8)、mkfs.reiserfs(8)、mkswap(8) は、デフォルトで 4096 バイトのセクタサイズを使用します。
mkfs.ext4(8) はデフォルトで、512 MiB より小さいファイルシステムに対しては 1024 バイトのセクタを、512 MiB 以上のファイルシステムに対しては 4096 バイトのセクタを使用します。
mkfs.xfs(8) はデフォルトで 512 バイトのセクタを使用しますが、512e と 4Kn のディスクに対しては 4096 バイトを使用します。
mkfs.f2fs(8)、mkfs.fat(8)、mkfs.ntfs(8)、mkfs.udf(8) は、バッキングデバイスの論理セクタサイズを使用します。つまり、これらは、512e ディスクに対しては 512 バイトのセクタを、4Kn ディスクに対しては 4096 バイトのセクタを使用します。
(ZFS の) zpool-create(8) はデフォルトで 512 (2⁹) バイトのセクタを使います。Advanced Format ディスクをパラメータ -o ashift=12
(2¹²、4096 バイト) で使用する場合、プール作成時にセクタサイズを明示的に設定する必要があります。
ストレージデバイスが正しいセクタサイズを報告しない場合は、物理セクタサイズに応じてパーティションを明示的にフォーマットできます。
特に、ファームウェアによって管理されている シングル磁気記録方式 (Singled Magnetic Recording: SMR) ドライブは、物理セクタサイズが 4096 バイトの場合に 512 バイトの論理セクタサイズを使用すると、深刻な悪影響を受けます。これらのドライブは、パフォーマンスの異なる書き込み領域が存在し、アイドル時にはリマッピングの再割当てが発生しますが、高負荷なアクティブ書き込み (例: RAID resilvering、バックアップ、小さなファイルを大量に書き込む、rsync など) 時には、ファイルシステムのセクタサイズが異なる場合に書き込み速度が1桁の MB/s まで落ちる可能性があります。これは、高パフォーマンスな書き込み領域が枯渇し、単一の領域上でセクタの変換レイヤに高負荷がかかるからです。
以下は、4096 バイトのセクタを明示的に設定する例です:
- ext4:
# mkfs.ext4 -b 4096 /dev/device
- XFS:
# mkfs.xfs -s size=4096 /dev/device
- FAT:
# mkfs.fat -S 4096 /dev/device
- NTFS-3G:
# mkfs.ntfs -Q -s 4096 /dev/device
- UDF:
# mkfs.udf -b 4096 /dev/device
- ZFS:
# zpool create -o ashift=12 poolname raidz device0 … deviceN
参照
- Western Digital’s Advanced Format: The 4K Sector Transition Begins
- White paper entitled "Advanced Format Technology."
- HDD のアライメントに失敗すると、読み込み/書き込みのパフォーマンスが劣化します。具体的な例は [4] を見てください。