磁盘挂载LVM,适用centos和ubuntu

38 阅读2分钟

执行前用lsblk命令找到挂载的磁盘并记录,接下来就交给下面的脚本

#!/bin/bash
set -euo pipefail  # 严格模式,出错立即退出

# ==================== 1. 权限校验 & 系统兼容 ====================
if [ "$(id -u)" -ne 0 ]; then
    echo "[ERROR] 错误:必须用root权限运行(sudo ./lvm-mount.sh)"
    exit 1
fi

# 自动判断包管理器(apt/yum/dnf),取消静默输出,显示进度
install_package() {
    local pkg=$1
    echo -n "  → 安装 $pkg..."
    if command -v apt &> /dev/null; then
        # Ubuntu:更新缓存(显示进度),自动确认安装(-y),允许非交互式
        DEBIAN_FRONTEND=noninteractive apt update -y || { echo "[ERROR] apt更新失败!"; exit 1; }
        DEBIAN_FRONTEND=noninteractive apt install -y "$pkg" || { echo "[ERROR] 安装 $pkg 失败!"; exit 1; }
    elif command -v dnf &> /dev/null; then
        dnf install -y "$pkg" &> /dev/null
    elif command -v yum &> /dev/null; then
        yum install -y "$pkg" &> /dev/null
    else
        echo "[ERROR] 不支持的系统(仅兼容Ubuntu/CentOS/Rocky/Alma)"
        exit 1
    fi
    echo "[OK]"
}

# ==================== 2. 用户输入 & 基础校验(提前输入,避免安装时卡住) ====================
echo "======================================="
echo "      Linux LVM通用挂载脚本(无分区)"
echo "  逻辑:磁盘 → 物理卷(PV) → 卷组(VG) → 逻辑卷(LV)"
echo "  支持文件系统:ext4(默认)/xfs(推荐大容量)"
echo "======================================="

# 1. 输入磁盘设备(如 /dev/sdb、/dev/nvme1n1)
read -p "[INPUT] 请输入要创建LVM的磁盘设备(例:/dev/sdb):" DISK
if [ ! -b "$DISK" ]; then
    echo "[ERROR] 错误:磁盘 $DISK 不存在!可用磁盘如下:"
    lsblk | grep -E '^sd|^nvme' | awk '{print "  " $1 " -> " $7}'
    exit 1
fi

# 校验磁盘是否已被使用
if lsblk "$DISK" | grep -qE 'part|lvm'; then
    read -p "[WARN] 警告:磁盘 $DISK 已存在分区/LVM标识,继续会清空所有数据!是否继续(y/N):" CONFIRM
    [ "$CONFIRM" != "y" ] && [ "$CONFIRM" != "Y" ] && exit 0
fi

# 2. 输入卷组(VG)名称(默认 vg_data)
read -p "[INPUT] 请输入卷组(VG)名称(默认 vg_data):" VG_NAME
VG_NAME=${VG_NAME:-vg_data}
if vgdisplay "$VG_NAME" &> /dev/null; then
    echo "[ERROR] 错误:卷组 $VG_NAME 已存在!请更换名称(如 vg_storage)"
    exit 1
fi

# 3. 输入逻辑卷(LV)名称(默认 lv_data)
read -p "[INPUT] 请输入逻辑卷(LV)名称(默认 lv_data):" LV_NAME
LV_NAME=${LV_NAME:-lv_data}

# 4. 输入逻辑卷大小(默认100%FREE)
read -p "[INPUT] 请输入逻辑卷大小(默认100%FREE,例:200G/50%):" LV_SIZE
LV_SIZE=${LV_SIZE:-100%FREE}

# 5. 输入挂载点(如 /data)
read -p "[INPUT] 请输入挂载点目录(例:/data):" MOUNT_POINT
if [ -d "$MOUNT_POINT" ] && [ "$(ls -A "$MOUNT_POINT")" ]; then
    echo "[ERROR] 错误:挂载点 $MOUNT_POINT 已存在且非空!"
    exit 1
fi

# 6. 输入文件系统类型
read -p "[INPUT] 请输入文件系统类型(ext4/xfs,默认ext4):" FS_TYPE
FS_TYPE=${FS_TYPE:-ext4}
case $FS_TYPE in
    ext4|xfs) ;;
    *) echo "[ERROR] 错误:LVM仅支持ext4/xfs文件系统!"; exit 1 ;;
