在生产环境下,虚拟机如何不停机扩容?

本文以场景维度列出虚拟机的多种扩容方式.

扩容操作从空间来源上,有两种方式,新添加磁盘和原磁盘增加空间。

从空间目的地来说,也有两种,扩展原有分区和新增分区。

但只要把握底层原理,遵循大体步骤,还是很简单的。

虚拟机磁盘扩容_文件系统

需要理解的基础概念

分区:

文件系统:



场景一、虚拟机添加新硬盘,划分新分区

场景二、虚拟机添加新硬盘,扩容旧分区

场景三、虚拟机扩容现有硬盘容量,扩容旧分区

场景四,虚拟机扩容现有硬盘容量,非LVM在线调整空间


场景一、虚拟机添加新硬盘,新分区

一般用于初始化虚拟机。

一、虚拟机新添加一块硬盘(500G)

虚拟机磁盘扩容_文件系统_02

二、kernel识别:

centos7 添加后操作系统能直接识别。

lsblk

虚拟机磁盘扩容_centos_03

三、LVM管理分区

3.1、创建PV

pvcreate /dev/sdb            
pvdisplay

3.2、创建VG

vgcreate vgdata /dev/sdb

3.3、创建LV-->格式化LV-->挂载LV

1、指定大小

lvcreate -l 100%FREE -n lv_data vgdata

#或者指定LV空间大小
lvcreate -L 500G -n lv_data vgdata

lvs

2、格式化

mkfs.xfs /dev/vgdata/lv_data

3、新加挂载点, 如: /data

mkdir /data
df -Th

4、修改fstab文件

vi /etc/fstab
/dev/vgdata/lv_data /data                             xfs     defaults        0 0

5、将lv1挂载到/data

mount -

备注:对于低IO读写的VM,可以精简挂载,来实现自动回收空间。

mount -t xfs -o discard /dev/vgdata/lv_data /data
/dev/vgdata/lv_data /data                  xfs     defaults,discard       2 2

五、重启VM,检查开机是否挂载(验证)

init 6
df -Th


场景二、虚拟机添加新硬盘,扩容旧分区

1、新加的硬盘超过2T,无需分区,直接做成pv即可

pvcreate /dev/sdb

 2、查看LVM组名

vgs

知道lvm卷组叫 'vg_data'了,使用vgextend来向 'vg_data' 卷组添加pv。

vgextend vg_data /dev/sdb


对逻辑分区进行扩容前,df -h 看看有哪些分区。

df -h


给各个分区添加容量

 假设:/ 、/home 需要添加500G 。

lvextend -L +500G /dev/mapper/centos-root
lvextend -L +500G /dev/mapper/centos-home

  提示扩容成功! 让我们再次用上述命令查看LVM信息

vgs
lvscan
vgdisplay

为什么df -h 还没变呢?

 4、刷新磁盘信息与写入

    因为我们要用xfs_growfs 重设分区大小! 这样才能使df -h 也能生效!

注意的是,xfs文件系统使用 xfs_growfs,ext文件系统使用 resize2fs;xfs文件系统只支持增大不支持缩小。

xfs_growfs /dev/mapper/centos-root

#当然有些人也喜欢partprobe这个命令


场景三、在VM中对已有硬盘在线扩容

一、VM中增加现有磁盘大小

虚拟机磁盘扩容_centos_04

直接更改磁盘容量大小。

注意:如果此磁盘存在快照,则无法操作。需要先删除快照


二、重新扫描改变大小的磁盘

登陆系统lsblk查看磁盘空间无改变

此时需要重新扫描存储设备的scsi总线,有两种方法

方法一

找到scsi磁盘编号,进行rescan

ls /sys/class/scsi_disk/
echo 1 > /sys/class/scsi_disk/0\:0\:1\:0/device/rescan

虚拟机磁盘扩容_centos_05

方法二

shell>echo 1 > /sys/block/扩展的磁盘/device/rescan

扩展的磁盘,如 sda sdb sdc 等

echo 1> /sys/class/block/sda/device/rescan #kernel 3.x

echo 1>/sys/class/scsi_device/0:0:1:0/device/block:sdb/device/rescan #kernel 2.x

fdisk -l 发现新扩展空间

三、重新分区以使用新增的空间

fdisk /dev/sda
命令 (m 以獲得說明):d
分割區編號 (1,2, default 2): 2
Partition 2 is deleted
命令 (m 以獲得說明):n
Partition type:
p primary (1 primary, 0 extended, 3 free)
e extended
Select (default p): p
分割區編號 (2-4, default 2): 2
起初 sector (1026048-92274687, 預設 1026048):
使用預設值 1026048n
最後 sector, +sectors 或 +大小{K,M,G} (1026048-92274687, 預設 92274687):
使用預設值 92274687
Partition 2 of type Linux and of size 43.5 GiB is set
如果是分配给LVM的则需要指定type
命令 (m 以獲得說明):t
分割區編號 (1,2, default 2): 2
Hex code (type L to list all codes): 8e
Changed type of partition 'Linux' to 'Linux LVM'
呼叫 ioctl() 以重新讀取分割表。
w
WARNING: Re-reading the partition table failed with error 16: 裝置或系統資源忙碌中.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)

三、通知系统分区表的变化 partprobe:

partprobe



四、改变文件系统的大小 (LVM情况跳过)

resize2fs /dev/sda2

五、LVM 情况下操作

pvcreat /dev/sda2
vgextend vg_data /dev/sda2
lvextend -L +100G -f -r /dev/centos/root




场景四、非LVM在线调整空间

需求:扩容硬盘分区。

常规操作如下:

一、关闭掉使用/data分区的服务,这里/data分区是mysql数据库

service mysqld stop

二、卸载掉磁盘,重新分区

1、卸载磁盘

umount  -l  /data

若提示磁盘忙,使用fuser找出将正在使用磁盘的程序并结束掉。

fuser -m -v /data

fuser -m -v -i -k /data

2、磁盘分区

使用fdisk命令重新调整磁盘分区大小

fdisk -l

fdisk /dev/sdb

p #查看磁柱号 ,记住,后面要用到

d #删除之前的分区

n #建立新分区

p #主分区

1 #第一个主分区

删除之前的分区,然后建立新分区,注意开始的磁柱号要和原来的一致(保证数据不丢失的关键步骤),结束的磁柱号默认回车使用全部磁盘。

wq #保存分区信息并退出

3、调整分区

e2fsck -f /dev/sdb1 #检查分区信息

resize2fs /dev/sdb1 #调整分区大小

4、重新挂载分区

mount /data

df -h #可以看到磁盘容量已经变为300GB了

至此,Linux下使用fdisk扩大分区容量教程完成

resize2fs /dev/sdb5