很多次被问到,但没有确凿的答案:能否将逻辑块大小从 512e 更改为 4k(物理块大小)?
使用的解决方案hdparm --set-sector-size 4096
在 qemu/kvm 下不起作用,因此如果不使用我没有的备用设备,我无法真正测试它。
能否说服 Linux 内核切换到 4k 扇区大小而不是 512e?最好以某种方式,可以在虚拟机中进行测试。
答案1
将 HDD 更改为原生 4k 扇区至少适用于 WD Red Plus 14 TB 硬盘,但丢失所有数据。数据实际上并未被擦除,但分区表和文件系统在更改后无法找到,因为它们现在的 LBA 位置不正确。
hdparm --set-sector-size 4096 --please-destroy-my-drive /dev/sdX
此命令将您的驱动器更改为本机 4k 扇区。该更改在驱动器重新启动后仍然存在,但您可以稍后通过设置 512 来恢复它。立即重启调整磁盘后。仅在重新启动后才尝试对驱动器进行分区并添加数据(gdisk 将显示 4096/4096 扇区大小)。
调整后尝试直接访问驱动器时,内核出现读取错误。可以使用控制器重新扫描或热插拔来代替,但对于大多数人来说,重新启动机器是最简单的。
如果您尝试这样做,预计会出现问题DD以 512 字节扇区大小创建的任何磁盘映像(例如用于安装发行版的 .iso 文件)。
对于 NVME SSD,可以使用该实用程序更改 LBA 扇区大小
nvme
(在nvme-cli
基于 Debian 的 ditros 上的软件包中)。
答案2
答案3
是的你可以。但是您需要在硬盘驱动器级别而不是操作系统级别修改系统。操作系统会处理它。
您必须记住的下一个问题是,如果该驱动器已包含数据,则此类操作将破坏您的分区表(MBR 和 GPT)。
验证我所说内容的一个简单示例是将 Samsung S1 Mini 驱动器(1k 扇区)复制到标准驱动器(通常为 512 字节模拟)。
由于今天的驱动器主要运行在 4k 本机大小上,如果您的驱动器制造商没有为您提供该选项,您将必须修补固件(我不能这样做)才能生成所需的行为。
当我自己搜索此类驱动器时,我注意到制造商对驱动器进行了不错的标记,这些驱动器将物理 4k 转换为逻辑 4k,而无需“缩小”至 512。这同样适用于在扇区读取失败时快速返回读取错误的能力(重要)对于 RAID 阵列)。这只是一个固件问题。在典型的最终用户驱动器上,驱动器会重复读取大量时间,然后最终返回错误条件。
也许在两者之间放置一个允许这种转换的控制器卡可以解决这个问题 - 只是一个想法。
请让我们知道您是如何解决这个问题的 - 这是一个有趣的问题!
答案4
从评论来看,您似乎想要使用 msdos 样式分区(“不使用 UEFI/GPT”),并且大概您想要使用 4K 扇区大小来允许 msdos 分区的最大分区大小和磁盘使用量。在 Linux 中执行此操作的一种方法是使用环回设备来提供具有不同扇区大小的底层块设备的视图。
# 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 时,会创建 10Tb 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=4096
如果您想在 QEMU 虚拟机中使用此功能,您可以使用属性和来添加指定磁盘物理和逻辑扇区大小的磁盘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,否则您就不走运了。无论如何,我认为澄清这个问题会有所帮助。