#!/bin/bash # ============================================================================ # 文件名: repartition_disks.sh # 描述: 删除所有现有分区并创建新的 GPT 分区表(除了系统盘) # 作者: 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 # 检查 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 } # # 主函数 - 重新分区所有非系统盘 # main() { log_info "============ 磁盘重新分区程序 ============" log_info "版本: 2.1.0 (支持远程库加载)" # 检查依赖 check_and_install lsblk check_and_install parted check_and_install wipefs 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") if [ -z "$disks" ]; then log_warning "没有找到除系统盘以外的硬盘" exit 0 fi # 处理每个磁盘 for disk in $disks; do log_info "正在处理硬盘: /dev/${disk}" log_warning "删除 /dev/${disk} 上的所有分区..." run_command "清除分区签名" wipefs -a "/dev/${disk}" log_warning "在 /dev/${disk} 上创建新的 GPT 分区表..." run_command "创建分区表" parted -s "/dev/${disk}" mklabel gpt log_warning "在 /dev/${disk} 上创建新分区..." run_command "创建分区" parted -s "/dev/${disk}" mkpart primary 0% 100% log_info "刷新分区表..." run_command "刷新分区" partprobe "/dev/${disk}" log_success "完成处理 /dev/${disk}" echo done log_success "所有操作完成" } # 执行主函数 main "$@"