guestfish交互式操作镜像

为什么用 guestfish

guestfish 属于 libguestfs 工具集,它允许在不启动虚拟机的情况下直接操作虚拟机镜像(如 qcow2)
常用于:

  • 修改系统配置(如密码、network、fstab)
  • 复制文件进出镜像
  • 调试 cloud-init 故障
    无需 mount loop 或启动虚拟机,非常高效。

命令解析

1
sudo guestfish --rw -a Fedora-Cloud-Base-Generic-42-1.1.aarch64.qcow2

解释:

  • sudo:以 root 权限运行,因为需要访问镜像的文件系统。
  • guestfish:交互式镜像操作工具。
  • --rw:read-write 模式(允许修改内容)。
  • -a <镜像>:指定要附加的 qcow2 磁盘镜像。

执行后会进入一个 guestfish 交互 shell,提示符会变成:

><fs>

1.启动虚拟磁盘设备

1
><fs> run

作用:让 libguestfs 启动内部的虚拟机环境(后台会自动加载内核、initrd),扫描磁盘分区。
(类似 qemu 挂载镜像,只不过是轻量级用户态虚拟环境。)


2.列出磁盘上的文件系统

1
><fs> list-filesystems

作用:查看镜像中有哪些分区,比如输出可能是:

/dev/sda1: ext4
/dev/sda2: xfs

这样你就知道根分区挂在哪个设备上。


3.挂载根文件系统

1
><fs> mount /dev/sda1 /

作用:把 /dev/sda1(或正确的根分区)挂载到 guestfish 内部环境的 / 路径下。
这时你就能访问 /etc, /root, /home 等文件了。


4.修改密码

方法 A:直接编辑 /etc/shadow

1
><fs> vi /etc/shadow

这会在 guestfish 内部启动一个简单的编辑器(vi 风格)让你手动修改密码字段。
但比较麻烦,因为密码是哈希格式(如 $6$rounds=500000$xxxx...)。

方法 B:直接使用 set-password

1
><fs> set-password fedora mypassword

作用:
自动为用户 fedora 生成 SHA512 加密密码并写入 /etc/shadow,无需手动算 hash。
如果该用户不存在,会报错(但 Fedora Cloud 镜像中默认有 fedora 用户)。


5.退出并保存修改

1
><fs> exit

作用:退出 guestfish,同步写入修改。镜像文件会被更新。
此时镜像中 fedora 用户的密码已经变成了 mypassword


验证

启动虚拟机:

1
2
3
qemu-system-aarch64 -m 2G -cpu cortex-a72 -machine virt \
-drive if=virtio,file=Fedora-Cloud-Base-Generic-42-1.1.aarch64.qcow2 \
-nographic

出现登录提示后,用:

login: fedora
Password: mypassword

附加技巧

  • 查看镜像内容:

    1
    guestfish --ro -a <image> -i ls /etc

    --ro 表示只读)

  • 复制文件出来:

    1
    guestfish --ro -a image.qcow2 -i copy-out /etc/hostname .
  • 修改 root 密码:

    1
    set-password root newpass

简化命令重置密码

guestfish --rw -a /mnt/Fedora-Cloud-Base-Generic-42-1.1.aarch64.qcow2
><fs> run
><fs> list-filesystems
><fs> mount /dev/sda1 /
><fs> set-password fedora mypass
><fs> exit