date: 2021-02-04title: kvm存储池与存储卷 #标题
tags: kvm #标签
categories: kvm # 分类
kvm存储池管理
存储池用于存放虚机的磁盘文件及iso文件,默认使用本地目录作为存储池,存储池大概有如下几种类型:
- 基于目录的存储池
- 基于磁盘的存储池
- 基于分区的存储池
- 基于LVM的存储池
- 基于iscsi的存储池
- 基于nfs的存储池
基于目录的存储池
$ mkdir /data2
# guest_images:池名称
# dir:存储池类型为目录类型
$ virsh pool-define-as guest_images dir --target "/data2"
基于物理磁盘的存储池
# 更改磁盘类型为gpt
$ parted -s /dev/sdb mklabel gpt
$ cat /tmp/device.xml # 定义文件内容如下
<pool type='disk'>
<name>local_disk</name>
<source>
<device path='/dev/sdb'/>
<format type='gpt'/>
</source>
<target>
<path>/dev</path>
</target>
</pool>
# source为/dev/sdb
# target为:/dev/
# 从文件中定义存储池
$ virsh pool-define /tmp/device.xml
# 启动并设置为开机自启
$ virsh pool-start local_disk
$ virsh pool-autostart local_disk
基于分区的存储池
分区格式化后,libvirtd会自动mount指定的分区。
# 创建分区并格式化
$ parted -s /dev/sdb mklabel gpt
$ parted /dev/sdb mkpart primary xfs 0% 100%
$ mkfs.xfs /dev/sdb1
# 创建基于分区的存储池
$ virsh pool-define-as parted_pool fs \
--source-dev "/dev/sdb1" --target "/data3"
# 查看所有存储池
$ virsh pool-list --all
名称 状态 自动开始
-------------------------------------------
disk 活动 是
guest_images 不活跃 否
iso 活动 是
parted_pool 不活跃 否
# 启动新创建的存储池
$ virsh pool-build parted_pool # 仅在第一次启动前需要执行
$ virsh pool-start parted_pool # 启动
$ virsh pool-autostart parted_pool # 开机自启
基于lvm的存储池
# --source-dev: 指定硬盘设备,事先无卷组时此项才需要指定
# --source-name: 指定已有卷组名,此项利用已有卷组创建存储池才需指定,事先无卷组无需指定
# --target:指定vg放在哪里
# 如果有卷组请执行
$ virsh pool-define-as test_lvm logical --source-name=vg_name --target=/dev/vg_libvirt
# 如果没有卷组,请执行
$ virsh pool-define-as test_lvm logical --source-dev=/dev/sdb --target=/dev/vg_libvirt
# 启动新创建的存储池
$ virsh pool-build test_lvm # 仅在第一次启动前需要执行
$ virsh pool-start test_lvm
$ virsh pool-autostart test_lvm
$ virsh pool-list --all # 确认状态正常
名称 状态 自动开始
-------------------------------------------
test_lvm 活动 是
# 当可以查看到 test_lvm 这个存储池时
# 也可以通过vgscan命令查看到相应的vg
# 而当后面我们基于此存储池创建存储卷后
# 也可以通过lvscan查看到相应的lv卷
如果要使用lvm的存储池创建存储卷并安装虚机,则需要用--disk vol=test_lvm/lvvol1
来指定磁盘文件,其中test_lvm
是存储池名称,lvvol1
是存储卷名称。
基于iscsi的存储池
iscsi实现网络存储,提供存储端叫 Target,使用存储端叫 Initiator,Target 上可以提供存储空间,Initiator负责连接ISCSI设备,在ISCSI设备中创建文件系统,以及存取数据,在 Initiator 上看上去是多了一块硬盘。
在SAN中,主机一般都是指Initiator,存储设备则是Target。Initiator是SCSI会话的发起方,负责向Target请求LUN,并将数据的读写指令发送给Target。Target是接受SCSI会话的一方,它负责接受来自Initator的指令,为Initiator提供LUN,并实现对LUN的读写。
这里基于iscsi的存储池是使用Linux-IO来实现的,其在linux内核中,用软件实现各种SCSI Target。
Linux_IO简称LIO,其可以使用ram、disk、directory来作为它对外提供的存储设备。
配置Target
这里需要单独准备一台机器,用作于Target。
如下操作在Target的机器上进行,以便创建各种LUN。此机器需要准备未格式化的磁盘,用于对外提供存储。
# 安装target客户端
$ yum -y install targetcli
# 格式化新磁盘以便给target使用
$ parted -s /dev/sdb mklabel gpt
$ parted /dev/sdb mkpart primary xfs 0% 100%
$ targetcli # 进入target交互模式中
# target交互模式中,类似于shell,支持自动补全、ls、cd等命令
/> ls / # 查看有哪些东西
o- / ................................................................... [...]
o- backstores ........................................................ [...]
| o- block ............................................ [Storage Objects: 0]
| o- fileio ........................................... [Storage Objects: 0]
| o- pscsi ............................................ [Storage Objects: 0]
| o- ramdisk .......................................... [Storage Objects: 0]
o- iscsi ...................................................... [Targets: 0]
o- loopback ................................................... [Targets: 0]
# 上面的 backstores 目录下对应的就是不同类型的存储
# 如:block(块存储)、fileio(文件存储)、ramdisk(基于内存的存储)
# 基于/dev/sdb1创建块存储
$ targetcli # 进入target交互模式中
/> cd backstores/block
# 使用/dev/sdb1创建块存储并命名为 block1
/backstores/block> create block1 dev=/dev/sdb1
Created block storage object block1 using /dev/sdb1.
# 基于/tmp/data1.img 创建文件存储
> cd /backstores/fileio
# 基于/tmp/data1.img 文件创建一个10G的存储
/backstores/fileio> create fileio1 /tmp/data1.img 10G
Created fileio fileio1 with size 10737418240
# 查看本地文件,发现大小为10G
$ ll -sh /tmp/data1.img
0 -rw-r--r--. 1 root root 10G 2月 3 21:24 /tmp/data1.img
$ du -sh /tmp/data1.img # 但du命令统计大小为 0
0 /tmp/data1.img
# 基于内存创建内存存储
> cd /backstores/ramdisk
> create randisk1 1G # 使用1G的内存空间创建内存存储
Created ramdisk randisk1 with size 1G.
# 当创建成功后,你的内存剩余可用空间将减少1G
当上面各种类型都创建完成后,此时看一下 / ,返回结果如下:
当可以看到上面的信息后,说明我们后端存储已创建完毕,那么现在就可以创建一个ISCSI Target了,如下:
$ targetcli
/> cd iscsi
# iscsi target的命名必须以 iqn, naa, eui其中之一开头。
# 我这里命名为:iqn.2021-02.org.stroge.srv1:pod7-dmz-20-6 ,冒号后面建议写本机主机名称
/iscsi> create iqn.2021-02.org.stroge.srv1:pod7-dmz-20-6
Created target iqn.2021-02.org.stroge.srv1:pod7-dmz-20-6.
Created TPG 1.
Global pref auto_add_default_portal=true
Created default portal listening on all IPs (0.0.0.0), port 3260.
/iscsi> ls # 查看上面命令执行后生成的信息
o- iscsi ............................................................ [Targets: 1]
o- iqn.2021-02.org.stroge.srv1:pod7-dmz-20-6 ......................... [TPGs: 1]
o- tpg1 ............................................... [no-gen-acls, no-auth]
o- acls .......................................................... [ACLs: 0]
o- luns .......................................................... [LUNs: 0]
o- portals .................................................... [Portals: 1]
o- 0.0.0.0:3260 ..................................................... [OK]
# 将存储对象与target进行mapping
/> cd /iscsi/iqn.2021-02.org.stroge.srv1:pod7-dmz-20-6/tpg1/luns
/iscsi/iqn.20...0-6/tpg1/luns> create /backstores/block/block1
Created LUN 0.
/iscsi/iqn.20...0-6/tpg1/luns> create /backstores/fileio/fileio1
Created LUN 1.
/iscsi/iqn.20...0-6/tpg1/luns> create /backstores/ramdisk/randisk1
Created LUN 2.
# 到Initiator查看其IQN(如下操作,是谁要挂载iSCSI就到哪个机器上查看)
$ yum install -y iscsi-initiator-utils
$ cat /etc/iscsi/initiatorname.iscsi # 查看iSCSI名称,名称可自定义
InitiatorName=iqn.2021-02.com.redhat:pod7-dmz-20-10
$ systemctl restart iscsid # 如果更改了本机的IQN,则需要重启此服务,以便更新IQN
# 在target存储机器上,为Initiator客户端创建acl
/> cd /iscsi/iqn.2021-02.org.stroge.srv1:pod7-dmz-20-6/tpg1/acls # 切换到此目录
# 下面指定的IQN名字,是Initiator客户端查看到的IQN
/iscsi/iqn.20...0-6/tpg1/acls> create iqn.2021-02.com.redhat:pod7-dmz-20-10
Created Node ACL for iqn.2021-02.com.redhat:pod7-dmz-20-10
Created mapped LUN 2.
Created mapped LUN 1.
Created mapped LUN 0.
# 保存设置并退出
/> saveconfig
/> exit
最后查看target的 / ,返回信息如下:
启动target服务
$ systemctl enable target
$ systemctl start target
配置Initiator使用target
# 需要保证和target服务器网络可通
$ telnet 192.168.20.6 3260
# 发现target的IQN,--portal 指定的IP是target服务器的IP
$ iscsiadm --mode discovery --type sendtargets --portal 192.168.20.6
192.168.20.6:3260,1 iqn.2021-02.org.stroge.srv1:pod7-dmz-20-6
# 登录到target的IQN
$ iscsiadm -d2 -m node --login # 如果提示如下,则表示登录失败
iscsiadm: Max file limits 1024 4096
iscsiadm: default: Creating session 1/1
Logging in to [iface: default, target: iqn.2021-02.org.stroge.srv1:pod7-dmz-20-6, portal: 192.168.20.6,3260] (multiple)
iscsiadm: Could not login to [iface: default, target: iqn.2021-02.org.stroge.srv1:pod7-dmz-20-6, portal: 192.168.20.6,3260].
iscsiadm: initiator reported error (24 - iSCSI login failed due to authorization failure)
iscsiadm: Could not log into all portals
# 可能是 名称与服务端acl设置的名称不一致 或者 未更新客户端的IQN
$ systemctl restart iscsid # 客户端重启iscsid服务,以便更新本机IQN
$ iscsiadm -d2 -m node --login # 再次登录,输出如下,表示成功登录到target服务器
iscsiadm: Max file limits 1024 4096
iscsiadm: default: Creating session 1/1
Logging in to [iface: default, target: iqn.2021-02.org.stroge.srv1:pod7-dmz-20-6, portal: 192.168.20.6,3260] (multiple)
Login to [iface: default, target: iqn.2021-02.org.stroge.srv1:pod7-dmz-20-6, portal: 192.168.20.6,3260] successful.
# 如果不需要使用了,可以执行如下命令,退出target登录状态
$ iscsiadm -d2 -m node --logout
iscsiadm: Max file limits 1024 4096
Logging out of session [sid: 4, target: iqn.2021-02.org.stroge.srv1:pod7-dmz-20-6, portal: 192.168.20.6,3260]
Logout of [sid: 4, target: iqn.2021-02.org.stroge.srv1:pod7-dmz-20-6, portal: 192.168.20.6,3260] successful.
$ lsblk # 再次查看,刚才挂载的块设备也不见了
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 100G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 99G 0 part
├─centos-root 253:0 0 50G 0 lvm /
├─centos-swap 253:1 0 2G 0 lvm [SWAP]
└─centos-home 253:2 0 47G 0 lvm /home
sdb 8:16 0 100G 0 disk
sr0 11:0 1 1024M 0 rom
kvm中使用iSCSI创建存储池
$ virsh pool-list --all # 确认现有存储池
名称 状态 自动开始
-------------------------------------------
disk 活动 是
iso 活动 是
test_lvm 活动 是
$ lsblk # 查看现有本地磁盘
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 100G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 99G 0 part
├─centos-root 253:0 0 50G 0 lvm /
├─centos-swap 253:1 0 2G 0 lvm [SWAP]
└─centos-home 253:2 0 47G 0 lvm /home
sdb 8:16 0 100G 0 disk
sr0 11:0 1 1024M 0 rom
# 创建基于iSCSI的存储池
# --source-host:指定target主机IP
# --source-dev:指定target主机的IQN名字
# --target:必须指定为本机的 /dev/disk/by-path 目录
$ virsh pool-define-as --name iscsi_storge --type iscsi \
--source-host 192.168.20.6 \
--source-dev iqn.2021-02.org.stroge.srv1:pod7-dmz-20-6 \
--target /dev/disk/by-path
定义池 iscsi_storge
# 启动此存储池
$ virsh pool-start iscsi_storge
池 iscsi_storge 已启动
# 开启自动启动
$ virsh pool-autostart iscsi_storge
池 iscsi_storge 标记为自动启动
# 查看所有存储池
$ virsh pool-list --all
名称 状态 自动开始
-------------------------------------------
disk 活动 是
iscsi_storge 活动 是
iso 活动 是
test_lvm 活动 是
# 查看本地磁盘设备
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 100G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 99G 0 part
├─centos-root 253:0 0 50G 0 lvm /
├─centos-swap 253:1 0 2G 0 lvm [SWAP]
└─centos-home 253:2 0 47G 0 lvm /home
sdb 8:16 0 100G 0 disk
sdc 8:32 0 20G 0 disk
sdd 8:48 0 1G 0 disk
sde 8:64 0 10G 0 disk
sr0 11:0 1 1024M 0 rom
通过上面不难发现,我们通过kvm来使用iSCSI存储时,kvm会自动帮我们做发现、登录target等操作。
基于nfs的存储池
准备一台机器,用作于nfs服务器。
# 如下是配置一个简单的nfs服务器
$ yum -y install nfs-utils rpcbind
$ systemctl enable nfs rpcbind
$ cat /etc/exports
/data 192.168.20.0/24(rw,sync,no_root_squash)
$ systemctl start rpcbind nfs
$ exportfs -av # 确认目录已共享
exporting 192.168.20.0/24:/data
然后到kvm主机上,执行如下:
$ showmount -e 192.168.20.6 # 确认可以查看到共享目录
Export list for 192.168.20.6:
/data 192.168.20.0/24
# 创建基于nfs的存储卷
# --source-host:指定nfs主机
# --source-path:指定nfs共享目录
# --target:指定挂在到本地哪个路径
$ virsh pool-define-as nfspool --type netfs \
--source-host 192.168.20.6 \
--source-path /data \
--target /data/kvm/nfs_pool
# 构建池
$ virsh pool-build nfspool
# 启动池并设置为开机自启
$ virsh pool-start nfspool && virsh pool-autostart nfspool
# 确认存储池已存在
$ virsh pool-list --all | grep nfspool
nfspool 活动 是
存储池运维命令
查看存储池列表
$ virsh pool-list
名称 状态 自动开始
-------------------------------------------
disk 活动 是
iso 活动 是
查看某个存储池的详细信息
$ virsh pool-info disk
名称: disk
UUID: 553ec16d-fffe-4b85-a2ab-f0d1c8930666
状态: running
持久: 是
自动启动: 是
容量: 49.98 GiB
分配: 9.07 GiB
可用: 40.90 GiB
查看存储池中的卷信息
$ virsh vol-list disk
名称 路径
------------------------------------------------------------------------------
vm01.qcow2 /data/kvm/disk/vm01.qcow2
vm02.qcow2 /data/kvm/disk/vm02.qcow2
编辑存储池配置文件
# 对应/etc/libvirt/storage下的配置文件
$ virsh pool-edit disk
<pool type='dir'>
<name>disk</name>
<uuid>553ec16d-fffe-4b85-a2ab-f0d1c8930666</uuid>
<capacity unit='bytes'>53660876800</capacity>
<allocation unit='bytes'>9741123584</allocation>
<available unit='bytes'>43919753216</available>
<source>
</source>
<target>
<path>/data/kvm/disk</path>
<permissions>
<mode>0755</mode>
<owner>0</owner>
<group>0</group>
</permissions>
</target>
</pool>
删除存储池
# parted_pool为存储池名称
$ virsh pool-destroy parted_pool
$ virsh pool-delete parted_pool
$ virsh pool-undefine parted_pool
kvm存储卷管理
存储卷是基于存储池的,存储池被分割为多个存储卷,存储卷可以是虚拟磁盘文件、物理分区、lvm逻辑卷以及libvirt管理的其他类型存储的抽象。
存储卷相关管理指令如下:
$ virsh # 进入virsh交互终端模式
virsh # help volume
Storage Volume (help keyword 'volume'):
vol-clone 克隆卷。
vol-create-as 从一组变量中创建卷
vol-create 从一个 XML 文件创建一个卷
vol-create-from 生成卷,使用另一个卷作为输入。
vol-delete 删除卷
vol-download 将卷内容下载到文件中
vol-dumpxml XML 中的卷信息
vol-info 存储卷信息
vol-key 为给定密钥或者路径返回卷密钥
vol-list 列出卷
vol-name 为给定密钥或者路径返回卷名
vol-path 为给定密钥或者路径返回卷路径
vol-pool 为给定密钥或者路径返回存储池
vol-resize 创新定义卷大小
vol-upload 将文件内容上传到卷中
vol-wipe 擦除卷
# 创建存储卷语法如下
vol-create-as <pool> <name> <capacity> [--allocation <string>] [--format <string>] [--backing-vol <string>] [--backing-vol-format <string>] [--prealloc-metadata] [--print-xml]
DESCRIPTION
创建一个卷。
OPTIONS
[--pool] <string> 池名称
[--name] <string> 卷的名称
[--capacity] <string> 卷大小,以整数计(默认为字节)
--allocation <string> 初始化分配大小,以整数计(默认为 KiB)
--format <string> 文件格式类型:raw、bochs、qcow、qcow2、qed、vmdk
--backing-vol <string> 提取快照时的后端卷
--backing-vol-format <string> 提取快照时的后端卷格式
--prealloc-metadata 预先分配的元数据(用于 qcow2 而不是整个分配)
--print-xml 打印 XML 文档,但不能定义/创建
接下来所有存储卷的操作,都是基于上面创建的存储池进行的。如下,查看目前所有的存储池:
$ virsh pool-list
名称 状态 自动开始
-------------------------------------------
disk 活动 是
iscsi_storge 活动 是
iso 活动 是
nfspool 活动 是
test_lvm 活动 是
基于目录的存储池中的存储卷管理
$ virsh pool-dumpxml disk # 确认此存储池为dir类型的
<pool type='dir'>
<name>disk</name>
<uuid>553ec16d-fffe-4b85-a2ab-f0d1c8930666</uuid>
<capacity unit='bytes'>53660876800</capacity>
<allocation unit='bytes'>9779654656</allocation>
<available unit='bytes'>43881222144</available>
<source>
</source>
<target>
<path>/data/kvm/disk</path> # 存储池对应的目录
<permissions>
<mode>0755</mode>
<owner>0</owner>
<group>0</group>
</permissions>
</target>
</pool>
# 确认当前存储池下的存储卷
$ ls /data/kvm/disk/
vm01.qcow2 vm02.qcow2
# 创建存储卷
$ virsh vol-create-as disk test_vol.qcow2 10G --format qcow2
创建卷 test_vol.qcow2
# 查询卷信息
$ virsh vol-info test_vol.qcow2 --pool disk
名称: test_vol.qcow2
类型: 文件
容量: 10.00 GiB
分配: 196.00 KiB
# 查询卷详细信息
$ virsh vol-dumpxml test_vol.qcow2 --pool disk
<volume type='file'>
<name>test_vol.qcow2</name>
<key>/data/kvm/disk/test_vol.qcow2</key>
<source>
</source>
<capacity unit='bytes'>10737418240</capacity>
<allocation unit='bytes'>200704</allocation>
<physical unit='bytes'>197120</physical>
<target>
<path>/data/kvm/disk/test_vol.qcow2</path>
<format type='qcow2'/>
<permissions>
<mode>0600</mode>
<owner>0</owner>
<group>0</group>
</permissions>
<timestamps>
<atime>1612411306.186183187</atime>
<mtime>1612411163.940871367</mtime>
<ctime>1612411163.942871372</ctime>
</timestamps>
</target>
</volume>
$ ls /data/kvm/disk/ # 本地目录也多了相应的文件
test_vol.qcow2 vm01.qcow2 vm02.qcow2
基于lvm存储池创建存储卷
其实,在基于lvm存储池中创建存储卷,实际呢,就是在vg中创建了对应的lv(逻辑卷)。
$ virsh pool-dumpxml test_lvm # 确保存在基于lvm的存储池
<pool type='logical'>
<name>test_lvm</name>
<uuid>4d9ba51a-b866-46b7-8b62-b558cbc03122</uuid>
<capacity unit='bytes'>107369988096</capacity>
<allocation unit='bytes'>0</allocation>
<available unit='bytes'>107369988096</available>
<source>
<device path='/dev/sdb'/>
<name>test_lvm</name>
<format type='lvm2'/>
</source>
<target>
<path>/dev/test_lvm</path>
</target>
</pool>
# 创建卷lvvol1
# test_lvm:是存储池名称
# lvvol1:是要创建的存储卷名称
# 10G:存储卷的大小
# 注:基于lvm存储池创建存储卷时,不支持指定卷格式,如qcow2、raw等。
$ virsh vol-create-as test_lvm lvvol1 10G
创建卷 lvvol1
# 依次继续创建第二个及第三个存储卷
$ virsh vol-create-as test_lvm lvvol2 20G
创建卷 lvvol2
$ virsh vol-create-as test_lvm lvvol3 30G
创建卷 lvvol3
# 指定存储池名称,查看其中的存储卷
$ virsh vol-list test_lvm
名称 路径
------------------------------------------------------------------------------
lvvol1 /dev/test_lvm/lvvol1
lvvol2 /dev/test_lvm/lvvol2
lvvol3 /dev/test_lvm/lvvol3
$ lvscan # 也可以查看到相应的lv逻辑卷
ACTIVE '/dev/centos/swap' [2.00 GiB] inherit
ACTIVE '/dev/centos/home' [46.99 GiB] inherit
ACTIVE '/dev/centos/root' [50.00 GiB] inherit
ACTIVE '/dev/test_lvm/lvvol1' [10.00 GiB] inherit
ACTIVE '/dev/test_lvm/lvvol2' [20.00 GiB] inherit
ACTIVE '/dev/test_lvm/lvvol3' [30.00 GiB] inherit
其余类型的存储池都类似于lvm的创建存储卷方法,但iscsi类型的存储卷是不支持创建存储卷的,会报错如下:
虚机添加/删除存储卷
通过xml文件向虚拟机添加存储卷
$ virsh attach-device --help # 命令参数如下
NAME
attach-device - 从一个XML文件附加装置
SYNOPSIS
attach-device <domain> <file> [--persistent] [--config] [--live] [--current]
DESCRIPTION
从一个XML文件附加装置.
OPTIONS
[--domain] <string> domain name, id or uuid
[--file] <string> XML 文件
--persistent 让实时更改持久
--config 影响下一次引导
--live 影响运行的域
--current 影响当前域
# 上面是指定什么时候生效
$ virsh domblklist web01 # 确认当前虚机块设备
目标 源
------------------------------------------------
vda /data/kvm/disk/vm01.qcow2
hda -
$ cat /tmp/add_disk.xml # 编写xml文件如下
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='/data/kvm/disk/test_vol.qcow2'/>
<target dev='vdb'/>
</disk>
# 添加设备到虚机
$ virsh attach-device web01 /tmp/add_disk.xml --persistent
成功附加设备
# 确认虚机已成功添加磁盘
$ virsh domblklist web01
目标 源
------------------------------------------------
vda /data/kvm/disk/vm01.qcow2
vdb /data/kvm/disk/test_vol.qcow2
hda -
attac-disk命令行向虚拟机添加存储卷
$ virsh attach-disk web01 --source=/data/kvm/nfs_pool/nfs_2 --target=vdc
成功附加磁盘
detach-disk删除虚机磁盘设备
上面添加的磁盘设备,可以使用detach-disk
命令进行卸载。
$ virsh domblklist web01 # 确认现有磁盘设备
目标 源
------------------------------------------------
vda /data/kvm/disk/vm01.qcow2
vdb /data/kvm/disk/test_vol.qcow2
vdc /data/kvm/nfs_pool/nfs_2
hda -
$ virsh detach-disk web01 vdb
成功分离磁盘
$ virsh detach-disk web01 vdc
成功分离磁盘
$ virsh domblklist web01 # 确认已删除磁盘设备
目标 源
------------------------------------------------
vda /data/kvm/disk/vm01.qcow2
hda -
克隆存储卷
$ virsh vol-list --pool disk # 确认当前存储卷
名称 路径
------------------------------------------------------------------------------
test_vol.qcow2 /data/kvm/disk/test_vol.qcow2
vm01.qcow2 /data/kvm/disk/vm01.qcow2
vm02.qcow2 /data/kvm/disk/vm02.qcow2
# 克隆disk存储池中的test_vol.qcow2为test2_vol.qcow2
$ virsh vol-clone test_vol.qcow2 test2_vol.qcow2 --pool disk
使用 test2_vol.qcow2 克隆的卷 test_vol.qcow2
虚拟磁盘离线访问工具
离线访问工具主要用于查看或虚机磁盘中的文件。
这种工具使用场景应该不会太多,故仅记录下工具的名称,以后有需要再深入研究吧。
注:使用离线工具修改磁盘中的文件时,虚机最好要处于离线状态,否则可能会坏文件系统。
guestfish shell
# 安装工具
$ yum -y install guestfish*
# 访问虚拟磁盘
# --rw:以读写方式访问,也支持--ro 选项
# -a:指定虚拟磁盘文件
# -i:自动探测(自动检查分区等信息,并挂载到相应目录)
# 第一次进入会比较慢
$ guestfish --rw -a /data/kvm/disk/vm01.qcow2 -i
# 也可以通过-d选项直接指定虚机的名称进入
$ guestfish --rw -d web01 -i
Welcome to guestfish, the guest filesystem shell for
editing virtual machine filesystems and disk images.
Type: ‘help’ for help on commands
‘man’ to read the manual
‘quit’ to quit the shell
# 可以看到其自动探测到了系统版本,并挂载了相应分区
Operating system: CentOS Linux release 7.6.1810 (Core)
/dev/centos/root mounted on /
/dev/sda1 mounted on /boot
/dev/centos/home mounted on /home
><fs> ll / # 查看文件
total 24
dr-xr-xr-x. 18 root root 235 Feb 4 11:53 .
drwxr-xr-x 19 root root 4096 Feb 4 14:50 ..
lrwxrwxrwx. 1 root root 7 Jan 31 13:43 bin -> usr/bin
dr-xr-xr-x. 5 root root 4096 Jan 31 13:48 boot
drwxr-xr-x. 2 root root 6 Jan 31 13:42 dev
drwxr-xr-x. 84 root root 8192 Jan 31 06:20 etc
drwxr-xr-x. 2 root root 6 Apr 11 2018 home
lrwxrwxrwx. 1 root root 7 Jan 31 13:43 lib -> usr/lib
lrwxrwxrwx. 1 root root 9 Jan 31 13:43 lib64 -> usr/lib64
drwxr-xr-x. 2 root root 6 Apr 11 2018 media
drwxr-xr-x. 2 root root 6 Apr 11 2018 mnt
drwxr-xr-x 2 root root 6 Feb 4 11:53 nfs
drwxr-xr-x. 3 root root 16 Jan 31 13:44 opt
drwxr-xr-x. 2 root root 6 Jan 31 13:42 proc
dr-xr-x---. 4 root root 217 Feb 4 12:38 root
drwxr-xr-x. 2 root root 6 Jan 31 13:42 run
lrwxrwxrwx. 1 root root 8 Jan 31 13:43 sbin -> usr/sbin
drwxr-xr-x. 2 root root 6 Apr 11 2018 srv
drwxr-xr-x. 2 root root 6 Jan 31 13:42 sys
drwxrwxrwt. 9 root root 4096 Feb 4 13:13 tmp
drwxr-xr-x. 13 root root 155 Jan 31 13:43 usr
drwxr-xr-x. 20 root root 282 Jan 31 06:20 var
# 编辑文件
><fs> edit /etc/sysconfig/network-scripts/ifcfg-eth0
# 退出离线工具
><fs> exit