请求编写读取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所有挂载操作执行完毕"
使用说明
- 依赖安装:脚本需要
jq工具解析JSON,若未安装请先执行对应发行版的安装命令(如Debian/Ubuntu:sudo apt install jq,RHEL/CentOS:sudo dnf install jq)。 - 运行方式:必须以root权限运行,执行
sudo bash mount_all.sh(假设脚本保存为mount_all.sh)。 - 关键特性:
- 自动跳过已挂载的设备,避免重复挂载操作。
- 支持常见文件系统(ext2/3/4、XFS、Btrfs等),
mount命令会自动识别文件系统类型。 - 未格式化或无法识别的设备会触发警告,但不影响其他设备的挂载流程。
- 目录层级严格按照你的要求创建:磁盘→分区→LVM卷。
内容的提问来源于stack exchange,提问作者madredhatter
相关产品推荐
相关产品推荐

