在企业级物理服务器部署中,背板直通盘阵凭借低延迟、高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.xfs
、blkid
等工具可用) - 文件系统:XFS(RHEL8系列默认推荐,支持大文件、日志式存储,适配企业级数据场景)
- 依赖工具:
util-linux
(提供blkid
)、xfsprogs
(提供mkfs.xfs
),默认已预装,缺失可通过yum install util-linux xfsprogs
安装
1.3 核心需求
- 跳过分区步骤,直接使用裸盘(减少性能损耗,简化管理);
- 每块裸盘对应独立挂载点(
/data01
至/data10
),便于业务分区使用; - 通过UUID配置
/etc/fstab
,避免设备名漂移导致挂载失败; - 全程静默执行,适配自动化部署场景。
二、关键技术原理
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 脚本执行与权限配置
脚本权限设置:
由于涉及磁盘格式化、/etc/fstab
修改等操作,需以root
用户执行,先赋予脚本可执行权限:chmod +x bare_disk_mount.sh
静默执行脚本:
执行过程中会输出设备处理日志,无需人工交互,适合后台运行:./bare_disk_mount.sh > disk_mount_log.txt 2>&1
日志文件
disk_mount_log.txt
可用于后续问题排查。
3.3 关键操作验证
脚本执行完成后,需通过以下命令验证挂载结果,确保符合预期:
验证挂载状态:
查看/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)
验证
/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
验证磁盘空间:
查看每块磁盘的容量与使用情况,确保无异常:df -Th | grep "/data"
验证开机自动挂载:
重启服务器后,再次执行mount | grep "/data"
,确认所有挂载点均自动生效,避免/etc/fstab
配置错误导致的开机挂载失败。
四、常见问题与排查方案
4.1 磁盘格式化失败(mkfs.xfs
报错)
- 可能原因:磁盘处于挂载状态、磁盘硬件故障、权限不足。
- 排查步骤:
- 执行
mount | grep /dev/sdc
(替换目标磁盘),确认磁盘未挂载; - 执行
lsblk /dev/sdc
,查看磁盘是否被识别,排除硬件链路问题; - 确保以
root
用户执行脚本,避免权限不足。
- 执行
4.2 UUID获取失败(blkid
无输出)
- 可能原因:磁盘未格式化、
blkid
工具缺失、磁盘损坏。 - 排查步骤:
- 执行
mkfs.xfs -f /dev/sdc
手动格式化磁盘,再重试blkid
; - 执行
yum install util-linux
重新安装blkid
工具; - 执行
smartctl -a /dev/sdc
检查磁盘健康状态,排除硬件故障。
- 执行
4.3 开机挂载失败(/data
目录为空)
- 可能原因:
/etc/fstab
条目错误、UUID不匹配、文件系统损坏。 - 排查步骤:
- 执行
mount -a
测试/etc/fstab
配置,查看具体错误信息; - 执行
blkid /dev/sdc
获取当前UUID,与/etc/fstab
中的UUID对比,确认一致; - 执行
xfs_repair /dev/sdc
修复XFS文件系统(需先卸载磁盘)。
- 执行
五、注意事项与最佳实践
数据备份优先:
裸盘格式化会清除所有数据,执行脚本前必须确认目标磁盘无重要数据,或已完成备份。磁盘命名一致性:
若服务器重启后磁盘设备名发生漂移(如/dev/sdc
变为/dev/sdd
),无需担心——因挂载基于UUID,不影响实际使用,但建议通过udev
规则固定设备名(如/dev/disk/by-id/
),便于运维识别。性能优化配置:
脚本中fstab
使用defaults,noatime
参数,noatime
可禁用文件访问时间记录,减少磁盘IO;若为NVMe盘,可追加discard
参数启用TRIM,提升长期使用性能:UUID="xxx" /data01 xfs defaults,noatime,discard 0 0
批量运维建议:
若需管理超过10块裸盘,可通过循环动态生成devices
和mount_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性能进行实时监控,及时发现并处理存储异常,保障业务稳定运行。