Ces trois fichiers vivaient dans le dépôt du wiki, seuls fichiers exécutables parmi cent dix pages de documentation. Le wiki est public et sa branche main n'est pas protégée ; le serveur de l'install party en recopie deux toutes les heures et les distribue en root aux machines des participants. Un commit de documentation et un commit de code y avaient donc les mêmes conséquences, et rien ne le disait. Ils sont désormais chez eux, classés par contexte d'exécution — qui les lance, sur quelle machine, avec quels droits — et non par distribution : « poste/ » tient les trois ensemble, ce qu'impose de toute façon l'appel du relevé par install.sh, qui le cherche à côté de lui. La branche stable est ce que les machines reçoivent, main ce sur quoi on travaille. Avancer l'une sur l'autre demande d'avoir essayé sur une machine : c'est le relecteur qui manquait. L'historique des trois fichiers est conservé, depuis la migration du monorepo alpinux.site.2026 en mai. Les adresses de téléchargement de leurs en-têtes sont reprises. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BssvzfDMeXVoUQHEcnavW7
236 lines
11 KiB
Bash
Executable file
236 lines
11 KiB
Bash
Executable file
#!/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.scripts/raw/branch/stable/poste/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
|
|
TROUVE_LINUX=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)
|
|
ETIQUETTE=$(blkid -s LABEL -o value "$part" 2>/dev/null)
|
|
ok "$part : partition Linux ($type)${ETIQUETTE:+ — « $ETIQUETTE »}"
|
|
TROUVE_LINUX=1
|
|
;;
|
|
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 -pnl -o NAME,FSTYPE | awk 'NF==2 && $1 ~ /[0-9]$/')
|
|
|
|
[ "$TROUVE_WINDOWS" = "0" ] && info "Aucune partition Windows détectée."
|
|
|
|
if [ "$TROUVE_LINUX" = "1" ]; then
|
|
attention "Un système Linux occupe déjà ce disque"
|
|
AVERTISSEMENTS+=("Linux déjà installé — sauvegarder /home avant de réinstaller")
|
|
fi
|
|
|
|
# ─────────────────────────────────────────────────────────────────────
|
|
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'
|