#!/bin/bash # ============================================================================ # 文件名: create_raid0_array.sh # 描述: 创建并配置 RAID 0 存储阵列 # 作者: Cloud Tools Project # 版本: 2.0.0 # 警告: 此操作将删除目标磁盘上的所有数据 # ============================================================================ set -euo pipefail # 获取脚本目录 readonly SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" readonly PROJECT_ROOT="$(dirname "$SCRIPT_DIR")" # 加载公共库 source "${PROJECT_ROOT}/common/logging.sh" source "${PROJECT_ROOT}/common/error_handler.sh" # 配置 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 创建程序 ============" # 检查依赖 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 "$@"