ubuntu2004挂载qcow2磁盘镜像

1,581 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第1天,点击查看活动详情

qcow2磁盘镜像是QEMU/KVM支持和使用的磁盘镜像格式之一,它可以用一个文件来表示一个固定大小的块设备。qcow2磁盘镜像一般是用虚拟机来读取的,但有时候我们希望不通过启动虚拟机就读取磁盘镜像内的文件,这就可以通过挂载方式来实现了。

在ubuntu2004系统,我们可以通过qemu-nbdlibguestfs两种方法来挂载 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