#!/bin/bash # ============================================================================ # 文件名: create_raid0_array_remote.sh # 描述: 创建并配置 RAID 0 存储阵列(支持远程库加载) # 作者: Cloud Tools Project # 版本: 2.1.0(远程加载版) # 警告: 此操作将删除目标磁盘上的所有数据 # ============================================================================ set -euo pipefail # ============================================================================ # 远程库加载配置 # ============================================================================ # 远程仓库 URL(可通过环境变量覆盖) readonly REMOTE_BASE_URL="${REMOTE_LIB_URL:-https://gitea.bcde.io/wangdefa/tools/raw/branch/main}" # 获取脚本目录(用于本地加载) readonly SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" readonly PROJECT_ROOT="$(dirname "$SCRIPT_DIR")" # # 智能加载公共库 # # 加载策略: # 1. 如果 FORCE_REMOTE=1,强制使用远程库 # 2. 否则尝试使用本地库 # 3. 本地库不存在时自动回退到远程库 # load_common_libs() { local use_remote=false # 检查是否强制远程 if [[ "${FORCE_REMOTE:-0}" == "1" ]]; then echo "[INFO] 强制使用远程库 (FORCE_REMOTE=1)" >&2 use_remote=true # 检查本地库是否存在 elif [[ -f "${PROJECT_ROOT}/common/logging.sh" ]] && [[ -f "${PROJECT_ROOT}/common/error_handler.sh" ]]; then # shellcheck disable=SC1091 source "${PROJECT_ROOT}/common/logging.sh" # shellcheck disable=SC1091 source "${PROJECT_ROOT}/common/error_handler.sh" return 0 else echo "[WARN] 本地库不存在,使用远程库" >&2 use_remote=true fi # 使用远程库 if [[ "$use_remote" == "true" ]]; then if command -v curl &>/dev/null; then echo "[INFO] 使用 curl 下载远程库..." >&2 # shellcheck disable=SC1090 if source <(curl -fsSL "${REMOTE_BASE_URL}/common/remote_loader.sh" 2>/dev/null); then return 0 fi elif command -v wget &>/dev/null; then echo "[INFO] 使用 wget 下载远程库..." >&2 # shellcheck disable=SC1090 if source <(wget -qO- "${REMOTE_BASE_URL}/common/remote_loader.sh" 2>/dev/null); then return 0 fi fi echo "[ERROR] 无法加载公共库" >&2 echo "[ERROR] - 本地库不存在" >&2 echo "[ERROR] - 远程下载失败(需要 curl 或 wget)" >&2 echo "[ERROR] - 仓库 URL: ${REMOTE_BASE_URL}" >&2 exit 1 fi } # 加载公共库 load_common_libs # ============================================================================ # 脚本配置 # ============================================================================ # 配置 readonly MOUNT_POINT="/mnt/raid0" # 检查 root 权限 check_root # ============================================================================ # 函数定义 # ============================================================================ # # 检查并安装依赖工具 # # 参数: # $1 - 工具名称 # check_and_install() { local tool=$1 if ! command -v "$tool" &> /dev/null; then log_warning "$tool 未安装,正在尝试安装..." if command -v apt-get &> /dev/null; then run_command "安装 $tool" bash -c "apt-get update && apt-get install -y $tool" elif command -v yum &> /dev/null; then run_command "安装 $tool" yum install -y "$tool" else log_error "无法安装 $tool,请手动安装后重试" exit 1 fi fi } # # 主函数 - 创建 RAID 0 阵列 # main() { log_info "============ RAID 0 创建程序 ============" log_info "版本: 2.1.0 (支持远程库加载)" # 检查依赖 check_and_install mdadm check_and_install lsblk log_success "所有依赖已满足" # 获取系统盘 local system_disk system_disk=$(mount | grep " / " | cut -d' ' -f1 | sed 's/[0-9]*//g') log_info "检测到系统盘: ${system_disk}" # 获取可用磁盘 local disks disks=$(lsblk -dno NAME | sed -e '/^loop/d' -e '/^sr/d' -e "/^${system_disk##*/}$/d" | sed 's/^/\/dev\//') if [ -z "$disks" ]; then log_warning "没有找到除系统盘以外的硬盘" exit 0 fi # 检查磁盘数量 local disk_count disk_count=$(echo "$disks" | wc -l) if [ "$disk_count" -lt 2 ]; then log_error "至少需要两个磁盘来创建 RAID 0,只找到 $disk_count 个可用磁盘" exit 1 fi log_info "找到以下磁盘可用于 RAID 0:" echo "$disks" # 确认操作 echo read -p "是否继续创建 RAID 0? 这将删除这些磁盘上的所有数据 (y/n): " -n 1 -r echo if [[ ! $REPLY =~ ^[Yy]$ ]]; then log_warning "操作已取消" exit 1 fi # 删除现有 RAID 配置 mdadm --stop /dev/md0 2>/dev/null || true mdadm --zero-superblock $disks 2>/dev/null || true # 创建 RAID 0 阵列 log_info "正在创建 RAID 0 阵列..." run_command "创建 RAID" mdadm --create /dev/md0 --level=0 --raid-devices="$disk_count" $disks # 检查状态 if mdadm --detail /dev/md0 | grep -q 'State : clean'; then log_success "RAID 0 阵列创建成功" mdadm --detail /dev/md0 else log_error "RAID 0 阵列创建失败" exit 1 fi # 更新配置 log_info "正在更新 mdadm.conf..." mdadm --detail --scan >> /etc/mdadm/mdadm.conf # 创建文件系统 log_info "正在创建 ext4 文件系统..." run_command "创建文件系统" mkfs.ext4 -F /dev/md0 # 创建挂载点 mkdir -p "$MOUNT_POINT" # 获取 UUID local raid_uuid raid_uuid=$(blkid -s UUID -o value /dev/md0) # 更新 fstab log_info "正在更新 /etc/fstab..." echo "UUID=$raid_uuid $MOUNT_POINT ext4 defaults 0 0" >> /etc/fstab # 挂载 log_info "正在挂载 RAID 阵列..." if mount -a; then log_success "RAID 0 阵列已成功创建、格式化并挂载" log_success "挂载点: $MOUNT_POINT" else log_error "挂载 RAID 阵列失败" exit 1 fi log_warning "注意: 建议重启系统以确保所有配置生效" } # 执行主函数 main "$@"