mirror of
https://github.com/AeThex-Corporation/AeThex-OS.git
synced 2026-04-18 14:37:19 +00:00
110 lines
2.6 KiB
Bash
Executable file
110 lines
2.6 KiB
Bash
Executable file
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
# AeThex OS USB flashing helper (Linux/macOS)
|
|
# Usage:
|
|
# sudo ./script/flash-usb.sh -i path/to/AeThex-Linux-amd64.iso -d /dev/sdX
|
|
# sudo ./script/flash-usb.sh -i path/to/AeThex-Linux-amd64.iso # will list devices and prompt
|
|
|
|
ISO=""
|
|
DEVICE=""
|
|
|
|
usage() {
|
|
echo "Usage: sudo $0 -i <iso_path> [-d <device>]" >&2
|
|
echo "Example: sudo $0 -i ./artifacts/AeThex-Linux-amd64.iso -d /dev/sdX" >&2
|
|
}
|
|
|
|
while getopts ":i:d:h" opt; do
|
|
case "$opt" in
|
|
i) ISO="$OPTARG" ;;
|
|
d) DEVICE="$OPTARG" ;;
|
|
h) usage; exit 0 ;;
|
|
*) usage; exit 1 ;;
|
|
esac
|
|
done
|
|
|
|
if [[ $EUID -ne 0 ]]; then
|
|
echo "This script must run as root (use sudo)." >&2
|
|
exit 1
|
|
fi
|
|
|
|
if [[ -z "$ISO" ]]; then
|
|
usage
|
|
exit 1
|
|
fi
|
|
|
|
if [[ ! -f "$ISO" ]]; then
|
|
echo "ISO not found: $ISO" >&2
|
|
exit 1
|
|
fi
|
|
|
|
OS_NAME="$(uname -s)"
|
|
|
|
list_devices_linux() {
|
|
lsblk -dpno NAME,SIZE,MODEL,TRAN | grep -E "/dev/" || true
|
|
}
|
|
|
|
list_devices_macos() {
|
|
diskutil list | sed -n '/(external, physical)/,/^$/p' || diskutil list
|
|
}
|
|
|
|
echo "ISO: $ISO"
|
|
echo "Detecting removable drives..."
|
|
|
|
if [[ "$OS_NAME" == "Linux" ]]; then
|
|
list_devices_linux
|
|
elif [[ "$OS_NAME" == "Darwin" ]]; then
|
|
list_devices_macos
|
|
else
|
|
echo "Unsupported OS: $OS_NAME" >&2
|
|
exit 1
|
|
fi
|
|
|
|
if [[ -z "$DEVICE" ]]; then
|
|
read -r -p "Enter target device (e.g., /dev/sdX or /dev/diskN): " DEVICE
|
|
fi
|
|
|
|
if [[ -z "$DEVICE" ]]; then
|
|
echo "No device specified." >&2
|
|
exit 1
|
|
fi
|
|
|
|
echo "\nWARNING: This will ERASE ALL DATA on $DEVICE"
|
|
read -r -p "Type ERASE to continue: " CONFIRM
|
|
if [[ "$CONFIRM" != "ERASE" ]]; then
|
|
echo "Aborted." >&2
|
|
exit 1
|
|
fi
|
|
|
|
echo "Unmounting any mounted partitions from $DEVICE..."
|
|
if [[ "$OS_NAME" == "Linux" ]]; then
|
|
mapfile -t parts < <(lsblk -no NAME "$DEVICE" 2>/dev/null | tail -n +2)
|
|
for p in "${parts[@]}"; do
|
|
mountpoint="/dev/$p"
|
|
umount "$mountpoint" 2>/dev/null || true
|
|
done
|
|
elif [[ "$OS_NAME" == "Darwin" ]]; then
|
|
diskutil unmountDisk force "$DEVICE" || true
|
|
fi
|
|
|
|
echo "Writing ISO to $DEVICE... this may take several minutes."
|
|
if [[ "$OS_NAME" == "Linux" ]]; then
|
|
if command -v pv >/dev/null 2>&1; then
|
|
pv "$ISO" | dd of="$DEVICE" bs=4M conv=fsync status=progress
|
|
else
|
|
dd if="$ISO" of="$DEVICE" bs=4M conv=fsync status=progress
|
|
fi
|
|
sync
|
|
elif [[ "$OS_NAME" == "Darwin" ]]; then
|
|
# On macOS, use raw disk for performance (/dev/rdiskN)
|
|
RAW_DEVICE="$DEVICE"
|
|
if [[ "$DEVICE" == /dev/disk* ]]; then
|
|
RAW_DEVICE="/dev/r$(basename "$DEVICE")"
|
|
fi
|
|
dd if="$ISO" of="$RAW_DEVICE" bs=4m
|
|
sync
|
|
diskutil eject "$DEVICE" || true
|
|
fi
|
|
|
|
echo "\nDone. Safely remove the USB, plug into target PC, and boot."
|
|
echo "If boot fails on UEFI, ensure Secure Boot is disabled or keys enrolled."
|