Incus 脚本审阅与验收 · 第 5 / 8 篇
重装菜单最有吸引力的承诺是“输入 3,就能重新得到一台干净的 vps3”。真正需要先讲清楚的,却是哪些东西将被清除,哪些配置可能留下,失败以后还能从哪里进去。否则,一键只是把多步风险压缩到了一个按钮里。

为什么使用 rebuild,而不是 delete 后重新 launch
现存两份重装脚本都采用 rebuild 思路:保留实例身份与配置,替换根文件系统。这样设计的目的是尽量延续原有设备映射,不要求用户重新填写每个 SSH 和业务端口。Incus rebuild 命令参考
必须区分两件事:代理设备仍存在,不代表原业务仍存在。根盘里的 SSH 配置、Komari Agent、网站程序、数据库文件都可能随根盘重建消失。容器内另挂的自定义卷和宿主路径又是另一类资源,不能笼统写成“全部数据都删除”或者“数据都保留”。先盘点每个挂载点,才能说明删除边界。
参数版和菜单版,各自在解决什么问题
reinstall_incus_vps_6_0_6_fixed.sh 接收 vps1—vps6 名称,预检实例类型、根盘池与驱动;没有预期 SSH 设备时,还会检查宿主机端口是否被占用。
incus_reinstall_menu.sh 则先列出现有实例,用名称中的数字选择目标,再要求输入完整名称确认。它在破坏性操作前强制检查预期 SSH proxy 的类型、listen 和 connect,避免选错或覆盖不同约定的入口。
二者不是完全等价的“新旧皮肤”:参数版多了明确的驱动预检和出站 TCP 预检;菜单版多了交互选择与设备前后比较,却没有同等完整的驱动检查。功能分散提示我们,下一版应抽出共同的预检与重装函数,让菜单只负责选择与确认。
配额为什么需要区分继承设备和本地设备
根盘可能来自 tiny-vps profile。修改共享 profile 会影响其他实例,重装单台时不应借此改动所有小鸡。脚本尝试对本地根盘使用 device set,对继承根盘使用 device override,目的是在单实例层覆盖配额并保留原 pool、path。
但两份代码后续均假定根盘设备叫 root。参数版虽然通过 API 寻找了根盘所属池,却没有把“真实设备名”贯穿到修改步骤。自定义名称如 osdisk 可能让重装后设置失败。稳妥的版本应在重装前提取唯一的 type=disk, path=/ 设备名,并完整校验,而不是接受根盘存在后继续猜名称。
重装之前必须留下怎样的退路
先停写应用或使用应用自身的一致性备份,再导出实例到受保护目录,并把必要副本移出同一个存储池。快照便于快速回退,但与实例位于同一池,不能应对整池损坏;自定义存储卷需要单独备份。Incus 官方备份说明
# 只读配置快照;输出文件可能包含敏感配置,应保存在受保护目录
umask 077
mkdir -p /root/incus-before-rebuild
incus query /1.0/instances/vps3 > /root/incus-before-rebuild/vps3.json
incus config show vps3 --expanded > /root/incus-before-rebuild/vps3-expanded.yaml
incus config device show vps3 > /root/incus-before-rebuild/vps3-devices.yaml
这些配置文件不是根盘数据备份。真正的备份还要执行适合本机版本的 export 或应用备份,并在隔离环境恢复一次。incus export --help 与 incus import --help 应作为目标 6.0 客户端的语法依据,不能只照搬最新文档里的选项。
为什么 apt 失败后不能直接再重装一次
参数版的执行顺序是重建根盘、设置资源、启动、检查公网 TCP、安装 SSH、写入新密码和验收。如果网络检查失败,根盘已经重建,但 SSH 与新密码尚未配置。此时脚本退出不等于自动回滚。
原提示建议恢复网络后重跑脚本,但完整重跑会再次 rebuild。更合理的恢复是先从宿主机用 incus exec 检查目标实例,修复出站、完成软件安装和密码配置;待状态明确后,再决定是否重建。下一版应增加明确的阶段状态与“继续配置”分支,避免把所有错误都引向再次清空。
SSH 主机密钥为什么会变化
根盘重建后,SSH 服务的主机密钥通常会重建。客户端报警应先核对目标实例与新指纹,再清理对应的 [宿主机地址]:端口 记录。不能把关闭主机密钥校验作为教程中的标准修复。宿主机内的管理通道可帮助核对指纹,但它不代替外部真实登录测试。
本篇的交付标准:目标根盘确实重建,其他实例不受影响;非根盘设备经结构化比较保持一致;SSH 真实登录可用;业务按清单恢复;失败时有可执行的恢复步骤。现有材料尚未包含完成这组破坏性演练的记录,不能写成已经达到。