Skip to content

Commit

Permalink
records: Add 2024-10-02
Browse files Browse the repository at this point in the history
  • Loading branch information
taoky committed Oct 2, 2024
1 parent 0bcae7a commit 1fd1d74
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 0 deletions.
36 changes: 36 additions & 0 deletions docs/records/2024-10-02.md
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` 锁定版本。
1 change: 1 addition & 0 deletions mkdocs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,7 @@ nav:
- 踩坑记录: traps.md
- 更新历史: changelog.md
- 工作总结:
- 2024 年 10 月 2 日: records/2024-10-02.md
- 2024 年 10 月 1 日: records/2024-10-01.md
- 2023 年 12 月 13 日: records/2023-12-13.md
- 2023 年 11 月 18 日: records/2023-11-18.md
Expand Down

0 comments on commit 1fd1d74

Please sign in to comment.