美文网首页
Linux磁盘挂载与分区工具

Linux磁盘挂载与分区工具

作者: 野生DBNull | 来源:发表于2024-01-24 16:56 被阅读0次

前言

生产与测试中经常遇到需要挂载磁盘与对磁盘进行分区的需求,对于老手来来说也就是几句指令就搞定了的事情,但是对于新手来说,百度来的东西总不是那么的靠谱,而且每次手动一个磁盘一个磁盘的挂载与分区也是很麻烦的事情,指令也容易敲错很麻烦(我个人是这样觉得)。我就写了如下的支持脚本,用来制作分区,与自动挂载。

脚本

#!/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 # 格式化磁盘

相关文章

  • linux 挂载磁盘与分区lvm逻辑卷

    linux磁盘分区与挂载 1.1查看分区挂载情况,命令: 1.2创建新的磁盘分区 1.3保存分区表 1.4查看创建...

  • Linux挂载磁盘空间

    Linux挂载磁盘空间 (1)查看磁盘空间 (2)查看硬盘及分区信息 (3)格式化新分区 (4)将磁盘挂载在/po...

  • Linux中初始化一个新磁盘

    Linux中挂载一个新磁盘后,创建分区并自动挂载的方法: 在线扩容一个已有磁盘

  • 硬盘自动挂载的配置

    查看Linux硬盘信息 格式化硬盘 创建目录 挂载分区 查看磁盘分区的UUID 配置开机自动挂载: mount命令...

  • Centos7 格式化分区并挂载

    Linux 经常可以遇到添加硬盘或者重新挂载分区等情况,本文简单记录挂载新分区的情况。由于磁盘分区之前已经处理过,...

  • linux挂载磁盘

    **** Virtualbox中Linux添加一个新磁盘->创建分区->格式化->挂载分区 2013-04-14 ...

  • 磁盘挂载

    一、查看磁盘挂载情况 二、查看所有磁盘 三、创建磁盘分区 四、格式化分区磁盘 五、挂载 六、卸载 七、查看挂载权限

  • 磁盘管理

    磁盘管理 一、磁盘分区工具和挂载 硬盘分区符认识 MBR概述:全称为Master Boot Record,即硬盘的...

  • 磁盘管理

    磁盘管理 一、磁盘分区工具和挂载 硬盘分区符认识 MBR概述:全称为Master Boot Record,即硬盘的...

  • 20170804 磁盘管理

    目录磁盘结构磁盘分区磁盘分区管理文件系统管理挂载 一、磁盘结构 (一)设备文件 设备文件:linux系统下一切皆文...

网友评论

      本文标题:Linux磁盘挂载与分区工具

      本文链接:https://www.haomeiwen.com/subject/vfrmodtx.html