論理セクタサイズを4kに変更

論理セクタサイズを4kに変更

何度も質問しましたが、確かな答えはありません。論理ブロックサイズを512eから4k(物理ブロックサイズ)に変更できますか?

使用されたソリューションはhdparm --set-sector-size 4096qemu / kvmでは機能しないため、私が持っていないスペアデバイスを使用しないと実際にテストすることはできません。

Linuxカーネルが512eの代わりに4kセクタサイズに切り替えるように説得できますか?何らかの方法で仮想マシンでテストすることをお勧めします。

答え1

HDDをデフォルトの4kセクタに変更すると、少なくともWD Red Plus 14TBドライブでは動作しますが、すべてのデータ損失。データは実際には消去されませんでしたが、パーティションテーブルとファイルシステムは間違ったLBAの場所にあるため、変更後に見つかりません。

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

このコマンドはドライブをデフォルトの4kセクタに変更します。変更はドライブを再起動しても保持されますが、後で 512 を設定することで元に戻すことができます。今再起動ディスク調整後。再起動後にのみドライブパーティションを分割し、データを追加します(gdiskは4096/4096セクタサイズを表示します)。

  • チューニング後に直接ドライブにアクセスしようとすると、カーネルに読み取りエラーが発生します。代わりにコントローラの再スキャンやホットスワップを使用できますが、ほとんどの人にとってシステムを再起動するのが最も簡単です。

  • これを試すと問題が発生する可能性がありますDD512バイトのセクタサイズで作成されたすべてのディスクイメージ(たとえば、展開のインストールに使用される.isoファイル)

  • NVME SSDの場合、このユーティリティを使用してLBAセクタサイズを変更できますnvmenvme-cliDebianベースのditrosパッケージにあります)。

答え2

論理ブロックサイズを512eから4k(物理ブロックサイズ)に変更できますか?

ドライブに論理ブロックのサイズを変更するように要求できます。それがまさにそのことですhdparm --set-sector-size 4096

これがドライブに実装されるという事実は、2つの実質的な結果をもたらします。

  • ドライブがサポートしている場合にのみ機能します(例:ジョン・マイリング 説明する);
  • これはドライブ自体にアクセスする必要があるため、仮想マシンでのテストは、仮想マシンにターゲットドライブへのフルアクセスが許可されている場合にのみ機能します。

答え3

そうそうできます。ただし、オペレーティングシステムレベルではなくハードドライブレベルでシステムを変更する必要があります。オペレーティングシステムはこれを処理します。

覚えておくべき次の問題は、ドライブにすでにデータが含まれている場合、これらの操作によってパーティションテーブル(MBRとGPT)が破壊されることです。

私が言うことを確認する簡単な例は、Samsung S1 Miniドライブ(1kセクタ)を標準ドライブ(通常512バイトエミュレーション)にコピーすることです。

今日のドライブは主に4Kのデフォルトサイズで動作するため、ドライブの製造元がそのオプションを提供していない場合は、必要な動作を生成するためにファームウェアをパッチする必要があります(私はできませんでした)。

これらのドライブを直接検索すると、メーカーは512に「縮小」せずに物理4kを論理4kに変換するドライブにラベルを貼り付けることがわかりました。セクタの読み取りが失敗したときに読み取りエラーをすばやく返す機能にも同じことが当てはまります(RAIDアレイにとって重要)。これはファームウェアの問題です。一般的なエンドユーザードライブでは、ドライブは長時間繰り返し読み込み、最終的にエラー状態を返します。

おそらく、この変換を可能にするコントローラカードを2つの間に置くと、問題が解決する可能性があります。ただ考えるだけです。

この問題をどのように解決したか教えてください。興味深い問題です!

答え4

コメントによれば、msdosスタイルのパーティション化(「UEFI / GPTを使用しない」)を使用したいと思われ、おそらくmsdosパーティションの最大パーティションサイズとディスク使用量を可能にするために4Kセクタサイズを使用したいと思います。 Linuxでこれを行う1つの方法は、ループバックデバイスを使用してさまざまなセクタサイズの基本ブロックデバイスのビューを提供することです。

# truncate -s 20T disk.20T.img
# parted -s disk.20T.img mklabel msdos p mkpart primary 16M 10TB p
Model:  (file)
Disk /home/ubuntu/disk.20T.img: 22.0TB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags: 

Number  Start  End  Size  Type  File system  Flags

Error: partition length of 19531218944 sectors exceeds the msdos-partition-table-imposed maximum of 4294967295

ここでは、セクタサイズが512バイトの20Tbディスクに10Tb msdosパーティションを作成できませんでした。ただし、ディスクにループバックデバイスを使用してセクタサイズを4Kに設定すると、10 Tb msdosパーティションが作成され、パーティション全体を使用してEXT4パーティションを作成できます。


# losetup --sector-size 4096 --show -f disk.20T.img
/dev/loop18
# blockdev --getss --getpbsz /dev/loop18
4096
4096
# parted -s /dev/loop18 mklabel msdos mkpart primary 16M 10TB p
Model: Loopback device (loopback)
Disk /dev/loop18: 22.0TB
Sector size (logical/physical): 4096B/4096B
Partition Table: msdos
Disk Flags: 

Number  Start   End      Size     Type     File system  Flags
 1      15.7MB  10000GB  10000GB  primary               lba
# kpartx -av /dev/loop18
add map loop18p1 (253:4): 0 19531218944 linear 7:18 30720
# mkfs.ext4 /dev/mapper/loop18p1 
mke2fs 1.46.5 (30-Dec-2021)
Discarding device blocks: done                            
Creating filesystem with 2441402368 4k blocks and 305176576 inodes
Filesystem UUID: 6aa698fa-1cb7-4aa6-9ba6-ebc493d40808
Superblock backups stored on blocks: 
    32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
    4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968, 
    102400000, 214990848, 512000000, 550731776, 644972544, 1934917632

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (262144 blocks): done
Writing superblocks and filesystem accounting information: done       
# mount /dev/mapper/loop18p1 /mnt
# df -h /mnt
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/loop18p1  9.1T   28K  8.6T   1% /mnt

physical_block_size=4096QEMU仮想マシンでこの機能を使用するには、属性を使用し、ディスクの物理的および論理的なセクタサイズを指定するディスクを追加できますlogical_block_size=4096

便宜上、テストに使用したコマンドは次のとおりです。必要なブータブルISOを使用できます。

qemu-system-x86_64 -name 'test live cd: bios' -m 2048 -serial stdio -rtc base=localtime \
  -vga std --enable-kvm -cdrom /media/ubuntu/STORAGE/isos/lubuntu-18.04-desktop-i386.iso \
  -boot d -device virtio-scsi-pci,id=scsi1,bus=pci.0 \
  -drive file=/tmp/disk.20T.img,if=none,id=drive-virtio-disk1 \
  -device scsi-hd,bus=scsi1.0,drive=drive-virtio-disk1,id=virtio-scsi-pci1,physical_block_size=4096,logical_block_size=4096

これで、仮想マシンにインストールして4Kドライブを使用して実行したいすべてのテストを実行できます。同様に、オペレーティングシステムが512バイトから4Kセクタのサイズでブロックデバイスのリアルタイム変更を処理する方法をテストしたい場合は、そのシミュレーションをQEMUに記述しない限り幸運ではありません。とにかく質問を明確にすることが役に立つと思います。

関連情報