#!/bin/bash
set -e

# =========================================================
# 用户配置部分
# =========================================================
DISK="/dev/nvme0n1"           # 要操作的物理磁盘（例如 /dev/sdb 或 /dev/nvme0n1）
MOUNT_PATH="/var/lib/docker"  # 挂载点路径（目录会自动创建）
FS_TYPE="ext4"                # 文件系统类型（支持ext4/xfs，默认ext4）

# =========================================================
# 核心逻辑（建议非必要不修改）
# =========================================================

function check_prerequisites() {
  # 必须root权限运行检查
  [[ $EUID -ne 0 ]] && echo -e "\033[31m错误：必须使用root权限运行此脚本\033[0m" && exit 1

  # 磁盘存在性检查
  [[ ! -b "$DISK" ]] && echo -e "\033[31m错误：磁盘 $DISK 不存在\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
}

function prepare_disk() {
  local partition

  # 核心修复：兼容 NVMe 和传统 SCSI/SATA 磁盘的分区命名规则
  # 如果物理磁盘名称以数字结尾 (如 nvme0n1)，分区名加 'p' (nvme0n1p1)
  # 如果以字母结尾 (如 sdb)，分区名直接加数字 (sdb1)
  if [[ "$DISK" =~ [0-9]$ ]]; then
    partition="${DISK}p1"
  else
    partition="${DISK}1"
  fi

  echo -e "\033[34m正在初始化磁盘分区...\033[0m"
  parted "$DISK" --script mklabel gpt
  parted "$DISK" --script mkpart primary 0% 100%
  parted "$DISK" --script set 1 lvm on

  # 通知系统内核重新读取分区表
  partprobe "$DISK"
  # 增加极短暂延时，确保NVMe设备分区节点已在 /dev/ 下成功生成
  sleep 2

  echo -e "\033[34m正在创建LVM结构 ($partition)...\033[0m"
  pvcreate "$partition"
  vgcreate datavg "$partition"
  lvcreate -y -l 100%FREE -n lvdata datavg
}

function format_and_mount() {
  echo -e "\033[34m格式化逻辑卷...\033[0m"
  if [[ "$FS_TYPE" == "ext4" ]]; then
    mkfs.ext4 -F "/dev/datavg/lvdata"
  else
    mkfs.xfs -f "/dev/datavg/lvdata"
  fi

  echo -e "\033[34m设置挂载配置...\033[0m"
  mkdir -p "$MOUNT_PATH"
  UUID=$(blkid -s UUID -o value "/dev/datavg/lvdata")

  # 备份 fstab 防呆，方便回滚
  cp /etc/fstab /etc/fstab.bak_$(date +%Y%m%d%H%M%S)
  echo "UUID=$UUID $MOUNT_PATH $FS_TYPE defaults 0 0" | tee -a /etc/fstab >/dev/null
  mount -a
}

function verify_result() {
  echo -e "\n\033[1;36m最终验证结果：\033[0m"
  lsblk -f "$DISK"
  echo -e "\n磁盘空间使用情况："
  df -TH "$MOUNT_PATH"
}

# =========================================================
# 主执行流程
# =========================================================
check_prerequisites
prepare_disk
format_and_mount
verify_result

echo -e "\n\033[32m操作执行完毕，请仔细核查上述输出信息\033[0m"