「アドバンスドフォーマット」の版間の差分
("セクタサイズを変更する" を追加) |
(同期) |
||
(2人の利用者による、間の9版が非表示) | |||
3行目: | 3行目: | ||
[[es:Advanced Format]] |
[[es:Advanced Format]] |
||
[[ru:Advanced Format]] |
[[ru:Advanced Format]] |
||
+ | [[tr:Advanced Format]] |
||
+ | [[zh-hans:先进格式化]] |
||
ハードディスクドライブ (HDD) における最小の物理記憶単位は[[Wikipedia:ja:ディスクセクタ|セクタ]]です。ソリッドステートドライブ (SSD) ではページがこれと等価です。[https://www.oo-software.com/en/docs/whitepaper/whitepaper_ssd.pdf] ストレージデバイスのファームウェアは物理セクタを、ソフトウェアが操作できる論理セクタに抽象化します。論理セクタのサイズは、ディスク上のアドレッシング可能な最小単位のサイズとなります。 |
ハードディスクドライブ (HDD) における最小の物理記憶単位は[[Wikipedia:ja:ディスクセクタ|セクタ]]です。ソリッドステートドライブ (SSD) ではページがこれと等価です。[https://www.oo-software.com/en/docs/whitepaper/whitepaper_ssd.pdf] ストレージデバイスのファームウェアは物理セクタを、ソフトウェアが操作できる論理セクタに抽象化します。論理セクタのサイズは、ディスク上のアドレッシング可能な最小単位のサイズとなります。 |
||
{{Note|ソフトウェアとドキュメントではストレージの種類に依らずに "セクタ" と "ブロック" を同じ意味で使用していることがあります。}} |
{{Note|ソフトウェアとドキュメントではストレージの種類に依らずに "セクタ" と "ブロック" を同じ意味で使用していることがあります。}} |
||
− | ; 物理セクタサイズ: これは、物理ストレージデバイスがアトミックに書き込めるとする最小単位です。HDD の場合、これはプラッタにおけるセクタの実際のサイズです。従来、HDD の物理セクタサイズは 512 バイトでした。つまり、各セクタは 512 バイトのデータを格納できることを意味します。しかし、[[Wikipedia:Advanced Format#History| |
+ | ; 物理セクタサイズ: これは、物理ストレージデバイスがアトミックに書き込めるとする最小単位です。HDD の場合、これはプラッタにおけるセクタの実際のサイズです。従来、HDD の物理セクタサイズは 512 バイトでした。つまり、各セクタは 512 バイトのデータを格納できることを意味します。しかし、[[Wikipedia:Advanced Format#History|アドバンスドフォーマット]] HDD の登場により、物理セクタサイズは 4096 バイト (4 KiB) に増え、誤り訂正機能が向上しました。SSD は NAND フラッシュメモリの実際のページサイズ (典型的には 4 KiB から 16 KiB ) を公開せず、報告される物理セクタサイズは論理セクタサイズと同じです。NVMe SSD の場合は、利用可能であれば、Atomic Write Unit Power Fail (AWUPF) パラメータの値が使用されます。 |
− | ; 論理セクタサイズ: 論理セクタサイズ (別名、オペレーティングシステムセクタサイズ) は、オペレーティングシステムとアプリケーションに公開されるセクタサイズを表します。ソフトウェアのレベルでストレージデバイスに読み書きする際に用いられるセクタサイズです。論理セクタサイズは物理セクタサイズと異なる可能性があります。例えば、物理セクタサイズが 4096 バイトの |
+ | ; 論理セクタサイズ: 論理セクタサイズ (別名、オペレーティングシステムセクタサイズ) は、オペレーティングシステムとアプリケーションに公開されるセクタサイズを表します。ソフトウェアのレベルでストレージデバイスに読み書きする際に用いられるセクタサイズです。論理セクタサイズは物理セクタサイズと異なる可能性があります。例えば、物理セクタサイズが 4096 バイトのアドバンスドフォーマット HDD は、古いシステムとアプリケーションとの互換性のために、依然として 512 バイトの論理セクタサイズを使用する場合があります。 |
異なる "レイヤー" (つまり、デバイス、スタックブロックデバイス、ファイルシステム) は、同じセクタサイズを使用するべきです。そうしないと、ファームウェアの変換レイヤーからのマッピングプロセス (通常は透過的ですが) で回避可能なオーバーヘッドが発生します。 |
異なる "レイヤー" (つまり、デバイス、スタックブロックデバイス、ファイルシステム) は、同じセクタサイズを使用するべきです。そうしないと、ファームウェアの変換レイヤーからのマッピングプロセス (通常は透過的ですが) で回避可能なオーバーヘッドが発生します。 |
||
42行目: | 44行目: | ||
ドライブのセクタサイズの変更は、低レベルなフォーマットが必要になる複雑なプロセスです。代替案として、ドライブ上にファイルシステムを作成する際にセクタサイズを手動で指定して最適なパフォーマンスを得ることができます。[[#dm-crypt]] と [[#ファイルシステム]] を見てください。 |
ドライブのセクタサイズの変更は、低レベルなフォーマットが必要になる複雑なプロセスです。代替案として、ドライブ上にファイルシステムを作成する際にセクタサイズを手動で指定して最適なパフォーマンスを得ることができます。[[#dm-crypt]] と [[#ファイルシステム]] を見てください。 |
||
− | === |
+ | === アドバンスドフォーマットハードディスクドライブ === |
− | [[hdparm]] ユーティリティを使うことで、 |
+ | [[hdparm]] ユーティリティを使うことで、アドバンスドフォーマットハードディスクドライブのセクタサイズを変更できるかどうか調べることができます: |
# hdparm -I /dev/sd''X'' {{!}} grep 'Sector size:' |
# hdparm -I /dev/sd''X'' {{!}} grep 'Sector size:' |
||
50行目: | 52行目: | ||
{{Note|USB で接続されたドライブの場合、USB ブリッジが [[Wikipedia:SCSI / ATA Translation|SAT (SCSI/ATA Translation)]] (ANSI INCITS 431-2007) をサポートしている必要があります。}} |
{{Note|USB で接続されたドライブの場合、USB ブリッジが [[Wikipedia:SCSI / ATA Translation|SAT (SCSI/ATA Translation)]] (ANSI INCITS 431-2007) をサポートしている必要があります。}} |
||
− | Sector Configuration Log に複数の論理セクタサイズが表示される |
+ | Sector Configuration Log に複数の論理セクタサイズが表示されるアドバンスドフォーマットドライブ では、それらのリストが表示されます: |
{{bc| |
{{bc| |
||
57行目: | 59行目: | ||
}} |
}} |
||
− | 複数の変更可能な論理セクタサイズをサポートしていないハードディスクドライブでは、現在のセクタサイズだけが報告されます。例えば、 |
+ | 複数の変更可能な論理セクタサイズをサポートしていないハードディスクドライブでは、現在のセクタサイズだけが報告されます。例えば、アドバンスドフォーマット 512e ドライブの場合: |
{{bc| |
{{bc| |
||
66行目: | 68行目: | ||
これらの種類のドライブで最適なパフォーマンスを得るには、[[#dm-crypt]] セクタサイズまたは[[#ファイルシステム]]のブロックサイズが少なくとも 4096 バイトであり、かつ 4096 バイト境界にアライメントされている必要があります。 |
これらの種類のドライブで最適なパフォーマンスを得るには、[[#dm-crypt]] セクタサイズまたは[[#ファイルシステム]]のブロックサイズが少なくとも 4096 バイトであり、かつ 4096 バイト境界にアライメントされている必要があります。 |
||
− | + | アドバンスドフォーマット 4Kn ドライブの場合: |
|
{{bc| |
{{bc| |
||
90行目: | 92行目: | ||
ほとんどの[[ソリッドステートドライブ]] (SSD) は、論理ブロックアドレスサイズが 512 バイトであると報告します。たとえ、それより大きなサイズ (典型的には 4 KiB、8 KiB、またはそれ以上) を物理的に使用していたとしてもです。 |
ほとんどの[[ソリッドステートドライブ]] (SSD) は、論理ブロックアドレスサイズが 512 バイトであると報告します。たとえ、それより大きなサイズ (典型的には 4 KiB、8 KiB、またはそれ以上) を物理的に使用していたとしてもです。 |
||
− | [[ |
+ | [[NVMe]] ドライブのフォーマットされた論理ブロックアドレスサイズ (FLBAS) を確認するには、{{Pkg|nvme-cli}} ユーティリティで ''Identify Namespace'' コマンドを使ってください: |
{{hc|# nvme id-ns -H /dev/nvme0n1 {{!}} grep "Relative Performance"| |
{{hc|# nvme id-ns -H /dev/nvme0n1 {{!}} grep "Relative Performance"| |
||
97行目: | 99行目: | ||
}} |
}} |
||
− | * {{ic|Metadata Size}} は ( |
+ | * {{ic|Metadata Size}} は、論理ブロックアドレス (LBA) 毎の追加メタデータのバイト数です。これは Linux ではあまり良くサポートされていないため、この値が 0 であるフォーマットを選ぶのが最適です。 |
− | * {{ic|Relative Performance}} はそのフォーマットのパフォーマンスを示します: ''good''、''better''、''best'' のどれかです。 |
+ | * {{ic|Relative Performance}} はそのフォーマットのパフォーマンスを示します: ''degraded''、''good''、''better''、''best'' のどれかです。 |
[[smartctl]] も、サポートされている論理ブロックアドレスサイズを表示できますが、ユーザフレンドリーな説明は提供しません。例: |
[[smartctl]] も、サポートされている論理ブロックアドレスサイズを表示できますが、ユーザフレンドリーな説明は提供しません。例: |
||
− | {{hc|# smartctl - |
+ | {{hc|# smartctl -c /dev/nvme0n1| |
... |
... |
||
Supported LBA Sizes (NSID 0x1) |
Supported LBA Sizes (NSID 0x1) |
||
108行目: | 110行目: | ||
0 + 512 0 2 |
0 + 512 0 2 |
||
1 - 4096 0 1 |
1 - 4096 0 1 |
||
− | .. |
||
}} |
}} |
||
129行目: | 130行目: | ||
{{Accuracy|電源状態や BIOS の設定をいじる前に、ネイティブの {{ic|nvme}} コマンドを使って操作ログを確認したり、{{ic|nvme reset}} ''など''を使ってコントローラをソフトリセットしたりすることをお勧めします。}} |
{{Accuracy|電源状態や BIOS の設定をいじる前に、ネイティブの {{ic|nvme}} コマンドを使って操作ログを確認したり、{{ic|nvme reset}} ''など''を使ってコントローラをソフトリセットしたりすることをお勧めします。}} |
||
− | 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] |
+ | 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] |
=== メーカー固有のプログラムを使う === |
=== メーカー固有のプログラムを使う === |
||
160行目: | 161行目: | ||
# openSeaChest_Format -d /dev/sd''X'' --setSectorSize=4096 --confirm this-will-erase-data |
# openSeaChest_Format -d /dev/sd''X'' --setSectorSize=4096 --confirm this-will-erase-data |
||
− | このコマンドは完了するまで2分かかります。その後、ドライブは |
+ | このコマンドは完了するまで2分かかります。その後、ドライブは 4 KiB ネイティブセクタサイズを使用するようになります。 |
− | |||
− | == ハードディスクドライブ – Advanced Format == |
||
− | |||
− | [[Wikipedia:Advanced Format|Advanced Format]] とは、[[Wikipedia:ja:ハードディスクドライブ|ハードディスクドライブ]]内の磁気ディスク上でデータを格納する際に、従来の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 以降) からのサポートを必要とします。このドライブには変換レイヤーが必要ないため、より安くなっています。しかし、古いツールと互換性がないかもしれません。 |
||
− | |||
− | === サポートされているセクタサイズを調べる === |
||
− | |||
− | ハードディスク {{ic|/dev/sd''X''}} の物理・論理セクタサイズは以下の sysfs エントリで確認することができます: |
||
− | |||
− | $ cat /sys/class/block/sd''X''/queue/physical_block_size |
||
− | $ cat /sys/class/block/sd''X''/queue/logical_block_size |
||
− | |||
− | 変換レイヤーのあるドライブ (上記を見てください) の場合は通常、論理ブロックサイズ 512 (後方互換性のため) と物理ブロックサイズ 4096 (そのドライブが Advanced Format ドライブであることを示す) が報告されます。 |
||
− | |||
− | 以下のツールは (ドライブが正しい値を報告しているのを前提として) ドライブの物理セクタを報告します: |
||
− | |||
− | * [[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:'}} |
||
− | |||
− | USB 接続のディスクでも上記のツールは使えます (USB ブリッジが SAT、別名 SCSI/ATA Translation または ANSI INCITS 431-2007 に対応している場合)。 |
||
− | |||
− | == ソリッドステートドライブ == |
||
− | |||
− | ほとんどの[[ソリッドステートドライブ]] (SSD) は、セクタサイズを 512 バイトと報告します。しかし、SSD はより大きなセクタ (典型的には 4 KiB、8 KiB、さらに大きいこともあります) を使用します。その結果として、ファイルシステムはネイティブなセクタサイズに自動的に最適化できません。パフォーマンスを最適化するには: |
||
− | |||
− | * ファイルシステムを作成するときにセクタサイズを[[#ファイルシステム|手動で指定する]] |
||
− | * デバイスによって報告されるネイティブなセクタサイズを[[#ネイティブなセクタサイズを設定する|変更する]] |
||
− | |||
− | === NVMe ドライブのサポートされているセクタサイズを調べる === |
||
− | |||
− | [[smartmontools]] を使って、サポートされているセクタサイズを確認してください: |
||
− | |||
− | {{hc|# 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'' コマンドを使ってください。 |
||
− | |||
− | {{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}} は (おそらく) セクタ毎の追加メタデータのバイト数です。これは Linux ではあまり良くサポートされていないため、0 の値をここに持つフォーマットを選択するのが最良です。 |
||
− | * {{ic|Relative Performance}} は、どのフォーマットが最高のパフォーマンスを提供するかを表します。 |
||
− | |||
− | セクタサイズを変更するには、{{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 デバイスの場合、メーカー固有のプログラムを使用する必要があります。すべての SATA デバイスがセクタサイズを変更できるわけではありません。 |
||
− | |||
− | ===== 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}}) を使ってください。 |
||
− | |||
− | ===== Seagate ===== |
||
− | |||
− | Seagate の場合、{{AUR|seagate-seachest}} を使ってください。 |
||
− | |||
− | すべてのドライブをスキャンし、適切なものを探してください。そして、見つけたドライブの情報を表示してください: |
||
− | |||
− | # SeaChest_Basics --scan |
||
− | # SeaChest_Basics -d /dev/sg''X'' -i |
||
− | |||
− | ドライブの情報が出力されるはずです。シリアル番号を確認してください。 |
||
− | |||
− | そのドライブによってサポートされている論理ブロックサイズを確認してください: |
||
− | |||
− | # SeaChest_Format -d /dev/sg''X'' --showSupportedFormats |
||
− | |||
− | 4096 が一覧に載っている場合、論理セクタサイズを 4096 バイトに変更できます: |
||
− | |||
− | # SeaChest_Format -d /dev/sg''X'' --setSectorSize=4096 --confirm this-will-erase-data |
||
− | |||
− | このコマンドは完了するまで2分かかります。その後、ドライブは 4K ネイティブセクタサイズを使用するようになります。 |
||
== パーティションのアライメント == |
== パーティションのアライメント == |
||
283行目: | 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 == |
||
294行目: | 186行目: | ||
# cryptsetup luksDump ''device'' | grep sector |
# cryptsetup luksDump ''device'' | grep sector |
||
− | デフォルトのセクタサイズが正しくない場合、 |
+ | デフォルトのセクタサイズが正しくない場合、4 KiB のセクタサイズをそれ以外のデフォルトのオプションで LUKS2 コンテナを強制的に作成することができます: |
# cryptsetup luksFormat --sector-size=4096 ''device'' |
# cryptsetup luksFormat --sector-size=4096 ''device'' |
||
306行目: | 198行目: | ||
}} |
}} |
||
− | {{Note| |
+ | {{Note|実際のドライブが 4 KiB 物理セクタを使用しているときにこのコマンドが失敗する可能性がある理由については、[https://gitlab.com/cryptsetup/cryptsetup/-/issues/585 cryptsetup issue 585] を見てください。}} |
デバイスを間違ったセクタサイズで暗号化してしまった場合、以下のコマンドでそのデバイスを再暗号化できます: |
デバイスを間違ったセクタサイズで暗号化してしまった場合、以下のコマンドでそのデバイスを再暗号化できます: |
||
316行目: | 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|[https://github.com/koverstreet/bcachefs/issues/765 512]}} |
||
+ | |- |
||
+ | | {{man|8|mkfs.btrfs}} || {{G|4096}} || {{G|4096}} |
||
+ | |- |
||
+ | | {{man|8|mkfs.exfat}} || {{R|[https://github.com/exfatprogs/exfatprogs/issues/277 512]}} || {{R|512}} |
||
+ | |- |
||
+ | | {{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|[https://github.com/jaegeuk/f2fs-tools/issues/29 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. |
+ | # {{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 バイトのセクタを使用します。 |
||
− | |||
− | ([[ZFS#Advanced Format ディスク|ZFS]] の) {{man|8|zpool-create|url=}} はデフォルトで 512 (2⁹) バイトのセクタを使います。Advanced Format ディスクをパラメータ {{ic|1=-o ashift=12}} (2¹²、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''}} |
||
+ | * exFAT: {{bc|# mkfs.exfat -s 4096 /dev/''device''}} |
||
* [[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''}} |
* [[ZFS#Advanced Format ディスク|ZFS]]: {{bc|1=# zpool create -o ashift=12 ''poolname'' raidz ''device0'' … ''deviceN''}} |
||
343行目: | 266行目: | ||
* [https://www.anandtech.com/Show/Index/2888 Western Digital’s Advanced Format: The 4K Sector Transition Begins] |
* [https://www.anandtech.com/Show/Index/2888 Western Digital’s Advanced Format: The 4K Sector Transition Begins] |
||
* [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 のアライメント |
+ | * HDD のアライメントを間違えると、読み込み/書き込みのパフォーマンスが劣化します。具体的な例は [https://linuxconfig.org/linux-wd-ears-advanced-format] を見てください。 |
− | {{TranslationStatus|Advanced Format| |
+ | {{TranslationStatus|Advanced Format|2024-11-04|819836}} |
2024年11月4日 (月) 18:12時点における最新版
ハードディスクドライブ (HDD) における最小の物理記憶単位はセクタです。ソリッドステートドライブ (SSD) ではページがこれと等価です。[1] ストレージデバイスのファームウェアは物理セクタを、ソフトウェアが操作できる論理セクタに抽象化します。論理セクタのサイズは、ディスク上のアドレッシング可能な最小単位のサイズとなります。
- 物理セクタサイズ
- これは、物理ストレージデバイスがアトミックに書き込めるとする最小単位です。HDD の場合、これはプラッタにおけるセクタの実際のサイズです。従来、HDD の物理セクタサイズは 512 バイトでした。つまり、各セクタは 512 バイトのデータを格納できることを意味します。しかし、アドバンスドフォーマット HDD の登場により、物理セクタサイズは 4096 バイト (4 KiB) に増え、誤り訂正機能が向上しました。SSD は NAND フラッシュメモリの実際のページサイズ (典型的には 4 KiB から 16 KiB ) を公開せず、報告される物理セクタサイズは論理セクタサイズと同じです。NVMe SSD の場合は、利用可能であれば、Atomic Write Unit Power Fail (AWUPF) パラメータの値が使用されます。
- 論理セクタサイズ
- 論理セクタサイズ (別名、オペレーティングシステムセクタサイズ) は、オペレーティングシステムとアプリケーションに公開されるセクタサイズを表します。ソフトウェアのレベルでストレージデバイスに読み書きする際に用いられるセクタサイズです。論理セクタサイズは物理セクタサイズと異なる可能性があります。例えば、物理セクタサイズが 4096 バイトのアドバンスドフォーマット 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 の出力からも得られます。
目次
セクタサイズを変更する
一部の 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 と #ファイルシステム を見てください。
アドバンスドフォーマットハードディスクドライブ
hdparm ユーティリティを使うことで、アドバンスドフォーマットハードディスクドライブのセクタサイズを変更できるかどうか調べることができます:
# hdparm -I /dev/sdX | grep 'Sector size:'
Sector Configuration Log に複数の論理セクタサイズが表示されるアドバンスドフォーマットドライブ では、それらのリストが表示されます:
Logical Sector size: 512 bytes [ Supported: 512 4096 ] Physical Sector size: 4096 bytes
複数の変更可能な論理セクタサイズをサポートしていないハードディスクドライブでは、現在のセクタサイズだけが報告されます。例えば、アドバンスドフォーマット 512e ドライブの場合:
Logical Sector size: 512 bytes Physical Sector size: 4096 bytes
これらの種類のドライブで最適なパフォーマンスを得るには、#dm-crypt セクタサイズまたは#ファイルシステムのブロックサイズが少なくとも 4096 バイトであり、かつ 4096 バイト境界にアライメントされている必要があります。
アドバンスドフォーマット 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
はそのフォーマットのパフォーマンスを示します: degraded、good、better、best のどれかです。
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
この処理には数秒しかかからないはずです。
2020年より前のドライブは、POST の最後に "security freeze" を発行する非標準的なシステムで使用する場合、Format NVM
コマンドをブロックする可能性があります。[3][4] nvme format
が失敗する場合、システムをサスペンドしてみて (S0ix ではなく S3 スリープを使用してください)、復帰後に nvme format
をもう一度実行してみてください。[5][6]
メーカー固有のプログラムを使う
上記の汎用ユーティリティでセクタサイズを変更できない場合、ドライブのメーカーのユーティリティを使用すれば変更できる場合があります。
Intel
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分かかります。その後、ドライブは 4 KiB ネイティブセクタサイズを使用するようになります。
パーティションのアライメント
パーティションを正しくアライメントすることで、読み込み・変更・書き込みの過剰なサイクルを回避できます。家庭用のコンピュータでは、各パーティションの開始位置とサイズを 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進接頭辞で指定するようにしてください。
checkpartitionsalignment.sh は、Parted と awk を使ってアライメントをチェックする bash スクリプトです。
dm-crypt
Cryptsetup 2.4.0 では、luksFormat
は自動的に LUKS2 フォーマットに最適な暗号化セクタサイズを検出します [8]。
しかし、これが機能するには、デバイスが正しいデフォルトセクタサイズを報告する必要があります。#セクタサイズを変更する を見てください。
cryptsetup luksFormat
を使用したあとに、LUKS2 ボリュームによって使用されているセクタサイズを確認できます:
# cryptsetup luksDump device | grep sector
デフォルトのセクタサイズが正しくない場合、4 KiB のセクタサイズをそれ以外のデフォルトのオプションで 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
ファイルシステム
4Kn ディスク (物理セクタサイズが 4096 バイト、論理セクタサイズが 4096 バイト) では、全ての mkfs ユーティリティは 4096 バイトのブロックサイズを使用します。512e ディスク (物理セクタサイズが 4096、論理セクタサイズが 512 バイト) と 512n ディスク (物理セクタサイズが 512 バイト、論理セクタサイズが 512 バイト) では、mkfs ユーティリティはそれぞれ異なる動作をします。
mkfs ユーティリティ | 512e ディスク | 512n ディスク |
---|---|---|
mkfs.bcachefs | 4096 | 512 |
mkfs.btrfs(8) | 4096 | 4096 |
mkfs.exfat(8) | 512 | 512 |
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 |
- mkfs.ext4(8) はデフォルトで、512 MiB 未満のファイルシステムに対しては 1024 バイトセクタを、512 MiB 以上のファイルシステムに対しては 4096 バイトのセクタを使用します。
ストレージデバイスが正しいセクタサイズを報告しない場合は、物理セクタサイズに応じてパーティションを明示的にフォーマットできます。
特に、ファームウェアによって管理されている シングル磁気記録方式 (Singled Magnetic Recording: SMR) ドライブは、物理セクタサイズが 4096 バイトの場合に 512 バイトの論理セクタサイズを使用すると、深刻な悪影響を受けます。これらのドライブは、パフォーマンスの異なる書き込み領域が存在し、アイドル時にはリマッピングの再割当てが発生しますが、高負荷なアクティブ書き込み (例: RAID resilvering、バックアップ、小さなファイルを大量に書き込む、rsync など) 時には、ファイルシステムのセクタサイズが異なる場合に書き込み速度が1桁の MB/s まで落ちる可能性があります。これは、高パフォーマンスな書き込み領域が枯渇し、単一の領域上でセクタの変換レイヤに高負荷がかかるからです。
以下は、4096 バイトのセクタを明示的に設定する例です:
- Bcachefs:
# bcachefs format --block_size=4096 /dev/device0 /dev/deviceN --replicas=n
- exFAT:
# mkfs.exfat -s 4096 /dev/device
- 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 device0 … deviceN
参照
- Western Digital’s Advanced Format: The 4K Sector Transition Begins
- White paper entitled "Advanced Format Technology."
- HDD のアライメントを間違えると、読み込み/書き込みのパフォーマンスが劣化します。具体的な例は [9] を見てください。