date: 2021-02-04title: kvm存储池与存储卷 #标题
tags: kvm #标签
categories: kvm # 分类

记录下kvm存储池与存储卷相关操作指令。

kvm存储池管理

存储池用于存放虚机的磁盘文件及iso文件,默认使用本地目录作为存储池,存储池大概有如下几种类型:

  • 基于目录的存储池
  • 基于磁盘的存储池
  • 基于分区的存储池
  • 基于LVM的存储池
  • 基于iscsi的存储池
  • 基于nfs的存储池

基于目录的存储池

  1. $ mkdir /data2
  2. # guest_images:池名称
  3. # dir:存储池类型为目录类型
  4. $ virsh pool-define-as guest_images dir --target "/data2"

基于物理磁盘的存储池

  1. # 更改磁盘类型为gpt
  2. $ parted -s /dev/sdb mklabel gpt
  3. $ cat /tmp/device.xml # 定义文件内容如下
  4. <pool type='disk'>
  5. <name>local_disk</name>
  6. <source>
  7. <device path='/dev/sdb'/>
  8. <format type='gpt'/>
  9. </source>
  10. <target>
  11. <path>/dev</path>
  12. </target>
  13. </pool>
  14. # source为/dev/sdb
  15. # target为:/dev/
  16. # 从文件中定义存储池
  17. $ virsh pool-define /tmp/device.xml
  18. # 启动并设置为开机自启
  19. $ virsh pool-start local_disk
  20. $ virsh pool-autostart local_disk

基于分区的存储池

分区格式化后,libvirtd会自动mount指定的分区。

  1. # 创建分区并格式化
  2. $ parted -s /dev/sdb mklabel gpt
  3. $ parted /dev/sdb mkpart primary xfs 0% 100%
  4. $ mkfs.xfs /dev/sdb1
  5. # 创建基于分区的存储池
  6. $ virsh pool-define-as parted_pool fs \
  7. --source-dev "/dev/sdb1" --target "/data3"
  8. # 查看所有存储池
  9. $ virsh pool-list --all
  10. 名称 状态 自动开始
  11. -------------------------------------------
  12. disk 活动
  13. guest_images 不活跃
  14. iso 活动
  15. parted_pool 不活跃
  16. # 启动新创建的存储池
  17. $ virsh pool-build parted_pool # 仅在第一次启动前需要执行
  18. $ virsh pool-start parted_pool # 启动
  19. $ virsh pool-autostart parted_pool # 开机自启

