CentOS6、7 LVM逻辑卷分区自动扩容Shell脚本编程思路与实例

简介:

应用场景和已知存在的问题:

  1. 适用于CentOS6或CentOS7(可能适用于CentOS4或5等早些版本)

  2. 根文件系统(被扩展的文件系统)采用LVM进行管理,例如mount命令输出“/dev/mapper/vg_$hostname-lv_root on / type ext4 (rw)”中含有“mapper”关键词

  3. 自动扩容根文件系统,如果想扩展其他文件系统,例如有的业务应用数据目录不在根分区中,则需要修改Shell脚本代码中的VG_PATH_TO_EXTEND变量(约78行)。

  4. 仅支持ext2、ext3、ext4、xfs等分区格式的文件系统

  5. 可能不支持某些过多自定义的CentOS系统,但核心步骤相似

  6. 脚本中仅添加了scsi磁盘支持,如需要管理其他磁盘,则需要自己扩充脚本

  7. 为了简化脚本,避免执行多次(本程序没有写执行锁),先前已经存在的磁盘名已经设定为sda,见Shell脚本代码中第45行的ONLINE_SCSI_DISK_PRESENT变量

考虑点:

由于CentOS6和CentOS7在默认根文件系统的文件系统格式存在差异,需要判断是否为xfs,如果是xfs则应该使用xfs_growfs而不是一味的使用resize2fs。

使用resize2fs扩展ext2、ext3、ext4格式的文件系统,使用xfs_growfs扩展xfs格式的文件系统

同一脚本在同一系统多次被执行可能引发的错误,可以考虑使用文件锁来解决这个问题

编程思路:

  1. (之前应该准备或检查Shell脚本运行环境)获取当前使用中的块设备文件名

  2. 获取新添加scsi磁盘的文件名

  3. 获取LVM卷组名(vg)、将被扩展的卷组名的文件路径

  4. 将新添加磁盘使用fdisk创建分区并格式化为LVM格式

  5. 创建物理卷,pvcreate

  6. 扩展卷组,vgextend

  7. 调节逻辑卷大小,lvresize

  8. 判断是否是xfs文件系统

  9. 同步文件系统,使得扩容生效

  10. 返回系统磁盘使用情况

Shell代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
#!/bin/bash
# Usage: Automatic expand lv with LVM managed disk
#  Setp 1: Add Hard Disk or Storage to Computing unit
#   Setp 2: Execute this script with root privilege
#   Setp 3: Mind info of this script execution result
 
 
# Open the refrigerator door, get the shell script execution environment ready
# Put the elephant into the refrigerator, how the shell scripts works
# Close the refrigerator door, check out the result of execution
# Simetimes, we have to pull new elephant or elephant dung out here, unset variables of shell script
 
function  check_execution_result(){
         if  [[ ! -z $RETVAL ]];  then
                 unset  RETVAL
         fi
         RETVAL=$?
         if  [[ $RETVAL - ne  0 ]];  then
                 echo  execution failed! 
                 exit  $RETVAL
         else
                 echo  execution successfully! 
         fi
         unset  RETVAL
}
 
# lsblk --scsi
# lsblk --all
# NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
# fd0               2:0    1    4K  0 disk 
# sda               8:0    0   40G  0 disk 
# ├─sda1            8:1    0  500M  0 part /boot
# └─sda2            8:2    0 39.5G  0 part 
#   ├─centos-swap 253:0    0  3.9G  0 lvm  [SWAP]
#   └─centos-root 253:1    0 35.6G  0 lvm  /
# sdb               8:16   0   16G  0 disk 
# sr0              11:0    1  6.6G  0 rom  
 
# Show present scsi disk online
# Q: Why use "xargs" here?
# A: Convert the text from multi-line single-column into single-line multi-column, for sed operation
ONLINE_SCSI_DISK_PRESENT=$(lsblk --all |  grep  disk |  grep  - v  fd |  awk  '{print $1}'  xargs )
# TODO
# For execution this script beyond twice
ONLINE_SCSI_DISK_PRESENT=sda
# Find new scsi disk online
# TODO figure it out why there is host0? 
echo  "- - -"  > /sys/class/scsi_host/host0/scan
echo  "- - -"  > /sys/class/scsi_host/host1/scan
echo  "- - -"  > /sys/class/scsi_host/host2/scan
# Show new added scsi disk online
ONLINE_SCSI_DISK_NEWADD=$(lsblk --all |  grep  disk |  grep  - v  fd |  awk  '{print $1}'  xargs  echo  sed  "s/$ONLINE_SCSI_DISK_PRESENT//g" )
# Construct disk file with full path
echo  New Added SCSI Disk: $ONLINE_SCSI_DISK_NEWADD
# Get VG Name
VG_Name=$(vgdisplay |  grep  'VG Name'  awk  '{print $NF}' )
VG_PATH_TO_EXTEND=$(lvdisplay |  grep  'LV Path'  awk  '{print $NF}'  grep  root)
for  BLOCK  in  $ONLINE_SCSI_DISK_NEWADD;  do
     ONLINE_SCSI_DISK_NEWADD_FILENAME= "/dev/" $BLOCK
     # end-of-file contents and eof mark must start row1
     fdisk  $ONLINE_SCSI_DISK_NEWADD_FILENAME > /dev/null  2>&1<<eof
