pve/linux/直接挂载/修改虚拟磁盘文件img/qcow2/vmdk/RW

修改qcow2镜像

对于一般的linux发行版执行下面命令。PVE自带这些工具,直接略过

#首先安装
sudo apt-get install qemu-utils
或者
sudo yum install qemu-img

第一步:开启nbd

modprobe nbd max_part=8

第二步:挂载虚拟磁盘

#代码如下
qemu-nbd --connect=/dev/nbd1 /path/to/qcow2/image
#解释 /dev/nbd1就是磁盘名,例如/dev/sda 
#注意的是这个nbd后面必须加个数字序号,可以1,可以是2。否则报错
qemu-nbd: Failed to open /dev/nbd: No such file or directory
#/path/to/qcow2/image 就是磁盘位置
#使用演示
1、qcow2位置/mnt/pve/nvme960/images/107/vm-107-disk-0.qcow2
2、磁盘名为nbd
#挂载虚拟磁盘
qemu-nbd --connect=/dev/nbd2 /mnt/pve/nvme960/images/107/vm-107-disk-0.qcow2
#使用fdisk查看磁盘
fdisk -l |grep nbd2
#可以看到如下信息
#Partition 1 does not start on physical sector boundary.
#Disk /dev/nbd2: 32 GiB, 34359738368 bytes, 67108864 sectors
#/dev/nbd2p1 *      2048   206847   204800  100M  7 HPFS/NTFS/exFAT
#/dev/nbd2p2      206848 67106815 66899968 31.9G  7 HPFS/NTFS/exFAT
#此时的虚拟磁盘就挂载成功了。可以看到2个分区。我这里挂载的是一个win7的镜像。其中/dev/nbd2p2是win7系统所在分区。格式是NTFS

第三步挂载分区

#由于是NTFS需要安装ntfs-3g
apt install ntfs-3g -y
#新建挂载点
mkdir /win7
#挂载/dev/nbd2p2  到/win7
mount /dev/nbd2p2  /win7
#查看挂载情况 
df -h |grep win7
#输出如下
/dev/nbd2p2            32G   24G  8.9G  73% /win7
#直接进入文件夹去看看
root@pve:/win7# ls
'$Recycle.Bin'		   pagefile.sys  'Program Files'	'System Volume Information'
'Documents and Settings'   PerfLogs	 'Program Files (x86)'	 Users
 hiberfil.sys		   ProgramData	  Recovery		 Windows
#挂载完,再新建一个文件夹试试
mkdir 1

第四步卸载

1、先卸载分区

umount /win7 

2、卸载磁盘

qemu-nbd --disconnect /dev/nbd2

第五步 大功告成

可以看到有个文件夹1

修改img vmdk镜像

可以通过qemu-img convert转换到qcow2再挂载

 

修改LVM/RAW镜像

如果虚拟机放在lvm或者使用RAW镜像可以参考下面

第一步,找到磁盘位置

我要修改VM108的磁盘,是vm-108-disk-4 

先通过ls /dev/mapper/来看一下磁盘名字叫什么

root@pve:~# ls /dev/mapper/
control                      NvmeSSD-vm--104--disk--0    NvmeSSD-vm--108--disk--4
NvmeSSD-base--993--disk--0   NvmeSSD-vm--105--disk--0    NvmeSSD-vm--301--disk--1
NvmeSSD-base--994--disk--0   NvmeSSD-vm--106--disk--0    NvmeSSD-vm--302--disk--0
NvmeSSD-base--995--disk--0   NvmeSSD-vm--107--disk--0    NvmeSSD-vm--302--disk--1
NvmeSSD-base--995--disk--1   NvmeSSD-vm--108--disk--0    NvmeSSD-vm--303--disk--0
NvmeSSD-base--998--disk--0   NvmeSSD-vm--108--disk--1    NvmeSSD-vm--303--disk--1
NvmeSSD-base--999--disk--0   NvmeSSD-vm--108--disk--2    NvmeSSD-vm--401--disk--0

 找到磁盘路径为/dev/mapper/NvmeSSD-vm--108--disk--4

 

第二步,安装kpartx

kpartx命令用来让Linux内核读取一个设备上的分区表,然后生成代表相应分区的设备。

apt update && apt install kpartx -y

 第三步,使用losetup挂载设备

先输入losetup回车查看是否有挂载了loop设备,没有就继续。

root@pve:~# losetup
root@pve:~# 

 用losetup将lvm中的磁盘挂载为loop设备

root@pve:~# losetup /dev/loop5 /dev/mapper/NvmeSSD-vm--108--disk--4
root@pve:~# kpartx -a /dev/loop5

查看一下是否挂载了,使用lsblk查看loop5设备

 

root@pve:~# lsblk
NAME                              MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
loop5                               7:5    0    52M  0 loop 
├─loop5p1                         253:44   0    15M  0 part 
├─loop5p2                         253:45   0    30M  0 part 
└─loop5p3                         253:46   0     4M  0 part 

 这里出现了3个分区,选择需要挂载的分区,因为我是改群晖,所以是第二个分区

 