基于lvm的存储池

  1. # --source-dev: 指定硬盘设备,事先无卷组时此项才需要指定
  2. # --source-name: 指定已有卷组名,此项利用已有卷组创建存储池才需指定,事先无卷组无需指定
  3. # --target:指定vg放在哪里
  4. # 如果有卷组请执行
  5. $ virsh pool-define-as test_lvm logical --source-name=vg_name --target=/dev/vg_libvirt
  6. # 如果没有卷组,请执行
  7. $ virsh pool-define-as test_lvm logical --source-dev=/dev/sdb --target=/dev/vg_libvirt
  8. # 启动新创建的存储池
  9. $ virsh pool-build test_lvm # 仅在第一次启动前需要执行
  10. $ virsh pool-start test_lvm
  11. $ virsh pool-autostart test_lvm
  12. $ virsh pool-list --all # 确认状态正常
  13. 名称 状态 自动开始
  14. -------------------------------------------
  15. test_lvm 活动
  16. # 当可以查看到 test_lvm 这个存储池时
  17. # 也可以通过vgscan命令查看到相应的vg
  18. # 而当后面我们基于此存储池创建存储卷后
  19. # 也可以通过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。此机器需要准备未格式化的磁盘,用于对外提供存储。

  1. # 安装target客户端
  2. $ yum -y install targetcli
  3. # 格式化新磁盘以便给target使用
  4. $ parted -s /dev/sdb mklabel gpt
  5. $ parted /dev/sdb mkpart primary xfs 0% 100%
  6. $ targetcli # 进入target交互模式中
  7. # target交互模式中,类似于shell,支持自动补全、ls、cd等命令
  8. /> ls / # 查看有哪些东西
  9. o- / ................................................................... [...]
  10. o- backstores ........................................................ [...]
  11. | o- block ............................................ [Storage Objects: 0]
  12. | o- fileio ........................................... [Storage Objects: 0]
  13. | o- pscsi ............................................ [Storage Objects: 0]
  14. | o- ramdisk .......................................... [Storage Objects: 0]
  15. o- iscsi ...................................................... [Targets: 0]
  16. o- loopback ................................................... [Targets: 0]
  17. # 上面的 backstores 目录下对应的就是不同类型的存储
  18. # 如:block(块存储)、fileio(文件存储)、ramdisk(基于内存的存储)
  19. # 基于/dev/sdb1创建块存储
  20. $ targetcli # 进入target交互模式中
  21. /> cd backstores/block
  22. # 使用/dev/sdb1创建块存储并命名为 block1
  23. /backstores/block> create block1 dev=/dev/sdb1
  24. Created block storage object block1 using /dev/sdb1.
  25. # 基于/tmp/data1.img 创建文件存储
  26. > cd /backstores/fileio
  27. # 基于/tmp/data1.img 文件创建一个10G的存储
  28. /backstores/fileio> create fileio1 /tmp/data1.img 10G
  29. Created fileio fileio1 with size 10737418240
  30. # 查看本地文件,发现大小为10G
  31. $ ll -sh /tmp/data1.img
  32. 0 -rw-r--r--. 1 root root 10G 2 3 21:24 /tmp/data1.img
  33. $ du -sh /tmp/data1.img # 但du命令统计大小为 0
  34. 0 /tmp/data1.img
  35. # 基于内存创建内存存储
  36. > cd /backstores/ramdisk
  37. > create randisk1 1G # 使用1G的内存空间创建内存存储
  38. Created ramdisk randisk1 with size 1G.
  39. # 当创建成功后,你的内存剩余可用空间将减少1G

当上面各种类型都创建完成后,此时看一下 / ,返回结果如下:

kvm存储池与存储卷 - 图1

当可以看到上面的信息后,说明我们后端存储已创建完毕,那么现在就可以创建一个ISCSI Target了,如下:

  1. $ targetcli
  2. /> cd iscsi
  3. # iscsi target的命名必须以 iqn, naa, eui其中之一开头。
  4. # 我这里命名为:iqn.2021-02.org.stroge.srv1:pod7-dmz-20-6 ,冒号后面建议写本机主机名称
  5. /iscsi> create iqn.2021-02.org.stroge.srv1:pod7-dmz-20-6
  6. Created target iqn.2021-02.org.stroge.srv1:pod7-dmz-20-6.
  7. Created TPG 1.
  8. Global pref auto_add_default_portal=true
  9. Created default portal listening on all IPs (0.0.0.0), port 3260.
  10. /iscsi> ls # 查看上面命令执行后生成的信息
  11. o- iscsi ............................................................ [Targets: 1]
  12. o- iqn.2021-02.org.stroge.srv1:pod7-dmz-20-6 ......................... [TPGs: 1]
  13. o- tpg1 ............................................... [no-gen-acls, no-auth]
  14. o- acls .......................................................... [ACLs: 0]
  15. o- luns .......................................................... [LUNs: 0]
  16. o- portals .................................................... [Portals: 1]
  17. o- 0.0.0.0:3260 ..................................................... [OK]
  18. # 将存储对象与target进行mapping
  19. /> cd /iscsi/iqn.2021-02.org.stroge.srv1:pod7-dmz-20-6/tpg1/luns
  20. /iscsi/iqn.20...0-6/tpg1/luns> create /backstores/block/block1
  21. Created LUN 0.
  22. /iscsi/iqn.20...0-6/tpg1/luns> create /backstores/fileio/fileio1
  23. Created LUN 1.
  24. /iscsi/iqn.20...0-6/tpg1/luns> create /backstores/ramdisk/randisk1
  25. Created LUN 2.
  26. # 到Initiator查看其IQN(如下操作,是谁要挂载iSCSI就到哪个机器上查看)
  27. $ yum install -y iscsi-initiator-utils
  28. $ cat /etc/iscsi/initiatorname.iscsi # 查看iSCSI名称,名称可自定义
  29. InitiatorName=iqn.2021-02.com.redhat:pod7-dmz-20-10
  30. $ systemctl restart iscsid # 如果更改了本机的IQN,则需要重启此服务,以便更新IQN
  31. # 在target存储机器上,为Initiator客户端创建acl
  32. /> cd /iscsi/iqn.2021-02.org.stroge.srv1:pod7-dmz-20-6/tpg1/acls # 切换到此目录
  33. # 下面指定的IQN名字,是Initiator客户端查看到的IQN
  34. /iscsi/iqn.20...0-6/tpg1/acls> create iqn.2021-02.com.redhat:pod7-dmz-20-10
  35. Created Node ACL for iqn.2021-02.com.redhat:pod7-dmz-20-10
  36. Created mapped LUN 2.
  37. Created mapped LUN 1.
  38. Created mapped LUN 0.
  39. # 保存设置并退出
  40. /> saveconfig
  41. /> exit

