SHELL / 编程开发

无需手动操作:自动格式化与挂载磁盘的脚本实现

浅时光博客 · 3月18日 · 2024年 · 7.4k 次已读

一、场景描述

在我们的业务系统中,数据的安全、以及数据的持久化保留是至文章来源(Source):https://dqzboy.com关重要的;所以我们在部署业务系统时,都会选择单独挂载一块磁盘作为数据盘,专门用来存储数据使用,磁盘类型根据业务需求可以是固态(SSD)或者是传统的机械盘(HDD),总之磁盘挂载到os之后,首先做的第一步就是对磁盘进行格式化、分区、挂载等相关操作;如果规模较小可以手动去一步一步执行操作,如果是服务器节点的很多的情况下就需要通过脚本帮助我们更好的减少重复性的工作,提高效率。

二、脚本内容

说明:此脚本呢,主要是针对的是CentOS操作系统,使用 expect 工具 实现免交互执行操作过程。

一些Shell小工具、脚本已经整合至个人的GitHub仓库,有兴趣的小伙伴可以查看下载。

GitHub:https://github.com/dqzboy/ShellProject
#!/usr/bin/env bash
#===============================================================================
#
#          FILE: Disk_Initialize.sh
# 
#         USAGE: ./Disk_Initialize.sh 
# 
#   DESCRIPTION: Linux CentOS Disk免交互格式化分区、挂载
# 
#  ORGANIZATION: DingQz dqzboy.com
#       CREATED: 2021
#===============================================================================

# 安装软件
EXPECT=`yum list installed | grep -w expect`
if [ $? -eq 0 ];then
   echo
   echo
   echo "--------------------------------------------------------------------------"
   echo "               Yum Install expect Skip..."
   echo "--------------------------------------------------------------------------"
   echo
   echo
else 
   yum -y install expect
   echo
   echo
   echo "--------------------------------------------------------------------------"
   echo "               Yum Install expect Done..."
   echo "--------------------------------------------------------------------------"
   echo
   echo
fi

# 解锁文件
chattr -i /etc/fstab

OS_CN() {
# 注意修改磁盘名称前缀,例如这里的 /sd
Dsk=`lsblk -r --output NAME,MOUNTPOINT | awk -F \/ '/sd/ { dsk=substr($1,1,3);dsks[dsk]+=1 } END { for ( i in dsks ) { if (dsks[i]==1) print i } }'`
Disk="/dev/${Dsk}"
DiskP="${Disk}1"
if [ ! -z "${Dsk}" ];then
expect -c "
  spawn fdisk ${Disk}
  expect {
    -re \"(.*)三思(.*)(\n*)(.*)获取帮助(.*)\" { send \"n\r\";exp_continue }
    \"default p\" { send \"\r\";exp_continue }
    \"分区号\" { send \"\r\";exp_continue }
    \"起始 扇区\" { send \"\r\";exp_continue }
    \"Last 扇区\" { send \"\r\";exp_continue }
    \"命令\" { send \"wq\r\";exp_continue }
  }
"
else
   echo
   echo
   echo "--------------------------------------------------------------------------"
   echo "               The new disk was not found. Exit..."
   echo "--------------------------------------------------------------------------"
   echo
   exit 1
fi
}

OS_EN() {
Dsk=`lsblk -r --output NAME,MOUNTPOINT | awk -F \/ '/sd/ { dsk=substr($1,1,3);dsks[dsk]+=1 } END { for ( i in dsks ) { if (dsks[i]==1) print i } }'`
Disk="/dev/${Dsk}"
DiskP="${Disk}1"
if [ ! -z "${Dsk}" ];then
expect -c "
  spawn fdisk ${Disk}
  expect {
    -re \"(.*)careful(.*)(\n*)(.*)help(.*)\" { send \"n\r\";exp_continue }
    \"default p\" { send \"\r\";exp_continue }
    \"Partition number\" { send \"\r\";exp_continue }
    \"First sector\" { send \"\r\";exp_continue }
    \"Last sector\" {send \"\r\";exp_continue }
    \"Command\" { send \"wq\r\";exp_continue }
  }
"
else
   echo
   echo
   echo "--------------------------------------------------------------------------"
   echo "              The new disk was not found. Exit..."
   echo "--------------------------------------------------------------------------"
   echo
   exit 1
fi
}

Mkfs_Disk() {
sleep 3

# 格式化分区
Partitions=`blkid | awk -F ":" '{print $1}'| grep "${DiskP}"`
if [ $? -eq 0 ];then
   echo
   echo
   echo "--------------------------------------------------------------------------"
   echo "               Formatted Done"
   echo "--------------------------------------------------------------------------"
   echo
   echo
else
   mkfs.xfs -f -n ftype=1 ${DiskP}
fi

if ! grep "${DiskP}" /etc/fstab; then
cat >> /etc/fstab <<EOF
${DiskP} /data                   xfs     defaults        1 0
EOF
echo "--------------------------------------------------------------------------"
fi

# 创建挂载目录
mkdir -p /data
mount ${DiskP}  /data

# 非ROOT用户不允许编辑以下文件
chattr +i /etc/fstab
}

# 判断系统语言
OS_LANG=`echo $LANG | awk -F "." '{print $1}'`
if [ "${OS_LANG}" == "en_US" ];then
   OS_EN
   Mkfs_Disk
elif [ "${OS_LANG}" == "zh_CN" ];then
   OS_CN
   Mkfs_Disk
else
   echo "Sorry script does not support this system."
fi 

三、脚本分析

主要是对脚本中使用到的expect工具的几个参数进行介绍说明:

  • expect -c:-c 标志在脚本中的任何命令之前添加要执行的命令。 该命令应该被引用以防止被shell分解
  • spawn:命令激活一个Unix程序来进行交互式的运行;交互程序开始后面跟命令或者指定程序
  • expect:获文章来源(Source):浅时光博客取匹配信息匹配成功则执行expect后面的程序动作
  • send:用于发送指定的字符串信息
  • exp_continue:在expect中多次匹配时,继续执行下面的匹配


本文作者:浅时光博客
原文链接:https://www.dqzboy.com/12424.html
版权声明:知识共享署名-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)协议进行许可,转载时请以>超链接形式标明文章原始出处和作者信息
免责声明:本站内容仅供个人学习与研究,严禁用于商业或非法目的。请在下载后24小时内删除相应内容。继续浏览或下载即表明您接受上述条件,任何后果由用户自行承担。

0 条回应

必须 注册 为本站用户, 登录 后才可以发表评论!