Scenarios and known issues:
Apply to CentOS6 or CentOS7 (possibly available on CentOS4 and earlier versions such as 5)
The root file system (extended file system) use LVM to manage, such as the mount command output “/dev/mapper/vg_$hostname-lv_root on/type ext4 (RW)“ in the “Mapper“ keywords
Automatic expansion of the root file system, if you want to expand to other file systems, such as the existing business application data directory is not in the root partition, you will need to modify the VG_PATH_TO_EXTEND variable in the Shell script code (around line 78).
Only support partition formats such as ext2, ext3, ext4, XFS file systems
May not support some customized CentOS system, but the core steps similar to
Scripts only add SCSI disk support, such as the need to manage other disks, you need to expand their own scripts
To keep the script simple, avoiding multiple (implementation of this program does not write locks), pre-existing disk name is already set for the SDA, see ONLINE_SCSI_DISK_PRESENT 45th row variable in Shell script code
Considerations:
CentOS6 and CentOS7 in the file system format of the default root file system differences, needs to determine whether the XFS, if XFS xfs_growfs option should be used instead of using the resize2fs.
Using the resize2fs extension of ext2, ext3, ext4 file system, use the xfs_growfs expanding XFS file system format
The same script is executed multiple times on the same system error that might be thrown, you can consider the use of file locking to solve this problem
Programming method:
(Should be prepared or checked before Shell Script Runtime Environment) for block device file names currently in use
Get new add SCSI disk filename
Gets a LVM volume group (VG), the file path of the volume group name will be expanded
To add a new disk using Fdisk partition is created and formatted with the LVM format
Create a physical volume, pvcreate
Extending a volume group, vgextend
Regulate the logical volume size, lvresize
Determine whether the XFS file system
Synchronize file systems, making expansion effect
Returns the system disk usage
Shell code:
12345678910111213141516171819202122 #!/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 scriptfunction 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 operationONLINE_SCSI_DISK_PRESENT=$(lsblk --all | grep disk | grep -v fd | awk '{print $1}' | xargs)# TODO# For execution this script beyond twiceONLINE_SCSI_DISK_PRESENT=sda# Find new scsi disk online# TODO figure it out why there is host0?echo "- - -" >/sys/class/scsi_host/host0/scanecho "- - -" >/sys/class/scsi_host/host1/scanecho "- - -" >/sys/class/scsi_host/host2/scan# Show new added scsi disk onlineONLINE_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 pathecho New Added SCSI Disk: $ONLINE_SCSI_DISK_NEWADD# Get VG NameVG_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<<eofnp1t8eweof 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 installedwhich 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 --alldone