「Advanced Format」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(同期)
63行目: 63行目:
 
[[NVMe]] デバイスがこれをサポートしているかどうか調べるには、''Identify Namespace'' コマンドを使ってください。
 
[[NVMe]] デバイスがこれをサポートしているかどうか調べるには、''Identify Namespace'' コマンドを使ってください。
   
{{hc|# nvme id-ns /dev/nvme0n1|
+
{{hc|# 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)
nlbaf : 0
 
  +
LBA Format 1 : Metadata Size: 0 bytes - Data Size: 4096 bytes - Relative Performance: 0x1 Better
[...]
 
lbaf 0 : ms:0 lbads:9 rp:0 (in use)
 
 
}}
 
}}
   
{{ic|nlbaf}} は、LBA フォーマットの数から 1 引いたものです。なので、この場合、フォーマットは1つだけがサポートされていること示しています。フォーマットのリストは出力の最後にあります。ここの {{ic|lbaf 0}} は、LBA フォーマット #0 を意味しています。9 という数値の {{ic|lbads}} (LBA データサイズ) は、セクタが 2<sup>9</sup> つまり 512 バイトであることを示しています。デバイスが 4 KiB セクタを利用できる場合、{{ic|lbads}} の値が 12 の別のエントリも表示されます。{{ic|rp}} (Relative Performance) 値は、どのフォーマットが最高のパフォーマンスを発揮できるかを示しています (ここでは、0 がベストであると示しています)。{{ic|ms}} は、(おそらく) セクタあたりの追加メタデータのバイト数であり、これは Linux であまり良くサポートされていないため、ここでは 0 の値を持つフォーマットを選択するのが最良です。
+
* {{ic|Metadata Size}} は (おそらく) セクタの追加メタデータのバイト数です。これは Linux であまり良くサポートされていないため、0 の値をここに持つフォーマットを選択するのが最良です。
  +
* {{ic|Relative Performance}} は、どのフォーマットが最高のパフォーマンスを提供するかを表します。
   
セクタサイズを変更するには、{{ic|nvme format}} を使い、{{ic|--lbaf}} パラメータで好ましい値を指定してください。{{ic|nvme format}} が失敗する場合、マシンを (例えば {{ic|systemctl suspend}} などで) スリープ状態にして、復帰させたあとにもう一度 {{ic|nvme format}} を実行してみてください。{{ic|nvme format}} が依然として失敗する場合、BIOS の設定をいじると解決するかもしれません。
+
セクタサイズを変更するには、{{ic|nvme format}} を使い、{{ic|--lbaf}} パラメータで好ましい値を指定してください:
  +
  +
{{hc|1=# nvme format --lbaf=1 /dev/nvme0n1|2=
  +
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
  +
}}
  +
  +
この処理には数秒しかかからないはずです。
  +
  +
{{Accuracy|電源状態や BIOS の設定をいじる前に、ネイティブの {{ic|nvme}} コマンドを使って操作ログを確認したり、{{ic|nvme reset}} ''など''を使ってコントローラをソフトリセットしたりすることをお勧めします。}}
  +
  +
{{ic|nvme format}} が失敗する場合、マシンを (例えば {{ic|systemctl suspend}} などで) スリープ状態にして、復帰させたあとにもう一度 {{ic|nvme format}} を実行してみてください。{{ic|nvme format}} が依然として失敗する場合、BIOS の設定をいじると解決するかもしれません。
   
 
==== SATA ====
 
==== SATA ====
78行目: 94行目:
   
 
===== Intel =====
 
