在昨晚给线上服务器进行磁盘扩容的时候遇到了一个大坑,新增磁盘后发现服务器并没有识别/dev/sdb 出来,折腾了好一会!那么接下来我就结合之前写的文章内容在这里做一个磁盘扩容的总结。
首先我们介绍一下磁盘扩容的两种方法:
1、在原有硬盘 1 的基础上直接增加空间。
如下图所示,原先的硬盘 1 空间只有 30G 大小,


接下来,我们直接在硬盘 1 上面增加空间,增加到 50G。如下图所示

这时候我们在服务器上执行 fdisk dev/sda 和 df -h 看,发现还是和之前一样,大小没有任何变化还是 30G。这里就不贴图片了,和上面一样。这时候往往之前的操作就是重启服务器 reboot 一下,然后 fdisk -l dev/sda 看会有 50G 空间,但是这里我们往往因为业务需要不能停止服务,更不能停止服务器了。所以这里我们需要按照下面的方法进行操作,不需要重启服务器也不需要重启服务!
方法 1:echo 1 > sys/class/$scsi_device/device/rescan
我们按照如下的方法操作一遍
[root@docker ~]# cd sys/class/scsi_disk/
[root@docker scsi_disk]# ls
0:0:0:0
[root@docker scsi_disk]# cd 0\:0\:0\:0/
[root@docker 0:0:0:0]# cd device/
[root@docker device]# ls
block eh_timeout generic power scsi_disk uevent
bsg evt_capacity_change_reported iocounterbits queue_depth scsi_generic unpriv_sgio
delete evt_inquiry_change_reported iodone_cnt queue_ramp_up_period scsi_level vendor
device_blocked evt_lun_change_reported ioerr_cnt queue_type state vpd_pg80
device_busy evt_media_change iorequest_cnt rescan subsystem vpd_pg83
dh_state evt_mode_parameter_change_reported modalias rev timeout
driver evt_soft_threshold_reached model scsi_device type
[root@docker device]# echo '1' > rescan
[root@docker device]# fdisk -l dev/sda
磁盘 /dev/sda:53.7 GB, 53687091200 字节,104857600 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x000a8551
设备 Boot Start End Blocks Id System
/dev/sda1 * 2048 821247 409600 83 Linux
/dev/sda2 821248 62914559 31046656 8e Linux LVM
这时候我们发现,sda 已经增加到 50G 了。那么接下里需要重新增加一个分区 sda3 出来,将增加的 20G 空间分为 sda3 出来。
[root@docker device]# fdisk /dev/sda
欢迎使用 fdisk (util-linux 2.23.2)。
更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。
命令(输入 m 获取帮助):n
Partition type:
p primary (2 primary, 0 extended, 2 free)
e extended
Select (default p): p
分区号 (3,4,默认 3):3
起始 扇区 (62914560-104857599,默认为 62914560):
将使用默认值 62914560
Last 扇区, +扇区 or +size{K,M,G} (62914560-104857599,默认为 104857599):
将使用默认值 104857599
分区 3 已设置为 Linux 类型,大小设为 20 GiB
命令(输入 m 获取帮助):t
分区号 (1-3,默认 3):3
Hex 代码(输入 L 列出所有代码):8e
已将分区“Linux”的类型更改为“Linux LVM”
命令(输入 m 获取帮助):p
磁盘 /dev/sda:53.7 GB, 53687091200 字节,104857600 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x000a8551
设备 Boot Start End Blocks Id System
/dev/sda1 * 2048 821247 409600 83 Linux
/dev/sda2 821248 62914559 31046656 8e Linux LVM
/dev/sda3 62914560 104857599 20971520 8e Linux LVM
命令(输入 m 获取帮助):w
The partition table has been altered!
Calling ioctl() to re-read partition table.
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)
正在同步磁盘。
[root@docker device]#
方法 2:重新扫描特定的 SCSI Device
echo 1 > /sys/block/$DEVICE/device/rescan 用 sda, sdb, sdc 等替换$DEVICE
[root@docker device]# echo 1 > /sys/block/sda/device/rescan
经过上面的操作,我们将 sda3 分成 lvm 格式的分区了。但是这时候还没有挂载上 sda3,我们发现/dev/下面没有 sda3 出现。这时候如果我们 pvcreate 是不会成功的。
[root@docker device]# ls /dev/sda
sda sda1 sda2
[root@docker device]# ls /dev/sda
[root@docker device]# pvcreate /dev/sda3
Device /dev/sda3 not found (or ignored by filtering).
这时候不要慌,我看看之前的提示信息

