每天5分钟复习OpenStack(八)存储虚拟化


 

KVM存储虚拟化是通过存储池(Storage Pool)和卷(Volume)来管理的。Storage Pool 是宿主机上可以看到的一片存储空间,可以是多种类型,Volume 是在 Storage Pool 中划分出的一块空间,宿主机将 Volume 分配给虚拟机,Volume 在虚拟机中看到的就是一块硬盘。

1、文件类存储池

此环境中使用sdb盘做为kvm的存储池来使用,也可以使用分区,(但是一般不建议)实际的生产环境中一般都是两块硬盘做了RAID1 ,在其上创建存储池.

1.1 磁盘格式化文件系统

#创建文件系统
 mkfs.xfs -f /dev/sdb 
 
 # 创建挂载目录
 mkdir -pv /data/volumes 
 
 #挂载 
 mount -a /dev/sdb /data/volumes
 

1.2 创建存储池

virsh pool-define-as <name>  <type> --target 指定目标  --source-path 指定源 
virsh pool-define-as sata-sdb dir --target /data/volumes/ --source-path /data/volumes/
  • sata-sdb:指定新的存储池的名称,方便区分各种类型存储池。
  • dir:指定存储池的类型,本例中为基于目录的存储池。
  • --target /data/volumes/:指定存储池将被创建的目标路径。
  • --source-path /data/volumes/:指定存储池的数据所在的源路径。

1.3 查看存储池

virsh pool-list --all 
 Name                 State      Autostart 
-------------------------------------------
 sata-sdb             inactive   no        

1.4 启动存储池,并设置存储池开机自启动

virsh pool-start sata-sdb
virsh pool-autostart sata-sdb

1.5 验证存储池为活动状态

# virsh pool-list 
 Name                 State      Autostart 
-------------------------------------------
 sata-sdb             active     yes       

1.6 删除存储池

#先停止储存池才能删除
virsh pool-destroy --pool pool-name 
#删除存储池的相关数据目录(但存储池的配置还在)
virsh pool-delete --pool pool-name 
#删除存储池配置文件

1.7 在存储池中创建一个卷 用来扩容磁盘

virsh vol-create-as --pool sata-sdb --name vm_test_sdb --capacity 10G --allocation 10 --format qcow2
  • pool : 存储池的名字
  • name : 创建卷的名字
  • capacity : 总容量
  • allocation : 初始容量
  • format : 镜像格式,支持多种格式 常见qcow2 raw 等

1.8 验证 存储池中的卷

virsh vol-list sata-sdb 
 Name                 Path                                    
------------------------------------------------------------------------------
 vm_test_sdb          /data/volumes/vm_test_sdb       

qemu-img info 查看文件的详细信息

qemu-img info vm_test_sdb 
image: vm_test_sdb
file format: qcow2
virtual size: 10G (10737418240 bytes)
disk size: 196K
cluster_size: 65536
Format specific information:
    compat: 0.10

上面这些常规操作,大部分文章都有写,下面介绍一些运维很常见需求,但是类似文章很少。
如给虚拟机添加一块盘、虚拟机系统盘扩容、

二: 给虚拟机加上一块磁盘

--live 参数去掉就是离线添加磁盘,离线需要关闭虚拟机。

virsh attach-disk test   /data/volumes/vm_test_sdb   \
--targetbus scsi sdc --sourcetype file \
--driver qemu --subdriver qcow2 \
--type disk --live --config
  • /data/volumes/vm_test_sdb 指定磁盘文件路径
  • targetbus 指定总线类型为bus ,对应虚拟机磁盘为sdc,
  • sourcetype 指定源文件类型为 file
  • drive 指定驱动为qemu 自定义
  • live 在线扩容
  • config 写入配置文件

验证,hda 为光盘设备,

  • 猜一猜:sdc 为添加的盘符,那虚拟机里盘符是否也是sdc了?
virsh domblklist  test 
Target     Source
------------------------------------------------
vda        /data/images/test.qcow2
hda        -
sdc        /data/volumes/vm_test_sdb

 

答案是根据添加的磁盘的类型和虚拟机device 设备来的如下图所示,显示为sda

[root@localhost ~]# lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda      8:0    0   10G  0 disk 
sr0     11:0    1 1024M  0 rom  
vda    253:0    0   50G  0 disk 
├─vda1 253:1    0  200M  0 part /boot
└─vda2 253:2    0 49.8G  0 part /

 

  • 1.9 卸载虚拟机磁盘
    --live 在线卸载,没有此参数,则需要关机才能卸载。
    sdc 为宿主机上识别到的盘
    virsh domblklist test可以查看到
virsh detach-disk test  sdc --live --config
Disk detached successfully

三:虚拟机系统盘在线扩容

在扩容之前我们在宿主机上查看虚拟机的系统盘的大小,最高50G分配了40G 实际占用14G

virsh domblkinfo test --device vda 
Capacity:       53687091200
Allocation:     40531144192
Physical:       1494298624
  • 3.1 在宿主机调整磁盘文件大小
virsh blockresize --path /data/images/test.qcow2  --size 100G test
#-- path指定磁盘文件路径  --size 指定扩容之后的大小 test 为domname 
  • 3.2 虚拟机层面扩分区

  • 3.2.1 安装必要的包