===== Intel =====
  +
  +
{{Out of date|Intel の SSD 事業が SK Hynix に買収されて Solidigm ブランドになって以降、Intel MAS は SSD を管理するために使用できなくなりました (Optane 製品を除く)。Solidigm は、Intel MAS が提供していた機能を持つ {{AUR|solidigm-sst-storage-tool-cli}} を提供しています。[[ソリッドステートドライブ/NVMe#Intel/Solidigm]] を参照してください。}}
   
 
Intel の場合、{{ic|1=-set PhysicalSectorSize=4096}} オプションと共に [https://downloadcenter.intel.com/download/29337/Intel-Memory-and-Storage-Tool-CLI-Command-Line-Interface-?product=83425 Intel Memory and Storage (MAS) Tool] ({{AUR|intel-mas-cli-tool}}) を使ってください。
 
Intel の場合、{{ic|1=-set PhysicalSectorSize=4096}} オプションと共に [https://downloadcenter.intel.com/download/29337/Intel-Memory-and-Storage-Tool-CLI-Command-Line-Interface-?product=83425 Intel Memory and Storage (MAS) Tool] ({{AUR|intel-mas-cli-tool}}) を使ってください。
152行目: 170行目:
   
 
{{man|8|mkfs.f2fs}}、{{man|8|mkfs.fat}}、{{man|8|mkfs.ntfs}}、{{man|8|mkfs.udf}} は、バッキングデバイスの論理セクタサイズを使用します。つまり、これらは、512e ディスクに対しては 512 バイトのセクタを、4Kn ディスクに対しては 4096 バイトのセクタを使用します。
 
{{man|8|mkfs.f2fs}}、{{man|8|mkfs.fat}}、{{man|8|mkfs.ntfs}}、{{man|8|mkfs.udf}} は、バッキングデバイスの論理セクタサイズを使用します。つまり、これらは、512e ディスクに対しては 512 バイトのセクタを、4Kn ディスクに対しては 4096 バイトのセクタを使用します。
  +
  +
([[ZFS#Advanced Format ディスク|ZFS]] の) {{man|8|zpool-create|url=}} はデフォルトで 512 (2⁹) バイトのセクタを使います。Advanced Format ディスクをパラメータ {{ic|1=-o ashift=12}} (2¹²、4096 バイト) で使用する場合、プール作成時にセクタサイズを明示的に設定する必要があります。
   
 
ストレージデバイスが正しいセクタサイズを報告しない場合は、物理セクタサイズに応じてパーティションを明示的にフォーマットできます。
 
ストレージデバイスが正しいセクタサイズを報告しない場合は、物理セクタサイズに応じてパーティションを明示的にフォーマットできます。
164行目: 184行目:
 
* [[NTFS-3G]]: {{bc|# mkfs.ntfs -Q -s 4096 /dev/''device''}}
 
* [[NTFS-3G]]: {{bc|# mkfs.ntfs -Q -s 4096 /dev/''device''}}
 
* UDF: {{bc|# mkfs.udf -b 4096 /dev/''device''}}
 
* UDF: {{bc|# mkfs.udf -b 4096 /dev/''device''}}
  +
* [[ZFS#Advanced Format ディスク|ZFS]]: {{bc|1=# zpool create -o ashift=12 ''poolname'' raidz ''device0'' … ''deviceN''}}
   
 
== 参照 ==
 
== 参照 ==
171行目: 192行目:
 
* HDD のアライメントに失敗すると、読み込み/書き込みのパフォーマンスが劣化します。具体的な例は [https://linuxconfig.org/linux-wd-ears-advanced-format] を見てください。
 
* HDD のアライメントに失敗すると、読み込み/書き込みのパフォーマンスが劣化します。具体的な例は [https://linuxconfig.org/linux-wd-ears-advanced-format] を見てください。
   
{{TranslationStatus|Advanced Format|2022-11-18|739813}}
+
{{TranslationStatus|Advanced Format|2023-04-06|774725}}

2023年4月6日 (木) 14:05時点における版

すべてのストレージデバイスには、使うことのできる最小の記憶単位が存在します。この利用可能な最小単位は一般にセクタと呼ばれており、従来のストレージデバイスの回転部品を最小に分割したものでした (ソリッドステートドライブはメモリセルを使用し、最小単位はページです)。[1] を参照してください。

異なるストレージデバイスは、異なるセクタサイズを使用します。2011 年以降、最近のハードディスクドライブは通常 (512 バイトではなく) 4 KiB セクタを使用します。ソリッドステートドライブは、複数のフォーマットをサポートしていることがあります。

異なる「レイヤー」(つまり、デバイス / スタックされたブロックデバイス / ファイルシステム) 間で同じセクタサイズを使用するべきです。同じセクタサイズを使わない場合、ファームウェアがファイルシステムのセクタと物理ドライブのセクタとの間でマッピングを行わなければなりません。これは通常、変換レイヤーによって透過的に行われますが、これは回避可能なオーバーヘッドであり、そうすることでパフォーマンスが向上します。

ハードディスクドライブ – 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

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

この記事またはセクションの正確性には問題があります。
理由: 電源状態や BIOS の設定をいじる前に、ネイティブの nvme コマンドを使って操作ログを確認したり、nvme reset などを使ってコントローラをソフトリセットしたりすることをお勧めします。 (議論: トーク:Advanced Format#)

nvme format が失敗する場合、マシンを (例えば systemctl suspend などで) スリープ状態にして、復帰させたあとにもう一度 nvme format を実行してみてください。nvme format が依然として失敗する場合、BIOS の設定をいじると解決するかもしれません。

SATA

SATA デバイスの場合、メーカー固有のプログラムを使用する必要があります。すべての SATA デバイスがセクタサイズを変更できるわけではありません。

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 の場合、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) で割り切ることができるので、一般的なページサイズとブロックサイズのシナリオすべてをカバーします。

警告: パーティションのアライメントを誤ると、dm-crypt/LUKS で 4096 バイトセクタを使用できなくなります。[2] を見てください。
  • fdisk、cfdisk、sfdisk はアライメントを自動的に管理します。
  • gdisk と cgdisk はアライメントを自動的に管理します。
    • sgdisk はデフォルトで、パーティションの開始位置のみをアライメントします。パーティションのサイズや終了位置のアライメントも有効化するには、-I/--align-end オプションを使ってください。
  • 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.
ノート: 基礎にあるドライブが 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 まで落ちる可能性があります。これは、高パフォーマンスな書き込み領域が枯渇し、単一の領域上でセクタの変換レイヤに高負荷がかかるからです。

以下は、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-04-06 です。もし英語版に 変更 があれば、翻訳の同期を手伝うことができます。