n
p
1
 
 
 
t
8e
w
eof
     check_execution_result
     LVM_OPERATION_DISK_FILENAME=$ONLINE_SCSI_DISK_NEWADD_FILENAME "1"
     pvcreate $LVM_OPERATION_DISK_FILENAME > /dev/null  2>&1
     check_execution_result
     vgextend $VG_Name $LVM_OPERATION_DISK_FILENAME > /dev/null  2>&1
     check_execution_result
     lvresize -l +100%FREE $VG_PATH_TO_EXTEND > /dev/null  2>&1
     check_execution_result
 
# resize2fs - ext2/ext3/ext4 file system resizer
# xfs_growfs, xfs_info - expand an XFS filesystem
 
#[root@hlc7172009 ~]# resize2fs /dev/mapper/centos-root
#resize2fs 1.42.9 (28-Dec-2013)
#resize2fs: Bad magic number in super-block while trying to open /dev/mapper/centos-root
#Couldn't find valid filesystem superblock.
#[root@hlc7172009 ~]#
 
#[root@hlc7172009 ~]# xfs_growfs $VG_PATH_TO_EXTEND
#meta-data=/dev/mapper/centos-root isize=256    agcount=4, agsize=2334208 blks
#         =                       sectsz=512   attr=2, projid32bit=1
#         =                       crc=0
#data     =                       bsize=4096   blocks=9336832, imaxpct=25
#         =                       sunit=0      swidth=0 blks
#naming   =version 2              bsize=4096   ascii-ci=0 ftype=0
#log      =internal               bsize=4096   blocks=4559, version=2
#         =                       sectsz=512   sunit=0 blks, lazy-count=1
#realtime =none                   extsz=4096   blocks=0, rtextents=0
#data blocks changed from 9336832 to 13530112
#[root@hlc7172009 ~]#
 
     # Check xfs_info if is installed 
     which  xfs_info > /dev/null  2>&1
     if  [[ $? - ne  0 ]];  then
         yum  install  xfsprogs -y > /dev/null  2>&1
     fi
     # end Check xfs_info if is installed
 
     # Check VG_PATH_TO_EXTEND if is xfs filesystem
     xfs_info $VG_PATH_TO_EXTEND > /dev/null  2>&1
     if  [[ $? - ne  0 ]];  then
         # is not xfs
         VG_PATH_TO_EXTEND_IS_NOT_XFS=0
     else 
         # is xfs
         VG_PATH_TO_EXTEND_IS_NOT_XFS=1
     fi
     # end Check VG_PATH_TO_EXTEND if is xfs filesystem
 
     # TODO CentOS7 default filesystem is xfs, so we can check it out by OS if is CentOS7
 
     if  [[ $VG_PATH_TO_EXTEND_IS_NOT_XFS ]];  then
         # is xfs
         xfs_growfs $VG_PATH_TO_EXTEND > /dev/null  2>&1
     else
         # is not xfs
         resize2fs $VG_PATH_TO_EXTEND > /dev/null  2>&1
     fi
     check_execution_result
     df  -h
     lsblk --all
done


测试结果:

(1)添加磁盘前:

image

(2)添加磁盘并执行脚本后:

image

由此可见根分区已经由原先的36GB变为52GB,表示LVM扩容成功。

--END--




本文转自 urey_pp 51CTO博客,原文链接:http://blog.51cto.com/dgd2010/1619692,如需转载请自行联系原作者


