1. 场景
查看操作虚拟机镜像的文件系统
- 查看/修改 windows 镜像密码
- 查看/修改 linux 镜像密码、cloud-init 文件
- 其他
2. 环境
环境 | 版本 | 备注 |
---|
OS | CentOS7.9 | | libguestfs | 1.40.2-10.el7.x86_64 | | libguestfs-tools | 1.40.2-10.el7.noarch | | libguestfs-winsupport | 7.2-3.el7.x86_64 | 实际安装了这个包也没法兼容 ntfs 文件系统 | ntfs-3g | 2017.3.23-11.el7.x86_64 | 挂载 ntfs 文件系统 | kpartx | 0.4.9-134.el7_9.x86_64 | 根据分区表将分区映射为不同的 lvm 设备 |
3. 操作
3.1. Linux
修改 cloud-init 配置使得用该镜像启动的虚拟机可以通过 root 用户 ssh
guestfish -a CentOS-7-x86_64-GenericCloud.qcow2
run
list-filesystems
mount /dev/sda1 /
vi /etc/cloud/cloud.cfg
exit
这样就算修改完成了,再次启动磁盘上的内容就是我们修改过的。
3.2. Windows
windows 比较麻烦点,上面版本的 libguestfs-tools 不支持 ntfs
我们使用 kpartx 先将磁盘分区映射到服务器的 lvm 然后使用 loop 设备挂载
kpartx 可以映射 raw 格式镜像,无法映射 qcow2 格式镜像,qcow2 格式镜像要么转换成 raw 格式镜像再映射,要么使用 nbd 映射
3.2.1. raw 镜像
qemu-img convert -f qcow2 -O raw xxxx.qcow2 xxxx.raw
kpartx -av xxxx.raw
add map loop1p1 (253:16): 0 1024000 linear /dev/loop1 2048
add map loop1p2 (253:17): 0 40914944 linear /dev/loop1 1026048
mount /dev/mapper/loop1p2 /mnt/
cd /mnt/
cat Program\ Files/Bingosoft/Ec2Config/SysPrepInit.cmd
cd -
umount /mnt
kpartx -dv xxx.raw
如果如果没有EC2 文件的话,一样的也是挂载到宿主机上,然后找到C盘的windows/system32/sethc.exe文件,把这个文件改为其他名字,然后把cmd.exe复制一份成这个文件。然后开机后连按5次shift键,就会跳出cmd界面了。然后用net user administrator 123456重置下密码。
3.2.2. qcow2
qcow2 镜像使用 nbd 驱动挂载, nbd 要先重新编译到内核里面,否则下面操作无法继续
这种方式我没有实操,参照mounting-raw-and-qcow2-images
modprobe nbd max_part=63
qemu-nbd -c /dev/nbd0 disk1.qcow2
mount /dev/nbd0p1 /mnt/t01
losetup /dev/loop0 /dev/nbd0p2
ls -l /dev/mapper
mount /dev/mapper/vg_volgroupname-lv_logicalgroupname /mnt/t02
...
umount /mnt/t02
umount /mnt/t01
vgchange -an vg_volgroupname
losetup -d /dev/loop0
qemu-nbd -d /dev/nbd0
rmmod nbd
4. 参考
https://www.linuxunbound.com/2016/07/mounting-raw-and-qcow2-images/
|