必须先执行run启动虚拟环境才能访问文件系统,否则list-filesystems报错;需同步修改/etc/shadow密码哈希、/etc/cloud/cloud.cfg(disable_root:false, ssh_pwauth:true)及/etc/ssh/sshd_config(PermitRootLogin yes),并手动umount后quit。

能直接重置,但必须改 /etc/shadow 里的 root 密码哈希,不能只改明文或漏掉 cloud-init/SSH 配置。
guestfish 启动后必须执行 run 才能访问文件系统
很多人卡在第一步:guestfish --rw -a centos7.qcow2 进入交互界面后直接输 list-filesystems,结果报错 “no filesystems found”。这是因为镜像还没“启动”——guestfish 的 run 命令不是运行脚本,而是启动一个轻量虚拟机环境来解析磁盘结构。
- 必须先执行
run,等待几秒(可能看到进度条),再执行list-filesystems - 如果
run报错,常见原因是:libvirtd没运行(systemctl start libvirtd)、当前用户没加到libvirt组、或镜像路径权限不对(用sudo或改/etc/libvirt/qemu.conf中的user/group) -
list-filesystems输出类似/dev/sda1: ext4,说明识别成功;若显示/dev/vda1,挂载时就得用这个设备名,别硬套sda1
挂载后要同时改 shadow + cloud.cfg + sshd_config
只改 /etc/shadow 往往还是登不进去。云镜像(CentOS/RHEL/Ubuntu)默认禁用 root 密码登录,靠 cloud-init 和 sshd 配置双重限制。
- 生成新密码哈希:
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已启用,改完记得systemctl restart sshd——但这步在 guestfish 里做不了,所以得靠 cloud-init 首次启动时自动生效
退出前必须 umount,否则下次 run 可能失败
guestfish 不会自动卸载已挂载的分区。如果中途 quit 后又重新进入,run 可能卡住或报 “device busy”,因为内核里还挂着上次的挂载点。
- 挂载后操作完,先
umount /(或你 mount 到的路径) - 再
quit,不要直接 Ctrl+C 或关终端 - 如果已经出问题,宿主机上手动清理:
sudo umount /mnt(如果你曾用mount /dev/nbd0p1 /mnt等方式挂载过),再sudo qemu-nbd --disconnect /dev/nbd0 - 某些旧版 guestfish(如 libguestfs
真正容易被忽略的是 cloud-init 的行为:它只在首次启动时读取 cloud.cfg 并应用配置。如果你改完镜像后反复启动同一台 VM,cloud-init 默认跳过初始化,disable_root: false 就不会生效——得删掉 /var/lib/cloud/instances/ 下的实例目录,或者改 cloud.cfg 里的 preserve_hostname: false 强制重跑。

