相关文章
|
1月前
|
存储 Linux 数据安全/隐私保护
【CentOS 7】深入指南:使用LVM和扩展文件系统增加root分区存储容量
通过上述步骤,您可以在 CentOS 7 系统中使用 LVM 和扩展文件系统来增加 root 分区的存储容量。这种方法不仅灵活,还能在不中断系统运行的情况下扩展存储空间,非常适合生产环境。请确保在操作前备份重要数据,并仔细执行每一步骤,以确保系统稳定和数据安全。
73 6
|
2月前
|
Shell Linux 测试技术
6种方法打造出色的Shell脚本
6种方法打造出色的Shell脚本
74 2
6种方法打造出色的Shell脚本
|
2月前
|
XML JSON 监控
Shell脚本要点和难点以及具体应用和优缺点介绍
Shell脚本在系统管理和自动化任务中扮演着重要角色。尽管存在调试困难、可读性差等问题,但其简洁高效、易于学习和强大的功能使其在许多场景中不可或缺。通过掌握Shell脚本的基本语法、常用命令和函数,并了解其优缺点,开发者可以编写出高效的脚本来完成各种任务,提高工作效率。希望本文能为您在Shell脚本编写和应用中提供有价值的参考和指导。
84 1
|
2月前
|
Ubuntu Shell 开发工具
ubuntu/debian shell 脚本自动配置 gitea git 仓库
这是一个自动配置 Gitea Git 仓库的 Shell 脚本,支持 Ubuntu 20+ 和 Debian 12+ 系统。脚本会创建必要的目录、下载并安装 Gitea,创建 Gitea 用户和服务,确保 Gitea 在系统启动时自动运行。用户可以选择从官方或小绿叶技术博客下载安装包。
78 2
|
2月前
|
Kubernetes Linux 容器
如何在centos中关闭swap分区
在CentOS中,关闭swap分区可以通过临时关闭和永久禁用两种方式实现。临时关闭swap分区适用于临时测试和故障排除,而永久禁用swap分区则需要修改 `/etc/fstab`文件。通过遵循上述步骤,可以确保系统在没有swap的情况下稳定运行。这对于某些应用场景(如Kubernetes集群)是必要的配置步骤。
399 3
|
2月前
|
存储 监控 Linux
在 CentOS 7 中进行磁盘分区和挂载的具体操作步骤,如何使用 `fdisk` 创建分区、格式化分区、创建挂载点以及临时和永久挂载分区的方法。
本文介绍了在 CentOS 7 中进行磁盘分区和挂载的具体操作步骤。通过一个实际案例,详细说明了如何使用 `fdisk` 创建分区、格式化分区、创建挂载点以及临时和永久挂载分区的方法。此外,还分享了一些实践经验,帮助读者更好地管理和优化服务器磁盘空间。
200 4
|
2月前
|
存储 监控 Linux
在 CentOS 7 中如何对未分配的大容量硬盘进行分区和挂载。通过具体案例,详细说明了使用 `fdisk` 创建分区、格式化分区、创建挂载点以及临时和永久挂载分区的步骤
本文介绍了在 CentOS 7 中如何对未分配的大容量硬盘进行分区和挂载。通过具体案例,详细说明了使用 `fdisk` 创建分区、格式化分区、创建挂载点以及临时和永久挂载分区的步骤。此外,还分享了一些实践经验,帮助读者更好地管理和优化磁盘空间。
201 8
|
2月前
|
存储 监控 Linux
如何在 CentOS 7 中进行磁盘分区和挂载,包括准备工作、创建分区、格式化分区、创建挂载点、挂载分区及实践经验分享
随着业务扩展和技术进步,服务器硬盘容量需求不断增加。本文通过具体案例介绍如何在 CentOS 7 中进行磁盘分区和挂载,包括准备工作、创建分区、格式化分区、创建挂载点、挂载分区及实践经验分享,帮助读者更好地管理和利用磁盘空间。
153 3
|
2月前
|
SQL 存储 Linux
从配置源到数据库初始化一步步教你在CentOS 7.9上安装SQL Server 2019
【11月更文挑战第16天】本文介绍了在 CentOS 7.9 上安装 SQL Server 2019 的详细步骤,包括配置系统源、安装 SQL Server 2019 软件包以及数据库初始化,确保 SQL Server 正常运行。
|
2月前
|
SQL 存储 Linux
从配置源到数据库初始化一步步教你在CentOS 7.9上安装SQL Server 2019
【11月更文挑战第8天】本文介绍了在 CentOS 7.9 上安装 SQL Server 2019 的详细步骤,包括系统准备、配置安装源、安装 SQL Server 软件包、运行安装程序、初始化数据库以及配置远程连接。通过这些步骤,您可以顺利地在 CentOS 系统上部署和使用 SQL Server 2019。
125 1