热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

CentOS7LVM逻辑卷分区自动扩容Shell脚本

应用场景和已知存在的问题:适用于CentOS6或CentOS7(可能适用于CentOS4或5等早些版本)根文件系统(被扩展的文件系统)采用LVM进行管理,例如mount命令输出“/dev/mapper/vg_$hostname-lv_rooton/typeext4(rw)”中含有“ma

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

  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 &#39;VG Name&#39; | awk &#39;{print $NF}&#39;)VG_PATH_TO_EXTEND=$(lvdisplay | grep &#39;LV Path&#39; | awk &#39;{print $NF}&#39; | 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</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&#39;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扩容成功。


推荐阅读
  • docker容器的数据管理一:数据卷实现数据的永久化,完全独立于容 ... [详细]
  • 成功安装Sabayon Linux在thinkpad X60上的经验分享
    本文分享了作者在国庆期间在thinkpad X60上成功安装Sabayon Linux的经验。通过修改CHOST和执行emerge命令,作者顺利完成了安装过程。Sabayon Linux是一个基于Gentoo Linux的发行版,可以将电脑快速转变为一个功能强大的系统。除了作为一个live DVD使用外,Sabayon Linux还可以被安装在硬盘上,方便用户使用。 ... [详细]
  • 【shell】网络处理:判断IP是否在网段、两个ip是否同网段、IP地址范围、网段包含关系
    本文介绍了使用shell脚本判断IP是否在同一网段、判断IP地址是否在某个范围内、计算IP地址范围、判断网段之间的包含关系的方法和原理。通过对IP和掩码进行与计算,可以判断两个IP是否在同一网段。同时,还提供了一段用于验证IP地址的正则表达式和判断特殊IP地址的方法。 ... [详细]
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
  • 本文介绍了在MacOS系统上安装MySQL的步骤,并详细说明了如何设置MySQL服务的开机启动和如何修改MySQL的密码。通过下载MySQL的macos版本并按照提示一步一步安装,在系统偏好设置中可以找到MySQL的图标进行设置。同时,还介绍了通过终端命令来修改MySQL的密码的具体操作步骤。 ... [详细]
  • 本文总结了Linux下多线程执行shell脚本的4种方法,包括切换到工作目录执行、使用绝对路径执行、直接使用bash或sh执行。同时介绍了为什么需要加上"./"来执行脚本的原因。 ... [详细]
  • 从U ... [详细]
  • crontab 自动执行定时任务时,命令无法执行的解决方案
    为什么80%的码农都做不了架构师?最近在工作中需要使用crontab执行定时任务,处理memcacheq消息队列里的数据,但是发现在 ... [详细]
  • 本文介绍了在Android Studio中使用命令行build gradle的方法,并解决了一些常见问题,包括手动配置gradle环境变量和解决External Native Build Issues的方法。同时提供了相关参考文章链接。 ... [详细]
  • 程序员如何选择机械键盘轴体?红轴和茶轴对比
    本文介绍了程序员如何选择机械键盘轴体,特别是红轴和茶轴的对比。同时还介绍了U盘安装Linux镜像的步骤,以及在Linux系统中安装软件的命令行操作。此外,还介绍了nodejs和npm的安装方法,以及在VSCode中安装和配置常用插件的方法。最后,还介绍了如何在GitHub上配置SSH密钥和git的基本配置。 ... [详细]
  • ZABBIX 3.0 配置监控NGINX性能【OK】
    1.在agent端查看配置:nginx-V查看编辑时是否加入状态监控模块:--with-http_stub_status_module--with-http_gzip_stat ... [详细]
  • 其实之前也有下载过完整的android源码,但是从来没有对这个做过一些总结,在加上最近需要经常去看,索性就在从新下载,编译一下,其实这些东西官网上面都有。http:sou ... [详细]
  • homemyUserscript.sh>>homemyUserlog.txt2>&1在script.sh ... [详细]
  • systemd-nspawn可以创建最轻量级的容器(ns的意思就是namespace),本文的实验平台是Ubuntu16.04,x86_64机器。本文的目的是:在Ubuntu中用syst ... [详细]
  • mysql自动打开文件_让docker中的mysql启动时自动执行sql文件
    本文提要本文目的不仅仅是创建一个MySQL的镜像,而是在其基础上再实现启动过程中自动导入数据及数据库用户的权限设置,并且在新创建出来的容器里自动启动My ... [详细]
author-avatar
zhangmy0815522
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有