这似乎是关于不同机器之间逻辑卷的映射设备的扇区大小的问题。
更具体地说,我想知道是否以及如何配置与逻辑卷对应的映射设备的扇区大小。
这是问题的描述,比较了两台机器。
机器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
返回 512kpartx -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-mytestlv
512?这是否会影响组中或系统上的所有逻辑卷?
我看不到任何与lvcreate
此lvdisplay
相关的选项。
答案1
据我所知,默认扇区大小来自底层硬件。
因此,在机器 1 上,底层磁盘显然位于高级格式 512e模式,可能是因为机器 1 的磁盘控制器本身无法使用 4k 扇区。另一种可能性是,在机器 1 上,其中一个物理卷MyVolumeGroup
无法支持 4k 扇区大小,因此整个卷组必须使用其能力最差的磁盘可以支持的扇区大小。
另一方面,机器 2 及其所有物理卷MyVolumeGroup
似乎完全能够原生使用 4k 扇区大小(高级格式 4Kn)。它默认这样做,因为这比模拟旧的 512 字节扇区大小更有效。