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:
parent
f3a5772dfc
commit
c0020277a0
2 changed files with 233 additions and 3 deletions
228
code/linux/linux-mint/verif-disque.sh
Executable file
228
code/linux/linux-mint/verif-disque.sh
Executable 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'
|
||||||
|
|
@ -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*
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue