「アドバンスドフォーマット」の版間の差分
(TranslationStatus) |
(同期) |
||
| (2人の利用者による、間の9版が非表示) | |||
| 2行目: | 2行目: | ||
[[en:Advanced Format]] |
[[en:Advanced Format]] |
||
[[es:Advanced Format]] |
[[es:Advanced Format]] |
||
| + | [[hu: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行目: | 45行目: | ||
ドライブのセクタサイズの変更は、低レベルなフォーマットが必要になる複雑なプロセスです。代替案として、ドライブ上にファイルシステムを作成する際にセクタサイズを手動で指定して最適なパフォーマンスを得ることができます。[[#dm-crypt]] と [[#ファイルシステム]] を見てください。 |
ドライブのセクタサイズの変更は、低レベルなフォーマットが必要になる複雑なプロセスです。代替案として、ドライブ上にファイルシステムを作成する際にセクタサイズを手動で指定して最適なパフォーマンスを得ることができます。[[#dm-crypt]] と [[#ファイルシステム]] を見てください。 |
||
| − | === |
+ | === アドバンスドフォーマットハードディスクドライブ === |
| − | [[hdparm]] ユーティリティを使うことで、 |
+ | [[hdparm]] ユーティリティを使うことで、アドバンスドフォーマットハードディスクドライブのセクタサイズを変更できるかどうか調べることができます: |
# hdparm -I /dev/sd''X'' {{!}} grep 'Sector size:' |
# hdparm -I /dev/sd''X'' {{!}} grep 'Sector size:' |
||
| 50行目: | 53行目: | ||
{{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行目: | 60行目: | ||
}} |
}} |
||
| − | 複数の変更可能な論理セクタサイズをサポートしていないハードディスクドライブでは、現在のセクタサイズだけが報告されます。例えば、 |
+ | 複数の変更可能な論理セクタサイズをサポートしていないハードディスクドライブでは、現在のセクタサイズだけが報告されます。例えば、アドバンスドフォーマット 512e ドライブの場合: |
{{bc| |
{{bc| |
||
| 66行目: | 69行目: | ||
これらの種類のドライブで最適なパフォーマンスを得るには、[[#dm-crypt]] セクタサイズまたは[[#ファイルシステム]]のブロックサイズが少なくとも 4096 バイトであり、かつ 4096 バイト境界にアライメントされている必要があります。 |
これらの種類のドライブで最適なパフォーマンスを得るには、[[#dm-crypt]] セクタサイズまたは[[#ファイルシステム]]のブロックサイズが少なくとも 4096 バイトであり、かつ 4096 バイト境界にアライメントされている必要があります。 |
||
| − | + | アドバンスドフォーマット 4Kn ドライブの場合: |
|
{{bc| |
{{bc| |
||
| 75行目: | 78行目: | ||
4Kn ドライブでは、何も設定せずとも最適な設定になっており、パーティショニングやフォーマットの際に特別な考慮は必要ありません。そのまま使用することができます。 |
4Kn ドライブでは、何も設定せずとも最適な設定になっており、パーティショニングやフォーマットの際に特別な考慮は必要ありません。そのまま使用することができます。 |
||
| − | SATA HDD が複数の論理セクタサイズとオプションの ATA コマンド {{ic|SET SECTOR CONFIGURATION EXT}} をサポートしている場合 ( |
+ | SATA HDD が複数の論理セクタサイズとオプションの ATA コマンド {{ic|SET SECTOR CONFIGURATION EXT}} をサポートしている場合 (基本的に「エンタープライズ」クラスと呼ばれるような HDD でのみ利用できます)、''hdparm'' を使ってサポートされているセクタサイズから選択することができます。論理セクタサイズを 4096 バイト (つまり、4Kn) に設定するには、以下を実行してください: |
# hdparm --set-sector-size 4096 --please-destroy-my-drive /dev/sd''X'' |
# hdparm --set-sector-size 4096 --please-destroy-my-drive /dev/sd''X'' |
||
| 90行目: | 93行目: | ||
ほとんどの[[ソリッドステートドライブ]] (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行目: | 100行目: | ||
}} |
}} |
||
| − | * {{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行目: | 111行目: | ||
0 + 512 0 2 |
0 + 512 0 2 |
||
1 - 4096 0 1 |
1 - 4096 0 1 |
||
| − | .. |
||
}} |
}} |
||
| + | |||
| + | {{Warning|1=4K セクタをサポートしていると報告するが、有効化すると散発的に (特に大きなランダム読み込み負荷が掛かる時に) 不安定になるような NVMe SSD もあります。[https://bbs.archlinux.org/viewtopic.php?pid=2238884#p2238884][https://halestrom.net/darksleep/blog/054_nvme/] 失ったらまずいデータを保存する前に、新しい設定を徹底的にテストしてください。この問題が発生した場合は、512 セクタの設定に戻せば大丈夫です。}} |
||
論理ブロックアドレスサイズを変更するには、{{ic|nvme format}} を使い、{{ic|--lbaf}} パラメータで好ましい値を指定してください: |
論理ブロックアドレスサイズを変更するには、{{ic|nvme format}} を使い、{{ic|--lbaf}} パラメータで好ましい値を指定してください: |
||
| 129行目: | 133行目: | ||
{{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:// |
+ | 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://forums.sandisk.com/t/sn750-cannot-format-using-the-nvme-command/253702] |
=== メーカー固有のプログラムを使う === |
=== メーカー固有のプログラムを使う === |
||
| 137行目: | 141行目: | ||
==== Intel ==== |
==== Intel ==== |
||
| + | Intel の場合は、[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}}) で {{ic|1=-set PhysicalSectorSize=4096}} オプションを使用してください。報告される物理セクササイズのみが変わり、論理セクタサイズは同じままであることに注意してください。 |
||
| − | {{Out of date|Intel の SSD 事業が SK Hynix に買収されて Solidigm ブランドになって以降、Intel MAS は SSD を管理するために使用できなくなりました (Optane 製品を除く)。Solidigm は、Intel MAS が提供していた機能を持つ {{AUR|solidigm-sst-storage-tool-cli}} を提供しています。[[ソリッドステートドライブ/NVMe#Intel/Solidigm]] を参照してください。}} |
||
| + | {{Note|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 ==== |
||
| 160行目: | 164行目: | ||
# 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 ネイティブセクタサイズを使用するようになります。 |
== パーティションのアライメント == |
== パーティションのアライメント == |
||
| 172行目: | 176行目: | ||
** ''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 == |
||
| 178行目: | 184行目: | ||
しかし、これが機能するには、デバイスが正しいデフォルトセクタサイズを報告する必要があります。[[#セクタサイズを変更する]] を見てください。 |
しかし、これが機能するには、デバイスが正しいデフォルトセクタサイズを報告する必要があります。[[#セクタサイズを変更する]] を見てください。 |
||
| + | |||
| + | {{Tip|Cryptsetup は、暗号化パフォーマンスのためにドライブのセクササイズを 4096 バイトに変更することを強く推奨しています。[https://cdn.kernel.org/pub/linux/utils/cryptsetup/v2.8/v2.8.0-ReleaseNotes]}} |
||
{{ic|cryptsetup luksFormat}} を使用したあとに、LUKS2 ボリュームによって使用されているセクタサイズを確認できます: |
{{ic|cryptsetup luksFormat}} を使用したあとに、LUKS2 ボリュームによって使用されているセクタサイズを確認できます: |
||
| 183行目: | 191行目: | ||
# 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'' |
||
| 195行目: | 203行目: | ||
}} |
}} |
||
| − | {{Note| |
+ | {{Note|実際のドライブが 4 KiB 物理セクタを使用しているときにこのコマンドが失敗する可能性がある理由については、[https://gitlab.com/cryptsetup/cryptsetup/-/issues/585 cryptsetup issue 585] を見てください。}} |
デバイスを間違ったセクタサイズで暗号化してしまった場合、以下のコマンドでそのデバイスを再暗号化できます: |
デバイスを間違ったセクタサイズで暗号化してしまった場合、以下のコマンドでそのデバイスを再暗号化できます: |
||
| 205行目: | 213行目: | ||
== ファイルシステム == |
== ファイルシステム == |
||
| + | 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}} || {{O|[https://github.com/koverstreet/bcachefs/issues/765 512]}} |
||
| + | |- |
||
| + | | {{man|8|mkfs.btrfs}} || {{G|4096}} || {{G|4096}} |
||
| + | |- |
||
| + | | {{man|8|mkfs.exfat}} || {{G|4096}} || {{O|512}} |
||
| + | |- |
||
| + | | {{man|8|mkfs.ext4}} || {{G|4096}}<sup>1</sup> || {{G|4096}}<sup>1</sup> |
||
| + | |- |
||
| + | | {{man|8|mkfs.fat}} || {{R|512}} || {{O|512}} |
||
| + | |- |
||
| + | | {{man|8|mkfs.f2fs}} || {{G|4096}} || {{G|4096}} |
||
| + | |- |
||
| + | | {{man|8|mkfs.jfs}} || {{G|4096}} || {{G|4096}} |
||
| + | |- |
||
| + | | {{man|8|mkfs.nilfs2}} || {{G|4096}} || {{G|4096}} |
||
| + | |- |
||
| + | | {{man|8|mkfs.ntfs}} || {{R|[https://github.com/tuxera/ntfs-3g/issues/133 512]}} || {{O|512}} |
||
| + | |- |
||
| + | | {{man|8|mkfs.reiserfs|url=https://manpages.debian.org/unstable/reiserfsprogs/mkfs.reiserfs.8.en.html}} || {{G|4096}} || {{G|4096}} |
||
| + | |- |
||
| + | | {{man|8|mkfs.udf}} || {{R|512}} || {{O|512}} |
||
| + | |- |
||
| + | | {{man|8|mkfs.xfs}} || {{G|4096}} || {{O|512}} |
||
| + | |- |
||
| + | | {{man|8|mkswap}} || {{G|4096}} || {{G|4096}} |
||
| + | |- |
||
| + | | {{man|8|zpool-create|url=}} || {{R|512}} || {{O|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''}} |
| + | * [https://openzfs.github.io/openzfs-docs/Project%20and%20Community/FAQ.html#advanced-format-disks ZFS]: {{bc|1=# zpool create -o ashift=12 ''poolname'' raidz ''device0'' … ''deviceN''}} |
||
| + | |||
| + | == 既知の問題 == |
||
| + | |||
| + | === Syslinux と FAT === |
||
| + | |||
| + | [[Syslinux]] は 512 バイト以外のセクタサイズの FAT ファイルシステムをサポートしていません。 |
||
| + | |||
| + | === systemd-homed === |
||
| + | |||
| + | [[systemd-homed]] は、4096 バイトセクタサイズの 4Kn ドライブと LUKS 上では動作しません。Systemd のイシュー [https://github.com/systemd/systemd/issues/30393 30393] と [https://github.com/systemd/systemd/issues/30394 30394] を参照してください。 |
||
== 参照 == |
== 参照 == |
||
| 232行目: | 281行目: | ||
* [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|2025-06-29|839284}} |
2025年6月29日 (日) 15:19時点における最新版
ハードディスクドライブ (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 をサポートしている場合 (基本的に「エンタープライズ」クラスと呼ばれるような HDD でのみ利用できます)、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 コマンドをブロックする可能性があります。[5][6] nvme format が失敗する場合、システムをサスペンドしてみて (S0ix ではなく S3 スリープを使用してください)、復帰後に nvme format をもう一度実行してみてください。[7][8]
メーカー固有のプログラムを使う
上記の汎用ユーティリティでセクタサイズを変更できない場合、ドライブのメーカーのユーティリティを使用すれば変更できる場合があります。
Intel
Intel の場合は、Intel Memory and Storage (MAS) Tool (intel-mas-cli-toolAUR) で -set PhysicalSectorSize=4096 オプションを使用してください。報告される物理セクササイズのみが変わり、論理セクタサイズは同じままであることに注意してください。
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 フォーマットに最適な暗号化セクタサイズを検出します [10]。
しかし、これが機能するには、デバイスが正しいデフォルトセクタサイズを報告する必要があります。#セクタサイズを変更する を見てください。
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) | 4096 | 512 |
| mkfs.ext4(8) | 40961 | 40961 |
| mkfs.fat(8) | 512 | 512 |
| mkfs.f2fs(8) | 4096 | 4096 |
| 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
既知の問題
Syslinux と FAT
Syslinux は 512 バイト以外のセクタサイズの FAT ファイルシステムをサポートしていません。
systemd-homed
systemd-homed は、4096 バイトセクタサイズの 4Kn ドライブと LUKS 上では動作しません。Systemd のイシュー 30393 と 30394 を参照してください。
参照
- Western Digital’s Advanced Format: The 4K Sector Transition Begins
- White paper entitled "Advanced Format Technology."
- HDD のアライメントを間違えると、読み込み/書き込みのパフォーマンスが劣化します。具体的な例は [12] を見てください。