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 | qemu-system-aarch64 -m 2G -cpu cortex-a72 -machine virt \ |
出现登录提示后,用:
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