esac

# ==================== 3. 依赖安装(显示进度,解决Ubuntu卡住) ====================
echo -e "\n[TOOL] 开始安装依赖工具(Ubuntu会显示更新和安装进度):"
install_package "lvm2"  # LVM核心工具(Ubuntu必装,CentOS默认有)
case $FS_TYPE in
    ext4) install_package "e2fsprogs" ;;
    xfs) install_package "xfsprogs" ;;
esac

# ==================== 4. LVM核心操作(和之前一致,保持稳定) ====================
echo -e "\n[PV] 正在创建物理卷(PV):$DISK..."
pvcreate --force --yes "$DISK" &> /dev/null
echo "[OK]"

echo -n "[VG] 正在创建卷组(VG):$VG_NAME..."
vgcreate "$VG_NAME" "$DISK" &> /dev/null
echo "[OK]"

echo -n "[LV] 正在创建逻辑卷(LV):$LV_NAME(大小:$LV_SIZE)..."
lvcreate -n "$LV_NAME" -l "$LV_SIZE" "$VG_NAME" &> /dev/null
echo "[OK]"

LV_DEVICE="/dev/$VG_NAME/$LV_NAME"
if [ ! -b "$LV_DEVICE" ]; then
    echo "[ERROR] 错误:逻辑卷 $LV_DEVICE 创建失败!"
    vgremove -f "$VG_NAME" &> /dev/null
    pvremove -f "$DISK" &> /dev/null
    exit 1
fi

# ==================== 5. 格式化 & 挂载 & 开机自动挂载 ====================
echo -n "[FORMAT] 正在格式化 $LV_DEVICE 为 $FS_TYPE 文件系统..."
case $FS_TYPE in
    ext4) mkfs.ext4 -F "$LV_DEVICE" &> /dev/null ;;
    xfs) mkfs.xfs -f "$LV_DEVICE" &> /dev/null ;;
esac
echo "[OK]"

echo -n "[MOUNT] 正在创建挂载点并临时挂载..."
mkdir -p "$MOUNT_POINT"
mount "$LV_DEVICE" "$MOUNT_POINT"
echo "[OK]"

echo -n "[FSTAB] 写入/etc/fstab,配置开机自动挂载..."
LV_UUID=$(blkid -s UUID -o value "$LV_DEVICE")
if [ -z "$LV_UUID" ]; then
    echo "[ERROR] 错误:无法获取逻辑卷UUID!"
    umount "$MOUNT_POINT"
    lvremove -f "$LV_DEVICE"
    vgremove -f "$VG_NAME"
    pvremove -f "$DISK"
    exit 1
fi

FSTAB_LINE="UUID=$LV_UUID  $MOUNT_POINT  $FS_TYPE  defaults,noatime  0  2"
if ! grep -q "$LV_UUID" /etc/fstab; then
    echo "$FSTAB_LINE" >> /etc/fstab
else
    echo "[WARN] 警告:/etc/fstab已存在该UUID配置,跳过写入"
fi
echo "[OK]"

# ==================== 6. 验证配置 ====================
echo -n "[CHECK] 正在验证LVM挂载配置..."
mount -a &> /dev/null
df -h | grep "$MOUNT_POINT" &> /dev/null
lvdisplay "$LV_DEVICE" &> /dev/null
echo "全部完成!"

# 输出结果
echo -e "\n======================================="
echo "====== LVM挂载结果汇总 ======"
echo "  物理卷(PV):$DISK"
echo "  卷组(VG):$VG_NAME"
echo "  逻辑卷(LV):$LV_DEVICE"
echo "  挂载点:$MOUNT_POINT"
echo "  文件系统:$FS_TYPE"
echo "  开机自动挂载:已配置(/etc/fstab)"
echo -e "\n====== LVM常用管理命令 ======"
echo "  1. 查看VG剩余空间:vgs 或 vgdisplay $VG_NAME"
echo "  2. 扩容LV(例:新增50G):lvextend -L +50G $LV_DEVICE"
echo "  3. 扩容文件系统(ext4):resize2fs $LV_DEVICE"
echo "  4. 扩容文件系统(xfs):xfs_growfs $MOUNT_POINT"
echo "======================================="
chmod +x disk-mount.sh
./disk-mount.sh