在生产环境下,虚拟机如何不停机扩容?
本文以场景维度列出虚拟机的多种扩容方式.
扩容操作从空间来源上,有两种方式,新添加磁盘和原磁盘增加空间。
从空间目的地来说,也有两种,扩展原有分区和新增分区。
但只要把握底层原理,遵循大体步骤,还是很简单的。
需要理解的基础概念
分区:
文件系统:
场景一、虚拟机添加新硬盘,划分新分区
场景二、虚拟机添加新硬盘,扩容旧分区
场景三、虚拟机扩容现有硬盘容量,扩容旧分区
场景四,虚拟机扩容现有硬盘容量,非LVM在线调整空间
场景一、虚拟机添加新硬盘,新分区
一般用于初始化虚拟机。
一、虚拟机新添加一块硬盘(500G)
二、kernel识别:
centos7 添加后操作系统能直接识别。
lsblk
三、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中增加现有磁盘大小
直接更改磁盘容量大小。
注意:如果此磁盘存在快照,则无法操作。需要先删除快照
二、重新扫描改变大小的磁盘
登陆系统lsblk查看磁盘空间无改变
此时需要重新扫描存储设备的scsi总线,有两种方法
方法一
找到scsi磁盘编号,进行rescan
ls /sys/class/scsi_disk/
echo 1 > /sys/class/scsi_disk/0\:0\:1\:0/device/rescan
方法二
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