最后查看target的 / ,返回信息如下:

kvm存储池与存储卷 - 图2

启动target服务
  1. $ systemctl enable target
  2. $ systemctl start target

配置Initiator使用target
  1. # 需要保证和target服务器网络可通
  2. $ telnet 192.168.20.6 3260
  3. # 发现target的IQN,--portal 指定的IP是target服务器的IP
  4. $ iscsiadm --mode discovery --type sendtargets --portal 192.168.20.6
  5. 192.168.20.6:3260,1 iqn.2021-02.org.stroge.srv1:pod7-dmz-20-6
  6. # 登录到target的IQN
  7. $ iscsiadm -d2 -m node --login # 如果提示如下,则表示登录失败
  8. iscsiadm: Max file limits 1024 4096
  9. iscsiadm: default: Creating session 1/1
  10. Logging in to [iface: default, target: iqn.2021-02.org.stroge.srv1:pod7-dmz-20-6, portal: 192.168.20.6,3260] (multiple)
  11. iscsiadm: Could not login to [iface: default, target: iqn.2021-02.org.stroge.srv1:pod7-dmz-20-6, portal: 192.168.20.6,3260].
  12. iscsiadm: initiator reported error (24 - iSCSI login failed due to authorization failure)
  13. iscsiadm: Could not log into all portals
  14. # 可能是 名称与服务端acl设置的名称不一致 或者 未更新客户端的IQN
  15. $ systemctl restart iscsid # 客户端重启iscsid服务,以便更新本机IQN
  16. $ iscsiadm -d2 -m node --login # 再次登录,输出如下,表示成功登录到target服务器
  17. iscsiadm: Max file limits 1024 4096
  18. iscsiadm: default: Creating session 1/1
  19. Logging in to [iface: default, target: iqn.2021-02.org.stroge.srv1:pod7-dmz-20-6, portal: 192.168.20.6,3260] (multiple)
  20. Login to [iface: default, target: iqn.2021-02.org.stroge.srv1:pod7-dmz-20-6, portal: 192.168.20.6,3260] successful.

kvm存储池与存储卷 - 图3

  1. # 如果不需要使用了,可以执行如下命令,退出target登录状态
  2. $ iscsiadm -d2 -m node --logout
  3. iscsiadm: Max file limits 1024 4096
  4. Logging out of session [sid: 4, target: iqn.2021-02.org.stroge.srv1:pod7-dmz-20-6, portal: 192.168.20.6,3260]
  5. Logout of [sid: 4, target: iqn.2021-02.org.stroge.srv1:pod7-dmz-20-6, portal: 192.168.20.6,3260] successful.
  6. $ lsblk # 再次查看,刚才挂载的块设备也不见了
  7. NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
  8. sda 8:0 0 100G 0 disk
  9. ├─sda1 8:1 0 1G 0 part /boot
  10. └─sda2 8:2 0 99G 0 part
  11. ├─centos-root 253:0 0 50G 0 lvm /
  12. ├─centos-swap 253:1 0 2G 0 lvm [SWAP]
  13. └─centos-home 253:2 0 47G 0 lvm /home
  14. sdb 8:16 0 100G 0 disk
  15. sr0 11:0 1 1024M 0 rom

