前言
生产与测试中经常遇到需要挂载磁盘与对磁盘进行分区的需求,对于老手来来说也就是几句指令就搞定了的事情,但是对于新手来说,百度来的东西总不是那么的靠谱,而且每次手动一个磁盘一个磁盘的挂载与分区也是很麻烦的事情,指令也容易敲错很麻烦(我个人是这样觉得)。我就写了如下的支持脚本,用来制作分区,与自动挂载。
脚本
#!/bin/bash
usage="$(basename "$0") [-h|-help] [-s|--disk] [-s|--size] [-m|--mount] [-l|--lvm]
This program will run.
Arguments:
-h|--help show this help
-d|--disk dev ex: sda/sdb
-s|--size disk size ex: 100G/ALL
-m|--mount mount path ex: /data/kafka
-l|--lvm use lvm ex: yes/no"
ARGS=$(getopt -a -o hd:s:m:t:l: -l help,disk:,size:,mount:,type:,lvm: -- "$@")
set -e
eval set -- "$ARGS"
while true; do
case $1 in
-d | --disk)
DISK=$2
shift
;;
-l | --lvm)
LVM=$2
shift
;;
-s | --size)
SIZE=$2
shift
;;
-m | --mount)
MOUNT=$2
shift
;;
-h | --help)
echo "$usage"
exit
;;
--)
shift
break
;;
*)
echo "Internal error!"
exit
;;
esac
shift
done
if [ -z "$DISK" ]; then
echo "请选择磁盘"
exit
fi
if [ -z "$SIZE" ]; then
echo "请输入磁盘大小,全部使用[ALL]"
exit
fi
if [ -z "$MOUNT" ]; then
echo "请输入挂载路径"
exit
fi
if [ "$SIZE" = "ALL" ]; then
SIZE='100%'
fi
main() {
MOUNTED=$(cat /etc/fstab | grep -v '^#' | awk -v path="$MOUNT" '$2 == path {print $2}')
if [ -n "$MOUNTED" ]; then
echo "该路径已被挂载,请选择其他路径后重试~"
exit
fi
PT=$(LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8 parted /dev/$DISK print | grep 'Partition Table' | awk -F ":" '{print $2}' | sed 's/^[[:space:]]*//')
echo "磁盘格式为->$PT"
if [ "$PT" != "gpt" ]; then
echo "开始格式化磁盘为[gpt]~"
parted /dev/$DISK mklabel gpt
echo "磁盘格式化成功~"
fi
PART_NUM=$(lsblk /dev/$DISK -l | grep 'part' | wc -l)
echo "磁盘最大分区号为[$PART_NUM]"
if [ "$PART_NUM" = 0 ]; then
START='0%'
else
START=$(LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8 parted /dev/$DISK print free | grep 'Free Space' | awk 'END{print}' | awk '{print $1}')
fi
if [ "$SIZE" != '100%' ]; then
if [ "$START" = '0%' ]; then
START_VALUE=0
else
START_VALUE=$(printf '%.0f' "${START//[A-Za-z]/}")
fi
SIZE_VALUE=$(printf '%.0f' "${SIZE//[A-Za-z]/}")
END_VALUE=$(expr $START_VALUE + $SIZE_VALUE)
MAX_SIZE=$(LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8 parted /dev/$DISK print | grep "Disk /dev/$DISK" | awk -F ":" '{print $2}' | sed 's/^[[:space:]]*//')
MAX_SIZE_VALUE="${MAX_SIZE//[A-Za-z]/}"
if [ "$END_VALUE" -gt "$MAX_SIZE_VALUE" ]; then
echo "磁盘容量不够~"
exit
fi
END="${END_VALUE}GB"
else
END='100%'
fi
echo "开始对磁盘进行分区 执行命令为[parted /dev/$DISK mkpart primary xfs $START ${END}]"
parted /dev/$DISK mkpart primary xfs $START "${END}"
echo "磁盘分区成功"
PART_NUM=$(expr $PART_NUM + 1)
disk_name="/dev/${DISK}${PART_NUM}"
mkdir -p $MOUNT
if [ "$LVM" = "yes" ]; then
vg_name="vg_${DISK}${PART_NUM}"
lv_name="lv_${DISK}${PART_NUM}"
echo "开始进行LVM挂载~ [vg_name->$vg_name][lv_name->$lv_name]"
pvcreate $disk_name
vgcreate $vg_name $disk_name
lvcreate -l '100%FREE' -n $lv_name $vg_name
mkfs.xfs -f "/dev/$vg_name/$lv_name"
DISK_UUID=$(blkid -s UUID -o value "/dev/$vg_name/$lv_name")
else
echo "开始进行裸盘挂载~ [disk_name->$disk_name]"
mkfs.xfs -f $disk_name
DISK_UUID=$(blkid -s UUID -o value $disk_name)
fi
echo "UUID=$DISK_UUID $MOUNT xfs defaults 0 0" >>/etc/fstab
mount -a
echo "=== 磁盘分区挂载成功 ==="
}
main
使用说明
保存上面的脚本为 disk.sh
, 这个脚本会将磁盘自动分区并自动挂载,并根据需求自动做好LVM,也会使用UUID的形式写入/etc/fstab
中并直接执行 mount -a
将挂载生效,使用说明如下
# 在sdb中划一个50G的分区挂载到 /data下,并做LVM
bash ./disk.sh -d sdb -m /data -s 50G -l yes
# 在sdb中划一个100G的分区挂载到 /data1下,不做LVM
bash ./disk.sh -d sdb -m /data -s 100G
# 将sdb中剩余的所有空间划成一个分区挂载到 /data2下,并做LVM
bash ./disk.sh -d sdb -m /data -s ALL -l yes
# -d 代表的是磁盘驱动,可以使用 lsblk 进行查看磁盘的卷号 如: sdb
# -m 代表要挂载到哪个位置 如: /hd01
# -s 分区容量, 单位只能是 G,如果输入 ALL 就代表整块磁盘全部放这个分区中 如:200G
# -l yes 代表这玩意做 LVM,不加这个参数就不做 LVM,默认不做LVM
分区错误之后删除相关分区
lsblk # 查看分区
umount /data1 # 移除分区挂载
vi /etc/fstab # 在这里面删除相关分区挂载
# 如果有LVM的话需要执行LVM的删除
lvremove -f /dev/vg_sdd1/lv_sdd1 # 删除lvm卷
vgchange -a n vg_sdd1 # 卸载lvm卷
vgremove vg_sdd1 # 删除lvm卷
pvremove /dev/sdd1 # 删除物理卷
lsblk # 查看当前卷挂载
mkfs.xfs -f /dev/sdd # 格式化磁盘
网友评论