<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>文叨叨 | IaaS 排障手记</title><link>/</link><description>Recent content on 文叨叨 | IaaS 排障手记</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Sun, 20 Sep 2026 14:16:23 +0800</lastBuildDate><atom:link href="/index.xml" rel="self" type="application/rss+xml"/><item><title>为什么 NBD 要嵌套 NBD？qcow2 镜像链解析原理</title><link>/posts/nbd-nested-nbd-qcow2-chain/</link><pubDate>Sat, 18 Jul 2026 10:00:00 +0800</pubDate><guid>/posts/nbd-nested-nbd-qcow2-chain/</guid><description>创建 NBD 镜像时，为什么要把 backing 的所有镜像全部设置为 NBD？因为镜像链的解析由 qemu driver 负责，NBD 和本地 file 都只是独立块设备，没有解析能力。</description></item><item><title>qemu64 CPU 模型为什么有 svm？兼容性模型的指令集设计</title><link>/posts/qemu64-cpu-model-svm/</link><pubDate>Sun, 12 Jul 2026 10:00:00 +0800</pubDate><guid>/posts/qemu64-cpu-model-svm/</guid><description>查看 qemu64 CPU 模型定义，发现它居然包含 svm 指令。qemu64 是为了兼容性设计的，但 svm 这类虚拟化指令也在其中，值得探究。</description></item><item><title>为什么 Linux 只读 remount 失败，只能重启？</title><link>/posts/linux-readonly-filesystem/</link><pubDate>Sat, 11 Jul 2026 10:00:00 +0800</pubDate><guid>/posts/linux-readonly-filesystem/</guid><description>虚拟机文件系统变成只读，touch 报 Read-only file system。同事说另一种类型的虚拟机只读能恢复，但那种是卷只读，而 Linux 只读是存储 IO 错误触发的保护机制，只能重启。</description></item><item><title>nbd-server 连接被误清理：tcp6 双栈的坑</title><link>/posts/nbd-server-tcp6-miscleanup/</link><pubDate>Sun, 05 Jul 2026 10:00:00 +0800</pubDate><guid>/posts/nbd-server-tcp6-miscleanup/</guid><description>虚拟机通过 nbd 秒级启动，但 nbd-server 连接总被误清理。根因是新版本 nbd-server 默认用 tcp6 双栈监听，而清理代码用 netstat -4 只过滤 tcp4，导致误判无连接。</description></item><item><title>裸金属报固件错误：bnx2x 加载不了固件文件</title><link>/posts/bm-firmware-error-bnx2x/</link><pubDate>Sat, 04 Jul 2026 10:00:00 +0800</pubDate><guid>/posts/bm-firmware-error-bnx2x/</guid><description>裸金属带外报 bnx2x: Can&amp;#39;t load firmware file，网卡驱动加载失败。通过 modinfo 查看驱动需要的固件，下载放到镜像对应目录即可。</description></item><item><title>裸金属网卡乱序导致 iSCSI 加载不了：IPAPPEND 2 的妙用</title><link>/posts/bm-nic-order-iscsi-ipappend/</link><pubDate>Sun, 28 Jun 2026 10:00:00 +0800</pubDate><guid>/posts/bm-nic-order-iscsi-ipappend/</guid><description>裸金属装机一直卡在 iscsistart，根因是 ethX 网卡乱序，iSCSI 连接建立在了错误的网卡上。加上 IPAPPEND 2 让 PXELINUX 自动把引导网卡的 MAC 追加给内核。</description></item><item><title>创建裸金属一直刷 NBP：UEFI 与 Legacy 引导差异</title><link>/posts/bm-nbp-uefi-legacy/</link><pubDate>Sat, 27 Jun 2026 10:00:00 +0800</pubDate><guid>/posts/bm-nbp-uefi-legacy/</guid><description>创建裸金属一直刷 &amp;#39;NBP file downloaded successfully&amp;#39; 但进不去系统。根因是启动方式是 UEFI，而裸金属注册时一般是 Legacy，UEFI 和 Legacy 的 NBP 不一样。</description></item><item><title>ZFS 副本为什么比主本占用大：raidZ 条带与块大小不适配</title><link>/posts/zfs-replica-larger-than-primary/</link><pubDate>Sun, 21 Jun 2026 10:00:00 +0800</pubDate><guid>/posts/zfs-replica-larger-than-primary/</guid><description>ZFS 副本通过 zfs send 从主本复制过来，逻辑数据一样，但副本 used 是 4.75T，主本只有 3.94T。根因是 raidZ 高可用加条带和 16k 块大小不适配。</description></item><item><title>为什么 COPY --from 找不到文件？相对路径不相对 WORKDIR</title><link>/posts/docker-copy-from-path-trap/</link><pubDate>Sat, 20 Jun 2026 10:00:00 +0800</pubDate><guid>/posts/docker-copy-from-path-trap/</guid><description>Docker 多阶段构建中，COPY --from=builder 后相对路径会被解析为相对于根目录，而不是相对于 WORKDIR，导致找不到文件。</description></item><item><title>虚拟机无响应？重启后快速进 console 看内核日志</title><link>/posts/vm-no-response-restart-console/</link><pubDate>Sun, 14 Jun 2026 10:00:00 +0800</pubDate><guid>/posts/vm-no-response-restart-console/</guid><description>virsh console 卡住进不去，虚拟机无响应。一个思路是重启后快速进入 console，看内核启动日志，往往能发现关键线索。</description></item><item><title>清理网卡前先清理相关资源：unregister_netdevice 的坑</title><link>/posts/cleanup-netdev-before-down/</link><pubDate>Sat, 13 Jun 2026 10:00:00 +0800</pubDate><guid>/posts/cleanup-netdev-before-down/</guid><description>LXC 销毁后 hyper 内核报 unregister_netdevice 网卡错误，很久没解决。最后在网卡 down 后加了一个 disable_ipv6 的操作就好了。</description></item><item><title>为什么新系统跑不起来？默认 qemu 指令集不够用</title><link>/posts/modern-os-need-cpu-model/</link><pubDate>Sun, 07 Jun 2026 10:00:00 +0800</pubDate><guid>/posts/modern-os-need-cpu-model/</guid><description>新版本操作系统在没配置 CPU 指令集的虚拟机上运行僵死，报 &amp;#39;CPU does not support x86-64-v2&amp;#39;。根因是现代 OS 开启了指令集优化，纯 qemu 模拟指令无法满足运行要求。</description></item><item><title>热迁移后虚拟机卡死：CPU 100% 的时间中断死循环</title><link>/posts/migrate-vm-hang-cpu-100/</link><pubDate>Sat, 06 Jun 2026 10:00:00 +0800</pubDate><guid>/posts/migrate-vm-hang-cpu-100/</guid><description>从 Ubuntu 20 宿主机迁移到 Ubuntu 22 宿主机后，虚拟机卡死、CPU 占用 100%。用 crash 和 perf 定位到时间中断处理死循环，根因是热迁移过程中的时间处理问题。</description></item><item><title>长运行与临时调整要分离</title><link>/posts/long-running-vs-temp-adjust/</link><pubDate>Sun, 24 May 2026 10:00:00 +0800</pubDate><guid>/posts/long-running-vs-temp-adjust/</guid><description>存量 VM 不切换，我们可以提供一个接口来调整虚拟机的 cpu_mode 来实现。这样长运行的逻辑简单，而调整和长运行逻辑分离，降低复杂性。</description></item><item><title>架构决定稳定性：核心对象 + 流水线</title><link>/posts/architecture-determines-stability/</link><pubDate>Sat, 23 May 2026 10:00:00 +0800</pubDate><guid>/posts/architecture-determines-stability/</guid><description>架构决定下限，代码决定上限。虽然代码影响很大，但是整体的稳定性，依然是架构占大部分决定因素。linux 网络栈足够复杂，但又有足够的扩展性，且非常的高性能，为什么？因为它流水线 + sk_buff。</description></item><item><title>简单是唯一标准吗？</title><link>/posts/is-simple-the-only-criterion/</link><pubDate>Sun, 17 May 2026 10:00:00 +0800</pubDate><guid>/posts/is-simple-the-only-criterion/</guid><description>很多时候讨论方案，&amp;#39;这个改起来简单&amp;#39;，然后就没有人说话了。简单没有错，问题是简单就是指这一次改动的简单呢？那运维的简单性、扩展的简单性、稳定的简单性、排查的简单性呢？</description></item><item><title>边界：计算、存储、网络要分离</title><link>/posts/boundary-compute-storage-network/</link><pubDate>Sat, 16 May 2026 10:00:00 +0800</pubDate><guid>/posts/boundary-compute-storage-network/</guid><description>拿快照来说，为啥我们支持快照的多链这么复杂？按道理虚拟机只需要一个卷，至于这个卷背后的链是完全不需要关心的。如果计算存储分离，快照局限于存储模块，计算只需要一个卷。</description></item><item><title>可变与不可变：找到变化，封装变化</title><link>/posts/variable-vs-invariable/</link><pubDate>Sun, 10 May 2026 10:00:00 +0800</pubDate><guid>/posts/variable-vs-invariable/</guid><description>设计模式一个基本点两个原则：一个基本点是找到变化、封装变化；两个原则是基于接口而不是基于实现、组合优于继承。核心是可变与不可变的隔离、解耦。</description></item><item><title>简单 + 组合，才是最强的</title><link>/posts/simple-plus-combination/</link><pubDate>Sat, 09 May 2026 10:00:00 +0800</pubDate><guid>/posts/simple-plus-combination/</guid><description>《UNIX编程艺术》里讲的：cmd + 管道 + 文本的设计理念，让单个命令足够简单清晰，而命令的编排又可以创造无限扩展的能力。单元简单，才容易组合。</description></item><item><title>高可用要么不做，要么做完善：fence 是必备</title><link>/posts/ha-fence-essential/</link><pubDate>Sun, 03 May 2026 10:00:00 +0800</pubDate><guid>/posts/ha-fence-essential/</guid><description>稳定性相关的，要么不做，要么就要完善，要不然做了高可用，反而造成雪崩。高可用必备 fence，fence 就是 ipmi 强制关机，这是最稳妥的方式。</description></item><item><title>状态机：围绕状态，而不是围绕具体流程</title><link>/posts/state-machine-around-state/</link><pubDate>Sat, 02 May 2026 10:00:00 +0800</pubDate><guid>/posts/state-machine-around-state/</guid><description>状态机的核心是围绕状态，而不是围绕具体流程。当前状态、输入、转移状态，就是围绕着三要素设计的。它可以把一个超长流程、超多条件判断的流程，解耦为一个个独立的状态。</description></item><item><title>正向流程容易，逆向回滚才是灾难</title><link>/posts/forward-easy-rollback-hard/</link><pubDate>Sun, 26 Apr 2026 10:00:00 +0800</pubDate><guid>/posts/forward-easy-rollback-hard/</guid><description>当流程跨越了多个服务，一旦中途某一步失败，如何把已经扭转的状态干净地恢复原状，是软件架构里最重的活。优秀的架构师会尽量避免物理回滚，把流程设计为只能向前。</description></item><item><title>面向过程还是面向对象？对象是骨架，流程是血肉</title><link>/posts/oop-vs-procedural/</link><pubDate>Sat, 25 Apr 2026 10:00:00 +0800</pubDate><guid>/posts/oop-vs-procedural/</guid><description>流程是易变的、脆弱的，对象是稳定的、高内聚的。面向对象的流程是分治，将易变的流程拆分成多个稳定的对象，对象之间面向接口协作，复杂性拆分成局部复杂性。</description></item><item><title>决策树还是决策层？决策流程适合树</title><link>/posts/decision-tree-vs-layer/</link><pubDate>Sun, 19 Apr 2026 10:00:00 +0800</pubDate><guid>/posts/decision-tree-vs-layer/</guid><description>决策流程这个场景，适合树而不是层。树是前后依赖的，层是前后不依赖的、每一层是通用的。规则引擎天生就是规则流，前后有依赖，所以写规则配置就是树的方式。</description></item><item><title>mq 相比直接传递消息的优势</title><link>/posts/mq-advantage-over-direct-message/</link><pubDate>Sat, 18 Apr 2026 10:00:00 +0800</pubDate><guid>/posts/mq-advantage-over-direct-message/</guid><description>mq 不仅是削峰填谷，也不仅是解耦服务，还有降低代码复杂性、增加稳定性的作用。中间件是一个稳定的、没有逻辑的、仅仅存储数据的。</description></item><item><title>check 和修复，要从大流程上就分开</title><link>/posts/check-and-fix-separate/</link><pubDate>Sun, 12 Apr 2026 10:00:00 +0800</pubDate><guid>/posts/check-and-fix-separate/</guid><description>check 有很多项，每个项都有修复。check 是一条线，修复是一条线。不要在 check 中发现某个项有问题就进行修复，而是要等 check 完再调用修复。</description></item><item><title>底层单一，上层组合</title><link>/posts/bottom-single-top-combine/</link><pubDate>Sat, 11 Apr 2026 10:00:00 +0800</pubDate><guid>/posts/bottom-single-top-combine/</guid><description>底层逻辑尤其要保证单一，一个能力只提供一种方法。想要更多，通过上层组合、上层封装来实现。千万不要把所有需求都放到底层原子能力上。</description></item><item><title>Hook、插件、Middleware：三种扩展机制的区别</title><link>/posts/hook-plugin-middleware/</link><pubDate>Sun, 05 Apr 2026 10:00:00 +0800</pubDate><guid>/posts/hook-plugin-middleware/</guid><description>Hook 侧重现有流程上运行时的局部修改，插件侧重模块化功能扩展，Middleware 是流程中可以扩展的横切面。三者核心目标都是不侵入主程序的前提下实现扩展。</description></item><item><title>用主流技术：技术是手段，不是目的</title><link>/posts/use-mainstream-technology/</link><pubDate>Sat, 04 Apr 2026 10:00:00 +0800</pubDate><guid>/posts/use-mainstream-technology/</guid><description>跟随主流技术非常重要，不要老用一些偏门的、古怪的技术凸显自己的别具一格。技术是手段，不是目的，所以越主流越好。</description></item><item><title>耦合的松紧，关键在于变化</title><link>/posts/coupling-key-is-change/</link><pubDate>Sun, 29 Mar 2026 10:00:00 +0800</pubDate><guid>/posts/coupling-key-is-change/</guid><description>什么是耦合，怎么判断有没有耦合？可以从结果反推：A 变化了，B 要不要跟着变化。如果跟着变，那就是耦合了；如果没有跟着变，或者变动很小，那就是松耦合。</description></item><item><title>魔数、默认值使用常量封装：唯一来源</title><link>/posts/constant-single-source/</link><pubDate>Sat, 28 Mar 2026 10:00:00 +0800</pubDate><guid>/posts/constant-single-source/</guid><description>魔数、默认值使用常量封装。提高可读性，统一定义唯一来源，唯一来源相当于是统一了标准。常量在离使用代码最近的地方定义比较好。</description></item><item><title>符合设计原则，可以规避一些想不到的问题</title><link>/posts/design-principles-avoid-problems/</link><pubDate>Sun, 22 Mar 2026 10:00:00 +0800</pubDate><guid>/posts/design-principles-avoid-problems/</guid><description>把只读状态写到了事务字段里，明显不符合单一原则。一个字段怎么能表示多种意思呢？如果一开始就不违反单一原则，即便没想到并发冲突问题，也不会出现问题。</description></item><item><title>即便是补丁，也要面向对象，而不是针对流程打补丁</title><link>/posts/patch-object-oriented/</link><pubDate>Sat, 21 Mar 2026 10:00:00 +0800</pubDate><guid>/posts/patch-object-oriented/</guid><description>哪里遇到问题了，就找个地方加个开关、加个检查、加个条件判断来处理掉。这导致不够系统化，引入了局部的分支点，会造成多流程的耦合交叉，扩展容易遗漏。</description></item><item><title>开发的时候就要想部署交付：为什么要云原生</title><link>/posts/think-deploy-when-developing/</link><pubDate>Sun, 15 Mar 2026 10:00:00 +0800</pubDate><guid>/posts/think-deploy-when-developing/</guid><description>开发决定了部署。开发的时候就要想哪种方式部署简单、能标准化部署、能尽量减少环境依赖。这就是为什么要云原生。</description></item><item><title>代码也有一致性：面向接口而非面向实现</title><link>/posts/code-consistency-interface/</link><pubDate>Sat, 14 Mar 2026 10:00:00 +0800</pubDate><guid>/posts/code-consistency-interface/</guid><description>不仅数据有一致性问题，代码的一致性问题更加遍地都是。判断主机是否运行应该面向 libvirt 接口，而不是面向实现中的文件、过程。</description></item><item><title>面向接口，面向接口，面向接口</title><link>/posts/interface-oriented/</link><pubDate>Sun, 08 Mar 2026 10:00:00 +0800</pubDate><guid>/posts/interface-oriented/</guid><description>接口很多时候听起来很有道理，写的时候会质疑是不是为了接口而接口。一写二抄三重构，前面没有必要的时候不用接口，后面重复的时候可以引入接口。</description></item><item><title>封装和独立的区别：复用 vs 管理能力</title><link>/posts/encapsulation-vs-independent/</link><pubDate>Sat, 07 Mar 2026 10:00:00 +0800</pubDate><guid>/posts/encapsulation-vs-independent/</guid><description>封装仅仅是为了复用，但是独立有管理能力。封装调用了就得执行，独立有自己的一套管理规则，比如排队、限流、调整优先级、丢弃、转换等。</description></item><item><title>底层最好有默认值，上层可以少硬编码</title><link>/posts/bottom-default-value/</link><pubDate>Sun, 01 Mar 2026 10:00:00 +0800</pubDate><guid>/posts/bottom-default-value/</guid><description>底层（被依赖者）最好有默认值，上层（依赖者）可以少硬编码。判断不是问题，问题是重复判断；硬编码本身是必须的，问题是重复的硬编码。</description></item><item><title>一个目的一种实现：少即是多</title><link>/posts/one-goal-one-implementation/</link><pubDate>Sat, 28 Feb 2026 10:00:00 +0800</pubDate><guid>/posts/one-goal-one-implementation/</guid><description>不要封装太多的实现方法，会造成使用复杂度。一个目的提供一种方法，提供的太多，反而让使用者陷入学习复杂性。</description></item><item><title>封装不在于使用复杂度，而在于使用频率</title><link>/posts/encapsulation-frequency-not-complexity/</link><pubDate>Sun, 22 Feb 2026 10:00:00 +0800</pubDate><guid>/posts/encapsulation-frequency-not-complexity/</guid><description>如果一个工具仅仅在一两个地方调用，那无所谓封装。如果一个工具通篇各处都在调用，那就一定要封装了，即便这个工具仅仅是一行命令。</description></item><item><title>调用第三方一定要封装，哪怕仅仅是一个命令行</title><link>/posts/wrap-third-party-call/</link><pubDate>Sat, 21 Feb 2026 10:00:00 +0800</pubDate><guid>/posts/wrap-third-party-call/</guid><description>调用第三方工具一定要封装，哪怕仅仅是一个命令行。封装的好处：应对版本变化、方便做切面、简化使用、提供统一方法。</description></item><item><title>抽象流程还是抽象对象？一写二抄三重构</title><link>/posts/abstract-flow-vs-object/</link><pubDate>Sun, 15 Feb 2026 10:00:00 +0800</pubDate><guid>/posts/abstract-flow-vs-object/</guid><description>要不要抽象，关键在于要不要复用。业务流程都是独立的，不需要复用；技术类流程需要复用。一写二抄三重构，第二次大量重复时就可以开始重构了。</description></item><item><title>代码写三遍：跑通、防御、优化</title><link>/posts/code-write-three-times/</link><pubDate>Sat, 14 Feb 2026 10:00:00 +0800</pubDate><guid>/posts/code-write-three-times/</guid><description>写代码高价值套路：代码写三遍。第一遍跑通，第二遍防御，第三遍优化。过早的优化是万恶之源，尤其是新服务新项目的时候。</description></item><item><title>no space left on device：不一定是磁盘满了，可能是 inode 满了</title><link>/posts/no-space-left-inode-full/</link><pubDate>Sun, 08 Feb 2026 10:00:00 +0800</pubDate><guid>/posts/no-space-left-inode-full/</guid><description>报 no space left on device，看上去是磁盘空间不足，但有可能不是存储满了，而是 inode 满了。用 df -i 查看 inode 使用情况，如果有 100% 的就是 inode 满了。</description></item><item><title>删除文件后磁盘空间为什么没释放？</title><link>/posts/delete-file-disk-space-not-released/</link><pubDate>Sat, 07 Feb 2026 10:00:00 +0800</pubDate><guid>/posts/delete-file-disk-space-not-released/</guid><description>删除文件后磁盘空间没释放，是因为文件被进程打开，进程还持有文件描述符。用 lsof | grep deleted 找到占用进程，最好的方法是在线清空文件。</description></item><item><title>virsh attach/detach 的延时问题：重试不是灵药，可能是毒药</title><link>/posts/virsh-attach-detach-delay/</link><pubDate>Sun, 01 Feb 2026 10:00:00 +0800</pubDate><guid>/posts/virsh-attach-detach-delay/</guid><description>virsh detach 后 domblklist 有短暂延时，detach 成功后立即 detach 相同卷也能成功，两次重复 detach 后再 attach 会失败。根因是 libvirt 不是实时状态，有一定延时。</description></item><item><title>libvirt CPU feature 的 disable 和 forbid 有什么区别？</title><link>/posts/libvirt-cpu-feature-disable-forbid/</link><pubDate>Sat, 31 Jan 2026 10:00:00 +0800</pubDate><guid>/posts/libvirt-cpu-feature-disable-forbid/</guid><description>libvirt CPU feature 的 policy 有 force、require、optional、disable、forbid 五种。disable 是虚拟 CPU 不支持该特性，forbid 是宿主机支持该特性时创建会失败。</description></item><item><title>ARM 虚拟机缺 acpi 为什么登录没反应？</title><link>/posts/arm-vm-missing-acpi-login/</link><pubDate>Sun, 25 Jan 2026 10:00:00 +0800</pubDate><guid>/posts/arm-vm-missing-acpi-login/</guid><description>ARM 虚拟机配置中 features 区块缺少 acpi，表面现象是 virsh console 登录没反应。根因是 ACPI 缺失导致系统底层硬件/服务初始化异常，间接引发登录流程失败。</description></item><item><title>qemu 为什么只支持一个 IDE controller？</title><link>/posts/qemu-single-ide-controller/</link><pubDate>Sat, 24 Jan 2026 10:00:00 +0800</pubDate><guid>/posts/qemu-single-ide-controller/</guid><description>qemu 只支持一个 IDE controller，一个 IDE controller 只支持 4 个设备（hda 到 hdd）。定义两个 IDE controller 或使用 hde 都会报错。</description></item><item><title>qemu-img commit 的链为什么必须完整？-d 参数又是什么</title><link>/posts/qemu-img-commit-chain-complete/</link><pubDate>Sun, 18 Jan 2026 10:00:00 +0800</pubDate><guid>/posts/qemu-img-commit-chain-complete/</guid><description>qemu-img commit 的链必须是完整的，虽然 commit 的是 head，看起来和底层几级镜像没关系，但实际还是需要。commit 链的关系还可以是临时的，-d 参数决定 commit 后是否清空文件。</description></item><item><title>multipath 的 wwids 被手动改，导致盘一直加不上</title><link>/posts/multipath-wwids-manual-edit/</link><pubDate>Sat, 17 Jan 2026 10:00:00 +0800</pubDate><guid>/posts/multipath-wwids-manual-edit/</guid><description>sdf 设备总是加不到 multipath 下，配置没问题，重启 multipathd 也不行。根因是 /etc/multipath/wwids 被人手动加了个 # 注释，导致对应的盘一直加载不上。</description></item><item><title>pvscan 没返回信息别慌：Global lock failed 的排查</title><link>/posts/lvmlockd-pvscan-global-lock-failed/</link><pubDate>Sun, 11 Jan 2026 10:00:00 +0800</pubDate><guid>/posts/lvmlockd-pvscan-global-lock-failed/</guid><description>pvscan 报 Global lock failed 且没有返回信息，不一定是数据没了。停掉 sanlock 和 lvmlockd 再 pvscan，只要 pv 在，一切都好说。</description></item><item><title>sanlock 的 wdmd 为什么在多 vg 场景下要禁用？</title><link>/posts/sanlock-wdmd-multi-vg-disable/</link><pubDate>Sat, 10 Jan 2026 10:00:00 +0800</pubDate><guid>/posts/sanlock-wdmd-multi-vg-disable/</guid><description>sanlock 的 wdmd 看门狗在多 vg 场景下不适合启用：只要一个锁空间续约失败，wdmd 就不喂狗，导致宿主机被强制重启。</description></item><item><title>ARM 架构下 CPU 模型设置为什么失效？只有 passthrough</title><link>/posts/arm-cpu-model-passthrough/</link><pubDate>Sun, 04 Jan 2026 10:00:00 +0800</pubDate><guid>/posts/arm-cpu-model-passthrough/</guid><description>在 ARM（aarch64）架构下，libvirt/QEMU 的 CPU 模型与特性禁用设置不生效，虚拟机看到的 CPU 依然是透传的物理 CPU。</description></item><item><title>为什么 ICMP 通但 TCP 不通？tunl 设备校验和没生效</title><link>/posts/calico-icmp-ok-tcp-fail-checksum/</link><pubDate>Sat, 03 Jan 2026 10:00:00 +0800</pubDate><guid>/posts/calico-icmp-ok-tcp-fail-checksum/</guid><description>k8s 环境 pod 之间 ICMP 通但 TCP 不通，client 收到 synack 却不响应。根因是 server 端 tunl 设备的 tx-checksumming 没生效，发出的包校验和错误。</description></item></channel></rss>