所以这时候要么 reboot 重启,要么运行 partprobe 要么运行 kpartx 命令。所以这里我在运行一下 partprobe 命令后,发现/dev/sda3 出来了。
[root@docker device]# partprobe
[root@docker device]# ll /dev/sda
sda sda1 sda2 sda3
那么接下来操作将 20G 扩到跟/目录下。也就是进行 lvm 的扩展操作了。
[root@docker device]# pvcreate /dev/sda3
Physical volume "/dev/sda3" successfully created
[root@docker device]# vgextend centos_docker /dev/sda3
Volume group "centos_docker" successfully extended
[root@docker device]# lvextend -l +100%FREE /dev/mapper/centos_docker-root
Size of logical volume centos_docker/root changed from 25.61 GiB (6555 extents) to 45.60 GiB (11674 extents).
Logical volume root successfully resized.
[root@docker device]# xfs_growfs /dev/mapper/centos_docker-root
meta-data=/dev/mapper/centos_docker-root isize=256 agcount=4, agsize=1678080 blks
= sectsz=512 attr=2, projid32bit=1
= crc=0 finobt=0
data = bsize=4096 blocks=6712320, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=0
log =internal bsize=4096 blocks=3277, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
data blocks changed from 6712320 to 11954176
##(如果是 ext4 文件系统,则使用命令 resize2fs /dev/mapper/centos_docker-root)##
[root@docker device]# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/centos_docker-root 46G 1.6G 45G 4% /
devtmpfs 1.9G 0 1.9G 0% /dev
tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs 1.9G 8.5M 1.9G 1% /run
tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
/dev/sda1 397M 120M 278M 31% /boot
tmpfs 380M 0 380M 0% /run/user/0
[root@docker device]#
这里成功将根/目录扩张到 50G 了。
2、增加一块新的硬盘
这里实验我就不继续做了,我复制之前的文章内容
————————–以下内容来源实战给 Linux 系统动态扩容,不停机处理!———————————–
上图中,我们原先只有 56G 的根目录空间,现在想增加 50G 进去!那么添加一块 50G 的硬盘进去。我们在不停机的情况下,点击虚拟机,点击编辑设置,选择添加,选择硬盘,创建新的虚拟磁盘磁盘,容量 50G,一直下一步知道完成。如下图所示,增加一块新的硬盘!

记录 lvm 的相关信息
我们使用 df -h 和 lvdisplay 命令记录下 LV 的相关信息,VG Name,LV Path 等信息
[root@do1 ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/centos-root 56G 1.5G 55G 3% /
devtmpfs 911M 0 911M 0% /dev
tmpfs 921M 0 921M 0% /dev/shm
tmpfs 921M 8.5M 912M 1% /run
tmpfs 921M 0 921M 0% /sys/fs/cgroup
/dev/sda1 397M 120M 278M 31% /boot
tmpfs 185M 0 185M 0% /run/user/0
[root@do1 ~]# lvdisplay
--- Logical volume ---
LV Path /dev/centos/swap
LV Name swap
VG Name centos
LV UUID k3TPNs-vUuJ-vmcy-SPzS-xxMA-jWhq-JFP95Z
LV Write Access read/write
LV Creation host, time do1, 2018-10-19 18:59:22 +0800
LV Status available
# open 2
LV Size 4.00 GiB
Current LE 1024
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:1
--- Logical volume ---
LV Path /dev/centos/root
LV Name root
VG Name centos
LV UUID BqhdTf-yzgq-HaJi-fU6o-HbIn-WoAU-8tleaE
LV Write Access read/write
LV Creation host, time do1, 2018-10-19 18:59:22 +0800
LV Status available
# open 1
LV Size 55.61 GiB
Current LE 14235
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:0
LV Path /dev/centos/root #也就是根目录/挂载点
LV Name root
VG Name centos
上面三个信息记录下来,后面要用。
格式化新挂载的磁盘
先用 fdisk -l 查看新的磁盘是否挂载

注意:这里如果没有发现新添加的磁盘,那么请 root 用户执行以下脚本。scsisum.sh
#!/usr/bin/bash
scsisum=`ls /sys/class/scsi_host/ |wc -l`
for ((i=0;i<${scsisum};i++))
do
echo "- - -" > /sys/class/scsi_host/host${i}/scan
done
接下来格式化分区操作‘fdisk /dev/sdb’


新分区增加到 LV
将新加的分区 /dev/sdb1 创建为物理卷
[root@do1 ~]# pvcreate /dev/sdb1
Physical volume "/dev/sdb1" successfully created
给卷组‘centos’扩容,将物理卷 /dev/sdb1 扩展至‘centos’卷组
[root@do1 ~]# vgextend centos /dev/sdb1
Volume group "centos" successfully extended
此时卷组‘centos’有50G空余空间即 /dev/sdb1,将其全部扩展至 /
[root@do1 ~]# lvextend -l +100%FREE /dev/mapper/centos-root
Size of logical volume centos/root changed from 55.61 GiB (14235 extents) to 105.60 GiB (27034 extents).
Logical volume root successfully resized.
此时50G磁盘虽已扩展至 /,但并没写入文件系统;进入 /etc/fstab 确认 / 文件系统—>xfs

写入文件系统,使扩容生效(如果是 ext4 文件系统,则使用命令 resize2fs /dev/mapper/centos-root)
[root@do1 ~]# xfs_growfs /dev/mapper/centos-root
meta-data=/dev/mapper/centos-root isize=256 agcount=4, agsize=3644160 blks
= sectsz=512 attr=2, projid32bit=1
= crc=0 finobt=0
data = bsize=4096 blocks=14576640, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=0
log =internal bsize=4096 blocks=7117, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
data blocks changed from 14576640 to 27682816
查看/根目录大小是否变化,扩容前是 56G,扩容后是 106G,此时大功告成!

总结:以上是没有停机的情况下完成扩容磁盘,当然一切前提还是要做好安全备份!做好相应的备份快照,这样就实现了上述两点要求!
本次扩容指令汇总:
1.创建分区 #fdisk /dev/sdb
2.创建物理卷 #pvcreate /dev/sdb1
3.查看卷组名称及使用情况 #vgdisplay
4.将物理卷扩展到卷组 #vgextend cl /dev/sdb1 (此处‘cl’是卷组名称)
5.将卷组中空闲空间扩展到 /home #lvextend -l +100%FREE /dev/mapper/centos-root
6.刷新文件系统是扩容生效 #resize2fs /dev/mapper/centos-root
使用 reiserfs 文件系统代替 ext2/ext3 #resize_reiserfs /dev/mapper/centos-root
Centos7 默认文件系统是 ‘xfs’,其他系统注意是否是‘ext4’等