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,如需转载请自行联系原作者


相关文章
|
5月前
|
Linux Shell
Centos或Linux编写一键式Shell脚本删除用户、组指导手册
Centos或Linux编写一键式Shell脚本删除用户、组指导手册
128 4
|
5月前
|
Linux Shell 数据安全/隐私保护
Centos或Linux编写一键式Shell脚本创建用户、组、目录分配权限指导手册
Centos或Linux编写一键式Shell脚本创建用户、组、目录分配权限指导手册
271 3
|
6月前
|
Linux Shell
在Linux、CentOS7中设置shell脚本开机自启动服务
以上就是在CentOS 7中设置shell脚本开机自启动服务的全部步骤。希望这个指南能帮助你更好地管理你的Linux系统。
435 25
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
188 6
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
Shell Linux
Linux shell编程学习笔记30:打造彩色的选项菜单
Linux shell编程学习笔记30:打造彩色的选项菜单
|
7月前
|
存储 安全 Linux
Centos 8系统ext4文件系统类型进行扩容缩容 (LVM)
通过使用这些技术和工具,可以有效管理CentOS 8系统上的存储资源,确保系统在高负载和高并发情况下的稳定运行。
437 9
|
10月前
|
Ubuntu Linux 虚拟化
CentOS7扩容踩坑记录(最后只有ubuntu成功)
这篇博客记录了一次尝试给CentOS根分区扩容的过程。作者在VMware中扩展了虚拟磁盘,但最终未能成功将新分区合并到现有卷组中,因为原有分区未创建物理卷(PV)和卷组(VG)。过程中遇到了多个问题,如分区文件正在使用中等。最终作者提醒读者在操作前务必先检查当前的分区和卷组状态。
190 4
CentOS7扩容踩坑记录(最后只有ubuntu成功)
|
12月前
|
Web App开发 网络协议 Linux
linux命令总结(centos):shell常用命令汇总,平时用不到,用到就懵逼忘了,于是专门写了这篇论文,【便持续更新】
这篇文章是关于Linux命令的总结,涵盖了从基础操作到网络配置等多个方面的命令及其使用方法。
230 1
linux命令总结(centos):shell常用命令汇总,平时用不到,用到就懵逼忘了,于是专门写了这篇论文,【便持续更新】
|
11月前
|
运维 监控 Shell
深入理解Linux系统下的Shell脚本编程
【10月更文挑战第24天】本文将深入浅出地介绍Linux系统中Shell脚本的基础知识和实用技巧,帮助读者从零开始学习编写Shell脚本。通过本文的学习,你将能够掌握Shell脚本的基本语法、变量使用、流程控制以及函数定义等核心概念,并学会如何将这些知识应用于实际问题解决中。文章还将展示几个实用的Shell脚本例子,以加深对知识点的理解和应用。无论你是运维人员还是软件开发者,这篇文章都将为你提供强大的Linux自动化工具。
|
Shell Linux 开发工具