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代碼:

#!/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 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/scan
echo "- - -" >/sys/class/scsi_host/host1/scan
echo "- - -" >/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 path
echo 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<<eof
n
p1
t8e
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)添加磁盤並執行腳本後:

由此可見根分區已經由原先的36GB變爲52GB,表示LVM擴容成功。

--END--


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章