-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
2 changed files
with
37 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,36 @@ | ||
# 2024 年 10 月 2 日工作总结 | ||
|
||
今日排查了已经有长时间记录的偶发的 KVM 创建后分区表错乱问题。 | ||
|
||
## 背景 | ||
|
||
目前 KVM 虚拟机的存储部分创建流程如下: | ||
|
||
1. pv1 full clone 到目标 pv 和存储池 | ||
2. 目标 pv 执行 resize 操作 | ||
|
||
从 KVM 特性 GA 之后,我们就时不时收到无法开机的故障反馈,检查后发现所有出现故障的机器的分区表都是损坏的,绝大部分都是主 GPT 分区表显示 CRC 校验码不正确,备用分区表正常,有少量的备用分区表也存在问题(显示很多不存在的分区)。并且这个问题是偶发的,之前测试发现一直都无法复现。 | ||
|
||
今日收到用户反馈邮件后尝试再次进行了复现工作。在调大了测试用户的机器限额后,创建了多台 KVM 虚拟机,发现问题得到了复现。手动 clone 进行几次操作后也发现复现问题,因此判断问题与第一步在 pv1 上的操作有关,与 resize 无关。 | ||
|
||
使用 `execsnoop-bpfcc` 追踪 clone 时执行的命令,与对应磁盘有关的有以下几项: | ||
|
||
```shell | ||
/sbin/lvcreate -aly -Wy --yes --size 4194304k --name vm-9621-disk-0 --addtag pve-vm-9621 user-data | ||
/sbin/lvchange -aey /dev/user-data/vm-9621-disk-0 | ||
/sbin/lvchange --refresh /dev/user-data/vm-9621-disk-0 | ||
/usr/bin/qemu-img convert -p -n -f qcow2 -O raw /mnt/vz/images/200/base-200-disk-1.qcow2 /dev/user-data/vm-9621-disk-0 | ||
/sbin/lvchange -aln /dev/user-data/vm-9621-disk-0 | ||
``` | ||
|
||
出问题概率最大的是 `qemu-img convert` 命令,测试后发现即使运行了 `convert`,`gdisk` 仍然会报告目标块设备的 GPT 分区表损坏,但是如果目标是本地文件,则能够正常工作。同时,如果将正常的本地文件 `dd` 回块设备,那么也是正常的。 | ||
|
||
阅读 [`qemu-img(1)`](https://linux.die.net/man/1/qemu-img) 发现 `-S` 参数可能与此有关: | ||
|
||
```text | ||
SPARSE_SIZE indicates the consecutive number of bytes (defaults to 4k) that must contain only zeros for qemu-img to create a sparse image during conversion. If SPARSE_SIZE is 0, the source will not be scanned for unallocated or zero sectors, and the destination image will always be fully allocated. | ||
``` | ||
|
||
在添加 `-S 0` 后测试,`qemu-img convert` 能够正常工作。由于一个 GPT 项只有 128B,而 `qemu-img` 默认 sparse size 为 4K,因此如果刚好对应的块设备区域没有被写零清空,那么本来为 0 的 GPT 表就会错误包含非零内容,进而导致了分区表校验和错误。 | ||
|
||
相关问题已反馈 Proxmox: <https://bugzilla.proxmox.com/show_bug.cgi?id=5754>。经过内部讨论,我们暂时添加了 `-S 1M` 参数,并且 `apt-mark hold qemu-server` 锁定版本。 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters