![设备映射器表对齐不一致](https://linux22.com/image/104096/%E8%AE%BE%E5%A4%87%E6%98%A0%E5%B0%84%E5%99%A8%E8%A1%A8%E5%AF%B9%E9%BD%90%E4%B8%8D%E4%B8%80%E8%87%B4.png)
在日记中,我收到诸如以下内容:
Jan 27 18:23:08 tara kernel: device-mapper: table: 254:2: adding target device sdb2 caused an alignment inconsistency: physical_block_size=4096, logical_block_size=512, alignment_offset=0, start=33553920
Jan 27 18:23:08 tara kernel: device-mapper: table: 254:2: adding target device sdb2 caused an alignment inconsistency: physical_block_size=4096, logical_block_size=512, alignment_offset=0, start=33553920
Jan 27 18:23:08 tara kernel: device-mapper: table: 254:3: adding target device sdb2 caused an alignment inconsistency: physical_block_size=4096, logical_block_size=512, alignment_offset=0, start=34393292288
Jan 27 18:23:08 tara kernel: device-mapper: table: 254:3: adding target device sdb2 caused an alignment inconsistency: physical_block_size=4096, logical_block_size=512, alignment_offset=0, start=34393292288
我该如何解释这一点:
- 这里究竟什么地方对齐不正确?
- 数字从哪里来
start=
?
如何才能使对齐方式一致?
更多信息:
[ravi@tara ~]$ uname -a
Linux tara 4.8.17-1-MANJARO #1 SMP PREEMPT Mon Jan 9 10:24:58 UTC 2017 x86_64 GNU/Linux
[ravi@tara ~]$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 3.7T 0 disk
sdb 8:16 0 3.7T 0 disk
├─sdb1 8:17 0 200M 0 part
└─sdb2 8:18 0 3.7T 0 part
├─usb-eMMC_backup 254:2 0 32G 0 lvm
└─usb-ark 254:3 0 3.6T 0 lvm /ark
sdc 8:32 1 7.5G 0 disk
└─sdc1 8:33 1 7.5G 0 part
mmcblk0 179:0 0 29.1G 0 disk
├─mmcblk0p1 179:1 0 200M 0 part /mnt/esp
└─mmcblk0p2 179:2 0 28.9G 0 part
├─lvm-root 254:0 0 24G 0 lvm /
└─lvm-swap 254:1 0 4.9G 0 lvm [SWAP]
mmcblk0boot0 179:8 0 4M 1 disk
mmcblk0boot1 179:16 0 4M 1 disk
mmcblk0rpmb 179:24 0 4M 0 disk
[ravi@tara ~]$
答案1
该警告表明分区和 LVM 设备可能未对齐,如检查中所定义的blk_stack_limits。您可以检查输出的值lsblk -t /dev/sdb
并检查所捕获的不对齐类型blk_stack_limits
(例如,物理是逻辑块大小的倍数,opt 和 min I/O 是物理块大小的倍数等)
2019-03-03 更新:正如@derobert 在评论中指出的那样,在这种情况下,警告是正确的。您的 PV 从字节 33,553,920 开始,它不是物理块大小 4,096 的倍数。要纠正此问题,您需要移动或重新创建 PV/分区以从 4,096 的倍数开始(例如,通过传递--dataalignment
到vgcreate
/pvcreate
或--offset
到cryptsetup
)。
不幸的是,即使在纠正开始之后,“对齐不一致”消息仍将继续打印。 Sven Eschenberg 在 dm-crypt 列表上的一个长帖子中得出的结论是,其中一些检查可能会产生不正确的警告。 特别是,如果sdb
是 USB 磁盘,则最佳 I/O 大小可能不是物理扇区大小的倍数(例如,我有一个 4k USB3 磁盘,报告为physical_block_size
4,096 和optimal_io_size
33,553,920)。这些值是正确的(如驱动器报告的)、合理的(由于 USB 限制),并且不基于任何设备映射器参数。
问题在于,其中的逻辑blk_stack_limits
假设最佳 I/O 大小将是物理扇区大小的倍数,但对于某些设备而言并非如此。一旦这是唯一存在的问题,您就可以安全地忽略该警告。
2019-03-03 更新: 不幸的是,一些工具可能会创建这些不正确对齐的 PV/分区。相关问题/修复:
- 红帽错误 1513820对于 cryptsetup(在 v2.0.0 中修复 -b80278c0)
- Debian 错误 923561对于分开的(不固定)
- util-linux libfdisk(在 v2.27 中修复 -ACB7651F8)
- 红帽错误 1685787对于lvm2 pvcreate(未修复)
答案2
结盟确保驱动器的最佳使用,有时软件会出现此错误并通过使用更大的缓存进行补偿,请检查
cat /sys/block/sd?/queue/optimal_io_size
要纠正您必须重新格式化(可能是 GPT/LVM 层)的问题,请查看 pvcreate 的 --dataalignment 和 --dataalignmentoffset
答案3
解释
第一个值start=
是33553920
目标设备中第一个 LV 的第一个 PE 的偏移量(上面/dev/sdb2
)。
这可以通过以下方式确认:
sudo pvs -o +pe_start --units b
还有另一个start=
重复的值,因为sdb2
的 VG 包含两个 LV(usb-eMMC_backup
和usb-ark
)。我不知道为什么每个都是重复的。
原因
存在对齐不一致的原因是pe_start
不能被PHY-SEC
以下值整除:
lsblk -t /dev/sdb
PHY-SEC
是 4096,并且 33553920 % 4096 != 0。
pe_start
如果不对齐(默认 PE 大小为 4MiB),VG 中的所有 LV 都会错位。
解决
需要创建可被pe_start
磁盘扇区大小整除的 VG。
传递到--dataalignment 1m
将vgcreate
有pe_start
= 1048576B = 1MiB
如果我仍然得到怎么办alignment inconsistency
?
假设底层分区已对齐,仍然可能会生成(不正确的)对齐消息。看这个答案了解可能的原因和解决方法,尤其是在使用 USB 连接的 SATA (UAS) 时。