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'