yum -y install cloud-init cloud-utils-growpart
  • 3.2.2 扩容磁盘大小 growpart
#查看根分区
[root@localhost ~]# lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sr0     11:0    1 1024M  0 rom  
vda    253:0    0  100G  0 disk 
├─vda1 253:1    0  200M  0 part /boot
└─vda2 253:2    0 49.8G  0 part /

#扩容跟分区
[root@localhost ~]# growpart /dev/vda 2
CHANGED: partition=2 start=411648 old: size=104445952 end=104857600 new: size=209303519 end=209715167

#验证根分区
[root@localhost ~]# lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sr0     11:0    1 1024M  0 rom  
vda    253:0    0  100G  0 disk 
├─vda1 253:1    0  200M  0 part /boot
└─vda2 253:2    0 99.8G  0 part /
  • 3.2.3 文件系统扩容
xfs_growfs /dev/vda2
meta-data=/dev/vda2              isize=512    agcount=4, agsize=3263936 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0 spinodes=0
data     =                       bsize=4096   blocks=13055744, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=6374, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 13055744 to 26162939

(可选)移除安装的包

yum -y remove cloud-init cloud-utils-growpart

四: 将宿主机的硬盘透传给虚拟机使用

在超融合的环境中,存储是部署在虚拟机中的,那怎么将宿主机的硬盘直接透传给虚拟机了?
大部分文章都是通过XML的方式,我介绍下命令行的方式来实现,效率更高,而且便于自动化实现。
在Linux 系统中有能唯一描述磁盘的

总结来说,/dev/disk/by-uuid/使用磁盘的UUID作为标识符,而/dev/disk/by-id/使用磁盘的ID作为标识符。UUID是独一无二的且稳定的,适用于需要持久标识磁盘的情况。而磁盘ID虽然可以唯一标识磁盘,但可能会受到硬件变更的影响。

因此我们建议是使用by-uuid 来唯一描述一个磁盘设备

virsh attach-disk <虚拟机名字> <uuid> <磁盘盘符>

virsh attach-disk test /dev/disk/by-uuid/049b1f34-6c35-4db1-ad04-478ae9603789 sdb

 

卸载命令可以是:

virsh detach-disk test sdb
 
 
 

KVM虚拟机,一般扩充硬盘的方法是通过virt-manager,添加新的虚拟硬盘。那么有没有直接挂栽host宿主机上的物理硬盘分区的方法呢? 这里做了一些实验。

1.首先打开现有虚拟机的配置文档,位置在 /etc/libvirt/qemu/vm-names.xml 可以看到,虚拟机自带的 两个disk 都是 type='file', device 分别是 disk、cdrom 。

 

image

 

我们要做的就是添加一个disk ,type=‘block’ 块设备。 这个要在 virsh 环境下编辑才可以

virsh #进入virsh环境,下面的命令是在 virsh# 提示符之下执行的
edit vm-name #如果你有多个文字编辑工具,会让你选择用哪一种来编辑
#找到类似下面的语段,添加内容如下
<disk type='block' device='disk'>
<driver name='qemu' type='raw' cache='none'/> #这里的type=‘raw’表示是初始状态,未格式化
<source dev='/dev/disk/by-uuid/de06200b-7f00-4d34-a8a3-de669a59bda9'/>
<target dev='vdc' bus='virtio'/> # vdc vda之类的命名不影响显示结果
</disk>

#添加上面的语段后,保存退出,然后启动vm-name
start vm-name
AI写代码

2. 挂栽新添加的分区

利用 fdisk -l 命令,查看是否出现了新添加的分区

 

image

 

如上图所示,我们设定的name是vdc,但是显示的是vda,系统自动命名的。

如果是已经格式化过的磁盘分区,且是ext4格式的,则可以直接mount到你想要的地方即可,不用重新格式化就能直接用。可以看一下我的实验:

image

 

 

可以看到,我将 /dev/vda 直接mount到 mnt这个文件夹了,df -Th 命令,可以看到系统挂栽的磁盘分区的格式和容量。

我在mnt下新建了 test.txt文档,并写入了一些数字。

同时还登录宿主机查看了一下这个文档,里面的数字和虚拟机编辑后的不一致,还保留了之前的内容。 在宿主机中将该分区卸载,重新挂栽后,再查看test.txt 文档,则内容就变成了和虚拟机中一样了。

若要每次虚拟机开机直接mount到指定目录,请参考我的其他博客内容:

用systemd挂载硬盘分区和进行bind挂栽文件夹以及定时关机_lggirls的博客-CSDN博客
https://blog.csdn.net/lggirls/article/details/100297311

3.几点注意事项

A 采用上述方法为虚拟机添加物理硬盘后,需要保持物理硬盘在线才能正常启动虚拟机。如果 移除了物理硬盘,需要采用上述方法,将对应的disk 删除。否则会出现错误提醒。

B保持物理硬盘正常即可,host可以不用挂该物理硬盘到自己的文件系统就可以使用。也就是说,只需要vm直接以 UUID配置到上述文档中,不需要host先挂栽,然后vm再挂栽。

posted @ 2025-08-05 15:08  aaahwh  阅读(10)  评论(0)    收藏  举报