Ajouter un script d'état des lieux du disque avant installation

En install party, personne ne regarde le disque avant de le partitionner.
On découvre en cours de route qu'il y avait deux disques, une partition
de récupération, un Windows chiffré par BitLocker ou un disque fatigué —
et il est alors trop tard.

En session live, taper les commandes une à une est fastidieux et suppose
de les connaître. Le script les enchaîne et rend un verdict lisible :
machine (64 bits, RAM, édition conseillée), mode de démarrage et Secure
Boot, disques et tables de partition, systèmes déjà installés, BitLocker,
hibernation de Windows, LUKS, santé SMART, accès réseau. Il se termine par
deux listes : ce qui bloque, et ce qu'il faut savoir.

Il ne modifie rien — lectures seules, montages en lecture seule et
démontés dans la foulée.

Au passage, l'encadré du guide sur le script de post-installation
annonçait une licence à accepter à la main : l'exécution réelle montre
que les polices Microsoft s'installent sans intervention.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BE4rvHVETRoWnYNDTGssdo
This commit is contained in:
Alpinux 2026-09-20 08:55:18 +02:00
parent f3a5772dfc
commit c0020277a0
2 changed files with 233 additions and 3 deletions

View file

@ -0,0 +1,228 @@
#!/bin/bash
#
# Alpinux — état des lieux d'une machine avant d'installer Linux Mint
#
# À lancer depuis la session live, AVANT de toucher au disque :
# wget https://gitea.alpinux.org/alpinux.cedrica5l/alpinux-wiki/raw/branch/main/code/linux/linux-mint/verif-disque.sh
# chmod +x verif-disque.sh
# ./verif-disque.sh
#
# Ou, sur le réseau de l'install party :
# wget http://10.0.0.1/verif-disque.sh && chmod +x verif-disque.sh && ./verif-disque.sh
#
# Le script ne modifie RIEN : il lit, il affiche, il conseille. Il peut s'exécuter
# sans droits d'administration, mais plusieurs vérifications les demandent : il
# relance alors sudo de lui-même.
#
# testé le 20/09/2026 sur Linux Mint 22.3 Cinnamon
set -u
VERT=$'\e[32m'; ROUGE=$'\e[31m'; ORANGE=$'\e[33m'; GRAS=$'\e[1m'; RAZ=$'\e[0m'
titre() { printf '\n%s%s%s\n' "$GRAS" "$1" "$RAZ"; printf '%s\n' "${1//?/─}"; }
ok() { printf ' %s✓%s %s\n' "$VERT" "$RAZ" "$1"; }
attention(){ printf ' %s!%s %s\n' "$ORANGE" "$RAZ" "$1"; }
probleme(){ printf ' %s✗%s %s\n' "$ROUGE" "$RAZ" "$1"; }
info() { printf ' %s\n' "$1"; }
# Les alertes collectées en chemin, résumées à la fin.
AVERTISSEMENTS=()
BLOQUANTS=()
if [ "$(id -u)" != "0" ]; then
echo "Certaines vérifications demandent les droits d'administration."
exec sudo -- "$0" "$@"
fi
printf '%s\n' "════════════════════════════════════════════════════════════"
printf '%s\n' " Alpinux — état des lieux avant installation"
printf '%s\n' " $(date '+%d/%m/%Y %H:%M')"
printf '%s\n' "════════════════════════════════════════════════════════════"
# ─────────────────────────────────────────────────────────────────────
titre "La machine"
MODELE="$(cat /sys/devices/virtual/dmi/id/sys_vendor 2>/dev/null) $(cat /sys/devices/virtual/dmi/id/product_name 2>/dev/null)"
info "Modèle : ${MODELE:-inconnu}"
info "Processeur : $(grep -m1 'model name' /proc/cpuinfo | cut -d: -f2- | sed 's/^ //')"
if grep -qw lm /proc/cpuinfo; then
ok "Processeur 64 bits"
else
probleme "Processeur 32 bits : Linux Mint ne s'installera pas"
BLOQUANTS+=("Processeur 32 bits — voir Debian ou LMDE")
fi
RAM_MO=$(( $(grep MemTotal /proc/meminfo | tr -dc '0-9') / 1024 ))
info "Mémoire vive : ${RAM_MO} Mo"
if [ "$RAM_MO" -lt 2000 ]; then
probleme "Moins de 2 Go : en dessous du minimum de Linux Mint"
BLOQUANTS+=("RAM insuffisante (${RAM_MO} Mo)")
elif [ "$RAM_MO" -lt 4000 ]; then
attention "Moins de 4 Go : conseillez l'édition Xfce plutôt que Cinnamon"
AVERTISSEMENTS+=("RAM de ${RAM_MO} Mo — édition Xfce conseillée")
else
ok "Mémoire suffisante pour l'édition Cinnamon"
fi
# ─────────────────────────────────────────────────────────────────────
titre "Le mode de démarrage"
if [ -d /sys/firmware/efi ]; then
ok "Démarrage en UEFI — le disque sera en GPT, avec une partition EFI"
MODE=UEFI
SB=/sys/firmware/efi/efivars/SecureBoot-8be4df61-93ca-11d2-aa0d-00e098032b8c
if [ -r "$SB" ]; then
if [ "$(od -An -t u1 "$SB" 2>/dev/null | awk '{print $5}')" = "1" ]; then
attention "Secure Boot actif : à désactiver si un pilote propriétaire est nécessaire"
AVERTISSEMENTS+=("Secure Boot actif")
else
ok "Secure Boot désactivé"
fi
fi
else
attention "Démarrage en BIOS hérité — le disque sera en MBR, sans partition EFI"
MODE=BIOS
AVERTISSEMENTS+=("Machine démarrée en mode BIOS hérité")
fi
# ─────────────────────────────────────────────────────────────────────
titre "Les disques"
mapfile -t DISQUES < <(lsblk -dn -o NAME,TYPE | awk '$2=="disk"{print $1}')
NB_DISQUES=${#DISQUES[@]}
if [ "$NB_DISQUES" -eq 0 ]; then
probleme "Aucun disque détecté"
BLOQUANTS+=("Aucun disque vu par le système — contrôleur SATA en RAID/Intel RST ?")
elif [ "$NB_DISQUES" -gt 1 ]; then
attention "$NB_DISQUES disques présents : identifiez le bon avant de partitionner"
AVERTISSEMENTS+=("$NB_DISQUES disques — risque d'effacer le mauvais")
fi
for d in "${DISQUES[@]}"; do
TAILLE=$(lsblk -dn -o SIZE "/dev/$d" | tr -d ' ')
ROT=$(cat "/sys/block/$d/queue/rotational" 2>/dev/null)
TYPE=$([ "$ROT" = "0" ] && echo "SSD/NVMe" || echo "disque mécanique")
TABLE=$(blkid -p -s PTTYPE -o value "/dev/$d" 2>/dev/null || echo "aucune")
printf '\n %s/dev/%s%s — %s, %s, table %s\n' "$GRAS" "$d" "$RAZ" "$TAILLE" "$TYPE" "${TABLE:-aucune}"
lsblk -o NAME,SIZE,FSTYPE,LABEL,FSUSE%,MOUNTPOINT "/dev/$d" | sed '1d;s/^/ /'
TAILLE_GO=$(( $(lsblk -dbn -o SIZE "/dev/$d") / 1000000000 ))
if [ "$TAILLE_GO" -lt 11 ]; then
probleme " Moins de 11 Go : l'installateur refusera de démarrer"
BLOQUANTS+=("/dev/$d trop petit (${TAILLE_GO} Go)")
elif [ "$TAILLE_GO" -lt 30 ]; then
attention " ${TAILLE_GO} Go : installable, mais en dessous des 30 Go conseillés"
AVERTISSEMENTS+=("/dev/$d de ${TAILLE_GO} Go seulement")
fi
if [ "$MODE" = "UEFI" ] && [ "$TABLE" = "dos" ]; then
attention " Machine en UEFI mais disque en MBR : table à refaire en GPT"
AVERTISSEMENTS+=("/dev/$d en MBR alors que la machine démarre en UEFI")
fi
done
# ─────────────────────────────────────────────────────────────────────
titre "Ce qui est déjà installé"
TROUVE_WINDOWS=0
while read -r part type; do
[ -z "$part" ] && continue
case "$type" in
BitLocker)
probleme "$part : partition chiffrée par BitLocker"
BLOQUANTS+=("$part chiffrée BitLocker — suspendre le chiffrement depuis Windows AVANT de toucher au disque")
TROUVE_WINDOWS=1
;;
ntfs)
TROUVE_WINDOWS=1
ETIQUETTE=$(blkid -s LABEL -o value "$part" 2>/dev/null)
ok "$part : partition Windows (NTFS)${ETIQUETTE:+ — « $ETIQUETTE »}"
POINT=$(mktemp -d)
if mount -o ro,noexec,nosuid "$part" "$POINT" 2>/dev/null; then
[ -f "$POINT/hiberfil.sys" ] && {
attention " hiberfil.sys présent : Windows est en veille prolongée ou en démarrage rapide"
AVERTISSEMENTS+=("$part : désactiver le démarrage rapide de Windows, puis arrêt complet")
}
[ -d "$POINT/Windows" ] && info " Windows installé sur cette partition"
umount "$POINT" 2>/dev/null
else
attention " Montage impossible en lecture seule : partition sale, chiffrée, ou mal démontée"
AVERTISSEMENTS+=("$part illisible — Windows mal arrêté ?")
fi
rmdir "$POINT" 2>/dev/null
;;
ext4|ext3|btrfs|xfs)
ok "$part : partition Linux ($type)"
;;
vfat)
if [ "$(blkid -s PARTLABEL -o value "$part" 2>/dev/null)" = "EFI system partition" ] \
|| [ "$(lsblk -no PARTTYPENAME "$part" 2>/dev/null)" = "EFI System" ]; then
ok "$part : partition EFI existante — à réutiliser, pas à recréer"
fi
;;
crypto_LUKS)
attention "$part : partition chiffrée LUKS"
AVERTISSEMENTS+=("$part chiffrée (LUKS) — récupérer la phrase de passe avant d'effacer")
;;
esac
done < <(lsblk -pn -o NAME,FSTYPE | awk 'NF==2 && $1 ~ /[0-9]$/')
[ "$TROUVE_WINDOWS" = "0" ] && info "Aucune partition Windows détectée."
# ─────────────────────────────────────────────────────────────────────
titre "Santé des disques"
if command -v smartctl >/dev/null; then
for d in "${DISQUES[@]}"; do
SANTE=$(smartctl -H "/dev/$d" 2>/dev/null | grep -Ei 'overall-health|SMART Health' | cut -d: -f2- | sed 's/^ *//')
case "$SANTE" in
*PASSED*|*OK*) ok "/dev/$d : $SANTE" ;;
"") info "/dev/$d : pas d'information SMART (disque virtuel, USB, ou contrôleur muet)" ;;
*) probleme "/dev/$d : $SANTE"
BLOQUANTS+=("/dev/$d signalé défaillant par SMART — ne pas installer dessus") ;;
esac
REALLOC=$(smartctl -A "/dev/$d" 2>/dev/null | awk '/Reallocated_Sector_Ct/{print $10}')
if [ -n "${REALLOC:-}" ] && [ "$REALLOC" -gt 0 ] 2>/dev/null; then
attention "/dev/$d : $REALLOC secteurs réalloués — disque fatigué"
AVERTISSEMENTS+=("/dev/$d : $REALLOC secteurs réalloués")
fi
done
else
info "smartmontools absent de la session live."
info "Pour l'ajouter : sudo apt update && sudo apt install -y smartmontools"
fi
# ─────────────────────────────────────────────────────────────────────
titre "Réseau"
if ping -c1 -W3 archive.ubuntu.com >/dev/null 2>&1; then
ok "Connexion à Internet fonctionnelle (mises à jour et codecs téléchargeables)"
else
attention "Pas d'accès à Internet : branchez le câble réseau avant d'installer"
AVERTISSEMENTS+=("Pas de réseau — codecs et mises à jour ne s'installeront pas")
fi
# ─────────────────────────────────────────────────────────────────────
titre "Conclusion"
if [ ${#BLOQUANTS[@]} -gt 0 ]; then
printf ' %s%sÀ RÉGLER AVANT D'"'"'INSTALLER%s\n' "$GRAS" "$ROUGE" "$RAZ"
for b in "${BLOQUANTS[@]}"; do printf ' %s✗%s %s\n' "$ROUGE" "$RAZ" "$b"; done
echo
fi
if [ ${#AVERTISSEMENTS[@]} -gt 0 ]; then
printf ' %s%sÀ SAVOIR%s\n' "$GRAS" "$ORANGE" "$RAZ"
for a in "${AVERTISSEMENTS[@]}"; do printf ' %s!%s %s\n' "$ORANGE" "$RAZ" "$a"; done
echo
fi
if [ ${#BLOQUANTS[@]} -eq 0 ] && [ ${#AVERTISSEMENTS[@]} -eq 0 ]; then
printf ' %s✓%s Rien ne s'"'"'oppose à l'"'"'installation.\n\n' "$VERT" "$RAZ"
fi
printf ' Dans le doute, montrez cet écran à un bénévole avant de continuer.\n'
printf ' Guide complet : https://wiki.alpinux.org/guides/linux-mint-depuis-windows/\n\n'

View file

@ -530,9 +530,11 @@ Ce que le script met en place :
Le script s'efface lui-même une fois terminé. Le script s'efface lui-même une fois terminé.
!!! note "Il attend une réponse" !!! note "Comptez vingt minutes, et une connexion qui tient"
L'installation des polices Microsoft affiche une licence à accepter : le script n'est Le script installe les polices Microsoft (leur licence est acceptée automatiquement),
pas entièrement automatique, restez devant la première minute. puis applique la mise à jour complète du système — plusieurs centaines de paquets sur
une installation neuve. Il demande le mot de passe au début, pour se relancer avec les
droits d'administration, puis se déroule seul.
!!! info "Pourquoi installer les polices Microsoft ?" !!! info "Pourquoi installer les polices Microsoft ?"
Linux utilise des polices libres. Un document reçu en *Arial* ou *Times New Roman* Linux utilise des polices libres. Un document reçu en *Arial* ou *Times New Roman*