148 lines
4.1 KiB
Bash
Executable File
148 lines
4.1 KiB
Bash
Executable File
#!/usr/bin/env bash
|
||
#
|
||
# usb-format.sh — formate proprement une clé USB / carte SD
|
||
# Usage: usb-format.sh /dev/sdX [fat32|exfat|ext4] [LABEL]
|
||
|
||
set -euo pipefail
|
||
|
||
DEVICE="${1:-}"
|
||
FSTYPE="${2:-fat32}"
|
||
LABEL="${3:-}"
|
||
|
||
if [[ -z "$DEVICE" ]]; then
|
||
echo "Usage: $0 /dev/sdX [fat32|exfat|ext4] [LABEL]"
|
||
echo
|
||
echo "Périphériques disponibles :"
|
||
lsblk -d -o NAME,SIZE,MODEL,TRAN
|
||
exit 1
|
||
fi
|
||
|
||
# Normaliser le chemin (accepte "sdb" ou "/dev/sdb")
|
||
[[ "$DEVICE" != /dev/* ]] && DEVICE="/dev/$DEVICE"
|
||
|
||
# --- Garde-fous ---
|
||
|
||
if [[ ! -b "$DEVICE" ]]; then
|
||
echo "Erreur : $DEVICE n'est pas un périphérique bloc valide."
|
||
exit 1
|
||
fi
|
||
|
||
if [[ "$DEVICE" == "/dev/nvme0n1" || "$DEVICE" =~ ^/dev/nvme0n1p[0-9]+$ ]]; then
|
||
echo "Erreur : $DEVICE correspond au disque interne (nvme0n1). Abandon."
|
||
exit 1
|
||
fi
|
||
|
||
ROOT_SRC=$(findmnt -n -o SOURCE / || true)
|
||
if [[ -n "$ROOT_SRC" && "$ROOT_SRC" == "$DEVICE"* ]]; then
|
||
echo "Erreur : $DEVICE semble contenir la partition racine. Abandon."
|
||
exit 1
|
||
fi
|
||
|
||
TRAN=$(lsblk -d -no TRAN "$DEVICE" 2>/dev/null || echo "?")
|
||
if [[ "$TRAN" != "usb" ]]; then
|
||
echo "Attention : $DEVICE n'est pas détecté comme périphérique USB (TRAN=$TRAN)."
|
||
fi
|
||
|
||
case "$FSTYPE" in
|
||
fat32|exfat|ext4) ;;
|
||
*)
|
||
echo "Erreur : type de système de fichiers non supporté : $FSTYPE"
|
||
echo "Choix possibles : fat32, exfat, ext4"
|
||
exit 1
|
||
;;
|
||
esac
|
||
|
||
if [[ -z "$LABEL" ]]; then
|
||
read -rp "Nom de la partition (label) : " LABEL
|
||
LABEL="${LABEL:-USB}"
|
||
fi
|
||
|
||
if [[ "$FSTYPE" == "fat32" && ${#LABEL} -gt 11 ]]; then
|
||
echo "Attention : FAT32 limite le label à 11 caractères, il sera tronqué."
|
||
fi
|
||
|
||
# --- Nouvelle demande : type de table de partition ---
|
||
echo
|
||
echo "Choisissez le type de table de partition :"
|
||
echo " [1] msdos (MBR) – recommandé pour la compatibilité avec les vieux appareils (imprimantes, consoles)"
|
||
echo " [2] gpt – pour les disques >2 To ou l'UEFI moderne"
|
||
read -rp "Votre choix (1 ou 2, défaut=1) : " PT_CHOICE
|
||
PT_CHOICE="${PT_CHOICE:-1}"
|
||
case "$PT_CHOICE" in
|
||
1|msdos|mbr) PART_TABLE="msdos" ;;
|
||
2|gpt) PART_TABLE="gpt" ;;
|
||
*)
|
||
echo "Choix invalide, utilisation de msdos par défaut."
|
||
PART_TABLE="msdos"
|
||
;;
|
||
esac
|
||
echo "-> Table de partition choisie : $PART_TABLE"
|
||
|
||
echo "==================================================="
|
||
echo " Périphérique : $DEVICE"
|
||
echo " Transport : $TRAN"
|
||
echo " Système de fichiers: $FSTYPE"
|
||
echo " Label : $LABEL"
|
||
echo " Table de partition : $PART_TABLE"
|
||
echo "==================================================="
|
||
lsblk -f "$DEVICE"
|
||
echo
|
||
echo "TOUTES LES DONNÉES SUR $DEVICE VONT ÊTRE EFFACÉES."
|
||
read -rp "Tape le nom du périphérique ($DEVICE) pour confirmer : " CONFIRM
|
||
if [[ "$CONFIRM" != "$DEVICE" ]]; then
|
||
echo "Confirmation invalide. Abandon."
|
||
exit 1
|
||
fi
|
||
|
||
# --- Nettoyage et préparation ---
|
||
echo "--> Démontage des partitions existantes..."
|
||
for part in "${DEVICE}"?*; do
|
||
[[ -b "$part" ]] && sudo umount "$part" 2>/dev/null || true
|
||
done
|
||
|
||
echo "--> Suppression des signatures existantes..."
|
||
sudo wipefs -a "$DEVICE"
|
||
|
||
# --- CORRECTION : forcer le rechargement du périphérique avant parted ---
|
||
echo "--> Relecture de la table par le noyau..."
|
||
sudo partprobe "$DEVICE" 2>/dev/null || true
|
||
sudo udevadm settle
|
||
sleep 1
|
||
|
||
echo "--> Création d'une nouvelle table de partitions ($PART_TABLE)..."
|
||
sudo parted -s "$DEVICE" mklabel "$PART_TABLE"
|
||
|
||
# --- Création de la partition ---
|
||
echo "--> Création de la partition..."
|
||
sudo parted -s "$DEVICE" mkpart primary 1MiB 100%
|
||
sudo partprobe "$DEVICE"
|
||
sudo udevadm settle
|
||
sleep 1
|
||
|
||
# Déterminer le nom de la première partition
|
||
PART="${DEVICE}1"
|
||
[[ "$DEVICE" =~ nvme|mmcblk ]] && PART="${DEVICE}p1"
|
||
|
||
# Attendre que la partition soit créée
|
||
sleep 1
|
||
if [[ ! -b "$PART" ]]; then
|
||
echo "Erreur : la partition $PART n'a pas été créée."
|
||
exit 1
|
||
fi
|
||
|
||
echo "--> Formatage en $FSTYPE..."
|
||
case "$FSTYPE" in
|
||
fat32)
|
||
sudo mkfs.vfat -F32 -n "${LABEL^^}" "$PART"
|
||
;;
|
||
exfat)
|
||
sudo mkfs.exfat -n "$LABEL" "$PART"
|
||
;;
|
||
ext4)
|
||
sudo mkfs.ext4 -L "$LABEL" "$PART"
|
||
;;
|
||
esac
|
||
|
||
echo "--> Terminé."
|
||
lsblk -f "$DEVICE"
|