From 2cbf64c16cf449877f3bb90d2905ed619a955a9d Mon Sep 17 00:00:00 2001 From: Alpinux Date: Sun, 20 Sep 2026 08:55:18 +0200 Subject: [PATCH] =?UTF-8?q?Ajouter=20un=20script=20d'=C3=A9tat=20des=20lie?= =?UTF-8?q?ux=20du=20disque=20avant=20installation?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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) Claude-Session: https://claude.ai/code/session_01BE4rvHVETRoWnYNDTGssdo --- poste/verif-disque.sh | 228 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 228 insertions(+) create mode 100755 poste/verif-disque.sh diff --git a/poste/verif-disque.sh b/poste/verif-disque.sh new file mode 100755 index 0000000..8ff6dad --- /dev/null +++ b/poste/verif-disque.sh @@ -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'