Skip to content

Instantly share code, notes, and snippets.

@superyngo
Created January 5, 2026 06:08
Show Gist options
  • Select an option

  • Save superyngo/4e972039cbf789a35eec99e29b16b903 to your computer and use it in GitHub Desktop.

Select an option

Save superyngo/4e972039cbf789a35eec99e29b16b903 to your computer and use it in GitHub Desktop.
Reformat vetoy 1st partition and auto create another efi partiton for refind.
#!/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