From fe7b013629c4ce48b57a3c08f2f4dba129008300 Mon Sep 17 00:00:00 2001 From: iBug Date: Tue, 19 Nov 2024 20:47:13 +0800 Subject: [PATCH] traps: Add HPE SAN box SCSI UNMAP issue --- docs/records/2024-10-02.md | 27 ++++++++++++++++++++++++++- docs/traps.md | 14 ++++++++++++-- 2 files changed, 38 insertions(+), 3 deletions(-) diff --git a/docs/records/2024-10-02.md b/docs/records/2024-10-02.md index 73b35502..0d691452 100644 --- a/docs/records/2024-10-02.md +++ b/docs/records/2024-10-02.md @@ -31,6 +31,31 @@ 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 表就会错误包含非零内容,进而导致了分区表校验和错误。 +在添加 `-S 0` 后测试,`qemu-img convert` 能够正常工作。由于一个 GPT 项只有 128B,而 `qemu-img` 默认 sparse size 为 4K,因此如果刚好对应的块设备区域没有被写零清空,那么本来为 0 的 GPT 表区域就会包含残留数据,进而导致了分区表校验和错误。 相关问题已反馈 Proxmox: 。经过内部讨论,我们暂时添加了 `-S 1M` 参数,并且 `apt-mark hold qemu-server` 锁定版本。 + +## 后续 + +在 Proxmox 开发者的提示下,我们检查 HPE 存储柜汇报的 SCSI 功能特性: + +```console + +root@pv1:~# sg_vpd --page=0xb2 /dev/sde +Logical block provisioning VPD page (SBC): + Unmap command supported (LBPU): 1 + Write same (16) with unmap bit supported (LBPWS): 1 + Write same (10) with unmap bit supported (LBPWS10): 0 + Logical block provisioning read zeros (LBPRZ): 1 +[...] +``` + +而实际上该存储柜仅当 SCSI UNMAP 命令覆盖完整的 1 MiB 段时才会清零对应位置的数据,而 qemu-img 的 sparse size 默认为 4K,因此当 qemu-img 以 4K 为单位 `fallocate()` 时底层存储的数据并没有清零。 + +保险起见,我们决定禁用“以 UNMAP 作清零”的功能,具体做法是向 `/sys/devices/platform/host*/session*/target*/scsi_disk/*/zeroing_mode` 中写入 `writesame`。持久化该设置的方式是通过 udev: + +```shell title="/etc/udev/rules.d/99-scsi-zeroing-mode.rules" +ACTION=="add", SUBSYSTEM=="scsi_disk", DEVPATH=="/devices/platform/host*/session*/target*/scsi_disk/*", ATTR{zeroing_mode}="writesame" +``` + +完整的讨论过程参见上面的 Proxmox Bugzilla 链接。 diff --git a/docs/traps.md b/docs/traps.md index faf346c2..8db89951 100644 --- a/docs/traps.md +++ b/docs/traps.md @@ -1,3 +1,7 @@ +--- +icon: material/bug +--- + # 踩坑记录 ## Proxmox VE @@ -26,9 +30,9 @@ ### Migrate 提示 `ERROR: migration aborted (duration 00:00:00): CT is locked (migrate)` -容器:`pct unlock ` +容器:`pct unlock ` -虚拟机:`qm unlock ` +虚拟机:`qm unlock ` !!! warning "HA 注意事项" @@ -463,6 +467,12 @@ See [2023 年 1 月 28 日工作记录](./records/2023-01-28.md). # pct list | awk '$2=="running"{print $1}' | xargs -I xxx pct exec xxx -- bash -c 'echo xxx && [ ! -f "/etc/systemd/system/logrotate.timer.d/vlab.conf" ] && mkdir -p /etc/systemd/system/logrotate.timer.d && echo -e "[Timer]\nRandomizedDelaySec=3h" > /etc/systemd/system/logrotate.timer.d/vlab.conf && systemctl daemon-reload' ``` +### 新建的虚拟机随机出现 GPT 分区表损坏 + +这个问题困扰了我们很久,根本原因是 HPE 的 SAN 汇报其会对通过 SCSI UNMAP 命令释放的块进行清零处理,但实际上并不会,导致 `qemu-img convert` 往新建的 LVM 写入镜像时跳过了清零操作,而未清零的残余数据导致了 GPT 分区表损坏。 + +排查过程和解决方法详见 [2024 年 10 月 2 日的工作记录](records/2024-10-02.md)。 + ## Web 及用户界面 ### 创建虚拟机出现 Connection aborted, RemoteDisconnected('Remote end closed connection without response')