feat(v2.0.0): renombrar script, agregar catálogo isos.conf y descarga directa
- Script renombrado a rm-multiboot.sh con header de autor y versión - Nuevo archivo isos.conf: catálogo NOMBRE|URL con 30+ distros populares - Nuevo flujo "Agregar ISO": elegir entre descargar del catálogo o ruta local - Descarga con wget (con fallback a curl) y retoma descargas incompletas (-c) - El nombre del catálogo se usa como etiqueta GRUB cuando la detección es genérica Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 4.6
parent
489af9b387
commit
08a5bbdbf8
@@ -0,0 +1,64 @@
|
|||||||
|
# =============================================================================
|
||||||
|
# isos.conf — Catálogo de ISOs para rm-multiboot
|
||||||
|
# =============================================================================
|
||||||
|
# Autor: Ricardo Monla
|
||||||
|
# GitHub: https://github.com/ricardomonla/rm-MULTIBOOT
|
||||||
|
#
|
||||||
|
# Formato de cada línea:
|
||||||
|
# NOMBRE | URL_DE_DESCARGA
|
||||||
|
#
|
||||||
|
# Reglas:
|
||||||
|
# • Las líneas que empiezan con # son comentarios (se ignoran)
|
||||||
|
# • Las líneas en blanco se ignoran
|
||||||
|
# • El NOMBRE se usa como etiqueta en el menú GRUB
|
||||||
|
# • Podés agregar, quitar o editar entradas libremente
|
||||||
|
# • La URL debe apuntar directamente al archivo .iso
|
||||||
|
# =============================================================================
|
||||||
|
|
||||||
|
# ── Ubuntu y Flavors oficiales ────────────────────────────────────────────────
|
||||||
|
Ubuntu 24.04 LTS Desktop | https://releases.ubuntu.com/24.04/ubuntu-24.04.2-desktop-amd64.iso
|
||||||
|
Ubuntu 22.04 LTS Desktop | https://releases.ubuntu.com/22.04/ubuntu-22.04.5-desktop-amd64.iso
|
||||||
|
Kubuntu 24.04 LTS | https://cdimage.ubuntu.com/kubuntu/releases/24.04/release/kubuntu-24.04.1-desktop-amd64.iso
|
||||||
|
Xubuntu 24.04 LTS | https://cdimage.ubuntu.com/xubuntu/releases/24.04/release/xubuntu-24.04.1-minimal-amd64.iso
|
||||||
|
Lubuntu 24.04 LTS | https://cdimage.ubuntu.com/lubuntu/releases/24.04/release/lubuntu-24.04.1-desktop-amd64.iso
|
||||||
|
|
||||||
|
# ── Debian ────────────────────────────────────────────────────────────────────
|
||||||
|
Debian 12.9 Netinstall | https://cdimage.debian.org/debian-cd/current/amd64/iso-cd/debian-12.9.0-amd64-netinst.iso
|
||||||
|
Debian 12.9 Live GNOME | https://cdimage.debian.org/debian-cd/current-live/amd64/iso-hybrid/debian-live-12.9.0-amd64-gnome.iso
|
||||||
|
Debian 12.9 Live KDE | https://cdimage.debian.org/debian-cd/current-live/amd64/iso-hybrid/debian-live-12.9.0-amd64-kde.iso
|
||||||
|
Debian 12.9 Live Xfce | https://cdimage.debian.org/debian-cd/current-live/amd64/iso-hybrid/debian-live-12.9.0-amd64-xfce.iso
|
||||||
|
|
||||||
|
# ── Linux Mint ────────────────────────────────────────────────────────────────
|
||||||
|
Linux Mint 22.1 Cinnamon | https://mirrors.edge.kernel.org/linuxmint/stable/22.1/linuxmint-22.1-cinnamon-64bit.iso
|
||||||
|
Linux Mint 22.1 MATE | https://mirrors.edge.kernel.org/linuxmint/stable/22.1/linuxmint-22.1-mate-64bit.iso
|
||||||
|
Linux Mint 22.1 Xfce | https://mirrors.edge.kernel.org/linuxmint/stable/22.1/linuxmint-22.1-xfce-64bit.iso
|
||||||
|
|
||||||
|
# ── Fedora ────────────────────────────────────────────────────────────────────
|
||||||
|
Fedora 41 Workstation | https://download.fedoraproject.org/pub/fedora/linux/releases/41/Workstation/x86_64/iso/Fedora-Workstation-Live-x86_64-41-1.4.iso
|
||||||
|
Fedora 41 KDE | https://download.fedoraproject.org/pub/fedora/linux/releases/41/Spins/x86_64/iso/Fedora-KDE-Live-x86_64-41-1.4.iso
|
||||||
|
|
||||||
|
# ── Arch Linux y derivadas ────────────────────────────────────────────────────
|
||||||
|
Arch Linux (latest) | https://mirror.rackspace.com/archlinux/iso/latest/archlinux-x86_64.iso
|
||||||
|
Manjaro KDE 24.2 | https://download.manjaro.org/kde/24.2.1/manjaro-kde-24.2.1-250114-linux612.iso
|
||||||
|
Manjaro GNOME 24.2 | https://download.manjaro.org/gnome/24.2.1/manjaro-gnome-24.2.1-250114-linux612.iso
|
||||||
|
|
||||||
|
# ── Seguridad / Pentest ───────────────────────────────────────────────────────
|
||||||
|
Kali Linux 2025.1 Live | https://cdimage.kali.org/kali-2025.1a/kali-linux-2025.1a-live-amd64.iso
|
||||||
|
Parrot OS 6.3 Security | https://deb.parrot.sh/parrot/iso/6.3/Parrot-security-6.3_amd64.iso
|
||||||
|
Parrot OS 6.3 Home | https://deb.parrot.sh/parrot/iso/6.3/Parrot-home-6.3_amd64.iso
|
||||||
|
Tails 6.11 | https://mirrors.edge.kernel.org/tails/stable/tails-amd64-6.11/tails-amd64-6.11.img
|
||||||
|
|
||||||
|
# ── openSUSE ──────────────────────────────────────────────────────────────────
|
||||||
|
openSUSE Leap 15.6 | https://download.opensuse.org/distribution/leap/15.6/iso/openSUSE-Leap-15.6-DVD-x86_64-Media.iso
|
||||||
|
openSUSE Tumbleweed | https://download.opensuse.org/tumbleweed/iso/openSUSE-Tumbleweed-DVD-x86_64-Current.iso
|
||||||
|
|
||||||
|
# ── Enterprise Linux ──────────────────────────────────────────────────────────
|
||||||
|
Rocky Linux 9.5 | https://download.rockylinux.org/pub/rocky/9/isos/x86_64/Rocky-9.5-x86_64-dvd.iso
|
||||||
|
AlmaLinux 9.5 | https://repo.almalinux.org/almalinux/9/isos/x86_64/AlmaLinux-9.5-x86_64-dvd.iso
|
||||||
|
|
||||||
|
# ── Otras populares ───────────────────────────────────────────────────────────
|
||||||
|
MX Linux 23.3 Xfce | https://sourceforge.net/projects/mx-linux/files/Final/MX-23.3_x64.iso/download
|
||||||
|
Zorin OS 17.2 Core | https://mirrors.sourceforge.net/project/zorin-os/17/Zorin-OS-17.2-Core-64-bit.iso
|
||||||
|
Pop!_OS 22.04 (Intel/AMD) | https://iso.pop-os.org/22.04/amd64/intel/40/pop-os_22.04_amd64_intel_40.iso
|
||||||
|
elementary OS 8 | https://ams3.dl.elementary.io/elementary_os_8_stable_amd64.20241001.iso
|
||||||
|
Alpine Linux 3.21 | https://dl-cdn.alpinelinux.org/alpine/v3.21/releases/x86_64/alpine-standard-3.21.0-x86_64.iso
|
||||||
+259
-117
@@ -1,12 +1,29 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
# =============================================================================
|
# =============================================================================
|
||||||
# multiboot.sh — Gestor de Multiboot desde disco interno
|
# rm-multiboot.sh — Gestor de Multiboot desde disco interno
|
||||||
# Proyecto: rm-MULTIBOOT | Uso: sudo ./multiboot.sh
|
# =============================================================================
|
||||||
|
# Autor: Ricardo Monla
|
||||||
|
# Email: ma_fp@yahoo.com.ar
|
||||||
|
# GitHub: https://github.com/ricardomonla/rm-MULTIBOOT
|
||||||
|
# Versión: 2.0.0
|
||||||
|
# Licencia: MIT
|
||||||
|
#
|
||||||
|
# Uso: sudo ./rm-multiboot.sh
|
||||||
|
#
|
||||||
|
# Descripción:
|
||||||
|
# Prepara una partición del disco interno para bootear ISOs de Linux
|
||||||
|
# directamente desde el menú GRUB, sin necesidad de pendrive.
|
||||||
|
# Las ISOs se pueden descargar desde el catálogo (isos.conf) o
|
||||||
|
# agregarse desde un archivo local.
|
||||||
# =============================================================================
|
# =============================================================================
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
|
|
||||||
# ─── Constantes ───────────────────────────────────────────────────────────────
|
# ─── Constantes ───────────────────────────────────────────────────────────────
|
||||||
readonly SCRIPT_VERSION="1.0.0"
|
readonly SCRIPT_VERSION="2.0.0"
|
||||||
|
readonly SCRIPT_AUTHOR="Ricardo Monla"
|
||||||
|
readonly SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
|
readonly ISOS_CONF="$SCRIPT_DIR/isos.conf"
|
||||||
|
|
||||||
readonly MULTIBOOT_LABEL="MULTIBOOT"
|
readonly MULTIBOOT_LABEL="MULTIBOOT"
|
||||||
readonly MULTIBOOT_MOUNT="/mnt/multiboot"
|
readonly MULTIBOOT_MOUNT="/mnt/multiboot"
|
||||||
readonly ISO_DIR="$MULTIBOOT_MOUNT/isos"
|
readonly ISO_DIR="$MULTIBOOT_MOUNT/isos"
|
||||||
@@ -29,9 +46,9 @@ MULTIBOOT_DEV="" MULTIBOOT_SIZE="" MULTIBOOT_READY=false
|
|||||||
banner() {
|
banner() {
|
||||||
clear
|
clear
|
||||||
echo -e "${W}${B}"
|
echo -e "${W}${B}"
|
||||||
echo " ╔═══════════════════════════════════════════════════╗"
|
echo " ╔═══════════════════════════════════════════════════════╗"
|
||||||
echo " ║ MULTIBOOT MANAGER · rm-MULTIBOOT ║"
|
echo " ║ rm-multiboot · v${SCRIPT_VERSION} · ${SCRIPT_AUTHOR} ║"
|
||||||
echo " ╚═══════════════════════════════════════════════════╝"
|
echo " ╚═══════════════════════════════════════════════════════╝"
|
||||||
echo -e "${N}"
|
echo -e "${N}"
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -39,7 +56,7 @@ ok() { echo -e " ${G}✓${N} $*"; }
|
|||||||
warn() { echo -e " ${Y}⚠${N} $*"; }
|
warn() { echo -e " ${Y}⚠${N} $*"; }
|
||||||
err() { echo -e " ${R}✗${N} $*"; }
|
err() { echo -e " ${R}✗${N} $*"; }
|
||||||
step() { echo -e "\n ${W}${C}→${N} ${W}$*${N}"; }
|
step() { echo -e "\n ${W}${C}→${N} ${W}$*${N}"; }
|
||||||
divider() { echo -e "\n ${B}──────────────────────────────────────────────────${N}\n"; }
|
divider() { echo -e "\n ${B}──────────────────────────────────────────────────────${N}\n"; }
|
||||||
|
|
||||||
ask() {
|
ask() {
|
||||||
local prompt="$1" default="${2:-}" answer
|
local prompt="$1" default="${2:-}" answer
|
||||||
@@ -62,11 +79,13 @@ pause() { echo ""; read -rp " Presioná Enter para continuar..." _; }
|
|||||||
|
|
||||||
grub_update() {
|
grub_update() {
|
||||||
if command -v update-grub &>/dev/null; then
|
if command -v update-grub &>/dev/null; then
|
||||||
update-grub 2>/dev/null && ok "GRUB actualizado" || warn "No se pudo actualizar GRUB"
|
update-grub 2>/dev/null && ok "GRUB actualizado" \
|
||||||
|
|| warn "No se pudo actualizar GRUB automáticamente"
|
||||||
elif command -v grub-mkconfig &>/dev/null; then
|
elif command -v grub-mkconfig &>/dev/null; then
|
||||||
grub-mkconfig -o /boot/grub/grub.cfg 2>/dev/null && ok "GRUB actualizado" || warn "No se pudo actualizar GRUB"
|
grub-mkconfig -o /boot/grub/grub.cfg 2>/dev/null && ok "GRUB actualizado" \
|
||||||
|
|| warn "No se pudo actualizar GRUB automáticamente"
|
||||||
else
|
else
|
||||||
warn "No se encontró update-grub ni grub-mkconfig — actualizá el GRUB manualmente"
|
warn "No se encontró update-grub — actualizá el GRUB manualmente"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -79,26 +98,22 @@ detect_system() {
|
|||||||
step "Detectando sistema..."
|
step "Detectando sistema..."
|
||||||
echo ""
|
echo ""
|
||||||
|
|
||||||
# Modo boot
|
|
||||||
[[ -d /sys/firmware/efi ]] && BOOT_MODE="UEFI" || BOOT_MODE="BIOS Legacy"
|
[[ -d /sys/firmware/efi ]] && BOOT_MODE="UEFI" || BOOT_MODE="BIOS Legacy"
|
||||||
ok "Modo de arranque: ${W}$BOOT_MODE${N}"
|
ok "Modo de arranque: ${W}$BOOT_MODE${N}"
|
||||||
|
|
||||||
# OS actual
|
[[ -f /etc/os-release ]] && { . /etc/os-release; OS_NAME="${PRETTY_NAME:-Linux}"; } \
|
||||||
[[ -f /etc/os-release ]] && { . /etc/os-release; OS_NAME="${PRETTY_NAME:-Linux}"; } || OS_NAME="Linux"
|
|| OS_NAME="Linux"
|
||||||
ok "Sistema operativo: ${W}$OS_NAME${N}"
|
ok "Sistema operativo: ${W}$OS_NAME${N}"
|
||||||
|
|
||||||
# Disco raíz
|
|
||||||
local root_src root_name
|
local root_src root_name
|
||||||
root_src=$(findmnt -n -o SOURCE / 2>/dev/null | head -1)
|
root_src=$(findmnt -n -o SOURCE / 2>/dev/null | head -1)
|
||||||
root_name=$(lsblk -no PKNAME "$root_src" 2>/dev/null | head -1)
|
root_name=$(lsblk -no PKNAME "$root_src" 2>/dev/null | head -1)
|
||||||
if [[ -z "$root_name" ]]; then
|
[[ -z "$root_name" ]] && \
|
||||||
root_name=$(echo "$root_src" | sed 's|/dev/||;s|p\?[0-9]*$||')
|
root_name=$(echo "$root_src" | sed 's|/dev/||;s|p\?[0-9]*$||')
|
||||||
fi
|
|
||||||
ROOT_DISK_DEV="/dev/$root_name"
|
ROOT_DISK_DEV="/dev/$root_name"
|
||||||
ROOT_DISK_SIZE=$(lsblk -dno SIZE "$ROOT_DISK_DEV" 2>/dev/null || echo "?")
|
ROOT_DISK_SIZE=$(lsblk -dno SIZE "$ROOT_DISK_DEV" 2>/dev/null || echo "?")
|
||||||
ok "Disco principal: ${W}$ROOT_DISK_DEV${N} ($ROOT_DISK_SIZE)"
|
ok "Disco principal: ${W}$ROOT_DISK_DEV${N} ($ROOT_DISK_SIZE)"
|
||||||
|
|
||||||
# ¿Ya existe partición MULTIBOOT?
|
|
||||||
local mb_name
|
local mb_name
|
||||||
mb_name=$(lsblk -o NAME,LABEL -rn 2>/dev/null \
|
mb_name=$(lsblk -o NAME,LABEL -rn 2>/dev/null \
|
||||||
| awk -v lbl="$MULTIBOOT_LABEL" '$2==lbl {print $1}' | head -1)
|
| awk -v lbl="$MULTIBOOT_LABEL" '$2==lbl {print $1}' | head -1)
|
||||||
@@ -138,7 +153,8 @@ menu_principal() {
|
|||||||
mount_multiboot
|
mount_multiboot
|
||||||
local iso_count
|
local iso_count
|
||||||
iso_count=$(find "$ISO_DIR" -maxdepth 2 -name "*.iso" 2>/dev/null | wc -l)
|
iso_count=$(find "$ISO_DIR" -maxdepth 2 -name "*.iso" 2>/dev/null | wc -l)
|
||||||
[[ "$iso_count" -gt 0 ]] && show_iso_mini_list || echo -e " ${Y}Todavía no hay ISOs cargadas.${N}\n"
|
[[ "$iso_count" -gt 0 ]] && show_iso_mini_list \
|
||||||
|
|| echo -e " ${Y}Todavía no hay ISOs cargadas.${N}\n"
|
||||||
echo " 1) Agregar una ISO"
|
echo " 1) Agregar una ISO"
|
||||||
echo " 2) Ver ISOs disponibles"
|
echo " 2) Ver ISOs disponibles"
|
||||||
echo " 3) Eliminar una ISO"
|
echo " 3) Eliminar una ISO"
|
||||||
@@ -146,7 +162,7 @@ menu_principal() {
|
|||||||
echo ""
|
echo ""
|
||||||
local opt; opt=$(ask "Opción [1-4]")
|
local opt; opt=$(ask "Opción [1-4]")
|
||||||
case "$opt" in
|
case "$opt" in
|
||||||
1) add_iso ;;
|
1) menu_agregar_iso ;;
|
||||||
2) list_isos; pause; banner; detect_system; menu_principal ;;
|
2) list_isos; pause; banner; detect_system; menu_principal ;;
|
||||||
3) remove_iso ;;
|
3) remove_iso ;;
|
||||||
4) echo ""; exit 0 ;;
|
4) echo ""; exit 0 ;;
|
||||||
@@ -161,12 +177,35 @@ show_iso_mini_list() {
|
|||||||
echo -e " ISOs disponibles: ${W}$count${N}\n"
|
echo -e " ISOs disponibles: ${W}$count${N}\n"
|
||||||
find "$ISO_DIR" -maxdepth 2 -name "*.iso" 2>/dev/null | sort | while read -r iso; do
|
find "$ISO_DIR" -maxdepth 2 -name "*.iso" 2>/dev/null | sort | while read -r iso; do
|
||||||
local sz; sz=$(du -h "$iso" | cut -f1)
|
local sz; sz=$(du -h "$iso" | cut -f1)
|
||||||
printf " ${C}•${N} %-50s %s\n" "$(basename "$iso")" "($sz)"
|
printf " ${C}•${N} %-52s %s\n" "$(basename "$iso")" "($sz)"
|
||||||
done
|
done
|
||||||
echo ""
|
echo ""
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# MENÚ — CÓMO AGREGAR ISO
|
||||||
|
# =============================================================================
|
||||||
|
|
||||||
|
menu_agregar_iso() {
|
||||||
|
banner
|
||||||
|
step "Agregar una ISO"
|
||||||
|
echo ""
|
||||||
|
echo -e " ¿De dónde obtenés la ISO?\n"
|
||||||
|
echo " 1) Descargar desde el catálogo (isos.conf)"
|
||||||
|
echo " 2) Usar un archivo local (ruta en este equipo)"
|
||||||
|
echo " 3) Volver"
|
||||||
|
echo ""
|
||||||
|
local opt; opt=$(ask "Opción [1-3]")
|
||||||
|
case "$opt" in
|
||||||
|
1) download_from_catalog ;;
|
||||||
|
2) add_iso_local ;;
|
||||||
|
3) banner; detect_system; menu_principal ;;
|
||||||
|
*) menu_agregar_iso ;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
# =============================================================================
|
# =============================================================================
|
||||||
# SETUP WIZARD — crear la partición MULTIBOOT
|
# SETUP WIZARD — crear la partición MULTIBOOT
|
||||||
# =============================================================================
|
# =============================================================================
|
||||||
@@ -176,28 +215,25 @@ setup_wizard() {
|
|||||||
step "Asistente de configuración inicial"
|
step "Asistente de configuración inicial"
|
||||||
echo ""
|
echo ""
|
||||||
|
|
||||||
# ── Detectar espacios libres ──────────────────────────────────────────────
|
|
||||||
local free_raw
|
local free_raw
|
||||||
free_raw=$(parted -s "$ROOT_DISK_DEV" unit MiB print free 2>/dev/null \
|
free_raw=$(parted -s "$ROOT_DISK_DEV" unit MiB print free 2>/dev/null \
|
||||||
| awk '/Free Space/ && $3+0 >= 10240 {print $1, $2, $3}')
|
| awk '/Free Space/ && $3+0 >= 10240 {print $1, $2, $3}')
|
||||||
|
|
||||||
if [[ -z "$free_raw" ]]; then
|
if [[ -z "$free_raw" ]]; then
|
||||||
err "No se encontró espacio libre ≥ 10 GB sin asignar en $ROOT_DISK_DEV"
|
err "No se encontró espacio libre ≥ 10 GB sin asignar en $ROOT_DISK_DEV"
|
||||||
echo ""
|
echo -e "\n Para continuar necesitás liberar espacio con GParted u otra herramienta.\n"
|
||||||
echo -e " Para continuar necesitás liberar espacio con GParted u otra herramienta.\n"
|
|
||||||
pause; exit 1
|
pause; exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# ── Mostrar regiones disponibles ─────────────────────────────────────────
|
|
||||||
echo -e " Espacio libre sin asignar en ${W}$ROOT_DISK_DEV${N}:\n"
|
echo -e " Espacio libre sin asignar en ${W}$ROOT_DISK_DEV${N}:\n"
|
||||||
local -a starts ends sizes labels
|
local -a starts ends sizes
|
||||||
local i=1
|
local i=1
|
||||||
while read -r start end size; do
|
while read -r start end size; do
|
||||||
local size_gib
|
local size_gib
|
||||||
size_gib=$(echo "$size" | sed 's/MiB//' | awk '{printf "%.0f", $1/1024}')
|
size_gib=$(echo "$size" | sed 's/MiB//' | awk '{printf "%.0f", $1/1024}')
|
||||||
starts+=("$start"); ends+=("$end"); sizes+=("$size_gib")
|
starts+=("$start"); ends+=("$end"); sizes+=("$size_gib")
|
||||||
labels+=("${size_gib} GB libres (desde $start hasta $end)")
|
printf " ${C}%d)${N} %s GB libres (desde %s hasta %s)\n" \
|
||||||
printf " ${C}%d)${N} %s\n" "$i" "${labels[$((i-1))]}"
|
"$i" "$size_gib" "$start" "$end"
|
||||||
i=$((i+1))
|
i=$((i+1))
|
||||||
done <<< "$free_raw"
|
done <<< "$free_raw"
|
||||||
echo ""
|
echo ""
|
||||||
@@ -216,38 +252,34 @@ setup_wizard() {
|
|||||||
local max_gib="${sizes[$idx]}"
|
local max_gib="${sizes[$idx]}"
|
||||||
local recommended=$((max_gib > 100 ? 50 : max_gib))
|
local recommended=$((max_gib > 100 ? 50 : max_gib))
|
||||||
|
|
||||||
# ── Pedir tamaño ─────────────────────────────────────────────────────────
|
|
||||||
echo -e " ${Y}Nota:${N} cada ISO pesa entre 600 MB y 5 GB."
|
echo -e " ${Y}Nota:${N} cada ISO pesa entre 600 MB y 5 GB."
|
||||||
echo -e " Recomendado: ≥ 30 GB para tener varias ISOs.\n"
|
echo -e " Recomendado: ≥ 30 GB para tener varias ISOs.\n"
|
||||||
local size_gb
|
local size_gb
|
||||||
size_gb=$(ask "¿Cuántos GB asignar a MULTIBOOT? (máx $max_gib)" "$recommended")
|
size_gb=$(ask "¿Cuántos GB asignar a MULTIBOOT? (máx $max_gib)" "$recommended")
|
||||||
|
|
||||||
if ! [[ "$size_gb" =~ ^[0-9]+$ ]] || [[ "$size_gb" -lt 10 ]] || [[ "$size_gb" -gt "$max_gib" ]]; then
|
if ! [[ "$size_gb" =~ ^[0-9]+$ ]] || \
|
||||||
err "Tamaño inválido. Debe ser un número entre 10 y $max_gib."
|
[[ "$size_gb" -lt 10 ]] || [[ "$size_gb" -gt "$max_gib" ]]; then
|
||||||
pause; setup_wizard; return
|
err "Tamaño inválido. Debe ser un número entre 10 y $max_gib."; pause
|
||||||
|
setup_wizard; return
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# ── Calcular extremo de la nueva partición ────────────────────────────────
|
|
||||||
local start_mib end_mib
|
local start_mib end_mib
|
||||||
start_mib=$(echo "$free_start" | sed 's/MiB//')
|
start_mib=$(echo "$free_start" | sed 's/MiB//')
|
||||||
end_mib=$((start_mib + size_gb * 1024))
|
end_mib=$((start_mib + size_gb * 1024))
|
||||||
|
|
||||||
# ── Confirmar ─────────────────────────────────────────────────────────────
|
|
||||||
echo ""
|
echo ""
|
||||||
echo -e " ${W}Resumen:${N}"
|
echo -e " ${W}Resumen:${N}"
|
||||||
echo -e " Disco: $ROOT_DISK_DEV"
|
echo -e " Disco: $ROOT_DISK_DEV"
|
||||||
echo -e " Inicio: ${start_mib} MiB"
|
|
||||||
echo -e " Tamaño: ${size_gb} GB"
|
echo -e " Tamaño: ${size_gb} GB"
|
||||||
echo -e " Etiqueta: $MULTIBOOT_LABEL"
|
echo -e " Etiqueta: $MULTIBOOT_LABEL"
|
||||||
echo -e " Sistema arch: ext4"
|
echo -e " Sistema de arch: ext4"
|
||||||
echo -e " Punto montaje: $MULTIBOOT_MOUNT"
|
echo -e " Punto de montaje: $MULTIBOOT_MOUNT"
|
||||||
echo ""
|
echo ""
|
||||||
|
|
||||||
if ! confirm "¿Crear la partición ahora?"; then
|
if ! confirm "¿Crear la partición ahora?"; then
|
||||||
echo ""; warn "Operación cancelada."; pause; exit 0
|
echo ""; warn "Operación cancelada."; pause; exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# ── Crear partición ───────────────────────────────────────────────────────
|
|
||||||
echo ""
|
echo ""
|
||||||
step "Creando partición..."
|
step "Creando partición..."
|
||||||
|
|
||||||
@@ -255,9 +287,9 @@ setup_wizard() {
|
|||||||
parts_before=$(lsblk -lno NAME "$ROOT_DISK_DEV" \
|
parts_before=$(lsblk -lno NAME "$ROOT_DISK_DEV" \
|
||||||
| grep -v "^$(basename "$ROOT_DISK_DEV")$" | sort)
|
| grep -v "^$(basename "$ROOT_DISK_DEV")$" | sort)
|
||||||
|
|
||||||
# Tabla GPT: mkpart sin nombre de tipo; MBR: mkpart primary
|
|
||||||
local part_table
|
local part_table
|
||||||
part_table=$(parted -s "$ROOT_DISK_DEV" print 2>/dev/null | awk '/Partition Table/{print $3}')
|
part_table=$(parted -s "$ROOT_DISK_DEV" print 2>/dev/null \
|
||||||
|
| awk '/Partition Table/{print $3}')
|
||||||
|
|
||||||
if [[ "$part_table" == "gpt" ]]; then
|
if [[ "$part_table" == "gpt" ]]; then
|
||||||
parted -s "$ROOT_DISK_DEV" mkpart "$MULTIBOOT_LABEL" ext4 \
|
parted -s "$ROOT_DISK_DEV" mkpart "$MULTIBOOT_LABEL" ext4 \
|
||||||
@@ -267,14 +299,13 @@ setup_wizard() {
|
|||||||
"${start_mib}MiB" "${end_mib}MiB" 2>/dev/null
|
"${start_mib}MiB" "${end_mib}MiB" 2>/dev/null
|
||||||
fi
|
fi
|
||||||
|
|
||||||
sleep 1
|
sleep 1; partprobe "$ROOT_DISK_DEV" 2>/dev/null || true; sleep 1
|
||||||
partprobe "$ROOT_DISK_DEV" 2>/dev/null || true
|
|
||||||
sleep 1
|
|
||||||
|
|
||||||
local new_part
|
local new_part
|
||||||
new_part=$(comm -13 \
|
new_part=$(comm -13 \
|
||||||
<(echo "$parts_before") \
|
<(echo "$parts_before") \
|
||||||
<(lsblk -lno NAME "$ROOT_DISK_DEV" | grep -v "^$(basename "$ROOT_DISK_DEV")$" | sort) \
|
<(lsblk -lno NAME "$ROOT_DISK_DEV" \
|
||||||
|
| grep -v "^$(basename "$ROOT_DISK_DEV")$" | sort) \
|
||||||
| head -1)
|
| head -1)
|
||||||
|
|
||||||
if [[ -z "$new_part" ]]; then
|
if [[ -z "$new_part" ]]; then
|
||||||
@@ -284,30 +315,25 @@ setup_wizard() {
|
|||||||
MULTIBOOT_DEV="/dev/$new_part"
|
MULTIBOOT_DEV="/dev/$new_part"
|
||||||
ok "Partición creada: $MULTIBOOT_DEV"
|
ok "Partición creada: $MULTIBOOT_DEV"
|
||||||
|
|
||||||
# ── Formatear ─────────────────────────────────────────────────────────────
|
|
||||||
step "Formateando como ext4..."
|
step "Formateando como ext4..."
|
||||||
mkfs.ext4 -L "$MULTIBOOT_LABEL" -q "$MULTIBOOT_DEV"
|
mkfs.ext4 -L "$MULTIBOOT_LABEL" -q "$MULTIBOOT_DEV"
|
||||||
ok "Formato aplicado con etiqueta '$MULTIBOOT_LABEL'"
|
ok "Formato aplicado con etiqueta '$MULTIBOOT_LABEL'"
|
||||||
|
|
||||||
# ── Montar ────────────────────────────────────────────────────────────────
|
|
||||||
mkdir -p "$MULTIBOOT_MOUNT"
|
mkdir -p "$MULTIBOOT_MOUNT"
|
||||||
mount "$MULTIBOOT_DEV" "$MULTIBOOT_MOUNT"
|
mount "$MULTIBOOT_DEV" "$MULTIBOOT_MOUNT"
|
||||||
mkdir -p "$ISO_DIR" "$MULTIBOOT_MOUNT/grub/entries"
|
mkdir -p "$ISO_DIR" "$MULTIBOOT_MOUNT/grub/entries"
|
||||||
ok "Montada en $MULTIBOOT_MOUNT"
|
ok "Montada en $MULTIBOOT_MOUNT"
|
||||||
|
|
||||||
# ── fstab ─────────────────────────────────────────────────────────────────
|
|
||||||
local part_uuid
|
local part_uuid
|
||||||
part_uuid=$(lsblk -no UUID "$MULTIBOOT_DEV" | head -1)
|
part_uuid=$(lsblk -no UUID "$MULTIBOOT_DEV" | head -1)
|
||||||
if ! grep -q "$part_uuid" /etc/fstab 2>/dev/null; then
|
if ! grep -q "$part_uuid" /etc/fstab 2>/dev/null; then
|
||||||
printf '\n# Partición MULTIBOOT — rm-MULTIBOOT\nUUID=%s %s ext4 defaults,noatime 0 2\n' \
|
printf '\n# Partición MULTIBOOT — rm-MULTIBOOT\nUUID=%s %s ext4 defaults,noatime 0 2\n' \
|
||||||
"$part_uuid" "$MULTIBOOT_MOUNT" >> /etc/fstab
|
"$part_uuid" "$MULTIBOOT_MOUNT" >> /etc/fstab
|
||||||
ok "Agregado a /etc/fstab (montaje automático en cada inicio)"
|
ok "Agregado a /etc/fstab (montaje automático)"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# ── Hook de GRUB ──────────────────────────────────────────────────────────
|
|
||||||
install_grub_hook "$part_uuid"
|
install_grub_hook "$part_uuid"
|
||||||
|
|
||||||
# ── Actualizar GRUB ───────────────────────────────────────────────────────
|
|
||||||
step "Actualizando GRUB..."
|
step "Actualizando GRUB..."
|
||||||
grub_update
|
grub_update
|
||||||
|
|
||||||
@@ -323,14 +349,14 @@ setup_wizard() {
|
|||||||
|
|
||||||
|
|
||||||
# =============================================================================
|
# =============================================================================
|
||||||
# HOOK DE GRUB
|
# GRUB — HOOK
|
||||||
# =============================================================================
|
# =============================================================================
|
||||||
|
|
||||||
install_grub_hook() {
|
install_grub_hook() {
|
||||||
local part_uuid="$1"
|
local part_uuid="$1"
|
||||||
cat > "$GRUB_HOOK" <<HOOK
|
cat > "$GRUB_HOOK" <<HOOK
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
# rm-MULTIBOOT — entradas generadas automáticamente por multiboot.sh
|
# rm-MULTIBOOT — entradas generadas automáticamente por rm-multiboot.sh
|
||||||
MPOINT="$MULTIBOOT_MOUNT"
|
MPOINT="$MULTIBOOT_MOUNT"
|
||||||
ENTRIES="$ENTRIES_DIR"
|
ENTRIES="$ENTRIES_DIR"
|
||||||
|
|
||||||
@@ -364,14 +390,144 @@ mount_multiboot() {
|
|||||||
|
|
||||||
|
|
||||||
# =============================================================================
|
# =============================================================================
|
||||||
# AGREGAR ISO
|
# DESCARGAR DESDE CATÁLOGO (isos.conf)
|
||||||
# =============================================================================
|
# =============================================================================
|
||||||
|
|
||||||
add_iso() {
|
download_from_catalog() {
|
||||||
banner
|
banner
|
||||||
step "Agregar una ISO al multiboot"
|
step "Descargar ISO desde el catálogo"
|
||||||
echo ""
|
echo ""
|
||||||
echo -e " Ingresá la ruta al archivo .iso"
|
|
||||||
|
if [[ ! -f "$ISOS_CONF" ]]; then
|
||||||
|
err "No se encontró el archivo de catálogo: $ISOS_CONF"
|
||||||
|
echo -e " Creá o copiá el archivo ${W}isos.conf${N} junto a este script.\n"
|
||||||
|
pause; banner; detect_system; menu_principal; return
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Leer entradas válidas del catálogo (ignorar comentarios y líneas vacías)
|
||||||
|
local -a names urls
|
||||||
|
while IFS='|' read -r name url; do
|
||||||
|
# Ignorar comentarios y vacías
|
||||||
|
[[ "$name" =~ ^[[:space:]]*# ]] && continue
|
||||||
|
[[ -z "${name// }" ]] && continue
|
||||||
|
name="${name#"${name%%[! ]*}"}"; name="${name%"${name##*[! ]}"}"
|
||||||
|
url="${url#"${url%%[! ]*}"}"; url="${url%"${url##*[! ]}"}"
|
||||||
|
[[ -z "$url" ]] && continue
|
||||||
|
names+=("$name")
|
||||||
|
urls+=("$url")
|
||||||
|
done < "$ISOS_CONF"
|
||||||
|
|
||||||
|
if [[ "${#names[@]}" -eq 0 ]]; then
|
||||||
|
err "El catálogo está vacío o no tiene entradas válidas."
|
||||||
|
echo -e " Revisá el archivo ${W}isos.conf${N}.\n"
|
||||||
|
pause; banner; detect_system; menu_principal; return
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Mostrar catálogo
|
||||||
|
echo -e " ${W}Catálogo disponible:${N}\n"
|
||||||
|
local i=1
|
||||||
|
for name in "${names[@]}"; do
|
||||||
|
local iso_filename
|
||||||
|
iso_filename=$(basename "${urls[$((i-1))]%%\?*}")
|
||||||
|
local estado=""
|
||||||
|
[[ -f "$ISO_DIR/$iso_filename" ]] && estado=" ${G}[ya descargada]${N}"
|
||||||
|
printf " ${C}%2d)${N} %-42s%b\n" "$i" "$name" "$estado"
|
||||||
|
i=$((i+1))
|
||||||
|
done
|
||||||
|
echo " 0) Volver"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
local opt
|
||||||
|
opt=$(ask "¿Cuál descargamos? [0-${#names[@]}]")
|
||||||
|
|
||||||
|
if [[ "$opt" == "0" ]]; then
|
||||||
|
banner; detect_system; menu_principal; return
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! [[ "$opt" =~ ^[0-9]+$ ]] || \
|
||||||
|
[[ "$opt" -lt 1 ]] || [[ "$opt" -gt "${#names[@]}" ]]; then
|
||||||
|
err "Opción inválida."; pause; download_from_catalog; return
|
||||||
|
fi
|
||||||
|
|
||||||
|
local idx=$((opt - 1))
|
||||||
|
local chosen_name="${names[$idx]}"
|
||||||
|
local chosen_url="${urls[$idx]}"
|
||||||
|
local iso_filename
|
||||||
|
iso_filename=$(basename "${chosen_url%%\?*}")
|
||||||
|
local dest="$ISO_DIR/$iso_filename"
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo -e " ${W}ISO seleccionada:${N}"
|
||||||
|
ok "Nombre: ${W}$chosen_name${N}"
|
||||||
|
ok "Archivo: $iso_filename"
|
||||||
|
ok "URL: ${C}$chosen_url${N}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Verificar si ya existe
|
||||||
|
if [[ -f "$dest" ]]; then
|
||||||
|
warn "Esta ISO ya está descargada en la partición MULTIBOOT."
|
||||||
|
if ! confirm "¿Descargar de nuevo y sobreescribir?"; then
|
||||||
|
banner; detect_system; menu_principal; return
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Verificar espacio (estimamos con el tamaño del Content-Length del servidor)
|
||||||
|
local avail_k
|
||||||
|
avail_k=$(df "$MULTIBOOT_MOUNT" --output=avail | tail -1)
|
||||||
|
echo -e " Espacio libre en MULTIBOOT: $(( avail_k / 1024 / 1024 )) GB\n"
|
||||||
|
|
||||||
|
if ! confirm "¿Iniciar descarga?"; then
|
||||||
|
banner; detect_system; menu_principal; return
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Descargar
|
||||||
|
echo ""
|
||||||
|
step "Descargando $iso_filename..."
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
if command -v wget &>/dev/null; then
|
||||||
|
wget --show-progress -q -c -O "$dest" "$chosen_url" \
|
||||||
|
|| { err "Falló la descarga."; rm -f "$dest"; pause
|
||||||
|
banner; detect_system; menu_principal; return; }
|
||||||
|
elif command -v curl &>/dev/null; then
|
||||||
|
curl -L -C - --progress-bar -o "$dest" "$chosen_url" \
|
||||||
|
|| { err "Falló la descarga."; rm -f "$dest"; pause
|
||||||
|
banner; detect_system; menu_principal; return; }
|
||||||
|
else
|
||||||
|
err "No se encontró wget ni curl. Instalá uno de los dos e intentá de nuevo."
|
||||||
|
pause; banner; detect_system; menu_principal; return
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
ok "Descarga completada: $iso_filename"
|
||||||
|
|
||||||
|
# Generar entrada GRUB
|
||||||
|
step "Generando entrada de arranque..."
|
||||||
|
local distro
|
||||||
|
distro=$(detect_distro "$iso_filename")
|
||||||
|
# Preferir el nombre del catálogo si es más descriptivo
|
||||||
|
[[ "$distro" == "Linux" ]] && distro="$chosen_name"
|
||||||
|
generate_grub_entry "$iso_filename" "$distro"
|
||||||
|
|
||||||
|
step "Actualizando menú de arranque..."
|
||||||
|
grub_update
|
||||||
|
|
||||||
|
divider
|
||||||
|
echo -e " ${W}${G}¡ISO lista!${N}"
|
||||||
|
echo -e " Al reiniciar aparecerá en el menú GRUB.\n"
|
||||||
|
pause; banner; detect_system; menu_principal
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# AGREGAR ISO DESDE RUTA LOCAL
|
||||||
|
# =============================================================================
|
||||||
|
|
||||||
|
add_iso_local() {
|
||||||
|
banner
|
||||||
|
step "Agregar ISO desde archivo local"
|
||||||
|
echo ""
|
||||||
|
echo -e " Ingresá la ruta completa al archivo .iso"
|
||||||
echo -e " ${Y}Tip:${N} podés arrastrar el archivo directamente a la terminal\n"
|
echo -e " ${Y}Tip:${N} podés arrastrar el archivo directamente a la terminal\n"
|
||||||
|
|
||||||
local iso_path
|
local iso_path
|
||||||
@@ -393,10 +549,9 @@ add_iso() {
|
|||||||
echo -e " ${W}ISO detectada:${N}"
|
echo -e " ${W}ISO detectada:${N}"
|
||||||
ok "Nombre: ${W}$iso_name${N}"
|
ok "Nombre: ${W}$iso_name${N}"
|
||||||
ok "Tamaño: $size"
|
ok "Tamaño: $size"
|
||||||
ok "Distro: ${W}$distro${N}"
|
ok "Distro: ${W}$distro${N}"
|
||||||
echo ""
|
echo ""
|
||||||
|
|
||||||
# Verificar espacio disponible
|
|
||||||
local avail_k iso_k
|
local avail_k iso_k
|
||||||
avail_k=$(df "$MULTIBOOT_MOUNT" --output=avail | tail -1)
|
avail_k=$(df "$MULTIBOOT_MOUNT" --output=avail | tail -1)
|
||||||
iso_k=$(du -k "$iso_path" | cut -f1)
|
iso_k=$(du -k "$iso_path" | cut -f1)
|
||||||
@@ -407,7 +562,6 @@ add_iso() {
|
|||||||
pause; banner; detect_system; menu_principal; return
|
pause; banner; detect_system; menu_principal; return
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Verificar si ya existe
|
|
||||||
if [[ -f "$ISO_DIR/$iso_name" ]]; then
|
if [[ -f "$ISO_DIR/$iso_name" ]]; then
|
||||||
warn "Ya existe una ISO con ese nombre."
|
warn "Ya existe una ISO con ese nombre."
|
||||||
if ! confirm "¿Sobreescribir?"; then
|
if ! confirm "¿Sobreescribir?"; then
|
||||||
@@ -419,38 +573,34 @@ add_iso() {
|
|||||||
banner; detect_system; menu_principal; return
|
banner; detect_system; menu_principal; return
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Copiar con progreso
|
|
||||||
echo ""
|
echo ""
|
||||||
step "Copiando ISO..."
|
step "Copiando ISO..."
|
||||||
local total
|
local total dest
|
||||||
total=$(stat -c%s "$iso_path")
|
total=$(stat -c%s "$iso_path")
|
||||||
local dest="$ISO_DIR/$iso_name"
|
dest="$ISO_DIR/$iso_name"
|
||||||
|
|
||||||
cp "$iso_path" "$dest" &
|
cp "$iso_path" "$dest" &
|
||||||
local cp_pid=$!
|
local cp_pid=$!
|
||||||
while kill -0 "$cp_pid" 2>/dev/null; do
|
while kill -0 "$cp_pid" 2>/dev/null; do
|
||||||
local done_bytes=0
|
local done_b=0
|
||||||
[[ -f "$dest" ]] && done_bytes=$(stat -c%s "$dest" 2>/dev/null || echo 0)
|
[[ -f "$dest" ]] && done_b=$(stat -c%s "$dest" 2>/dev/null || echo 0)
|
||||||
local pct=$(( total > 0 ? done_bytes * 100 / total : 0 ))
|
local pct=$(( total > 0 ? done_b * 100 / total : 0 ))
|
||||||
local done_mb=$(( done_bytes / 1024 / 1024 ))
|
printf "\r ${C}→${N} %3d%% (%d MB de %d MB)" \
|
||||||
local total_mb=$(( total / 1024 / 1024 ))
|
"$pct" "$(( done_b / 1024 / 1024 ))" "$(( total / 1024 / 1024 ))"
|
||||||
printf "\r ${C}→${N} %3d%% (%d MB de %d MB)" "$pct" "$done_mb" "$total_mb"
|
|
||||||
sleep 0.4
|
sleep 0.4
|
||||||
done
|
done
|
||||||
wait "$cp_pid"
|
wait "$cp_pid"
|
||||||
printf "\r ${G}✓${N} 100%% (%d MB) \n" "$(( total / 1024 / 1024 ))"
|
printf "\r ${G}✓${N} 100%% (%d MB) \n" \
|
||||||
|
"$(( total / 1024 / 1024 ))"
|
||||||
|
|
||||||
# Generar entrada GRUB
|
|
||||||
step "Generando entrada de arranque..."
|
step "Generando entrada de arranque..."
|
||||||
generate_grub_entry "$iso_name" "$distro"
|
generate_grub_entry "$iso_name" "$distro"
|
||||||
|
|
||||||
# Actualizar GRUB
|
|
||||||
step "Actualizando menú de arranque..."
|
step "Actualizando menú de arranque..."
|
||||||
grub_update
|
grub_update
|
||||||
|
|
||||||
divider
|
divider
|
||||||
echo -e " ${W}${G}¡ISO agregada!${N}"
|
echo -e " ${W}${G}¡ISO agregada!${N} Al reiniciar aparecerá en el menú GRUB.\n"
|
||||||
echo -e " Al reiniciar, aparecerá en el menú de arranque.\n"
|
|
||||||
pause; banner; detect_system; menu_principal
|
pause; banner; detect_system; menu_principal
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -462,28 +612,28 @@ add_iso() {
|
|||||||
detect_distro() {
|
detect_distro() {
|
||||||
local n="${1,,}"
|
local n="${1,,}"
|
||||||
case "$n" in
|
case "$n" in
|
||||||
*kubuntu*) echo "Kubuntu" ;;
|
*kubuntu*) echo "Kubuntu" ;;
|
||||||
*xubuntu*) echo "Xubuntu" ;;
|
*xubuntu*) echo "Xubuntu" ;;
|
||||||
*lubuntu*) echo "Lubuntu" ;;
|
*lubuntu*) echo "Lubuntu" ;;
|
||||||
*ubuntu*) echo "Ubuntu" ;;
|
*ubuntu*) echo "Ubuntu" ;;
|
||||||
*linuxmint*|*mint*) echo "Linux Mint" ;;
|
*linuxmint*|*mint*) echo "Linux Mint" ;;
|
||||||
*debian*) echo "Debian" ;;
|
*debian*) echo "Debian" ;;
|
||||||
*fedora*) echo "Fedora" ;;
|
*fedora*) echo "Fedora" ;;
|
||||||
*arch*) echo "Arch Linux" ;;
|
*arch*) echo "Arch Linux" ;;
|
||||||
*manjaro*) echo "Manjaro" ;;
|
*manjaro*) echo "Manjaro" ;;
|
||||||
*kali*) echo "Kali Linux" ;;
|
*kali*) echo "Kali Linux" ;;
|
||||||
*parrot*) echo "Parrot OS" ;;
|
*parrot*) echo "Parrot OS" ;;
|
||||||
*opensuse*) echo "openSUSE" ;;
|
*opensuse*) echo "openSUSE" ;;
|
||||||
*pop*|*popos*) echo "Pop!_OS" ;;
|
*pop*|*popos*) echo "Pop!_OS" ;;
|
||||||
*elementary*) echo "elementary OS" ;;
|
*elementary*) echo "elementary OS" ;;
|
||||||
*zorin*) echo "Zorin OS" ;;
|
*zorin*) echo "Zorin OS" ;;
|
||||||
*mxlinux*|*mx-*) echo "MX Linux" ;;
|
*mxlinux*|*mx-*) echo "MX Linux" ;;
|
||||||
*tails*) echo "Tails" ;;
|
*tails*) echo "Tails" ;;
|
||||||
*alpine*) echo "Alpine Linux" ;;
|
*alpine*) echo "Alpine Linux" ;;
|
||||||
*rockylinux*|*rocky*) echo "Rocky Linux" ;;
|
*rockylinux*|*rocky*) echo "Rocky Linux" ;;
|
||||||
*almalinux*|*alma*) echo "AlmaLinux" ;;
|
*almalinux*|*alma*) echo "AlmaLinux" ;;
|
||||||
*centosstream*|*centos*) echo "CentOS" ;;
|
*centos*) echo "CentOS" ;;
|
||||||
*) echo "Linux" ;;
|
*) echo "Linux" ;;
|
||||||
esac
|
esac
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -499,19 +649,17 @@ generate_grub_entry() {
|
|||||||
part_uuid=$(lsblk -no UUID "$MULTIBOOT_DEV" 2>/dev/null | head -1)
|
part_uuid=$(lsblk -no UUID "$MULTIBOOT_DEV" 2>/dev/null | head -1)
|
||||||
local entry_file="$ENTRIES_DIR/${label}.cfg"
|
local entry_file="$ENTRIES_DIR/${label}.cfg"
|
||||||
|
|
||||||
# ── Verificar si la ISO tiene loopback.cfg nativo ─────────────────────────
|
# Verificar si la ISO tiene loopback.cfg nativo
|
||||||
local tmp_mnt has_loopback=false
|
local tmp_mnt has_loopback=false
|
||||||
tmp_mnt=$(mktemp -d)
|
tmp_mnt=$(mktemp -d)
|
||||||
if modprobe loop 2>/dev/null; then
|
modprobe loop 2>/dev/null || true
|
||||||
if mount -o loop,ro "$ISO_DIR/$iso_name" "$tmp_mnt" 2>/dev/null; then
|
if mount -o loop,ro "$ISO_DIR/$iso_name" "$tmp_mnt" 2>/dev/null; then
|
||||||
[[ -f "$tmp_mnt/boot/grub/loopback.cfg" ]] && has_loopback=true
|
[[ -f "$tmp_mnt/boot/grub/loopback.cfg" ]] && has_loopback=true
|
||||||
umount "$tmp_mnt" 2>/dev/null || true
|
umount "$tmp_mnt" 2>/dev/null || true
|
||||||
fi
|
|
||||||
fi
|
fi
|
||||||
rmdir "$tmp_mnt" 2>/dev/null || true
|
rmdir "$tmp_mnt" 2>/dev/null || true
|
||||||
|
|
||||||
if [[ "$has_loopback" == true ]]; then
|
if [[ "$has_loopback" == true ]]; then
|
||||||
# Usar loopback.cfg nativo de la ISO (máxima compatibilidad)
|
|
||||||
cat > "$entry_file" <<CFG
|
cat > "$entry_file" <<CFG
|
||||||
menuentry "$distro — $iso_name" --class linux {
|
menuentry "$distro — $iso_name" --class linux {
|
||||||
insmod part_gpt
|
insmod part_gpt
|
||||||
@@ -526,11 +674,10 @@ menuentry "$distro — $iso_name" --class linux {
|
|||||||
configfile (loop)/boot/grub/loopback.cfg
|
configfile (loop)/boot/grub/loopback.cfg
|
||||||
}
|
}
|
||||||
CFG
|
CFG
|
||||||
ok "Entrada GRUB: usando loopback.cfg nativo de la ISO"
|
ok "Entrada GRUB: loopback.cfg nativo"
|
||||||
else
|
else
|
||||||
# Entrada por parámetros según familia de distro
|
|
||||||
generate_grub_entry_fallback "$iso_name" "$distro" "$part_uuid" "$entry_file"
|
generate_grub_entry_fallback "$iso_name" "$distro" "$part_uuid" "$entry_file"
|
||||||
warn "Entrada GRUB: modo genérico (la ISO no tiene loopback.cfg)"
|
warn "Entrada GRUB: modo genérico (sin loopback.cfg en la ISO)"
|
||||||
fi
|
fi
|
||||||
ok "Entrada guardada: $(basename "$entry_file")"
|
ok "Entrada guardada: $(basename "$entry_file")"
|
||||||
}
|
}
|
||||||
@@ -569,7 +716,7 @@ generate_grub_entry_fallback() {
|
|||||||
*alpine*)
|
*alpine*)
|
||||||
vmlinuz="/boot/vmlinuz-lts"
|
vmlinuz="/boot/vmlinuz-lts"
|
||||||
initrd="/boot/initramfs-lts"
|
initrd="/boot/initramfs-lts"
|
||||||
params="iso-scan/filename=/isos/$iso_name alpine_dev=UUID:$part_uuid"
|
params="alpine_dev=UUID:$part_uuid iso-scan/filename=/isos/$iso_name"
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
vmlinuz="/casper/vmlinuz"
|
vmlinuz="/casper/vmlinuz"
|
||||||
@@ -608,13 +755,12 @@ list_isos() {
|
|||||||
while IFS= read -r iso; do
|
while IFS= read -r iso; do
|
||||||
[[ -f "$iso" ]] || continue
|
[[ -f "$iso" ]] || continue
|
||||||
count=$((count + 1))
|
count=$((count + 1))
|
||||||
local name sz distro grub_ok
|
local name sz entry grub_ok
|
||||||
name=$(basename "$iso")
|
name=$(basename "$iso")
|
||||||
sz=$(du -h "$iso" | cut -f1)
|
sz=$(du -h "$iso" | cut -f1)
|
||||||
distro=$(detect_distro "$name")
|
entry="$ENTRIES_DIR/${name%.iso}.cfg"
|
||||||
local entry="$ENTRIES_DIR/${name%.iso}.cfg"
|
|
||||||
[[ -f "$entry" ]] && grub_ok="${G}en menú${N}" || grub_ok="${R}sin entrada GRUB${N}"
|
[[ -f "$entry" ]] && grub_ok="${G}en menú${N}" || grub_ok="${R}sin entrada GRUB${N}"
|
||||||
printf " ${C}%2d)${N} %-50s %6s [%b]\n" "$count" "$name" "$sz" "$grub_ok"
|
printf " ${C}%2d)${N} %-52s %6s [%b]\n" "$count" "$name" "$sz" "$grub_ok"
|
||||||
done < <(find "$ISO_DIR" -maxdepth 2 -name "*.iso" 2>/dev/null | sort)
|
done < <(find "$ISO_DIR" -maxdepth 2 -name "*.iso" 2>/dev/null | sort)
|
||||||
|
|
||||||
if [[ "$count" -eq 0 ]]; then
|
if [[ "$count" -eq 0 ]]; then
|
||||||
@@ -651,7 +797,7 @@ remove_iso() {
|
|||||||
local i=1
|
local i=1
|
||||||
for iso in "${isos[@]}"; do
|
for iso in "${isos[@]}"; do
|
||||||
local sz; sz=$(du -h "$iso" | cut -f1)
|
local sz; sz=$(du -h "$iso" | cut -f1)
|
||||||
printf " ${C}%2d)${N} %-50s %6s\n" "$i" "$(basename "$iso")" "$sz"
|
printf " ${C}%2d)${N} %-52s %6s\n" "$i" "$(basename "$iso")" "$sz"
|
||||||
i=$((i+1))
|
i=$((i+1))
|
||||||
done
|
done
|
||||||
echo " 0) Cancelar"
|
echo " 0) Cancelar"
|
||||||
@@ -659,9 +805,7 @@ remove_iso() {
|
|||||||
|
|
||||||
local opt; opt=$(ask "¿Cuál eliminás? [0-${#isos[@]}]")
|
local opt; opt=$(ask "¿Cuál eliminás? [0-${#isos[@]}]")
|
||||||
|
|
||||||
if [[ "$opt" == "0" ]]; then
|
[[ "$opt" == "0" ]] && { banner; detect_system; menu_principal; return; }
|
||||||
banner; detect_system; menu_principal; return
|
|
||||||
fi
|
|
||||||
|
|
||||||
if ! [[ "$opt" =~ ^[0-9]+$ ]] || \
|
if ! [[ "$opt" =~ ^[0-9]+$ ]] || \
|
||||||
[[ "$opt" -lt 1 ]] || [[ "$opt" -gt "${#isos[@]}" ]]; then
|
[[ "$opt" -lt 1 ]] || [[ "$opt" -gt "${#isos[@]}" ]]; then
|
||||||
@@ -683,8 +827,7 @@ remove_iso() {
|
|||||||
|
|
||||||
step "Actualizando GRUB..."; grub_update
|
step "Actualizando GRUB..."; grub_update
|
||||||
|
|
||||||
echo ""
|
echo ""; ok "ISO eliminada: $tname"
|
||||||
ok "ISO eliminada: $tname"
|
|
||||||
pause; banner; detect_system; menu_principal
|
pause; banner; detect_system; menu_principal
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -697,10 +840,9 @@ main() {
|
|||||||
if [[ "$EUID" -ne 0 ]]; then
|
if [[ "$EUID" -ne 0 ]]; then
|
||||||
echo ""
|
echo ""
|
||||||
echo -e " ${R}Error:${N} Este script necesita permisos de administrador."
|
echo -e " ${R}Error:${N} Este script necesita permisos de administrador."
|
||||||
echo -e " Ejecutalo con: ${W}sudo $0${N}\n"
|
echo -e " Ejecutalo con: ${W}sudo ./rm-multiboot.sh${N}\n"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
banner
|
banner
|
||||||
detect_system
|
detect_system
|
||||||
menu_principal
|
menu_principal
|
||||||
Reference in New Issue
Block a user