Created
January 5, 2026 06:08
-
-
Save superyngo/4e972039cbf789a35eec99e29b16b903 to your computer and use it in GitHub Desktop.
Reformat vetoy 1st partition and auto create another efi partiton for refind.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/bin/bash | |
| set -e | |
| # ==================================================== | |
| # 功能: | |
| # 1️⃣ 若第 1 分割區非指定 FS,重新格式化為指定格式 (預設 xfs) | |
| # 2️⃣ 若尾端有未分配空間且 >32MB,自動建立 FAT32 分區 label="refind" | |
| # 3️⃣ 自動偵測並安裝必要格式化工具 | |
| # 4️⃣ 支援 --dry-run 模式(只顯示不執行) | |
| # ==================================================== | |
| DISK="" | |
| FS_TYPE="xfs" | |
| DRYRUN=false | |
| # === 參數解析 === | |
| while [[ $# -gt 0 ]]; do | |
| case "$1" in | |
| --disk) | |
| DISK="$2"; shift 2 ;; | |
| --fs) | |
| FS_TYPE="$2"; shift 2 ;; | |
| --dry-run) | |
| DRYRUN=true; shift ;; | |
| *) | |
| echo "使用方式: $0 --disk /dev/sdX [--fs xfs|ext4|ntfs|exfat|vfat] [--dry-run]" | |
| exit 1 ;; | |
| esac | |
| done | |
| # === 基本檢查 === | |
| if [[ -z "$DISK" ]]; then | |
| echo "❌ 錯誤:必須指定 --disk 參數" | |
| exit 1 | |
| fi | |
| if [[ ! -b "$DISK" ]]; then | |
| echo "❌ 找不到磁碟 $DISK" | |
| exit 1 | |
| fi | |
| echo "== 目標磁碟: $DISK ==" | |
| echo "== 指定檔案系統: $FS_TYPE ==" | |
| $DRYRUN && echo "== 模式: dry-run (不執行任何修改) ==" | |
| # === 自動偵測套件管理器 === | |
| install_pkg() { | |
| local pkg="$1" | |
| if ! command -v "$2" &>/dev/null; then | |
| if command -v apk &>/dev/null; then | |
| apk add --no-cache "$pkg" >/dev/null 2>&1 || true | |
| elif command -v apt &>/dev/null; then | |
| apt install -y "$pkg" >/dev/null 2>&1 || true | |
| fi | |
| fi | |
| } | |
| # === 1️⃣ 處理第 1 分割區 === | |
| P1="${DISK}p1" | |
| if [[ -b "$P1" ]]; then | |
| CURR_FS=$(blkid -o value -s TYPE "$P1" 2>/dev/null || true) | |
| if [[ "$CURR_FS" != "$FS_TYPE" ]]; then | |
| echo "" | |
| echo "== 第 1 分割區目前為 ${CURR_FS:-未知},將重新格式化為 $FS_TYPE (Label=Ventoy) ==" | |
| if ! $DRYRUN; then | |
| umount "$P1" 2>/dev/null || true | |
| case "$FS_TYPE" in | |
| xfs) | |
| install_pkg xfsprogs mkfs.xfs | |
| mkfs.xfs -f -L Ventoy "$P1" | |
| ;; | |
| ext4) | |
| install_pkg e2fsprogs mkfs.ext4 | |
| mkfs.ext4 -F -L Ventoy "$P1" | |
| ;; | |
| ntfs) | |
| install_pkg ntfs-3g mkfs.ntfs | |
| mkfs.ntfs -f -L Ventoy "$P1" | |
| ;; | |
| exfat) | |
| install_pkg exfatprogs mkfs.exfat | |
| mkfs.exfat -n Ventoy "$P1" | |
| ;; | |
| vfat|fat32) | |
| install_pkg dosfstools mkfs.vfat | |
| mkfs.vfat -F32 -n Ventoy "$P1" | |
| ;; | |
| *) | |
| echo "⚠️ 不支援的 FS 類型: $FS_TYPE"; exit 1 ;; | |
| esac | |
| fi | |
| else | |
| echo "" | |
| echo "✅ 第 1 分割區已是 $FS_TYPE,略過重新格式化。" | |
| fi | |
| else | |
| echo "⚠️ 找不到 $P1,略過格式化步驟。" | |
| fi | |
| # === 2️⃣ 檢查未分配空間,建立 refind 分區 === | |
| echo "" | |
| FREE_INFO=$(parted "$DISK" -m unit MB print free | grep "free" | tail -n 1) | |
| START_MB=$(echo "$FREE_INFO" | cut -d: -f2 | sed 's/MB//') | |
| END_MB=$(echo "$FREE_INFO" | cut -d: -f3 | sed 's/MB//') | |
| if [[ -n "$START_MB" && -n "$END_MB" ]]; then | |
| SIZE_MB=$(echo "$END_MB - $START_MB" | bc) | |
| if (( $(echo "$SIZE_MB > 32" | bc -l) )); then | |
| echo "== 偵測到未分配空間: ${START_MB}MB ~ ${END_MB}MB (共約 ${SIZE_MB}MB) ==" | |
| echo " 將建立 FAT32 分區 Label=refind" | |
| if ! $DRYRUN; then | |
| parted "$DISK" --script mkpart primary fat32 "${START_MB}MB" "${END_MB}MB" | |
| PART=$(lsblk -lnpo NAME "$DISK" | tail -n1) | |
| install_pkg dosfstools mkfs.vfat | |
| mkfs.vfat -F32 -n "refind" "$PART" | |
| fi | |
| else | |
| echo "⚠️ 剩餘空間僅 ${SIZE_MB}MB (<32MB),略過建立 refind 分區。" | |
| fi | |
| else | |
| echo "✅ 無偵測到未分配空間,略過建立 refind 分區。" | |
| fi | |
| # === 顯示結果 === | |
| echo "" | |
| echo "== ✅ 完成狀態 ==" | |
| lsblk -f "$DISK" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment