Files
tools/linux/create_raid0_array.sh
Wang Defa b34e1ef872 feat: 为所有脚本添加远程库加载支持
## 功能概述

实现了智能远程库加载机制,允许脚本从远程 Gitea 仓库动态下载公共库,
同时保留本地库优先的策略,确保脚本可以独立运行而不依赖本地项目结构。

## 变更内容

### 新增文件

- **common/remote_loader.sh**: 核心远程加载器
  - 支持 curl/wget 双重下载方式
  - 临时文件自动清理机制
  - 环境变量可配置仓库 URL

- **examples/remote_example.sh**: 纯远程模式示例
  - 演示完全独立的远程加载脚本
  - 适合单文件分发场景

- **examples/hybrid_loader_template.sh**: 混合模式模板
  - 本地优先 + 远程回退策略
  - 适合仓库内脚本

- **examples/REMOTE_LOADER_README.md**: 完整使用文档
  - 三种使用模式详解
  - 故障排除指南
  - 最佳实践建议

### 更新脚本(版本 2.1.0)

所有主要脚本均升级到 2.1.0 版本,支持智能库加载:

- **linux/create_raid0_array.sh**
- **linux/repartition_disks.sh**
- **linux/install_oh_my_zsh.sh**
- **gcp/create_ai_projects.sh**
- **gcp/delete_all_projects.sh**
- **oci/create_instance.sh**
- **common/demo_usage.sh**

## 加载策略

1. 检查 FORCE_REMOTE=1 环境变量 → 强制远程
2. 检查本地库存在性 → 优先使用本地
3. 本地不存在 → 自动回退远程
4. 远程失败 → 友好错误提示

## 使用示例

### 本地模式(默认)
```bash
./linux/create_raid0_array.sh
```

### 强制远程模式
```bash
FORCE_REMOTE=1 ./linux/create_raid0_array.sh
```

### 自定义仓库 URL
```bash
REMOTE_LIB_URL=https://example.com/repo ./script.sh
```

## 技术特性

-  向后兼容:默认使用本地库,行为不变
-  离线可用:本地库存在时无需网络
-  独立分发:支持单文件脚本分发
-  错误处理:详细的错误信息和诊断建议
-  环境可配:REMOTE_LIB_URL 和 FORCE_REMOTE
-  自动清理:临时文件通过 trap 自动删除
2025-12-26 15:00:06 +08:00

209 lines
6.3 KiB
Bash
Executable File
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
# ============================================================================
# 文件名: 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 "$@"