【生产实践】RHEL8.6物理服务器背板直通盘阵多块裸盘挂载实践(附完整Shell脚本)

发布于:2025-08-29 ⋅ 阅读:(17) ⋅ 点赞:(0)

在企业级物理服务器部署中,背板直通盘阵凭借低延迟、高IOPS的优势,广泛用于数据库、大数据等高性能存储场景。本文以RHEL8.6系统为例,详细介绍如何将盘阵中的多块裸盘(无分区)直接格式化为XFS文件系统,并通过UUID配置永久挂载,确保数据存储的稳定性与可靠性。

一、环境与前提说明

1.1 硬件环境

  • 物理服务器:支持PCIe背板直通的机架式服务器(如Dell R750、HPE DL380 Gen10)
  • 存储盘阵:通过SAS/SATA/PCIe总线直通服务器的JBOD盘阵,本次涉及10块裸盘(/dev/sdc/dev/sdl
  • 磁盘规格:每块磁盘容量根据业务需求选择(如1TB SAS、4TB NVMe),建议统一规格便于管理

1.2 软件环境

  • 操作系统:RHEL8.6(需提前配置基础网络、yum源,确保mkfs.xfsblkid等工具可用)
  • 文件系统:XFS(RHEL8系列默认推荐,支持大文件、日志式存储,适配企业级数据场景)
  • 依赖工具util-linux(提供blkid)、xfsprogs(提供mkfs.xfs),默认已预装,缺失可通过yum install util-linux xfsprogs安装

1.3 核心需求

  1. 跳过分区步骤,直接使用裸盘(减少性能损耗,简化管理);
  2. 每块裸盘对应独立挂载点(/data01/data10),便于业务分区使用;
  3. 通过UUID配置/etc/fstab,避免设备名漂移导致挂载失败;
  4. 全程静默执行,适配自动化部署场景。

二、关键技术原理

2.1 裸盘直接格式化的优势

传统存储部署中,会先对磁盘分区(如fdisk/parted创建/dev/sdc1),再格式化文件系统。而裸盘直接格式化(mkfs.xfs /dev/sdc)具有以下优势:

  • 性能更优:减少分区表对IO的额外开销,尤其对NVMe盘的高并发场景提升明显;
  • 管理简化:避免分区表损坏导致的磁盘不可用,降低运维复杂度;
  • 空间利用率高:无分区预留空间,磁盘容量100%用于数据存储。

2.2 UUID挂载的必要性

RHEL系统中,磁盘设备名(如/dev/sdc)可能因服务器重启、盘阵链路切换发生"漂移"(如原/dev/sdc变为/dev/sdd),导致基于设备名的挂载失效。而UUID(通用唯一识别码) 是磁盘格式化时生成的唯一标识,不受设备名变化影响,通过UUID配置/etc/fstab可确保开机自动挂载稳定可靠。

三、详细操作步骤

3.1 编写自动化挂载脚本

为实现批量、标准化部署,编写Shell脚本bare_disk_mount.sh,包含设备检查、挂载点创建、格式化、UUID配置等全流程逻辑。

#!/bin/bash
# Bare disk mount for RHEL8.6 backplane direct-attached array
# Target disks: /dev/sdc to /dev/sdl
# Mount points: /data01 to /data10

# Step 1: Define disk and mount point lists
devices=("sdc" "sdd" "sde" "sdf" "sdg" "sdh" "sdi" "sdj" "sdk" "sdl")
mount_points=("/data01" "/data02" "/data03" "/data04" "/data05" 
              "/data06" "/data07" "/data08" "/data09" "/data10")

# Step 2: Check if all disks exist
for dev in "${devices[@]}"; do
    if [ ! -b "/dev/$dev" ]; then
        echo "Error: Disk /dev/$dev not exist" >&2
        exit 1
    fi
done

# Step 3: Create mount points (if not exist)
for mp in "${mount_points[@]}"; do
    if [ -d "$mp" ]; then
        echo "Warning: $mp already exists"
    else
        mkdir -p "$mp" || { echo "Error: Create $mp failed" >&2; exit 1; }
        echo "Created mount point: $mp"
    fi
done

# Step 4: Process each disk (format, UUID, mount)
for i in "${!devices[@]}"; do
    dev="/dev/${devices[$i]}"
    mp="${mount_points[$i]}"
    echo "Processing $dev -> $mp..."

    # Unmount if disk is mounted
    if mount | grep -q "^$dev "; then
        echo "Unmounting $dev first..."
        umount "$dev" || { echo "Error: Unmount $dev failed, skip" >&2; continue; }
    fi

    # Format disk to XFS (silent mode)
    echo "Formatting $dev to XFS..."
    mkfs.xfs -f "$dev" >/dev/null 2>&1 || { echo "Error: Format $dev failed, skip" >&2; continue; }

    # Get disk UUID
    uuid=$(blkid -s UUID -o value "$dev")
    if [ $? -ne 0 ] || [ -z "$uuid" ]; then
        echo "Error: Get $dev UUID failed, skip" >&2; continue;
    fi
    echo "$dev UUID: $uuid"

    # Remove old fstab entry (if exist)
    if grep -q "$mp" /etc/fstab; then
        sed -i "\#$mp#d" /etc/fstab || { echo "Error: Clean $mp fstab failed, skip" >&2; continue; }
    fi

    # Add UUID to fstab
    echo "UUID=\"$uuid\"  $mp  xfs  defaults,noatime  0 0" >> /etc/fstab || {
        echo "Error: Write $mp to fstab failed, skip" >&2; continue;
    }

    # Mount disk
    mount "$mp" || { echo "Error: Mount $mp failed, skip" >&2; continue; }
    echo "$dev processed successfully"
    echo "----------------------------------------"
done

# Step 5: Verify mount result
echo "All disks processed!"
echo "Mounted disks list:"
mount | grep "^/dev/sd[c-l] "
echo "Disk usage:"
df -Th | grep "/data"

3.2 脚本执行与权限配置

  1. 脚本权限设置
    由于涉及磁盘格式化、/etc/fstab修改等操作,需以root用户执行,先赋予脚本可执行权限:

    chmod +x bare_disk_mount.sh
    
  2. 静默执行脚本
    执行过程中会输出设备处理日志,无需人工交互,适合后台运行:

    ./bare_disk_mount.sh > disk_mount_log.txt 2>&1
    

    日志文件disk_mount_log.txt可用于后续问题排查。

3.3 关键操作验证

脚本执行完成后,需通过以下命令验证挂载结果,确保符合预期:

  1. 验证挂载状态
    查看/data01/data10是否成功挂载,设备名与挂载点对应正确:

    mount | grep "/data"
    

    预期输出示例:

    /dev/sdc on /data01 type xfs (rw,noatime,attr2,inode64,logbufs=8,logbsize=32k,noquota)
    /dev/sdd on /data02 type xfs (rw,noatime,attr2,inode64,logbufs=8,logbsize=32k,noquota)
    
  2. 验证/etc/fstab配置
    确认UUID与挂载点的对应关系已正确写入,无重复或错误条目:

    cat /etc/fstab | grep "/data"
    

    预期输出示例:

    UUID="d823fd85-359e-4947-96fa-b055c9169db8"  /data01  xfs  defaults,noatime  0 0
    UUID="e734ac92-8f1d-4a3b-9c7e-c123456789ab"  /data02  xfs  defaults,noatime  0 0
    
  3. 验证磁盘空间
    查看每块磁盘的容量与使用情况,确保无异常:

    df -Th | grep "/data"
    
  4. 验证开机自动挂载
    重启服务器后,再次执行mount | grep "/data",确认所有挂载点均自动生效,避免/etc/fstab配置错误导致的开机挂载失败。

四、常见问题与排查方案

4.1 磁盘格式化失败(mkfs.xfs报错)

  • 可能原因:磁盘处于挂载状态、磁盘硬件故障、权限不足。
  • 排查步骤
    1. 执行mount | grep /dev/sdc(替换目标磁盘),确认磁盘未挂载;
    2. 执行lsblk /dev/sdc,查看磁盘是否被识别,排除硬件链路问题;
    3. 确保以root用户执行脚本,避免权限不足。

4.2 UUID获取失败(blkid无输出)

  • 可能原因:磁盘未格式化、blkid工具缺失、磁盘损坏。
  • 排查步骤
    1. 执行mkfs.xfs -f /dev/sdc手动格式化磁盘,再重试blkid
    2. 执行yum install util-linux重新安装blkid工具;
    3. 执行smartctl -a /dev/sdc检查磁盘健康状态,排除硬件故障。

4.3 开机挂载失败(/data目录为空)

  • 可能原因/etc/fstab条目错误、UUID不匹配、文件系统损坏。
  • 排查步骤
    1. 执行mount -a测试/etc/fstab配置,查看具体错误信息;
    2. 执行blkid /dev/sdc获取当前UUID,与/etc/fstab中的UUID对比,确认一致;
    3. 执行xfs_repair /dev/sdc修复XFS文件系统(需先卸载磁盘)。

五、注意事项与最佳实践

  1. 数据备份优先
    裸盘格式化会清除所有数据,执行脚本前必须确认目标磁盘无重要数据,或已完成备份。

  2. 磁盘命名一致性
    若服务器重启后磁盘设备名发生漂移(如/dev/sdc变为/dev/sdd),无需担心——因挂载基于UUID,不影响实际使用,但建议通过udev规则固定设备名(如/dev/disk/by-id/),便于运维识别。

  3. 性能优化配置
    脚本中fstab使用defaults,noatime参数,noatime可禁用文件访问时间记录,减少磁盘IO;若为NVMe盘,可追加discard参数启用TRIM,提升长期使用性能:

    UUID="xxx"  /data01  xfs  defaults,noatime,discard  0 0
    
  4. 批量运维建议
    若需管理超过10块裸盘,可通过循环动态生成devicesmount_points数组,避免手动编写冗余代码,示例:

    # 动态生成100块磁盘(sdc至sdch)和挂载点(/data01至/data100)
    for i in {0..99}; do
        devices[$i]=$(printf "sd%c" $((99 + $i)))  # 99对应'c',依次递增
        mount_points[$i]="/data$(printf "%02d" $((i + 1)))"
    done
    

六、总结

本文通过自动化脚本实现了RHEL8.6物理服务器背板直通盘阵多块裸盘的快速挂载,核心优势在于:跳过分区步骤简化管理、基于UUID确保挂载稳定、全程静默执行适配自动化场景。该方案适用于企业级数据库、大数据存储等高性能需求场景,同时提供了完整的验证与排查方法,可有效降低运维成本,提升存储部署效率。

在实际生产环境中,建议结合监控工具(如Prometheus+Grafana)对挂载点的磁盘使用率、IO性能进行实时监控,及时发现并处理存储异常,保障业务稳定运行。


网站公告

今日签到

点亮在社区的每一天
去签到