先挂载,注意这里loop5的位置在/dev/mapper

root@pve:~# mkdir /cloud
root@pve:~# mount /dev/mapper/loop5p2  /cloud
root@pve:~# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/pve-root 95G 12G 79G 13% /
/dev/mapper/loop5p2 30M 14M 17M 45% /cloud

 使用df -h可以看到已经挂载了。可以正常使用

 

root@pve:~# ls /cloud/
checksum.syno  extra.lzma  grub_cksum.syno  rd.gz  zImage
root@pve:~# touch /cloud/test1
root@pve:~# ls /cloud/
checksum.syno  extra.lzma  grub_cksum.syno  rd.gz  test1  zImage

 第四步,卸载

先卸载目录,再卸载loop设备

root@pve:~# umount /cloud 

再使用kpartx 取消mapper映射

root@pve:~# kpartx -d /dev/loop5 

最后使用losetup取消loop映射

root@pve:~# losetup -d /dev/loop5 

root@pve:~# umount /cloud
root@pve:~# kpartx -d /dev/loop5 root@pve:~# losetup NAME SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE DIO LOG-SEC /dev/loop5 0 0 0 0 /dev/dm-43 0 512 root@pve:~# losetup -d /dev/loop5 root@pve:~# losetup

 相关参考

How to: Mount raw VM disk images (KVM/Xen/VMW) - Knowledgebase - Mellowhost
raw,qcow2虚拟磁盘挂载 - 李庆喜 - 博客园 (cnblogs.com)

 

 

 

挂载修改zfs:zvol镜像

先确定镜像路径

使用下面命令。注意这里的zpoolname一定要和本机的对应

ls /dev/zvol/zpoolname/* -la 

root@pve:~# ls /dev/zvol/zfs/* -l
lrwxrwxrwx 1 root root 10 Sep  2 12:11 /dev/zvol/zfs/vm-100-disk-0 -> ../../zd16
lrwxrwxrwx 1 root root 12 Sep  2 12:11 /dev/zvol/zfs/vm-100-disk-0-part1 -> ../../zd16p1
lrwxrwxrwx 1 root root 13 Sep  2 12:11 /dev/zvol/zfs/vm-100-disk-0-part14 -> ../../zd16p14
lrwxrwxrwx 1 root root 13 Sep  2 12:11 /dev/zvol/zfs/vm-100-disk-0-part15 -> ../../zd16p15

 如上,这里出现了磁盘文件、分区以及具体的位置信息。确认一下修改的分区,如果不确定,可以使用命令查看

 

lsblk|grep zd 

root@pve:~# lsblk|grep zd
zd0 230:0 0 4M 0 disk
zd16 230:16 0 10G 0 disk
├─zd16p1 230:17 0 9.9G 0 part
├─zd16p14 230:30 0 4M 0 part
└─zd16p15 230:31 0 106M 0 part
zd32 230:32 0 40G 0 disk
└─zd32p1 230:33 0 40G 0 part
zd64 230:64 0 20G 0 disk
├─zd64p1 230:65 0 260M 0 part
└─zd64p2 230:66 0 19.7G 0 part
zd80 230:80 0 10.2G 0 disk
├─zd80p1 230:81 0 10.1G 0 part
├─zd80p14 230:94 0 4M 0 part
└─zd80p15 230:95 0 106M 0 part
zd96 230:96 0 10.2G 0 disk
├─zd96p1 230:97 0 10.1G 0 part
├─zd96p14 230:110 0 4M 0 part
└─zd96p15 230:111 0 106M 0 part 

 上面的命令输出了很多,我们只需要通过第一条的ls命令输出结果中的zd号,即可对应是哪个块,我的是zd16

 

zd16 230:16 0 10G 0 disk 
├─zd16p1 230:17 0 9.9G 0 part 
├─zd16p14 230:30 0 4M 0 part 
└─zd16p15 230:31 0 106M 0 part

我要修改数据目录,就修改p1即可。

于是

root@pve:~# mount /dev/zd16p1 /cloud
root@pve:~# ls /cloud/
bin   dev  home        initrd.img.old  lib64       media  opt   root  sbin  srv  tmp  var      vmlinuz.old
boot  etc  initrd.img  lib             lost+found  mnt    proc  run   snap  sys  usr  vmlinuz

 或者

root@pve:~# mount /dev/zvol/zfs/vm-100-disk-0-part1 /cloud/
root@pve:~# ls /cloud/
bin   dev  home        initrd.img.old  lib64       media  opt   root  sbin  srv  tmp  var      vmlinuz.old
boot  etc  initrd.img  lib             lost+found  mnt    proc  run   snap  sys  usr  vmlinuz

 卸载就umount就行

注意

以上都是针对虚拟磁盘中传统分区的修改,如果虚拟机内部创建了LVM,那就不一样了。

 

版权声明:
作者:佛西
链接:https://foxi.buduanwang.vip/linux/552.html/
来源:佛西博客
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
打赏
< <上一篇
下一篇>>
文章目录
关闭
目 录