#!/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:]]$MNT[[:space:]]/d" /etc/fstab sed -i.bak "/UUID=$UUID[[:space:]]/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"