You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求编写读取lsblk并自动挂载磁盘分区与LVM的BASH脚本

自动挂载磁盘分区与LVM的Bash脚本

以下脚本可实现你需要的功能:读取lsblk输出,按层级在/mnt下创建目录,并自动挂载所有未挂载的磁盘分区和可识别LVM卷,目录结构完全符合你的要求。

脚本代码

#!/bin/bash

# 检查jq工具是否安装(用于解析JSON格式的lsblk输出)
if ! command -v jq &> /dev/null; then
    echo "错误:缺少jq工具,请先安装(例如:sudo apt install jq)"
    exit 1
fi

# 获取块设备的结构化JSON数据,包含名称、类型、挂载点、路径、父设备名
LSBLK_DATA=$(lsblk -J -o NAME,TYPE,MOUNTPOINT,PATH,PKNAME)

# 第一步:创建磁盘对应的基础目录(如/mnt/sda)
echo "初始化磁盘基础目录..."
echo "$LSBLK_DATA" | jq -r '.blockdevices[] | select(.type == "disk") | .name' | while read -r DISK_NAME; do
    MNT_DIR="/mnt/$DISK_NAME"
    if [ ! -d "$MNT_DIR" ]; then
        sudo mkdir -p "$MNT_DIR"
        sudo chmod 755 "$MNT_DIR"
        echo "已创建目录: $MNT_DIR"
    fi
done

# 第二步:挂载磁盘分区到对应目录(如/mnt/sda/sda1)
echo -e "\n开始挂载磁盘分区..."
echo "$LSBLK_DATA" | jq -r '.blockdevices[] | select(.type == "disk") | .children[]? | select(.type == "part") | "\(.name) \(.pkname) \(.path) \(.mountpoint)"' | while read -r PART_NAME DISK_NAME PART_PATH CURRENT_MP; do
    MNT_DIR="/mnt/$DISK_NAME/$PART_NAME"
    # 跳过已挂载的分区
    if [ -z "$CURRENT_MP" ]; then
        sudo mkdir -p "$MNT_DIR"
        if sudo mount "$PART_PATH" "$MNT_DIR"; then
            echo "成功挂载: $PART_PATH -> $MNT_DIR"
        else
            echo "警告:无法挂载分区 $PART_PATH,已跳过"
        fi
    else
        echo "分区 $PART_PATH 已挂载到 $CURRENT_MP,跳过"
    fi
done

# 第三步:挂载LVM逻辑卷到所属分区的子目录(如/mnt/sda/sda1/vg1-lv_root)
echo -e "\n开始挂载LVM逻辑卷..."
echo "$LSBLK_DATA" | jq -r '.blockdevices[] | select(.type == "disk") | .children[]? | select(.type == "part") | .children[]? | select(.type == "lvm") | "\(.name) \(.pkname) \(.path) \(.mountpoint) \(.parent.pkname)"' | while read -r LV_NAME PART_NAME LV_PATH CURRENT_MP DISK_NAME; do
    MNT_DIR="/mnt/$DISK_NAME/$PART_NAME/$LV_NAME"
    # 跳过已挂载的LVM卷
    if [ -z "$CURRENT_MP" ]; then
        sudo mkdir -p "$MNT_DIR"
        if sudo mount "$LV_PATH" "$MNT_DIR"; then
            echo "成功挂载: $LV_PATH -> $MNT_DIR"
        else
            echo "警告:无法挂载LVM卷 $LV_PATH,已跳过"
        fi
    else
        echo "LVM卷 $LV_PATH 已挂载到 $CURRENT_MP,跳过"
    fi
done

echo -e "\n所有挂载操作执行完毕"

使用说明

  1. 依赖安装:脚本需要jq工具解析JSON,若未安装请先执行对应发行版的安装命令(如Debian/Ubuntu:sudo apt install jq,RHEL/CentOS:sudo dnf install jq)。
  2. 运行方式:必须以root权限运行,执行sudo bash mount_all.sh(假设脚本保存为mount_all.sh)。
  3. 关键特性:
    • 自动跳过已挂载的设备,避免重复挂载操作。
    • 支持常见文件系统(ext2/3/4、XFS、Btrfs等),mount命令会自动识别文件系统类型。
    • 未格式化或无法识别的设备会触发警告,但不影响其他设备的挂载流程。
    • 目录层级严格按照你的要求创建:磁盘→分区→LVM卷。

内容的提问来源于stack exchange,提问作者madredhatter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 19:45:31