kvm中使用iSCSI创建存储池
  1. $ virsh pool-list --all # 确认现有存储池
  2. 名称 状态 自动开始
  3. -------------------------------------------
  4. disk 活动
  5. iso 活动
  6. test_lvm 活动
  7. $ lsblk # 查看现有本地磁盘
  8. NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
  9. sda 8:0 0 100G 0 disk
  10. ├─sda1 8:1 0 1G 0 part /boot
  11. └─sda2 8:2 0 99G 0 part
  12. ├─centos-root 253:0 0 50G 0 lvm /
  13. ├─centos-swap 253:1 0 2G 0 lvm [SWAP]
  14. └─centos-home 253:2 0 47G 0 lvm /home
  15. sdb 8:16 0 100G 0 disk
  16. sr0 11:0 1 1024M 0 rom
  17. # 创建基于iSCSI的存储池
  18. # --source-host:指定target主机IP
  19. # --source-dev:指定target主机的IQN名字
  20. # --target:必须指定为本机的 /dev/disk/by-path 目录
  21. $ virsh pool-define-as --name iscsi_storge --type iscsi \
  22. --source-host 192.168.20.6 \
  23. --source-dev iqn.2021-02.org.stroge.srv1:pod7-dmz-20-6 \
  24. --target /dev/disk/by-path
  25. 定义池 iscsi_storge
  26. # 启动此存储池
  27. $ virsh pool-start iscsi_storge
  28. iscsi_storge 已启动
  29. # 开启自动启动
  30. $ virsh pool-autostart iscsi_storge
  31. iscsi_storge 标记为自动启动
  32. # 查看所有存储池
  33. $ virsh pool-list --all
  34. 名称 状态 自动开始
  35. -------------------------------------------
  36. disk 活动
  37. iscsi_storge 活动
  38. iso 活动
  39. test_lvm 活动
  40. # 查看本地磁盘设备
  41. $ lsblk
  42. NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
  43. sda 8:0 0 100G 0 disk
  44. ├─sda1 8:1 0 1G 0 part /boot
  45. └─sda2 8:2 0 99G 0 part
  46. ├─centos-root 253:0 0 50G 0 lvm /
  47. ├─centos-swap 253:1 0 2G 0 lvm [SWAP]
  48. └─centos-home 253:2 0 47G 0 lvm /home
  49. sdb 8:16 0 100G 0 disk
  50. sdc 8:32 0 20G 0 disk
  51. sdd 8:48 0 1G 0 disk
  52. sde 8:64 0 10G 0 disk
  53. sr0 11:0 1 1024M 0 rom

通过上面不难发现,我们通过kvm来使用iSCSI存储时,kvm会自动帮我们做发现、登录target等操作。

基于nfs的存储池

准备一台机器,用作于nfs服务器。

  1. # 如下是配置一个简单的nfs服务器
  2. $ yum -y install nfs-utils rpcbind
  3. $ systemctl enable nfs rpcbind
  4. $ cat /etc/exports
  5. /data 192.168.20.0/24(rw,sync,no_root_squash)
  6. $ systemctl start rpcbind nfs
  7. $ exportfs -av # 确认目录已共享
  8. exporting 192.168.20.0/24:/data

然后到kvm主机上,执行如下:

  1. $ showmount -e 192.168.20.6 # 确认可以查看到共享目录
  2. Export list for 192.168.20.6:
  3. /data 192.168.20.0/24
  4. # 创建基于nfs的存储卷
  5. # --source-host:指定nfs主机
  6. # --source-path:指定nfs共享目录
  7. # --target:指定挂在到本地哪个路径
  8. $ virsh pool-define-as nfspool --type netfs \
  9. --source-host 192.168.20.6 \
  10. --source-path /data \
  11. --target /data/kvm/nfs_pool
  12. # 构建池
  13. $ virsh pool-build nfspool
  14. # 启动池并设置为开机自启
  15. $ virsh pool-start nfspool && virsh pool-autostart nfspool
  16. # 确认存储池已存在
  17. $ virsh pool-list --all | grep nfspool
  18. nfspool 活动

