「Advanced Format」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(→‎dm-crypt: 翻訳)
(同期)
 
(同じ利用者による、間の11版が非表示)
3行目: 3行目:
 
[[es:Advanced Format]]
 
[[es:Advanced Format]]
 
[[ru:Advanced Format]]
 
[[ru:Advanced Format]]
  +
[[tr:Advanced Format]]
すべてのストレージデバイスには、使うことのできる最小の記憶単位が存在します。この利用可能な最小単位は一般に[[Wikipedia:ja:ディスクセクタ|セクタ]]と呼ばれており、従来のストレージデバイスの回転部品を最小に分割したものでした (ソリッドステートドライブはメモリセルを使用し、最小単位はページです)。[https://www.oo-software.com/en/docs/whitepaper/whitepaper_ssd.pdf] を参照してください。
 
  +
[[zh-hans:先进格式化]]
  +
ハードディスクドライブ (HDD) における最小の物理記憶単位は[[Wikipedia:ja:ディスクセクタ|セクタ]]です。ソリッドステートドライブ (SSD) ではページがこれと等価です。[https://www.oo-software.com/en/docs/whitepaper/whitepaper_ssd.pdf] ストレージデバイスのファームウェアは物理セクタを、ソフトウェアが操作できる論理セクタに抽象化します。論理セクタのサイズは、ディスク上のアドレッシング可能な最小単位のサイズとなります。
   
  +
{{Note|ソフトウェアとドキュメントではストレージの種類に依らずに "セクタ" と "ブロック" を同じ意味で使用していることがあります。}}
異なるストレージデバイスは、異なるセクタサイズを使用します。[[Wikipedia:Advanced Format#History|2011 年以降]]、最近のハードディスクドライブは通常 (512 バイトではなく) 4 KiB セクタを使用します。ソリッドステートドライブは、複数のフォーマットをサポートしていることがあります。
 
   
  +
; 物理セクタサイズ: これは、物理ストレージデバイスがアトミックに書き込めるとする最小単位です。HDD の場合、これはプラッタにおけるセクタの実際のサイズです。従来、HDD の物理セクタサイズは 512 バイトでした。つまり、各セクタは 512 バイトのデータを格納できることを意味します。しかし、[[Wikipedia:Advanced Format#History|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 バイトの論理セクタサイズを使用する場合があります。
   
  +
異なる "レイヤー" (つまり、デバイス、スタックブロックデバイス、ファイルシステム) は、同じセクタサイズを使用するべきです。そうしないと、ファームウェアの変換レイヤーからのマッピングプロセス (通常は透過的ですが) で回避可能なオーバーヘッドが発生します。
== ハードディスクドライブ – Advanced Format ==
 
   
  +
現在の物理セクタサイズと論理セクタサイズは [[lsblk]] で見られます:
[[Wikipedia:Advanced Format|Advanced Format]] とは、[[Wikipedia:ja:ハードディスクドライブ|ハードディスクドライブ]]内の磁気ディスク上でデータを格納する際に、従来の512バイトセクタではなく4キロバイトセクタを使用するディスクセクターフォーマットの総称です。4096バイトセクタの背景には各トラックのビット密度を上げるという狙いがあります。データセクタの間には Sync/DAM と ECC (Error Correction Code) 情報が挟まっているので、その間隙の数を減らすのです。古いフォーマットでのフォーマット効率は 88.7% であったのに対し、Advanced Format では 97.3% のフォーマット効率を達成できます。
 
   
  +
{{Accuracy|以下のどちらのコマンド ({{ic|lsblk}} と {{ic|cat /sys/class...}}) も NVMe ドライブ (もしかすると全 SSD) の物理セクタサイズを正確に提供せず、代わりに論理セクタサイズを報告してしまいます。}}
Advanced Format ドライブには2つの種類が存在します:
 
   
  +
{{hc|$ lsblk -td|
* オレンジの "AF" ロゴが付いている Advanced Format ドライブ: 内部的には 4k セクタを使用しますが、4k セクタのサポートがないオペレーティングシステムとの互換性のためにエミュレーションレイヤーを提供します。
 
  +
NAME ALIGNMENT MIN-IO OPT-IO PHY-SEC LOG-SEC ROTA SCHED RQ-SIZE RA WSAME
* 青い "4Kn" ロゴが付いている Advanced Format 4k ネイティブドライブ: オペレーティングシステム (Windows 8 以降、Linux 2.6.31 以降) からのサポートを必要とします。このドライブには変換レイヤーが必要ないため、より安くなっています。しかし、古いツールと互換性がないかもしれません。
 
  +
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
  +
}}
   
  +
{{ic|PHY-SEC}} は物理セクタサイズを、{{ic|LOG-SEC}} は論理セクタサイズを指します。
=== サポートされているセクタサイズを調べる ===
 
   
ハードディスク {{ic|/dev/sd''X''}} の物理・論理セクタサイズは以下の sysfs エントリで確認することができます:
+
あるい以下の sysfs エントリから特定のドライブのセクタサイズを読み取ることができます:
   
$ cat /sys/class/block/sd''X''/queue/physical_block_size
+
$ cat /sys/class/block/''drive''/queue/physical_block_size
$ cat /sys/class/block/sd''X''/queue/logical_block_size
+
$ cat /sys/class/block/''drive''/queue/logical_block_size
   
  +
セクタサイズは、[[fdisk]]、[[smartctl]]、そして [[hdparm]] の出力からも得られます。
変換レイヤーのあるドライブ (上記を見てください) の場合は通常、論理ブロックサイズ 512 (後方互換性のため) と物理ブロックサイズ 4096 (そのドライブが Advanced Format ドライブであることを示す) が報告されます。
 
   
  +
== セクタサイズを変更する ==
以下のツールは (ドライブが正しい値を報告しているのを前提として) ドライブの物理セクタを報告します:
 
   
  +
{{Warning|ドライブのセクタサイズを変更すると、ドライブ上の全データが不可逆的に削除されます。}}
* [[fdisk]]: {{bc|1=# LC_ALL=C fdisk -l /dev/sd''X'' {{!}} grep 'Sector size'}}
 
* [[smartmontools]]: {{bc|# smartctl -a /dev/sd''X'' {{!}} grep 'Sector Size'}}
 
* [[hdparm]]: {{bc|# hdparm -I /dev/sd''X'' {{!}} grep 'Sector size:'}}
 
   
  +
一部の NVMe ドライブと "エンタープライズ" SATA ハードディスクドライブでは、それぞれ標準の NVMe コマンド (NVM Command Set Specification 1.0 及びそれ以降の {{ic|Format NVM}}) か ATA コマンド (ATA Command Set - 4 及びそれ以降の {{ic|SET SECTOR CONFIGURATION EXT}}) を使って、報告されるセクタサイズを変更することができます。ハードディスクドライブの場合、最適なパフォーマンスを得るために物理セクタサイズとマッチするように論理セクタサイズを変更します。一方、NVMe ソリッドステートドライブの場合、論理セクタサイズと物理セクタサイズの両方が変更されます。
USB 接続のディスクでも上記のツールは使えます (USB ブリッジが SAT、別名 SCSI/ATA Translation または ANSI INCITS 431-2007 に対応している場合)。
 
   
  +
大抵、SATA ソリッドステートドライブはセクタサイズの変更をサポートしていません。例外は、報告される物理セクタサイズを変更できるが、論理セクタサイズは変更できない特定の Intel SATA SSD です。[https://superuser.com/q/982680] 報告される物理セクタサイズを変更するには [[#Intel]] に従ってください。
== ソリッドステートドライブ ==
 
   
ほとんどの[[ソリッドステートドライブ]] (SSD) は、セクタサイズを 512 バイトと報告します。しかしSSD はより大きなセクタ (典型的には 4 KiB、8 KiB、さらに大きいこともあります) を使用します。その結果として、ファイルシステムはネイティブなセクタサイズに自的に最適化できません。パフォーマンスを最適化るには:
+
ドライブセクタサイズの変更は低レベルなフォーマットが必要になる複雑プロスです。代替案として、ドライブ上にファイルシステムを作成する際にセクタサイズを手で指定して最適パフォーマンスを得ることができま。[[#dm-crypt]] と [[#ファイルシステム]] を見てください。
   
  +
=== Advanced Format ハードディスクドライブ ===
* ファイルシステムを作成するときにセクタサイズを[[#ファイルシステム|手動で指定する]]
 
  +
* デバイスによって報告されるネイティブなセクタサイズを[[#ネイティブなセクタサイズを設定する|変更する]]
 
  +
[[hdparm]] ユーティリティを使うことで、Advanced Format ハードディスクドライブのセクタサイズを変更できるかどうか調べることができます:
  +
  +
# hdparm -I /dev/sd''X'' {{!}} grep 'Sector size:'
  +
  +
{{Note|USB で接続されたドライブの場合、USB ブリッジが [[Wikipedia:SCSI / ATA Translation|SAT (SCSI/ATA Translation)]] (ANSI INCITS 431-2007) をサポートしている必要があります。}}
  +
  +
Sector Configuration Log に複数の論理セクタサイズが表示される Advanced Format ドライブ では、それらのリストが表示されます:
  +
  +
{{bc|
  +
Logical Sector size: 512 bytes [ Supported: 512 4096 ]
  +
Physical Sector size: 4096 bytes
  +
}}
  +
  +
複数の変更可能な論理セクタサイズをサポートしていないハードディスクドライブでは、現在のセクタサイズだけが報告されます。例えば、Advanced Format 512e ドライブの場合:
  +
  +
{{bc|
  +
Logical Sector size: 512 bytes
  +
Physical Sector size: 4096 bytes
  +
}}
  +
  +
これらの種類のドライブで最適なパフォーマンスを得るには、[[#dm-crypt]] セクタサイズまたは[[#ファイルシステム]]のブロックサイズが少なくとも 4096 バイトであり、かつ 4096 バイト境界にアライメントされている必要があります。
  +
  +
Advanced Format 4Kn ドライブの場合:
  +
  +
{{bc|
  +
Logical Sector size: 4096 bytes
  +
Physical Sector size: 4096 bytes
  +
}}
  +
  +
4Kn ドライブでは、何も設定せずとも最適な設定になっており、パーティショニングやフォーマットの際に特別な考慮は必要ありません。そのまま使用することができます。
  +
  +
SATA HDD が複数の論理セクタサイズとオプションの ATA コマンド {{ic|SET SECTOR CONFIGURATION EXT}} をサポートしている場合 (例えば、Seagate ドライブは FastFormat サポートを広告しています)、''hdparm'' を使ってサポートされているセクタサイズから選択することができます。論理セクタサイズを 4096 バイト (つまり、4Kn) に設定するには、以下を実行してください:
  +
  +
# hdparm --set-sector-size 4096 --please-destroy-my-drive /dev/sd''X''
  +
  +
その後、''hdparm'' は論理セクタサイズが 4096 バイトであると報告するはずです:
  +
  +
{{hc|# hdparm -I /dev/sd''X'' {{!}} 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) を確認するには、{{Pkg|nvme-cli}} ユーティリティで ''Identify Namespace'' コマンドを使ってください:
  +
  +
{{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)
  +
LBA Format 1 : Metadata Size: 0 bytes - Data Size: 4096 bytes - Relative Performance: 0x1 Better
  +
}}
   
  +
* {{ic|Metadata Size}} は、論理ブロックアドレス (LBA) 毎の追加メタデータのバイト数です。これは Linux ではあまり良くサポートされていないため、この値が 0 であるフォーマットを選ぶのが最適です。
=== NVMe ドライブのサポートされているセクタサイズを調べる ===
 
  +
* {{ic|Relative Performance}} はそのフォーマットのパフォーマンスを示します: ''degraded''、''good''、''better''、''best'' のどれかです。
   
[[smartmontools]] を使って、サポートされているサイズを確認てください:
+
[[smartctl]] 、サポートされている論理ブロッアドレスサイズを表示できますが、ユーザフレンドリーな説明は提供ません。例:
   
{{hc|# smartctl -a ''device''|
+
{{hc|# smartctl -c /dev/nvme0n1|
 
...
 
...
 
Supported LBA Sizes (NSID 0x1)
 
Supported LBA Sizes (NSID 0x1)
52行目: 110行目:
 
0 + 512 0 2
 
0 + 512 0 2
 
1 - 4096 0 1
 
1 - 4096 0 1
...
 
 
}}
 
}}
   
  +
論理ブロックアドレスサイズを変更するには、{{ic|nvme format}} を使い、{{ic|--lbaf}} パラメータで好ましい値を指定してください:
=== ネイティブなセクタサイズを設定する ===
 
   
  +
{{hc|1=# nvme format --lbaf=1 /dev/nvme0n1|2=
自動検出されたセクタサイズを手動でオーバーライドする代わりに、一部の SSD ではフォーマット時にセクタサイズを変更でき、真のセクタサイズに近い値を報告させることができます。
 
  +
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.
==== NVMe ====
 
  +
Sending format operation ...
  +
Success formatting namespace:1
  +
}}
   
  +
この処理には数秒しかかからないはずです。
[[NVMe]] デバイスがこれをサポートしているかどうか調べるには、''Identify Namespace'' コマンドを使ってください。
 
   
  +
{{Note|パーティショニングの際は以下の [[#パーティションのアライメント]] に従ってください。さもないと、パフォーマンス上の利点が水の泡になります。}}
{{hc|# nvme id-ns /dev/nvme0n1|
 
nlbaf : 0
 
[...]
 
lbaf 0 : ms:0 lbads:9 rp:0 (in use)
 
}}
 
   
  +
{{Accuracy|電源状態や BIOS の設定をいじる前に、ネイティブの {{ic|nvme}} コマンドを使って操作ログを確認したり、{{ic|nvme reset}} ''など''を使ってコントローラをソフトリセットしたりすることをお勧めします。}}
{{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 の値を持つフォーマットを選択するのが最良です。
 
   
  +
2020年より前のドライブは、POST の最後に "security freeze" を発行する非標準的なシステムで使用する場合、{{ic|Format NVM}} コマンドをブロックする可能性があります。[https://github.com/linux-nvme/nvme-cli/issues/816][https://forums.lenovo.com/topic/findpost/1300/5043069/5167342] {{ic|nvme format}} が失敗する場合、[[systemd#電源管理|システムをサスペンド]]してみて ([[電源管理/サスペンドとハイバネート#サスペンドの方法を変更する|S0ix ではなく S3 スリープを使用]]してください)、復帰後に {{ic|nvme format}} をもう一度実行してみてください。[https://github.com/linux-nvme/nvme-cli/issues/84][https://community.wd.com/t/sn750-cannot-format-using-the-nvme-command/254374]
セクタサイズを変更するには、{{ic|nvme format}} を使い、{{ic|--lbaf}} パラメータで好ましい値を指定してください。{{ic|nvme format}} が失敗する場合、マシンを (例えば {{ic|systemctl suspend}} などで) スリープ状態にして、復帰させたあとにもう一度 {{ic|nvme format}} を実行してみてください。{{ic|nvme format}} が依然として失敗する場合、BIOS の設定をいじると解決するかもしれません。
 
   
  +
=== メーカー固有のプログラムを使う ===
==== SATA ====
 
   
SATA デバイスの場合、メーカー固有プログラムを使用する必要があります。すべての SATA デバイスがセクタサイズを変更できるわけではありません
+
上記汎用ユーティリティでセクタサイズを変更できない場合、ドライブのメーカーのユーティリティを使用すれば変更できる場合がありま
   
===== 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}}) を使ってください。
   
===== Seagate =====
+
==== Seagate ====
   
Seagate の場合、{{AUR|seagate-seachest}} を使ってください。
+
Seagate の場合、{{AUR|openseachest}} を使ってください。
   
 
すべてのドライブをスキャンし、適切なものを探してください。そして、見つけたドライブの情報を表示してください:
 
すべてのドライブをスキャンし、適切なものを探してください。そして、見つけたドライブの情報を表示してください:
   
# SeaChest_Basics --scan
+
# openSeaChest_Basics --scan
# SeaChest_Basics -d /dev/sg''X'' -i
+
# openSeaChest_Basics -d /dev/sd''X'' -i
   
 
ドライブの情報が出力されるはずです。シリアル番号を確認してください。
 
ドライブの情報が出力されるはずです。シリアル番号を確認してください。
94行目: 155行目:
 
そのドライブによってサポートされている論理ブロックサイズを確認してください:
 
そのドライブによってサポートされている論理ブロックサイズを確認してください:
   
# SeaChest_Format -d /dev/sg''X'' --showSupportedFormats
+
# openSeaChest_Format -d /dev/sd''X'' --showSupportedFormats
   
 
4096 が一覧に載っている場合、論理セクタサイズを 4096 バイトに変更できます:
 
4096 が一覧に載っている場合、論理セクタサイズを 4096 バイトに変更できます:
   
# SeaChest_Format -d /dev/sg''X'' --setSectorSize=4096 --confirm this-will-erase-data
+
# openSeaChest_Format -d /dev/sd''X'' --setSectorSize=4096 --confirm this-will-erase-data
   
 
このコマンドは完了するまで2分かかります。その後、ドライブは 4K ネイティブセクタサイズを使用するようになります。
 
このコマンドは完了するまで2分かかります。その後、ドライブは 4K ネイティブセクタサイズを使用するようになります。
112行目: 173行目:
 
** ''sgdisk'' はデフォルトで、パーティションの開始位置のみをアライメントします。パーティションのサイズや終了位置のアライメントも有効化するには、{{ic|-I}}/{{ic|--align-end}} オプションを使ってください。
 
** ''sgdisk'' はデフォルトで、パーティションの開始位置のみをアライメントします。パーティションのサイズや終了位置のアライメントも有効化するには、{{ic|-I}}/{{ic|--align-end}} オプションを使ってください。
 
* [[Parted#アライメント|Parted]] はパーティションの開始位置のみをアライメントし、サイズと終了位置はアライメントしません。パーティションを作成するときは、パーティションの終了位置をメビバイトかより大きな IEC 2進接頭辞で指定するようにしてください。
 
* [[Parted#アライメント|Parted]] はパーティションの開始位置のみをアライメントし、サイズと終了位置はアライメントしません。パーティションを作成するときは、パーティションの終了位置をメビバイトかより大きな IEC 2進接頭辞で指定するようにしてください。
  +
  +
[https://github.com/crysman/check-partitions-alignment checkpartitionsalignment.sh] は、[[Parted]] と awk を使ってアライメントをチェックする bash スクリプトです。
   
 
== dm-crypt ==
 
== dm-crypt ==
117行目: 180行目:
 
[[Cryptsetup]] 2.4.0 では、{{ic|luksFormat}} は自動的に LUKS2 フォーマットに最適な暗号化セクタサイズを検出します [https://mirrors.edge.kernel.org/pub/linux/utils/cryptsetup/v2.4/v2.4.0-ReleaseNotes]。
 
[[Cryptsetup]] 2.4.0 では、{{ic|luksFormat}} は自動的に LUKS2 フォーマットに最適な暗号化セクタサイズを検出します [https://mirrors.edge.kernel.org/pub/linux/utils/cryptsetup/v2.4/v2.4.0-ReleaseNotes]。
   
しかし、これが機能するには、デバイスが正しいデフォルトセクタサイズを報告する必要があります。[[#ネイティブなセクタサイズを設定する]] を見てください。
+
しかし、これが機能するには、デバイスが正しいデフォルトセクタサイズを報告する必要があります。[[#セクタサイズを変更する]] を見てください。
   
 
{{ic|cryptsetup luksFormat}} を使用したあとに、LUKS2 ボリュームによって使用されているセクタサイズを確認できます:
 
{{ic|cryptsetup luksFormat}} を使用したあとに、LUKS2 ボリュームによって使用されているセクタサイズを確認できます:
145行目: 208行目:
 
== ファイルシステム ==
 
== ファイルシステム ==
   
  +
4Kn ディスク (物理セクタサイズが 4096 バイト、論理セクタサイズが 4096 バイト) では、全ての ''mkfs'' ユーティリティは 4096 バイトのブロックサイズを使用します。512e ディスク (物理セクタサイズが 4096、論理セクタサイズが 512 バイト) と 512n ディスク (物理セクタサイズが 512 バイト、論理セクタサイズが 512 バイト) では、''mkfs'' ユーティリティはそれぞれ異なる動作をします。
{{man|8|mkfs.btrfs}}、{{man|8|mkfs.jfs}}、{{man|8|mkfs.nilfs2}}、{{man|8|mkfs.reiserfs}}、{{man|8|mkswap}} は、デフォルトで 4096 バイトのセクタサイズを使用します。
 
   
  +
{| class="wikitable"
{{man|8|mkfs.ext4}} はデフォルトで、512 MiB より小さいファイルシステムに対しては 1024 バイトのセクタを、512 MiB 以上のファイルシステムに対しては 4096 バイトのセクタを使用します。
 
  +
|+ 非 4Kn ディスクにおけるファイルシステムのブロックサイズ (バイト単位)
  +
! ''mkfs'' ユーティリティ !! 512e ディスク !! 512n ディスク
  +
|-
  +
| ''mkfs.bcachefs'' || {{G|4096}} || {{R|512}}
  +
|-
  +
| {{man|8|mkfs.btrfs}} || {{G|4096}} || {{G|4096}}
  +
|-
  +
| {{man|8|mkfs.ext4}} || {{Y|4096}}<sup>1</sup> || {{Y|4096}}<sup>1</sup>
  +
|-
  +
| {{man|8|mkfs.fat}} || {{R|512}} || {{R|512}}
  +
|-
  +
| {{man|8|mkfs.f2fs}} || {{R|512}} || {{R|512}}
  +
|-
  +
| {{man|8|mkfs.jfs}} || {{G|4096}} || {{G|4096}}
  +
|-
  +
| {{man|8|mkfs.nilfs2}} || {{G|4096}} || {{G|4096}}
  +
|-
  +
| {{man|8|mkfs.ntfs}} || {{R|512}} || {{R|512}}
  +
|-
  +
| {{man|8|mkfs.reiserfs}} || {{G|4096}} || {{G|4096}}
  +
|-
  +
| {{man|8|mkfs.udf}} || {{R|512}} || {{R|512}}
  +
|-
  +
| {{man|8|mkfs.xfs}} || {{G|4096}} || {{R|512}}
  +
|-
  +
| {{man|8|mkswap}} || {{G|4096}} || {{G|4096}}
  +
|-
  +
| {{man|8|zpool-create|url=}} || {{R|512}} || {{R|512}}
  +
|}
   
{{man|8|mkfs.xfs}} はデフォルトで 512 バイトセクタを使用しますが512e と 4Knディに対しては 4096 バイトを使用します。
+
# {{man|8|mkfs.ext4}} はデフォルトで512 MiB 未満のファイルシステムに対しては 1024 バイトセクタを、512 MiB 以上ファイルシテムに対しては 4096 バイトのセクタを使用します。
 
{{man|8|mkfs.f2fs}}、{{man|8|mkfs.fat}}、{{man|8|mkfs.ntfs}}、{{man|8|mkfs.udf}} は、バックアップデバイスの論理セクタサイズを使用します。つまり、これらは、512e ディスクに対しては 512 バイトのセクタを、4Kn ディスクに対しては 4096 バイトのセクタを使用します。
 
   
 
ストレージデバイスが正しいセクタサイズを報告しない場合は、物理セクタサイズに応じてパーティションを明示的にフォーマットできます。
 
ストレージデバイスが正しいセクタサイズを報告しない場合は、物理セクタサイズに応じてパーティションを明示的にフォーマットできます。
   
 
特に、ファームウェアによって管理されている ''シングル磁気記録方式'' (Singled Magnetic Recording: SMR) ドライブは、物理セクタサイズが 4096 バイトの場合に 512 バイトの論理セクタサイズを使用すると、深刻な悪影響を受けます。これらのドライブは、パフォーマンスの異なる書き込み領域が存在し、アイドル時にはリマッピングの再割当てが発生しますが、高負荷なアクティブ書き込み (例: RAID resilvering、バックアップ、小さなファイルを大量に書き込む、rsync など) 時には、ファイルシステムのセクタサイズが異なる場合に書き込み速度が1桁の MB/s まで落ちる可能性があります。これは、高パフォーマンスな書き込み領域が枯渇し、単一の領域上でセクタの変換レイヤに高負荷がかかるからです。
 
特に、ファームウェアによって管理されている ''シングル磁気記録方式'' (Singled Magnetic Recording: SMR) ドライブは、物理セクタサイズが 4096 バイトの場合に 512 バイトの論理セクタサイズを使用すると、深刻な悪影響を受けます。これらのドライブは、パフォーマンスの異なる書き込み領域が存在し、アイドル時にはリマッピングの再割当てが発生しますが、高負荷なアクティブ書き込み (例: RAID resilvering、バックアップ、小さなファイルを大量に書き込む、rsync など) 時には、ファイルシステムのセクタサイズが異なる場合に書き込み速度が1桁の MB/s まで落ちる可能性があります。これは、高パフォーマンスな書き込み領域が枯渇し、単一の領域上でセクタの変換レイヤに高負荷がかかるからです。
  +
  +
{{Note|x86_64 システムでは、Linux は 4 KiB より大きいブロックサイズのファイルシステムをマウントすることができません。詳細と現在の進捗状況については [https://kernelnewbies.org/KernelProjects/large-block-size Large block sizes (LBS)] を参照してください。}}
   
 
以下は、4096 バイトのセクタを明示的に設定する例です:
 
以下は、4096 バイトのセクタを明示的に設定する例です:
   
  +
* [[Bcachefs]]: {{bc|1=# bcachefs format --block_size=4096 /dev/''device0'' /dev/''deviceN'' --replicas=''n''}}
 
* [[ext4]]: {{bc|# mkfs.ext4 -b 4096 /dev/''device''}}
 
* [[ext4]]: {{bc|# mkfs.ext4 -b 4096 /dev/''device''}}
* [[XFS]]: {{bc|1=# mkfs.xfs -s size=4096 /dev/''device''}}
 
 
* [[FAT]]: {{bc|# mkfs.fat -S 4096 /dev/''device''}}
 
* [[FAT]]: {{bc|# mkfs.fat -S 4096 /dev/''device''}}
 
* [[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''}}
  +
* [[XFS]]: {{bc|1=# mkfs.xfs -s size=4096 /dev/''device''}}
  +
* [[ZFS#Advanced Format ディスク|ZFS]]: {{bc|1=# zpool create -o ashift=12 ''poolname'' raidz ''device0'' … ''deviceN''}}
   
 
== 参照 ==
 
== 参照 ==
170行目: 264行目:
 
* [https://www.wdc.com/wdproducts/library/WhitePapers/ENG/2579-771430.pdf White paper entitled "Advanced Format Technology."]
 
* [https://www.wdc.com/wdproducts/library/WhitePapers/ENG/2579-771430.pdf White paper entitled "Advanced Format Technology."]
 
* HDD のアライメントに失敗すると、読み込み/書き込みのパフォーマンスが劣化します。具体的な例は [https://linuxconfig.org/linux-wd-ears-advanced-format] を見てください。
 
* HDD のアライメントに失敗すると、読み込み/書き込みのパフォーマンスが劣化します。具体的な例は [https://linuxconfig.org/linux-wd-ears-advanced-format] を見てください。
  +
  +
{{TranslationStatus|Advanced Format|2024-01-11|796563}}

2024年1月11日 (木) 17:39時点における最新版

ハードディスクドライブ (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) を確認するには、nvme-cli ユーティリティで 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 は、論理ブロックアドレス (LBA) 毎の追加メタデータのバイト数です。これは Linux ではあまり良くサポートされていないため、この値が 0 であるフォーマットを選ぶのが最適です。
  • Relative Performance はそのフォーマットのパフォーマンスを示します: degradedgoodbetterbest のどれかです。

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

# smartctl -c /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進接頭辞で指定するようにしてください。

checkpartitionsalignment.sh は、Parted と awk を使ってアライメントをチェックする bash スクリプトです。

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

ファイルシステム

4Kn ディスク (物理セクタサイズが 4096 バイト、論理セクタサイズが 4096 バイト) では、全ての mkfs ユーティリティは 4096 バイトのブロックサイズを使用します。512e ディスク (物理セクタサイズが 4096、論理セクタサイズが 512 バイト) と 512n ディスク (物理セクタサイズが 512 バイト、論理セクタサイズが 512 バイト) では、mkfs ユーティリティはそれぞれ異なる動作をします。

非 4Kn ディスクにおけるファイルシステムのブロックサイズ (バイト単位)
mkfs ユーティリティ 512e ディスク 512n ディスク
mkfs.bcachefs 4096 512
mkfs.btrfs(8) 4096 4096
mkfs.ext4(8) 40961 40961
mkfs.fat(8) 512 512
mkfs.f2fs(8) 512 512
mkfs.jfs(8) 4096 4096
mkfs.nilfs2(8) 4096 4096
mkfs.ntfs(8) 512 512
mkfs.reiserfs(8) 4096 4096
mkfs.udf(8) 512 512
mkfs.xfs(8) 4096 512
mkswap(8) 4096 4096
zpool-create(8) 512 512
  1. mkfs.ext4(8) はデフォルトで、512 MiB 未満のファイルシステムに対しては 1024 バイトセクタを、512 MiB 以上のファイルシステムに対しては 4096 バイトのセクタを使用します。

ストレージデバイスが正しいセクタサイズを報告しない場合は、物理セクタサイズに応じてパーティションを明示的にフォーマットできます。

特に、ファームウェアによって管理されている シングル磁気記録方式 (Singled Magnetic Recording: SMR) ドライブは、物理セクタサイズが 4096 バイトの場合に 512 バイトの論理セクタサイズを使用すると、深刻な悪影響を受けます。これらのドライブは、パフォーマンスの異なる書き込み領域が存在し、アイドル時にはリマッピングの再割当てが発生しますが、高負荷なアクティブ書き込み (例: RAID resilvering、バックアップ、小さなファイルを大量に書き込む、rsync など) 時には、ファイルシステムのセクタサイズが異なる場合に書き込み速度が1桁の MB/s まで落ちる可能性があります。これは、高パフォーマンスな書き込み領域が枯渇し、単一の領域上でセクタの変換レイヤに高負荷がかかるからです。

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

以下は、4096 バイトのセクタを明示的に設定する例です:

  • Bcachefs:
    # bcachefs format --block_size=4096 /dev/device0 /dev/deviceN --replicas=n
  • ext4:
    # mkfs.ext4 -b 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
  • XFS:
    # mkfs.xfs -s size=4096 /dev/device
  • ZFS:
    # zpool create -o ashift=12 poolname raidz device0deviceN

参照

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