Advanced Format

提供: ArchWiki
2023年7月29日 (土) 15:58時点におけるAshMyzk (トーク | 投稿記録)による版 (同期)
ナビゲーションに移動 検索に移動

ハードディスクドライブ (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 で見られます:

この記事またはセクションの正確性には問題があります。
理由: 以下のどちらのコマンド (lsblkcat /sys/class...) も NVMe ドライブ (もしかすると全 SSD) の物理セクタサイズを正確に提供せず、代わりに論理セクタサイズを報告してしまいます。 (議論: トーク:Advanced Format#)
$ 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

セクタサイズは、fdisksmartctl、そして hdparm の出力からも得られます。

セクタサイズを変更する

警告: ドライブのセクタサイズを変更すると、ドライブ上の全データが不可逆的に削除されます。

一部の NVMe ドライブと "エンタープライズ" SATA ハードディスクドライブでは、それぞれ標準の NVMe コマンド (NVM Command Set Specification 1.0 及びそれ以降の Format NVM) か ATA コマンド (ATA Command Set - 4 及びそれ以降の SET SECTOR CONFIGURATION EXT) を使って、報告されるセクタサイズを変更することができます。ハードディスクドライブの場合、最適なパフォーマンスを得るために物理セクタサイズとマッチするように論理セクタサイズを変更します。一方、NVMe ソリッドステートドライブの場合、論理セクタサイズと物理セクタサイズの両方が変更されます。

大抵、SATA ソリッドステートドライブはセクタサイズの変更をサポートしていません。例外は、報告される物理セクタサイズを変更できるが、論理セクタサイズは変更できない特定の Intel SATA SSD です。[2] 報告される物理セクタサイズを変更するには #Intel に従ってください。

ドライブのセクタサイズの変更は、低レベルなフォーマットが必要になる複雑なプロセスです。代替案として、ドライブ上にファイルシステムを作成する際にセクタサイズを手動で指定して最適なパフォーマンスを得ることができます。#dm-crypt#ファイルシステム を見てください。

Advanced Format ハードディスクドライブ

hdparm ユーティリティを使うことで、Advanced Format ハードディスクドライブのセクタサイズを変更できるかどうか調べることができます:

# hdparm -I /dev/sdX | grep 'Sector size:'
ノート: USB で接続されたドライブの場合、USB ブリッジが SAT (SCSI/ATA Translation) (ANSI INCITS 431-2007) をサポートしている必要があります。

Sector Configuration Log に複数の論理セクタサイズが表示される Advanced Format ドライブ では、それらのリストが表示されます:

        Logical  Sector size:                   512 bytes [ Supported: 512 4096 ]
        Physical Sector size:                  4096 bytes

複数の変更可能な論理セクタサイズをサポートしていないハードディスクドライブでは、現在のセクタサイズだけが報告されます。例えば、Advanced Format 512e ドライブの場合:

        Logical  Sector size:                   512 bytes
        Physical Sector size:                  4096 bytes

これらの種類のドライブで最適なパフォーマンスを得るには、#dm-crypt セクタサイズまたは#ファイルシステムのブロックサイズが少なくとも 4096 バイトであり、かつ 4096 バイト境界にアライメントされている必要があります。

Advanced Format 4Kn ドライブの場合:

        Logical  Sector size:                  4096 bytes
        Physical Sector size:                  4096 bytes

4Kn ドライブでは、何も設定せずとも最適な設定になっており、パーティショニングやフォーマットの際に特別な考慮は必要ありません。そのまま使用することができます。

SATA HDD が複数の論理セクタサイズとオプションの ATA コマンド SET SECTOR CONFIGURATION EXT をサポートしている場合 (例えば、Seagate ドライブは FastFormat サポートを広告しています)、hdparm を使ってサポートされているセクタサイズから選択することができます。論理セクタサイズを 4096 バイト (つまり、4Kn) に設定するには、以下を実行してください:

# hdparm --set-sector-size 4096 --please-destroy-my-drive /dev/sdX

その後、hdparm は論理セクタサイズが 4096 バイトであると報告するはずです:

# hdparm -I /dev/sdX | grep 'Sector size:'
        Logical  Sector size:                  4096 bytes [ Supported: 512 4096 ]
        Physical Sector size:                  4096 bytes

NVMe ソリッドステートドライブ

ほとんどのソリッドステートドライブ (SSD) は、論理ブロックアドレスサイズが 512 バイトであると報告します。たとえ、それより大きなサイズ (典型的には 4 KiB、8 KiB、またはそれ以上) を物理的に使用していたとしてもです。

NVMe ドライブのフォーマットされた論理ブロックアドレスサイズ (FLBAS) を確認するには、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 はそのフォーマットのパフォーマンスを示します: goodbetterbest のどれかです。

smartctl も、サポートされている論理ブロックアドレスサイズを表示できますが、ユーザフレンドリーな説明は提供しません。例:

# smartctl -a /dev/nvme0n1
...
Supported LBA Sizes (NSID 0x1)
Id Fmt  Data  Metadt  Rel_Perf
 0 +     512       0         2
 1 -    4096       0         1
..

論理ブロックアドレスサイズを変更するには、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

この処理には数秒しかかからないはずです。

ノート: パーティショニングの際は以下の #パーティションのアライメント に従ってください。さもないと、パフォーマンス上の利点が水の泡になります。
この記事またはセクションの正確性には問題があります。
理由: 電源状態や BIOS の設定をいじる前に、ネイティブの nvme コマンドを使って操作ログを確認したり、nvme reset などを使ってコントローラをソフトリセットしたりすることをお勧めします。 (議論: トーク:Advanced Format#)

2020年より前のドライブは、POST の最後に "security freeze" を発行するシステムで使用する場合、Format NVM コマンドをブロックする可能性があります。[3][4] nvme format が失敗する場合、システムをサスペンドしてみて (S0ix ではなく S3 スリープを使用してください)、復帰後に nvme format をもう一度実行してみてください。[5][6]

メーカー固有のプログラムを使う

上記の汎用ユーティリティでセクタサイズを変更できない場合、ドライブのメーカーのユーティリティを使用すれば変更できる場合があります。

Intel

この記事またはセクションは情報が古くなっています。
理由: Intel の SSD 事業が SK Hynix に買収されて Solidigm ブランドになって以降、Intel MAS は SSD を管理するために使用できなくなりました (Optane 製品を除く)。Solidigm は、Intel MAS が提供していた機能を持つ solidigm-sst-storage-tool-cliAUR を提供しています。ソリッドステートドライブ/NVMe#Intel/Solidigm を参照してください。 (Discuss)

Intel の場合、-set PhysicalSectorSize=4096 オプションと共に Intel Memory and Storage (MAS) Tool (intel-mas-cli-toolAUR) を使ってください。

Seagate

Seagate の場合、openseachestAUR を使ってください。

すべてのドライブをスキャンし、適切なものを探してください。そして、見つけたドライブの情報を表示してください:

# openSeaChest_Basics --scan
# openSeaChest_Basics -d /dev/sdX -i

ドライブの情報が出力されるはずです。シリアル番号を確認してください。

そのドライブによってサポートされている論理ブロックサイズを確認してください:

# openSeaChest_Format -d /dev/sdX --showSupportedFormats

4096 が一覧に載っている場合、論理セクタサイズを 4096 バイトに変更できます:

# openSeaChest_Format -d /dev/sdX --setSectorSize=4096 --confirm this-will-erase-data

このコマンドは完了するまで2分かかります。その後、ドライブは 4K ネイティブセクタサイズを使用するようになります。

パーティションのアライメント

パーティションを正しくアライメントすることで、読み込み・変更・書き込みの過剰なサイクルを回避できます。家庭用のコンピュータでは、各パーティションの開始位置とサイズを 1 MiB (1 048 576 バイト) 境界にアライメントするのが一般的です。これは、一般的に使用されているすべてのサイズ (1 MiB、512 KiB、128 KiB、4 KiB、512 B) で割り切ることができるので、一般的なページサイズとブロックサイズのシナリオすべてをカバーします。

警告: パーティションのアライメントを誤ると、dm-crypt/LUKS で 4096 バイトセクタを使用できなくなります。[7] を見てください。
  • fdisk、cfdisk、sfdisk はアライメントを自動的に管理します。
  • gdisk と cgdisk はアライメントを自動的に管理します。
    • sgdisk はデフォルトで、パーティションの開始位置のみをアライメントします。パーティションのサイズや終了位置のアライメントも有効化するには、-I/--align-end オプションを使ってください。
  • Parted はパーティションの開始位置のみをアライメントし、サイズと終了位置はアライメントしません。パーティションを作成するときは、パーティションの終了位置をメビバイトかより大きな IEC 2進接頭辞で指定するようにしてください。

dm-crypt

Cryptsetup 2.4.0 では、luksFormat は自動的に LUKS2 フォーマットに最適な暗号化セクタサイズを検出します [8]

しかし、これが機能するには、デバイスが正しいデフォルトセクタサイズを報告する必要があります。#セクタサイズを変更する を見てください。

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.
ノート: 基礎にあるドライブが 4K 物理セクタを使用しているときにこのコマンドが失敗する可能性がある理由については、cryptsetup issue 585 を見てください。

デバイスを間違ったセクタサイズで暗号化してしまった場合、以下のコマンドでそのデバイスを再暗号化できます:

警告: 含まれているファイルシステムが、4096 バイトおよびその倍数のブロックサイズを持っていなければなりません。さもないと、ファイルシステムが破壊されます。
# 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 まで落ちる可能性があります。これは、高パフォーマンスな書き込み領域が枯渇し、単一の領域上でセクタの変換レイヤに高負荷がかかるからです。

ノート: x86_64 システムでは、Linux は 4 KiB より大きいブロックサイズのファイルシステムをマウントすることができません。詳細と現在の進捗状況については Large block sizes (LBS) を参照してください。

以下は、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 device0deviceN

参照

翻訳ステータス: このページは en:Advanced Format の翻訳バージョンです。最後の翻訳日は 2023-07-29 です。もし英語版に 変更 があれば、翻訳の同期を手伝うことができます。