Cloud-init 18.5模块执行失败未生成SSH密钥,如何排查VM故障?
排查Cloud-init导致的SSH无法登录问题(RHEL8/9 + KVM/Libvirt环境)
1. 宿主机挂载VM磁盘直接读取核心日志
因为无法SSH登录,优先从宿主机侧获取VM内部日志:
- 先定位VM磁盘路径:
virsh domblklist <vm-name> - 关机后挂载磁盘到宿主机目录:
mount /path/to/vm-disk /mnt/vm-root - 查看关键日志文件:
/mnt/vm-root/var/log/cloud-init.log:记录Cloud-init全流程执行细节,模块启动、失败堆栈都在这里/mnt/vm-root/var/log/cloud-init-output.log:输出userdata脚本的执行内容,包括自定义脚本的报错信息
2. 检查Cloud-init执行状态与阶段记录
挂载磁盘后,验证Cloud-init是否完成所有阶段:
- 查看是否存在完成标记:
ls /mnt/vm-root/var/lib/cloud/instance/boot-finished,不存在则说明执行卡在某个阶段 - 读取状态JSON文件:
cat /mnt/vm-root/var/lib/cloud/instance/status.json,里面有各阶段的成功/失败标记 - 核对已执行模块:
cat /mnt/vm-root/var/lib/cloud/instance/run/modules.d/*.done,确认ssh、set-passwords等关键模块是否执行
3. 验证Userdata是否被正确接收
排查Userdata传输过程中的异常:
- 查看VM内实际读取到的Userdata:
cat /mnt/vm-root/var/lib/cloud/instance/user-data.txt,对比你传入的内容是否一致,排查截断、篡改问题 - 检查Libvirt配置:
virsh dumpxml <vm-name> | grep -A 20 cloud-init,确认Userdata的传递方式(文件/注入)是否配置正确
4. 排查SSH服务本身的配置与状态
即使Cloud-init执行异常,也可能是SSH自身配置问题:
- 查看SSH连接日志:
cat /mnt/vm-root/var/log/secure,查找连接被拒绝的具体原因(如密码认证未开启、用户不存在) - 检查SSH配置文件:
cat /mnt/vm-root/etc/ssh/sshd_config,确认PasswordAuthentication yes、PermitRootLogin等参数是否符合预期 - 验证用户存在性:
cat /mnt/vm-root/etc/passwd,确认Userdata中配置的用户是否创建成功
5. 重点核查密码设置模块的执行
针对Userdata中的密码配置,做专项检查:
- 在
cloud-init.log中搜索set-passwords,查看是否有Setting passwords for user <username>的日志,以及是否存在密码格式错误等报错 - 检查用户密码哈希:
cat /mnt/vm-root/etc/shadow | grep <username>,如果密码字段为!!或*,说明密码未被正确设置
6. 开启Debug日志排查偶发问题
因为问题非频繁出现,下次部署时开启Cloud-init Debug模式:
- 在Userdata开头添加:
#cloud-config debug: true - 或者通过内核参数传递:修改Libvirt XML配置,在
<cmdline>中添加cloud-init.debug=1 - 开启后
cloud-init.log会记录更详细的执行细节,便于定位偶发失败点
7. 检查宿主机侧的Cloud-init传递机制
偶发问题可能源于宿主机的Libvirt传递异常:
- 查看Libvirt虚拟机日志:
cat /var/log/libvirt/qemu/<vm-name>.log,排查是否存在Userdata读取失败等报错 - 验证宿主机Cloud-init工具状态:
cloud-init --version,确保宿主机工具版本与VM内版本兼容
内容的提问来源于stack exchange,提问作者guru
相关产品推荐
相关产品推荐

