#!/usr/bin/env bash set -euo pipefail
# Ús: sudo ./format_ext4_fulldisk.sh /dev/sdX /mnt/dir [ETIQUETA] # Exemple: sudo ./format_ext4_fulldisk.sh /dev/sdb /mnt/datadisk DATADISK
RED=“\e[31m”; GRN=“\e[32m”; YEL=“\e[33m”; BOLD=“\e[1m”; NC=“\e[0m”
msg() { echo -e “${GRN}${1}${NC}”; } warn() { echo -e “${YEL}${1}${NC}”; } err() { echo -e “${RED}${BOLD}ERROR:${NC} ${RED}${1}${NC}” >&2; }
if $EUID -ne 0; then
err "Cal executar el script com a root (usa sudo)." exit 1
fi
if -lt 2; then
echo "Ús: $0 /dev/sdX /mnt/dir [ETIQUETA]" exit 1
fi
DISK=“$1” MNT=“$2” LABEL=“${3:-}”
# Validacions bàsiques if ! -b "$DISK"; then
err "El dispositiu $DISK no existeix o no és un bloc de disc." exit 1
fi
# Ha de ser un 'disk', no una partició dtype=$(lsblk -no TYPE “$DISK” 2>/dev/null || true) if "$dtype" != "disk"; then
err "$DISK no és un disc complet (TYPE=$dtype). Indica, per exemple, /dev/sdb." exit 1
fi
# Evitar tocar el disc del sistema (on hi ha '/') root_src=$(findmnt -n -o SOURCE /) root_disk=$(lsblk -no pkname “$root_src” 2>/dev/null || true) if -n "$root_disk"; then
root_disk="/dev/$root_disk" if [[ "$root_disk" == "$DISK" ]]; then err "$DISK sembla ser el disc del sistema (conté '/'). Avortant per seguretat." exit 1 fi
fi
# Derivar etiqueta si no s'ha passat: del nom del directori, en majúscules i màx 16 caràcters if -z "$LABEL"; then
base="$(basename "$MNT")" # Ext4: etiqueta màx 16 bytes LABEL="$(echo "$base" | tr '[:lower:]' '[:upper:]' | tr -c 'A-Z0-9_' '_' | cut -c1-16)" [[ -z "$LABEL" ]] && LABEL="DATADISK"
fi
warn “A punt d'ESBORRAR i preparar $DISK com a ext4 amb 1 partició.” echo -e “ Disc: $DISK” echo -e “ Muntatge: $MNT” echo -e “ Etiqueta: $LABEL” echo read -rp $'\e[33mEscriu “SÍ” per continuar (majúscules exactes): \e[0m' CONFIRM if "$CONFIRM" != "SÍ"; then
err "Confirmació no vàlida. Res a fer." exit 1
fi
msg “Desmuntant possibles particions de $DISK…” # Desmuntar tot el que estiga muntat davall del disc mapfile -t mpoints < <(lsblk -nrpo MOUNTPOINT “$DISK” | awk 'NF') for mp in “${mpoints[@]:-}”; do
umount -q "$mp" || true
done
warn “Eliminant signatures prèvies (wipefs -a)…” wipefs -a “$DISK”
msg “Creant taula de particions GPT…” parted -s “$DISK” mklabel gpt
msg “Creant partició única ext4 de 1MiB al 100%…” parted -s “$DISK” mkpart primary ext4 1MiB 100%
# Forçar rerelectura de la taula partprobe “$DISK” || true udevadm settle || true sleep 1
# Detectar la partició creada PART=“$(lsblk -lnrp -o NAME,TYPE “$DISK” | awk '$2==“part”{print $1; exit}')” if -z "$PART"; then
# Intent bàsic
PART="${DISK}1"
fi if ! -b "$PART"; then
err "No s'ha pogut detectar la partició creada a $DISK." exit 1
fi msg “Partició detectada: $PART”
msg “Formatejant $PART com ext4 amb etiqueta '$LABEL'…” mkfs.ext4 -F -L “$LABEL” “$PART”
UUID=“$(blkid -s UUID -o value “$PART” || true)” if -z "$UUID"; then
err "No s'ha pogut obtindre l'UUID de $PART." exit 1
fi msg “UUID de la partició: $UUID”
msg “Creant el punt de muntatge: $MNT” mkdir -p “$MNT”
# Fer còpia de seguretat de fstab ts=“$(date +%Y%m%d-%H%M%S)” cp /etc/fstab “/etc/fstab.bak-$ts”
# Preparar línia /etc/fstab FSTAB_LINE=“UUID=$UUID $MNT ext4 defaults,noatime 0 2”
# Evitar duplicats: eliminar entrades anteriors per al mateix MNT o UUID sed -i.bak “/space$MNTspace/d” /etc/fstab sed -i.bak “/UUID=$UUIDspace/d” /etc/fstab
msg “Afegint entrada a /etc/fstab…” echo “$FSTAB_LINE” » /etc/fstab
msg “Muntant el sistema de fitxers…” mount “$MNT”
echo msg “✅ Operació completada amb èxit!” echo -e “ ${BOLD}Partició:${NC} $PART” echo -e “ ${BOLD}UUID:${NC} $UUID” echo -e “ ${BOLD}Muntada a:${NC} $MNT” echo echo “Resum:” lsblk -f “$DISK” echo echo “Contingut /etc/fstab (línia afegida):” echo “$FSTAB_LINE”
