一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第1天,点击查看活动详情。
qcow2磁盘镜像是QEMU/KVM支持和使用的磁盘镜像格式之一,它可以用一个文件来表示一个固定大小的块设备。qcow2磁盘镜像一般是用虚拟机来读取的,但有时候我们希望不通过启动虚拟机就读取磁盘镜像内的文件,这就可以通过挂载方式来实现了。
在ubuntu2004系统,我们可以通过qemu-nbd 和libguestfs两种方法来挂载 qcow2 类型的磁盘镜像( QEMU/KVM 使用的)。
方法一:qemu-nbd
NBD(Network Block Device),网络块设备。它可以将一个远程主机的磁盘空间,当作一个块设备来使用。NBD是一个内核模块,大部分Linux发行版都已包含它,不过使用前需要进行nbd模块的加载。
1.安装qemu-nbd命令行工具
$ sudo apt install qemu-utils
2.将qcow2磁盘镜像导出到磁盘
加载 nbd 内核模块。可以用"max_part=N" 选项指定我们想要通过 nbd 管理的分区的最大个数。
$ sudo modprobe nbd max_part=8
加载nbd模块后,就会在/dev设备目录下,出现nbd0-nbd9的设备名,我们可以将磁盘镜像导出为这些网络块设备。
$ sudo qemu-nbd -c /dev/nbd1 /XXX/XXX/imgname.qcow2
3.挂载qcow2磁盘镜像分区
导出为网络块设备后,就可以当成一个磁盘分区进行挂载和读取操作了。
$ sudo fdisk -l | grep /dev/nbd #查看导出后的磁盘分区
Disk /dev/nbd1:40 GiB,42949672960 字节,83886080 个扇区
/dev/nbd1p1 2048 4194303 4192256 2G e W95 FAT16 (LBA)
/dev/nbd1p2 4194304 83886079 79691776 38G 83 Linux
$ sudo mkdir /mnt/nbd1 /mnt/mbd2 #创建2个目录准备挂载/dev/nbd1p1和/dev/nbd1p2这两个分区。
$ sudo mount /dev/nbd1p1 /mnt/mbd1 #挂载/dev/nbd1p1
$ ls /mnt/nbd1/ #查看/dev/nbd1p1分区中的文件
config-4.19.90-2106.3.0.0095.oe1.x86_64 loader
dracut symvers-4.19.90-2106.3.0.0095.oe1.x86_64.gz
efi System.map-4.19.90-2106.3.0.0095.oe1.x86_64
grub2 vmlinuz-4.19.90-2106.3.0.0095.oe1.x86_64
initramfs-4.19.90-2106.3.0.0095.oe1.x86_64.img
$ sudo mount /dev/nbd1p2 /mnt/nbd2 #挂载/dev/nbd1p2
$ ls /mnt/nbd2/ #查看/dev/nbd1p2分区中的文件
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
3.断开磁盘镜像的链接
取消挂载后,还需要将nbd磁盘进行释放,否则会处于占用状态。
$ sudo umount /mnt/nbd1 /mnt/nbd2 #取消挂载
$ sudo qemu-nbd -d /dev/nbd1 #取消镜像链接
/dev/nbd1 disconnected
方法二:libguestfs
libguestfs是一组 Linux 下的 C 语言的 API ,用来访问虚拟机的磁盘映像文件。该工具包内包含的工具有virt-cat、virt-df、virt-ls、virt-copy-in、virt-copy-out、virt-edit、guestfs、guestmount、virt-list-filesystems、virt-list-partitions等工具。该工具也可以在不启动KVM虚拟机的情况下,直接查看和操作qcow2磁盘镜像的内容。
1.安装libguestfs工具
$ sudo apt install libguestfs-tools
2.挂载磁盘镜像中的分区到挂载点
语法:guestmount -a 镜像文件 -m 镜像文件内包含的某个分区 [选项] 挂载点
$ sudo mkdir /mnt/a #创建挂载点目录
sudo guestmount -a /XXX/XXX/imgname.qcow2 -m /dev/sda1 /mnt/a #尝试挂载/dev/sda分区,将提示有两个有效的分区/dev/sda1(/boot)和/dev/sda2(/root),
libguestfs: error: mount_options: mount exited with status 32: mount: /sysroot: wrong fs type, bad option, bad superblock on /dev/sda, missing codepage or helper program, or other error.
guestmount: ‘/dev/sda’ could not be mounted.
guestmount: Did you mean to mount one of these filesystems?
guestmount: /dev/sda1 (vfat)
guestmount: /dev/sda2 (ext4)
$ sudo guestmount -a /XXX/XXX/imgname.qcow2 -m /dev/sda2 /mnt/a #将磁盘镜像中包含的/dev/sda2分区挂载到/mnt/a目录
sudo ls /mnt/a
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
也可以通过-i参数替代-m来实现自动挂载有效分区
$ sudo mkdir /mnt/a #创建挂载点目录
$ sudo guestmount -a /XXX/XXX/imgname.qcow2 -i /mnt/a #将自动将磁盘镜像中最有效的/dev/sda2分区挂载到/mnt/a目录
sudo ls /mnt/a
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
3.取消挂载
$ sudo guestunmount /mnt/a