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

shell scott 329℃ 0评论

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

  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
#!/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)添加磁盘前:

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

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

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

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

–END–

原文:http://dgd2010.blog.51cto.com/1539422/1619692

转载请注明:osetc.com » shell: CentOS6、7 LVM逻辑卷分区自动扩容Shell脚本编程思路与实例

喜欢 (0)or分享 (0)
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址