pve/linux/直接挂载/修改虚拟磁盘文件img/qcow2/vmdk/RAW/RBD
修改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就行
修改ceph rbd
使用rbd工具的map和umap工具
查看当前的rbd磁盘
root@pve1:~# rbd ls --pool ssd
rdb1
这里--pool是指定ceph的池
这里有个rdb1,那么我们可以使用rbd map命令,将磁盘连接到主机
root@pve1:~# rbd map --pool ssd rdb1
/dev/rbd0
这里就会在主机上出现/dev/rbd0这个设备。
我们进行该做的操作就行。如果要卸载,则就ok
root@pve1:~# rbd unmap --pool ssd rdb1
或者
root@pve1:~# rbd unmap /dev/rbd0
注意
以上都是针对虚拟磁盘中传统分区的修改,如果虚拟机内部创建了LVM,那就不一样了。
作者:佛西
链接:https://foxi.buduanwang.vip/linux/552.html/
文章版权归作者所有,未经允许请勿转载
如需获得支持,请点击网页右上角
1
XuXian_许仙@1