必须先执行 run 启动 guestfish 虚拟环境,否则 list-filesystems 等操作均失败;run 成功后才能识别分区、挂载文件系统、同步修改 shadow/cloud.cfg/sshd_config,并在退出前 umount 再 quit。

能直接改,但必须先让 guestfish “启动”虚拟环境,否则所有文件操作都会失败。
guestfish 必须先 run 才能访问文件系统
很多人一上来就 guestfish -a image.qcow2,然后直接输 list-filesystems,结果报错 no filesystems found。这不是命令写错了,是漏掉了关键一步:run。
run 不是运行脚本,而是启动一个极轻量的虚拟机环境(基于 QEMU + 内核),用来解析磁盘结构、识别分区和文件系统。没这步,guestfish 就像没通电的手术刀——看着锋利,动不了真格。
- 执行
run后要等几秒,进度条走完才算成功;中途 Ctrl+C 会导致状态残留 - 如果
run报错,常见原因:libvirtd 服务没启(sudo systemctl start libvirtd)、当前用户不在libvirt组、镜像路径权限不足(可用sudo临时绕过) -
list-filesystems输出类似/dev/vda1: ext4或/dev/sda1: xfs,才说明识别成功;设备名以实际输出为准,别硬套sda1
挂载后必须同步改 shadow + cloud.cfg + sshd_config
只改 /etc/shadow 的 root 密码哈希,大概率还是 SSH 登不进去。云镜像(openEuler/CentOS/Ubuntu)默认禁用密码登录,靠三重限制:cloud-init 配置、sshd 设置、以及 PAM 策略。
- 生成新密码哈希:
openssl passwd -6 123456(推荐 SHA-512,-6比-1安全) - 编辑
/etc/shadow:找到root行,把第二个字段(冒号分隔)替换成刚生成的哈希,例如root:$6$abc123$xyz:18374:0:99999:7::: - 编辑
/etc/cloud/cloud.cfg:确保存在disable_root: false和ssh_pwauth: true;部分镜像支持加plain_text_passwd: "123456"实现首次启动自动设密 - 编辑
/etc/ssh/sshd_config:确认PermitRootLogin yes和PasswordAuthentication yes已启用(注意不是without-password)
umount 和 quit 顺序不能错
guestfish 不会自动卸载已挂载的分区。如果挂载了 /dev/vda1 到 /,操作完直接 quit,下次再进就会卡在 run 或报 device busy——因为内核里还挂着上次的挂载点。
- 退出前必须显式执行
umount /(或你 mount 到的路径),再quit - 千万别用 Ctrl+C 或直接关终端,那等于强制中断,挂载残留更难清理
- 如果已经出问题,宿主机上手动清理:
sudo umount /mnt(如果你曾用mount /dev/nbd0p1 /mnt方式挂载过),再sudo qemu-nbd --disconnect /dev/nbd0
真正麻烦的不是改哪几个文件,而是每一步都依赖前一步的状态闭环:run 要成功 → list-filesystems 要有输出 → mount 要对上设备名 → 三个配置文件要同时生效 → umount 要干净。漏掉任意一环,镜像看起来改了,启动后照样登不进去。


















