#!/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”