Files
CmiiDeploy/84-202605-北京三河测试/b-高级磁盘-多物理盘.sh
2026-05-19 14:28:44 +08:00

132 lines
3.8 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
set -euo pipefail
#----------------------------------------------------------
# 用户配置部分
#----------------------------------------------------------
DISKS=("/dev/sda" "/dev/sdb" "/dev/sdc" "/dev/sdd") # 4块物理磁盘
MOUNT_PATH="/data" # 挂载点路径(目录会自动创建)
FS_TYPE="ext4" # 文件系统类型(支持 ext4/xfs默认 ext4
VG_NAME="bigdatavg" # 卷组名
LV_NAME="biglvdata" # 逻辑卷名
#----------------------------------------------------------
# 核心逻辑(建议非必要不修改)
#----------------------------------------------------------
function check_prerequisites() {
# 必须 root 权限运行检查
[[ $EUID -ne 0 ]] && echo -e "\033[31m错误必须使用 root 权限运行此脚本\033[0m" && exit 1
# 文件系统类型校验
if [[ "$FS_TYPE" != "ext4" && "$FS_TYPE" != "xfs" ]]; then
echo -e "\033[31m错误不支持的磁盘格式 $FS_TYPE,仅支持 ext4/xfs\033[0m"
exit 1
fi
# 磁盘存在性检查
for disk in "${DISKS[@]}"; do
[[ ! -b "$disk" ]] && echo -e "\033[31m错误磁盘 $disk 不存在\033[0m" && exit 1
done
# 检查 VG / LV 是否已存在,避免误操作
if vgdisplay "$VG_NAME" >/dev/null 2>&1; then
echo -e "\033[31m错误卷组 $VG_NAME 已存在,请先检查环境\033[0m"
exit 1
fi
if lvdisplay "/dev/${VG_NAME}/${LV_NAME}" >/dev/null 2>&1; then
echo -e "\033[31m错误逻辑卷 /dev/${VG_NAME}/${LV_NAME} 已存在,请先检查环境\033[0m"
exit 1
fi
}
function prepare_disks() {
PARTITIONS=()
echo -e "\033[34m正在初始化磁盘分区...\033[0m"
for disk in "${DISKS[@]}"; do
echo -e "\033[34m处理磁盘: $disk\033[0m"
parted "$disk" --script mklabel gpt
parted "$disk" --script mkpart primary 0% 100%
parted "$disk" --script set 1 lvm on
partprobe "$disk"
# 兼容 nvme 和普通 sd/vd 设备命名
if [[ "$disk" =~ nvme ]]; then
partition="${disk}p1"
else
partition="${disk}1"
fi
# 等待分区节点出现
udevadm settle
sleep 1
[[ ! -b "$partition" ]] && echo -e "\033[31m错误分区 $partition 未识别成功\033[0m" && exit 1
PARTITIONS+=("$partition")
done
}
function create_lvm() {
echo -e "\033[34m正在创建 LVM 结构...\033[0m"
pvcreate "${PARTITIONS[@]}"
vgcreate "$VG_NAME" "${PARTITIONS[@]}"
lvcreate -y -l 100%FREE -n "$LV_NAME" "$VG_NAME"
}
function format_and_mount() {
local lv_path="/dev/${VG_NAME}/${LV_NAME}"
echo -e "\033[34m格式化逻辑卷...\033[0m"
if [[ "$FS_TYPE" == "ext4" ]]; then
mkfs.ext4 -F "$lv_path"
else
mkfs.xfs -f "$lv_path"
fi
echo -e "\033[34m设置挂载配置...\033[0m"
mkdir -p "$MOUNT_PATH"
UUID=$(blkid -s UUID -o value "$lv_path")
[[ -z "$UUID" ]] && echo -e "\033[31m错误未获取到逻辑卷 UUID\033[0m" && exit 1
# 避免重复写入 fstab
if ! grep -q "$UUID" /etc/fstab; then
echo "UUID=$UUID $MOUNT_PATH $FS_TYPE defaults 0 0" >> /etc/fstab
else
echo -e "\033[33m提示/etc/fstab 中已存在该 UUID跳过写入\033[0m"
fi
mount -a
}
function verify_result() {
echo -e "\n\033[1;36m最终验证结果\033[0m"
echo -e "\n\033[1;36m1. 查看块设备和 LVM 结构:\033[0m"
lsblk -f
echo -e "\n\033[1;36m2. 查看挂载结果:\033[0m"
df -hT "$MOUNT_PATH"
echo -e "\n\033[1;36m3. 查看 VG/LV 信息:\033[0m"
vgs
lvs
pvs
}
#----------------------------------------------------------
# 主执行流程
#----------------------------------------------------------
check_prerequisites
prepare_disks
create_lvm
format_and_mount
verify_result
echo -e "\n\033[32m操作执行完毕请仔细核查上述输出信息\033[0m"