#!/bin/bash # ============================================================================ # 文件名: repartition_disks.sh # 描述: 删除所有现有分区并创建新的 GPT 分区表(除了系统盘) # 作者: 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" # 检查 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 "============ 磁盘重新分区程序 ============" # 检查依赖 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 "$@"