#!/usr/bin/env bash set -euo pipefail DEV="/dev/sda" IMG_URL="https://fw.koolcenter.com/iStoreOS/x86_64/istoreos-24.10.5-2025123110-x86-64-squashfs-combined.img.gz" need_cmd() { command -v "$1" >/dev/null 2>&1 || { echo "缺少依赖命令: $1" >&2 exit 1 } } need_cmd curl need_cmd dd DECOMPRESS_CMD="" if command -v gunzip >/dev/null 2>&1; then DECOMPRESS_CMD="gunzip -c" elif command -v gzip >/dev/null 2>&1; then DECOMPRESS_CMD="gzip -dc" else echo "缺少解压命令 gunzip 或 gzip" >&2 exit 1 fi if [[ ! -b "$DEV" ]]; then echo "目标设备不存在或不是块设备: $DEV" >&2 echo "可用磁盘参考: lsblk" >&2 exit 1 fi echo "iStoreOS 自动写盘脚本(由 Cloudflare Worker 生成)" echo "目标磁盘: $DEV" echo "镜像地址: $IMG_URL" echo # 提示挂载风险 if command -v lsblk >/dev/null 2>&1; then MOUNTS="$(lsblk -nrpo NAME,MOUNTPOINT "$DEV" 2>/dev/null | awk '$2!=""{print $0}')" if [[ -n "$MOUNTS" ]]; then echo "警告:检测到该磁盘/分区存在挂载点:" echo "$MOUNTS" echo fi fi if [[ "\${FORCE:-0}" != "1" ]]; then echo "这将清空并写入整块磁盘:$DEV(不可逆)" read -r -p '确认继续请输入 YES: ' ans if [[ "$ans" != "YES" ]]; then echo "已取消" exit 1 fi fi echo "开始写盘(请勿断电/中断)..." set +e curl -fL "$IMG_URL" | $DECOMPRESS_CMD | dd of="$DEV" bs=4M conv=fsync status=progress DD_RC=$? set -e if [[ $DD_RC -ne 0 ]]; then echo "写盘失败(dd 返回码 $DD_RC)" >&2 exit $DD_RC fi sync || true echo "完成。建议现在重启,从 $DEV 启动。"