存储池运维命令

查看存储池列表
  1. $ virsh pool-list
  2. 名称 状态 自动开始
  3. -------------------------------------------
  4. disk 活动
  5. iso 活动

查看某个存储池的详细信息
  1. $ virsh pool-info disk
  2. 名称: disk
  3. UUID: 553ec16d-fffe-4b85-a2ab-f0d1c8930666
  4. 状态: running
  5. 持久:
  6. 自动启动:
  7. 容量: 49.98 GiB
  8. 分配: 9.07 GiB
  9. 可用: 40.90 GiB

查看存储池中的卷信息
  1. $ virsh vol-list disk
  2. 名称 路径
  3. ------------------------------------------------------------------------------
  4. vm01.qcow2 /data/kvm/disk/vm01.qcow2
  5. vm02.qcow2 /data/kvm/disk/vm02.qcow2

编辑存储池配置文件
  1. # 对应/etc/libvirt/storage下的配置文件
  2. $ virsh pool-edit disk
  3. <pool type='dir'>
  4. <name>disk</name>
  5. <uuid>553ec16d-fffe-4b85-a2ab-f0d1c8930666</uuid>
  6. <capacity unit='bytes'>53660876800</capacity>
  7. <allocation unit='bytes'>9741123584</allocation>
  8. <available unit='bytes'>43919753216</available>
  9. <source>
  10. </source>
  11. <target>
  12. <path>/data/kvm/disk</path>
  13. <permissions>
  14. <mode>0755</mode>
  15. <owner>0</owner>
  16. <group>0</group>
  17. </permissions>
  18. </target>
  19. </pool>

删除存储池
  1. # parted_pool为存储池名称
  2. $ virsh pool-destroy parted_pool
  3. $ virsh pool-delete parted_pool
  4. $ virsh pool-undefine parted_pool

kvm存储卷管理

存储卷是基于存储池的,存储池被分割为多个存储卷,存储卷可以是虚拟磁盘文件、物理分区、lvm逻辑卷以及libvirt管理的其他类型存储的抽象。

