LVM 和设备映射器:逻辑卷设备扇区大小

LVM 和设备映射器:逻辑卷设备扇区大小

这似乎是关于不同机器之间逻辑卷的映射设备的扇区大小的问题。

更具体地说,我想知道是否以及如何配置与逻辑卷对应的映射设备的扇区大小。

这是问题的描述,比较了两台机器。

机器1

mytestlv我在名为 的卷组中的逻辑卷中有一个完整的磁盘映像MyVolumeGroup

该磁盘映像有自己的分区表(完全独立于存储它的实际磁盘)。

例如,fdisk /dev/mapper/MyVolumeGroup-mytestlv显示此:

Disk /dev/mapper/MyVolumeGroup-mytestlv: 30 GiB, 32212254720 bytes, 62914560 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: gpt
Disk identifier: ...

Device                                    Start      End  Sectors Size Type
/dev/mapper/MyVolumeGroup-mytestlv-part1    2048     4095     2048   1M BIOS boot
/dev/mapper/MyVolumeGroup-mytestlv-part2    4096  4198399  4194304   2G Linux swap
/dev/mapper/MyVolumeGroup-mytestlv-part3 4198400 62914526 58716127  28G Linux filesystem

如果我需要访问该磁盘映像的某个分区上的数据,我可以使用kpartx并安装该分区。

kpartx -a /dev/mapper/MyVolumeGroup-mytestlv创建这些设备文件,可用于在该磁盘映像中安装分区,例如:

/dev/mapper/MyVolumeGroup-mytestlvl
/dev/mapper/MyVolumeGroup-mytestlv2
/dev/mapper/MyVolumeGroup-mytestlv3

机器2

现在将其复制到另一台机器上(内容完全相同,两者的校验/dev/mapper/MyVolumeGroup-mytestlv和相同)。

使用配置的块大小,fdisk /dev/mapper/MyVolumeGroup-mytestlv显示如下:

/dev/mapper/MyVolumeGroup-mytestlv: 30 GiB, 32212254720 bytes, 7864320 sectors
Units: sectors of 1 * 4096 = 4096 bytes
Sector size (logical/physical): 4096 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: dos
Disk identifier: 0x00000000

Device                                  Boot Start     End Sectors Size Id Type
/dev/mapper/MyVolumeGroup-mytestlv-part1          1 7864319 7864319  30G ee GPT

差异

逻辑扇区大小在机器 1 上为 512,但在机器 2 上为 4096。

在机器 1 上,blockdev --getss /dev/mapper/MyVolumeGroup-mytestlv返回 512。

在机器 2 上,blockdev --getss /dev/mapper/MyVolumeGroup-mytestlv返回 4096。

解决方法

在机器 2 上,将扇区大小强制为 512 可fdisk帮助其正确查看分区表。

fdisk --sector-size 512 /dev/mapper/MyVolumeGroup-mytestlv
Disk /dev/mapper/MyVolumeGroup-mytestlv: 30 GiB, 32212254720 bytes, 62914560 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: gpt
Disk identifier: ...

Device                                    Start      End  Sectors Size Type
/dev/mapper/MyVolumeGroup-mytestlv-part1    2048     4095     2048   1M BIOS boot
/dev/mapper/MyVolumeGroup-mytestlv-part2    4096  4198399  4194304   2G Linux swap
/dev/mapper/MyVolumeGroup-mytestlv-part3 4198400 62914526 58716127  28G Linux filesystem

不幸的是,其他工具(例如sfdisk或 )kpartx似乎没有这些选项。

如果我从该 LV 显式创建一个环回设备,则该环回设备的扇区大小为 512,并且一切正常(事实上,losetup该设备的版本不太旧,具有显式扇区大小选项)。后losetup --show -f /dev/mapper/MyVolumeGroup-mytestlv

  • blockdev --getss /dev/loop0返回 512
  • kpartx -a /dev/loop0创造/dev/mapper/loop0p{1,2,3}

该扇区大小在哪里配置?

我希望能够使用fdisk, sfdisk,kpartx而无需依赖额外的losetup.

在机器 2 上,cat /sys/block/dm-2/queue/hw_sector_size返回 4096 (/dev/mapper/MyVolumeGroup-mytestlv实际上是到 的软链接/dev/dm-2)。我尝试使用 来更改此设置echo 512 > /sys/block/dm-2/queue/hw_sector_size,但这似乎不可能。

  • 有没有办法告诉 LVM 我希望对应的设备的扇区大小为/dev/mapper/MyVolumeGroup-mytestlv512?

  • 这是否会影响组中或系统上的所有逻辑卷?

我看不到任何与lvcreatelvdisplay相关的选项。

答案1

据我所知,默认扇区大小来自底层硬件。

因此,在机器 1 上,底层磁盘显然位于高级格式 512e模式,可能是因为机器 1 的磁盘控制器本身无法使用 4k 扇区。另一种可能性是,在机器 1 上,其中一个物理卷MyVolumeGroup无法支持 4k 扇区大小,因此整个卷组必须使用其能力最差的磁盘可以支持的扇区大小。

另一方面,机器 2 及其所有物理卷MyVolumeGroup似乎完全能够原生使用 4k 扇区大小(高级格式 4Kn)。它默认这样做,因为这比模拟旧的 512 字节扇区大小更有效。

相关内容