存储卷相关管理指令如下:

  1. $ virsh # 进入virsh交互终端模式
  2. virsh # help volume
  3. Storage Volume (help keyword 'volume'):
  4. vol-clone 克隆卷。
  5. vol-create-as 从一组变量中创建卷
  6. vol-create 从一个 XML 文件创建一个卷
  7. vol-create-from 生成卷,使用另一个卷作为输入。
  8. vol-delete 删除卷
  9. vol-download 将卷内容下载到文件中
  10. vol-dumpxml XML 中的卷信息
  11. vol-info 存储卷信息
  12. vol-key 为给定密钥或者路径返回卷密钥
  13. vol-list 列出卷
  14. vol-name 为给定密钥或者路径返回卷名
  15. vol-path 为给定密钥或者路径返回卷路径
  16. vol-pool 为给定密钥或者路径返回存储池
  17. vol-resize 创新定义卷大小
  18. vol-upload 将文件内容上传到卷中
  19. vol-wipe 擦除卷
  20. # 创建存储卷语法如下
  21. vol-create-as <pool> <name> <capacity> [--allocation <string>] [--format <string>] [--backing-vol <string>] [--backing-vol-format <string>] [--prealloc-metadata] [--print-xml]
  22. DESCRIPTION
  23. 创建一个卷。
  24. OPTIONS
  25. [--pool] <string> 池名称
  26. [--name] <string> 卷的名称
  27. [--capacity] <string> 卷大小,以整数计(默认为字节)
  28. --allocation <string> 初始化分配大小,以整数计(默认为 KiB
  29. --format <string> 文件格式类型:rawbochsqcowqcow2qedvmdk
  30. --backing-vol <string> 提取快照时的后端卷
  31. --backing-vol-format <string> 提取快照时的后端卷格式
  32. --prealloc-metadata 预先分配的元数据(用于 qcow2 而不是整个分配)
  33. --print-xml 打印 XML 文档,但不能定义/创建

接下来所有存储卷的操作,都是基于上面创建的存储池进行的。如下,查看目前所有的存储池:

  1. $ virsh pool-list
  2. 名称 状态 自动开始
  3. -------------------------------------------
  4. disk 活动
  5. iscsi_storge 活动
  6. iso 活动
  7. nfspool 活动
  8. test_lvm 活动

基于目录的存储池中的存储卷管理

  1. $ virsh pool-dumpxml disk # 确认此存储池为dir类型的
  2. <pool type='dir'>
  3. <name>disk</name>
  4. <uuid>553ec16d-fffe-4b85-a2ab-f0d1c8930666</uuid>
  5. <capacity unit='bytes'>53660876800</capacity>
  6. <allocation unit='bytes'>9779654656</allocation>
  7. <available unit='bytes'>43881222144</available>
  8. <source>
  9. </source>
  10. <target>
  11. <path>/data/kvm/disk</path> # 存储池对应的目录
  12. <permissions>
  13. <mode>0755</mode>
  14. <owner>0</owner>
  15. <group>0</group>
  16. </permissions>
  17. </target>
  18. </pool>
  19. # 确认当前存储池下的存储卷
  20. $ ls /data/kvm/disk/
  21. vm01.qcow2 vm02.qcow2
  22. # 创建存储卷
  23. $ virsh vol-create-as disk test_vol.qcow2 10G --format qcow2
  24. 创建卷 test_vol.qcow2
  25. # 查询卷信息
  26. $ virsh vol-info test_vol.qcow2 --pool disk
  27. 名称: test_vol.qcow2
  28. 类型: 文件
  29. 容量: 10.00 GiB
  30. 分配: 196.00 KiB
  31. # 查询卷详细信息
  32. $ virsh vol-dumpxml test_vol.qcow2 --pool disk
  33. <volume type='file'>
  34. <name>test_vol.qcow2</name>
  35. <key>/data/kvm/disk/test_vol.qcow2</key>
  36. <source>
  37. </source>
  38. <capacity unit='bytes'>10737418240</capacity>
  39. <allocation unit='bytes'>200704</allocation>
  40. <physical unit='bytes'>197120</physical>
  41. <target>
  42. <path>/data/kvm/disk/test_vol.qcow2</path>
  43. <format type='qcow2'/>
  44. <permissions>
  45. <mode>0600</mode>
  46. <owner>0</owner>
  47. <group>0</group>
  48. </permissions>
  49. <timestamps>
  50. <atime>1612411306.186183187</atime>
  51. <mtime>1612411163.940871367</mtime>
  52. <ctime>1612411163.942871372</ctime>
  53. </timestamps>
  54. </target>
  55. </volume>
  56. $ ls /data/kvm/disk/ # 本地目录也多了相应的文件
  57. test_vol.qcow2 vm01.qcow2 vm02.qcow2

基于lvm存储池创建存储卷

其实,在基于lvm存储池中创建存储卷,实际呢,就是在vg中创建了对应的lv(逻辑卷)。

  1. $ virsh pool-dumpxml test_lvm # 确保存在基于lvm的存储池
  2. <pool type='logical'>
  3. <name>test_lvm</name>
  4. <uuid>4d9ba51a-b866-46b7-8b62-b558cbc03122</uuid>
  5. <capacity unit='bytes'>107369988096</capacity>
  6. <allocation unit='bytes'>0</allocation>
  7. <available unit='bytes'>107369988096</available>
  8. <source>
  9. <device path='/dev/sdb'/>
  10. <name>test_lvm</name>
  11. <format type='lvm2'/>
  12. </source>
  13. <target>
  14. <path>/dev/test_lvm</path>
  15. </target>
  16. </pool>
  17. # 创建卷lvvol1
  18. # test_lvm:是存储池名称
  19. # lvvol1:是要创建的存储卷名称
  20. # 10G:存储卷的大小
  21. # 注:基于lvm存储池创建存储卷时,不支持指定卷格式,如qcow2、raw等。
  22. $ virsh vol-create-as test_lvm lvvol1 10G
  23. 创建卷 lvvol1
  24. # 依次继续创建第二个及第三个存储卷
  25. $ virsh vol-create-as test_lvm lvvol2 20G
  26. 创建卷 lvvol2
  27. $ virsh vol-create-as test_lvm lvvol3 30G
  28. 创建卷 lvvol3
  29. # 指定存储池名称,查看其中的存储卷
  30. $ virsh vol-list test_lvm
  31. 名称 路径
  32. ------------------------------------------------------------------------------
  33. lvvol1 /dev/test_lvm/lvvol1
  34. lvvol2 /dev/test_lvm/lvvol2
  35. lvvol3 /dev/test_lvm/lvvol3
  36. $ lvscan # 也可以查看到相应的lv逻辑卷
  37. ACTIVE '/dev/centos/swap' [2.00 GiB] inherit
  38. ACTIVE '/dev/centos/home' [46.99 GiB] inherit
  39. ACTIVE '/dev/centos/root' [50.00 GiB] inherit
  40. ACTIVE '/dev/test_lvm/lvvol1' [10.00 GiB] inherit
  41. ACTIVE '/dev/test_lvm/lvvol2' [20.00 GiB] inherit
  42. ACTIVE '/dev/test_lvm/lvvol3' [30.00 GiB] inherit

其余类型的存储池都类似于lvm的创建存储卷方法,但iscsi类型的存储卷是不支持创建存储卷的,会报错如下:

kvm存储池与存储卷 - 图4

虚机添加/删除存储卷

通过xml文件向虚拟机添加存储卷

  1. $ virsh attach-device --help # 命令参数如下
  2. NAME
  3. attach-device - 从一个XML文件附加装置
  4. SYNOPSIS
  5. attach-device <domain> <file> [--persistent] [--config] [--live] [--current]
  6. DESCRIPTION
  7. 从一个XML文件附加装置.
  8. OPTIONS
  9. [--domain] <string> domain name, id or uuid
  10. [--file] <string> XML 文件
  11. --persistent 让实时更改持久
  12. --config 影响下一次引导
  13. --live 影响运行的域
  14. --current 影响当前域
  15. # 上面是指定什么时候生效
  1. $ virsh domblklist web01 # 确认当前虚机块设备
  2. 目标
  3. ------------------------------------------------
  4. vda /data/kvm/disk/vm01.qcow2
  5. hda -
  6. $ cat /tmp/add_disk.xml # 编写xml文件如下
  7. <disk type='file' device='disk'>
  8. <driver name='qemu' type='qcow2'/>
  9. <source file='/data/kvm/disk/test_vol.qcow2'/>
  10. <target dev='vdb'/>
  11. </disk>
  12. # 添加设备到虚机
  13. $ virsh attach-device web01 /tmp/add_disk.xml --persistent
  14. 成功附加设备
  15. # 确认虚机已成功添加磁盘
  16. $ virsh domblklist web01
  17. 目标
  18. ------------------------------------------------
  19. vda /data/kvm/disk/vm01.qcow2
  20. vdb /data/kvm/disk/test_vol.qcow2
  21. hda -

attac-disk命令行向虚拟机添加存储卷

  1. $ virsh attach-disk web01 --source=/data/kvm/nfs_pool/nfs_2 --target=vdc
  2. 成功附加磁盘

detach-disk删除虚机磁盘设备

上面添加的磁盘设备,可以使用detach-disk命令进行卸载。

  1. $ virsh domblklist web01 # 确认现有磁盘设备
  2. 目标
  3. ------------------------------------------------
  4. vda /data/kvm/disk/vm01.qcow2
  5. vdb /data/kvm/disk/test_vol.qcow2
  6. vdc /data/kvm/nfs_pool/nfs_2
  7. hda -
  8. $ virsh detach-disk web01 vdb
  9. 成功分离磁盘
  10. $ virsh detach-disk web01 vdc
  11. 成功分离磁盘
  12. $ virsh domblklist web01 # 确认已删除磁盘设备
  13. 目标
  14. ------------------------------------------------
  15. vda /data/kvm/disk/vm01.qcow2
  16. hda -

克隆存储卷

  1. $ virsh vol-list --pool disk # 确认当前存储卷
  2. 名称 路径
  3. ------------------------------------------------------------------------------
  4. test_vol.qcow2 /data/kvm/disk/test_vol.qcow2
  5. vm01.qcow2 /data/kvm/disk/vm01.qcow2
  6. vm02.qcow2 /data/kvm/disk/vm02.qcow2
  7. # 克隆disk存储池中的test_vol.qcow2为test2_vol.qcow2
  8. $ virsh vol-clone test_vol.qcow2 test2_vol.qcow2 --pool disk
  9. 使用 test2_vol.qcow2 克隆的卷 test_vol.qcow2

虚拟磁盘离线访问工具

离线访问工具主要用于查看或虚机磁盘中的文件。

这种工具使用场景应该不会太多,故仅记录下工具的名称,以后有需要再深入研究吧。

注:使用离线工具修改磁盘中的文件时,虚机最好要处于离线状态,否则可能会坏文件系统。

guestfish shell

  1. # 安装工具
  2. $ yum -y install guestfish*
  3. # 访问虚拟磁盘
  4. # --rw:以读写方式访问,也支持--ro 选项
  5. # -a:指定虚拟磁盘文件
  6. # -i:自动探测(自动检查分区等信息,并挂载到相应目录)
  7. # 第一次进入会比较慢
  8. $ guestfish --rw -a /data/kvm/disk/vm01.qcow2 -i
  9. # 也可以通过-d选项直接指定虚机的名称进入
  10. $ guestfish --rw -d web01 -i
  11. Welcome to guestfish, the guest filesystem shell for
  12. editing virtual machine filesystems and disk images.
  13. Type: help for help on commands
  14. man to read the manual
  15. quit to quit the shell
  16. # 可以看到其自动探测到了系统版本,并挂载了相应分区
  17. Operating system: CentOS Linux release 7.6.1810 (Core)
  18. /dev/centos/root mounted on /
  19. /dev/sda1 mounted on /boot
  20. /dev/centos/home mounted on /home
  21. ><fs> ll / # 查看文件
  22. total 24
  23. dr-xr-xr-x. 18 root root 235 Feb 4 11:53 .
  24. drwxr-xr-x 19 root root 4096 Feb 4 14:50 ..
  25. lrwxrwxrwx. 1 root root 7 Jan 31 13:43 bin -> usr/bin
  26. dr-xr-xr-x. 5 root root 4096 Jan 31 13:48 boot
  27. drwxr-xr-x. 2 root root 6 Jan 31 13:42 dev
  28. drwxr-xr-x. 84 root root 8192 Jan 31 06:20 etc
  29. drwxr-xr-x. 2 root root 6 Apr 11 2018 home
  30. lrwxrwxrwx. 1 root root 7 Jan 31 13:43 lib -> usr/lib
  31. lrwxrwxrwx. 1 root root 9 Jan 31 13:43 lib64 -> usr/lib64
  32. drwxr-xr-x. 2 root root 6 Apr 11 2018 media
  33. drwxr-xr-x. 2 root root 6 Apr 11 2018 mnt
  34. drwxr-xr-x 2 root root 6 Feb 4 11:53 nfs
  35. drwxr-xr-x. 3 root root 16 Jan 31 13:44 opt
  36. drwxr-xr-x. 2 root root 6 Jan 31 13:42 proc
  37. dr-xr-x---. 4 root root 217 Feb 4 12:38 root
  38. drwxr-xr-x. 2 root root 6 Jan 31 13:42 run
  39. lrwxrwxrwx. 1 root root 8 Jan 31 13:43 sbin -> usr/sbin
  40. drwxr-xr-x. 2 root root 6 Apr 11 2018 srv
  41. drwxr-xr-x. 2 root root 6 Jan 31 13:42 sys
  42. drwxrwxrwt. 9 root root 4096 Feb 4 13:13 tmp
  43. drwxr-xr-x. 13 root root 155 Jan 31 13:43 usr
  44. drwxr-xr-x. 20 root root 282 Jan 31 06:20 var
  45. # 编辑文件
  46. ><fs> edit /etc/sysconfig/network-scripts/ifcfg-eth0
  47. # 退出离线工具
  48. ><fs> exit

其他离线访问工具