La durée réelle d'une installation est l'écart entre les deux relevés d'une même machine, horodatés par le serveur. Sans relevé en session live, il n'y a pas d'heure de départ, et la seule chose qu'on mesure est la post-installation. D'où la consigne : on lance install.sh dès le live. Encore fallait-il qu'il s'y arrête. Il le faisait, mais mal, et le détail comptait : - la détection ne reposait que sur /cdrom/preseed/linuxmint.seed, le signe dont le relevé a démontré le 24/09 qu'il désigne aussi des machines installées — et s'il manque sur l'ISO du jour, c'est l'inverse qui se produit : le script installe des paquets dans un système vivant en mémoire, qui disparaîtra au redémarrage ; - elle n'intervenait qu'au milieu de modif_systeme, après configuration_apt, donc après une première modification ; - lancé sans sudo, il passait d'abord par personnalisation_utilisateur, puis la sortie en « exit 0 » de la relance était lue comme une réussite : le script annonçait « Installation terminée avec succès » et se supprimait lui-même. La session live est donc écartée en tête de fichier, avant quoi que ce soit, avec la détection éprouvée du relevé : racine en overlay ou squashfs, et boot=casper sur la ligne du noyau. Le script lance le relevé — avec --check, pour que le verdict s'affiche et qu'on ait le temps de le lire — dit que rien n'a été installé et que le serveur a noté l'heure de départ, puis s'arrête sans se supprimer. Les cinq situations sont vérifiées, dont le piège du 24/09 : un /cdrom monté en ext4 sur une machine installée reste une machine installée. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BssvzfDMeXVoUQHEcnavW7
470 lines
No EOL
16 KiB
Bash
470 lines
No EOL
16 KiB
Bash
#!/bin/bash
|
|
|
|
##################################################
|
|
# Fiche matérielle pour le serveur de l'install party
|
|
#
|
|
# Placée au début, et non à la fin : si un disque faiblit, autant le savoir
|
|
# avant d'avoir passé une heure à installer dessus — c'est le moment où l'on
|
|
# peut encore en parler à son propriétaire. Et si l'installation s'arrête en
|
|
# route, on a tout de même la fiche.
|
|
#
|
|
# Le relevé est le script voisin du dépôt, lu et versionné comme celui-ci :
|
|
# rien n'est téléchargé ni exécuté depuis le réseau. S'il n'est pas là, on
|
|
# passe — la machine d'un particulier qui rejoue ce script chez elle ne doit
|
|
# rien avoir à faire de tout ceci.
|
|
#
|
|
# C'est la seconde passe, celle que « sudo » relance, qui l'exécute :
|
|
# dmidecode et smartctl demandent les droits d'administration.
|
|
##################################################
|
|
|
|
if [ "$(id -u)" = "0" ] && [ -x "$(dirname "$0")/alpi-fiche.sh" ]; then
|
|
"$(dirname "$0")/alpi-fiche.sh" || true
|
|
fi
|
|
|
|
##################################################
|
|
# Une session live : relever, et ne rien installer
|
|
#
|
|
# On lance ce script dès la session live, avant même d'installer : c'est ce
|
|
# premier relevé qui donne au serveur l'heure de départ. La durée réelle d'une
|
|
# installation est l'écart entre les deux relevés d'une même machine, horodatés
|
|
# par le serveur — sans le premier, on ne mesure rien.
|
|
#
|
|
# Rien n'est installé ici. Le système live vit en mémoire et disparaîtra au
|
|
# redémarrage : y poser des paquets coûterait du temps et de la place, sans
|
|
# rien laisser. Le script s'arrête donc après le relevé, et se relance après
|
|
# l'installation.
|
|
#
|
|
# La détection est celle du relevé, éprouvée le 24/09/2026 : la racine montée
|
|
# en overlay ou squashfs, ce qu'aucun système installé ne fait, et « boot=casper »
|
|
# sur la ligne de commande du noyau. L'existence de /cdrom n'en fait pas partie :
|
|
# l'installateur de Mint en laisse un vide derrière lui, et s'y fier faisait
|
|
# prendre des machines installées pour des sessions live.
|
|
##################################################
|
|
|
|
en_session_live() {
|
|
findmnt -n -o FSTYPE / 2>/dev/null | grep -qE '^(overlay|aufs|squashfs)$' \
|
|
|| grep -qE '(^| )boot=(casper|live)( |$)' /proc/cmdline 2>/dev/null \
|
|
|| mountpoint -q /rofs 2>/dev/null \
|
|
|| { mountpoint -q /cdrom 2>/dev/null \
|
|
&& findmnt -n -o FSTYPE /cdrom 2>/dev/null | grep -qE '^(iso9660|squashfs)$'; }
|
|
}
|
|
|
|
if en_session_live; then
|
|
echo ""
|
|
echo "==> Session live détectée : rien ne sera installé."
|
|
echo ""
|
|
releve="$(dirname "$0")/alpi-fiche.sh"
|
|
if [ -x "$releve" ]; then
|
|
if [ "$(id -u)" = "0" ]; then
|
|
"$releve" --check || true
|
|
else
|
|
sudo "$releve" --check || true
|
|
fi
|
|
echo ""
|
|
echo "==> Le serveur a noté l'heure de départ de cette installation."
|
|
else
|
|
echo " Le relevé alpi-fiche.sh n'est pas à côté de ce script : le"
|
|
echo " décompte ne démarrera pas. Prenez-le sur le serveur :"
|
|
echo " wget http://alpicache.lan/alpi-fiche.sh && chmod +x alpi-fiche.sh"
|
|
fi
|
|
echo " Relancez ce script après l'installation, sur le système installé."
|
|
echo ""
|
|
exit 0
|
|
fi
|
|
|
|
|
|
|
|
# Script de post-installation pour Linux Mint 22.3
|
|
# testé le 25/03/2026
|
|
#
|
|
# utilisation
|
|
# wget https://gitea.alpinux.org/alpinux.cedrica5l/alpinux.scripts/raw/branch/stable/poste/install.sh
|
|
# && chmod +x install.sh
|
|
# && ./install.sh
|
|
|
|
|
|
GREEN=$'\e[32m'
|
|
NC=$'\e[0m'
|
|
|
|
abort() {
|
|
echo ""
|
|
echo ""
|
|
echo "Erreur : $1. Abandon" > /dev/stderr
|
|
exit 1
|
|
}
|
|
|
|
|
|
config_firefox_fr() {
|
|
echo -e "==> Configuration de Firefox en Français par défaut\n"
|
|
|
|
# Création d'un fichier de préférences globales pour Firefox
|
|
mkdir -p /usr/lib/firefox/browser/defaults/preferences
|
|
cat <<EOF > /usr/lib/firefox/browser/defaults/preferences/syspref.js
|
|
// Forcer la langue en Français
|
|
pref("intl.locale.requested", "fr");
|
|
// Activer le dictionnaire fr par défaut
|
|
pref("spellchecker.dictionary", "fr");
|
|
// Langues préférées pour les sites web
|
|
pref("intl.accept_languages", "fr, fr-fr, en-us, en");
|
|
// Activer les DRM (Netflix/Prime)
|
|
pref("media.eme.enabled", true);
|
|
EOF
|
|
}
|
|
|
|
|
|
config_libreoffice() {
|
|
echo -e "==> Vérification du support français LibreOffice\n"
|
|
# Le paquet l10n-fr installe l'interface, hunspell-fr installe le dictionnaire ABC
|
|
apt install -y libreoffice-l10n-fr hunspell-fr mythes-fr hyphen-fr
|
|
}
|
|
|
|
|
|
prepa_restauration_firefox() {
|
|
# Si on est en root via sudo, on récupère le vrai utilisateur
|
|
local ACTUAL_USER=${SUDO_USER:-$USER}
|
|
local ACTUAL_HOME=$(getent passwd "$ACTUAL_USER" | cut -d: -f6)
|
|
|
|
echo -e "==> Préparation du dossier Firefox pour $ACTUAL_USER\n"
|
|
|
|
# Création du dossier avec les bons droits
|
|
mkdir -p "$ACTUAL_HOME/.mozilla/firefox"
|
|
chown -R "$ACTUAL_USER:$ACTUAL_USER" "$ACTUAL_HOME/.mozilla"
|
|
|
|
echo "RAPPEL : Pour restaurer, copiez votre sauvegarde dans $ACTUAL_HOME/.mozilla/firefox/"
|
|
}
|
|
|
|
|
|
microcode() {
|
|
echo -e "==> Installation du microcode (Sécurité CPU)\n"
|
|
|
|
# Détection du fabricant du CPU
|
|
CPU_VENDOR=$(grep -m 1 'vendor_id' /proc/cpuinfo | awk '{print $3}')
|
|
|
|
case "$CPU_VENDOR" in
|
|
GenuineIntel)
|
|
echo "Processeur Intel détecté..."
|
|
apt install -y intel-microcode
|
|
;;
|
|
AuthenticAMD)
|
|
echo "Processeur AMD détecté..."
|
|
apt install -y amd64-microcode
|
|
;;
|
|
*)
|
|
echo "Fabricant inconnu ($CPU_VENDOR), saut de l'étape microcode."
|
|
;;
|
|
esac
|
|
}
|
|
|
|
|
|
|
|
opti_journald() {
|
|
echo -e "==> Optimizing system logs (Max 100MB)..."
|
|
|
|
# Use a regex that handles both commented and existing uncommented lines
|
|
sudo sed -i 's/^#\?SystemMaxUse=.*/SystemMaxUse=100M/' /etc/systemd/journald.conf
|
|
|
|
# Restart the daemon to apply changes
|
|
sudo systemctl restart systemd-journald
|
|
|
|
# Force immediate cleanup of logs older than the limit
|
|
sudo journalctl --vacuum-size=100M
|
|
|
|
echo -e "✅ Optimization complete.\n"
|
|
}
|
|
|
|
|
|
opti_fstab () {
|
|
echo -e "==> Optimisation du montage des disques (noatime)\n"
|
|
# Remplace relatime par noatime partout dans le fichier.
|
|
#
|
|
# ATTENTION : sans effet sur une installation Mint 22.3. Le fstab qu'écrit
|
|
# l'installateur ne mentionne ni « relatime » ni « noatime » — il s'en remet
|
|
# à « defaults », et relatime est le comportement par défaut du noyau. Il n'y
|
|
# a donc rien à substituer. Vérifié le 20/09/2026 sur une installation neuve.
|
|
# Pour poser réellement noatime, il faudrait ajouter l'option aux lignes
|
|
# concernées plutôt que d'en remplacer une qui n'y est pas.
|
|
sudo sed -i 's/relatime/noatime/g' /etc/fstab
|
|
}
|
|
|
|
|
|
opti_apt() {
|
|
# On s'assure d'avoir les droits root
|
|
if [[ $EUID -ne 0 ]]; then
|
|
echo "Erreur : Ce script doit être exécuté en tant que root (sudo)."
|
|
return 1
|
|
fi
|
|
|
|
echo -e "==> Optimisation du gestionnaire de paquets APT\n"
|
|
|
|
# 1. Supprime les fichiers .deb des paquets qui ne peuvent plus être téléchargés (obsolètes)
|
|
apt-get autoclean -y
|
|
|
|
# 2. Supprime la totalité du cache (ton code original)
|
|
apt-get clean
|
|
|
|
# 3. Supprime les dépendances inutilisées et leurs fichiers de config
|
|
apt-get autoremove --purge -y
|
|
|
|
# 4. Optionnel : Met à jour la liste des paquets pour repartir sur une base propre
|
|
# apt-get update
|
|
|
|
echo -e "\n[Terminé] Le système est plus léger !"
|
|
}
|
|
|
|
|
|
modif_systeme() {
|
|
|
|
configuration_apt
|
|
|
|
# La session live est écartée en tête de script, avant toute modification :
|
|
# ce test-ci arrivait après « configuration_apt », et ne reposait que sur un
|
|
# fichier de /cdrom — le signe dont on sait depuis le 24/09 qu'il désigne
|
|
# aussi des machines installées.
|
|
|
|
install_logiciels
|
|
config_firefox_fr
|
|
config_timeshift_desactive
|
|
microcode
|
|
opti_journald
|
|
opti_fstab
|
|
modif_grub
|
|
|
|
mises_a_jour
|
|
|
|
config_libreoffice
|
|
prepa_restauration_firefox
|
|
|
|
echo -e "==> Optimisation du Swappiness\n"
|
|
sysctl vm.swappiness=10
|
|
echo 'vm.swappiness=10' > /etc/sysctl.d/99-swappiness.conf
|
|
|
|
opti_apt
|
|
|
|
}
|
|
|
|
|
|
config_timeshift_desactive() {
|
|
echo -e "==> Désactivation des sauvegardes automatiques Timeshift\n"
|
|
|
|
# 1. On récupère l'UUID de la partition qui contient /home
|
|
# Si /home n'est pas une partition séparée, findmnt remontera à la racine /
|
|
HOME_DEV=$(findmnt -n -o SOURCE /home)
|
|
HOME_UUID=$(blkid -s UUID -o value "$HOME_DEV")
|
|
|
|
# 2. On s'assure que le dossier de config existe
|
|
mkdir -p /etc/timeshift
|
|
|
|
# 3. Écriture du JSON avec l'UUID détecté
|
|
cat <<EOF > /etc/timeshift/timeshift.json
|
|
{
|
|
"backup_device_uuid" : "$HOME_UUID",
|
|
"parent_uuid" : "",
|
|
"do_first_run" : "false",
|
|
"btrfs_mode" : "false",
|
|
"include_btrfs_home_for_snapshots" : "false",
|
|
"include_btrfs_home_for_restore" : "false",
|
|
"stop_cron_emails" : "true",
|
|
"schedule_monthly" : "false",
|
|
"schedule_weekly" : "false",
|
|
"schedule_daily" : "false",
|
|
"schedule_hourly" : "false",
|
|
"schedule_boot" : "false",
|
|
"count_monthly" : "0",
|
|
"count_weekly" : "0",
|
|
"count_daily" : "0",
|
|
"count_hourly" : "0",
|
|
"count_boot" : "0",
|
|
"snapshot_list" : [ ]
|
|
}
|
|
EOF
|
|
|
|
echo "Timeshift configuré sur la partition $HOME_DEV (UUID: $HOME_UUID) avec planning désactivé."
|
|
}
|
|
|
|
|
|
##########################################################
|
|
# Mises à jour et installation des logiciels utilisateur #
|
|
##########################################################
|
|
|
|
# Installation des polices Microsoft. On le fait au début pour pouvoir vite
|
|
# accepter l'EULA et pouvoir aller boire un café :-)
|
|
# L'astuce d'utiliser DEBIAN_FRONTEND=noninteractive ne marche plus, il faudrait
|
|
# préconfigurer debconf pour éviter d'avoir à répondre ici
|
|
install_logiciels() {
|
|
echo -e "==> Installation des polices Microsoft\n"
|
|
|
|
# 1. On pré-accepte la licence dans la base de données debconf
|
|
echo "ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true" | debconf-set-selections
|
|
|
|
# 2. On installe en forçant le mode non-interactif pour ignorer toute autre question
|
|
DEBIAN_FRONTEND=noninteractive apt install -y ttf-mscorefonts-installer || abort "problème lors de l'installation des polices"
|
|
|
|
# mise à jour du système
|
|
echo -e "==> Mise à jour du système\n"
|
|
apt update || abort "impossible de récupérer les informations des dépôts"
|
|
apt full-upgrade -y || abort "erreur lors de la mise à jour des paquets"
|
|
|
|
# installation de logiciels utilisateurs indispensables ou juste très utiles
|
|
# - backintime-qt pour avoir un bon logiciel de sauvegardes
|
|
# - brasero pour graver
|
|
# - cheese pour tester la webcam
|
|
# - fonts-contarell et fonts-linuxlibertine parce qu'elles sont jolies et complètes
|
|
# - keepassxc pour gérer les mots de passe
|
|
# - nemo-image-converter pour rapidement réduire des images pour l'envoi par mail
|
|
# - pdfarranger pour découper / assembler des PDF
|
|
# - verbiste-gnome pour la conjugaison
|
|
# - gparted pour organiser le partitionnement des disques
|
|
# - vlc pour lire les fichiers audio et vidéos
|
|
# - vnstat statisitques utilisation réseau
|
|
# - iftop afficher les connexions instantannée
|
|
# - numlockx activation du pavé numérique en X11
|
|
echo -e "==> Installation des programmes complémentaires\n"
|
|
apt install -y \
|
|
backintime-qt \
|
|
cheese \
|
|
fonts-cantarell fonts-linuxlibertine \
|
|
nemo-image-converter \
|
|
pdfarranger \
|
|
verbiste-gnome \
|
|
gparted \
|
|
vlc \
|
|
vnstat \
|
|
iftop \
|
|
numlockx \
|
|
hunspell-fr \
|
|
mint-meta-codecs \
|
|
tesseract-ocr tesseract-ocr-fra \
|
|
shotwell \
|
|
puddletag \
|
|
stacer \
|
|
|| abort "problème lors de l'installation des logiciels utilisateurs"
|
|
|
|
|
|
# Ajout du dépôt au niveau système (accessible à tous)
|
|
flatpak remote-add --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo
|
|
# Installation au niveau système de KeePassXC
|
|
flatpak install -y flathub org.keepassxc.KeePassXC
|
|
flatpak install -y flathub com.github.tchx84.Flatseal
|
|
|
|
|
|
# Installation de tous les paquets de langue
|
|
echo -e "==> Installation du support français pour les programmes déjà installés\n"
|
|
apt install -y language-selector-common
|
|
apt install -y $(check-language-support -l fr)
|
|
|
|
echo -e "==> Francisation de Firefox (.deb)\n"
|
|
# On installe le paquet de langue officiel des dépôts Mint/Ubuntu
|
|
apt install -y firefox-locale-fr || echo "Note: Impossible d'installer le pack FR pour Firefox apt."
|
|
# curl -L -o /usr/lib/firefox/distribution/extensions/dictionnaire-francais.xpi https://addons.mozilla.org/fr/firefox/downloads/latest/1750/addon-1750-latest.xpi
|
|
# sed -i 's/preferredDictionary =.*/preferredDictionary = fr/' /usr/lib/firefox-*/dictionaries/dictionaries.xml
|
|
}
|
|
################
|
|
# Mises à jour #
|
|
################
|
|
mises_a_jour() {
|
|
echo -e "==> Configuration de dconf\n"
|
|
# Configuration de dconf pour permettre de modifier certaines configurations
|
|
# par défaut
|
|
mkdir -p /etc/dconf/profile
|
|
echo -e\
|
|
"user-db:user\n"\
|
|
"system-db:local" > /etc/dconf/profile/user
|
|
mkdir -p /etc/dconf/db/local.d
|
|
|
|
# Ne pas demander à l'utilisateur l'utilisation de dépôts locaux
|
|
echo -e \
|
|
"[com/linuxmint/updates]\n"\
|
|
"default-repo-is-ok=true" > /etc/dconf/db/local.d/00-alpinux
|
|
|
|
dconf update
|
|
|
|
}
|
|
|
|
|
|
# Fonctions Utilisateur (SANS sudo)
|
|
personnalisation_utilisateur() {
|
|
echo -e "${GREEN}==> Personnalisation de l'environnement (User: $USER)${NC}"
|
|
# Cinnamon / Nemo
|
|
dconf write /org/nemo/desktop/trash-icon-visible true
|
|
dconf write /org/nemo/desktop/home-icon-visible true
|
|
dconf write /org/cinnamon/desktop/interface/clock-show-date true
|
|
dconf write /org/cinnamon/desktop/interface/first-day-of-week 1
|
|
# Note: sudo dconf update n'est pas nécessaire pour les clés utilisateur locales
|
|
}
|
|
|
|
|
|
configuration_apt() {
|
|
echo -e "==> Mise à jour de la liste des dépots\n"
|
|
apt update
|
|
# Met à jour les langues pour toutes les applications Flatpak installées
|
|
flatpak update -y
|
|
|
|
# Configuration de apt-proxy
|
|
echo -e "==> Configuration de apt-proxy\n"
|
|
apt install -y auto-apt-proxy || abort "Échec de l'installation d'auto-apt-proxy"
|
|
echo 'Acquire::http::ProxyAutoDetect "auto-apt-proxy";' > /etc/apt/apt.conf.d/01proxy
|
|
|
|
}
|
|
|
|
###############################################################
|
|
# GRUB : sélection automatique de la dernière entrée utilisée #
|
|
###############################################################
|
|
modif_grub() {
|
|
# Rien à faire si c'est déjà en place.
|
|
#
|
|
# update-grub lance os-prober, qui part sonder toutes les partitions de la
|
|
# machine à la recherche d'autres systèmes, puis régénère la configuration
|
|
# entière : vingt à trente secondes qu'on ne rattrape pas, et qu'on payait
|
|
# jusqu'ici à chaque exécution, y compris quand il n'y avait rien à
|
|
# changer. Sur une install party de quinze machines, cela se voit.
|
|
if grep -q '^GRUB_DEFAULT=saved' /etc/default/grub \
|
|
&& grep -q '^GRUB_SAVEDEFAULT=true' /etc/default/grub; then
|
|
echo -e "==> GRUB est déjà configuré, rien à changer\n"
|
|
return 0
|
|
fi
|
|
|
|
echo -e "==> Modification de GRUB\n"
|
|
# On commente la ligne d'origine, puis on ajoute les nôtres si elles
|
|
# manquent. Les ajouter plutôt que les insérer règle deux choses : le
|
|
# fichier ne se retrouve plus avec des lignes indentées — GRUB les accepte,
|
|
# mais elles trompent la lecture quand on vient déboguer —, et la fonction
|
|
# fait toujours son travail lorsque « GRUB_DEFAULT=0 » a disparu, ce qui
|
|
# arrive dès qu'un autre outil est passé avant nous.
|
|
sed -i 's/^GRUB_DEFAULT=0/#&/' /etc/default/grub
|
|
grep -q '^GRUB_DEFAULT=saved' /etc/default/grub \
|
|
|| echo 'GRUB_DEFAULT=saved' >> /etc/default/grub
|
|
grep -q '^GRUB_SAVEDEFAULT=true' /etc/default/grub \
|
|
|| echo 'GRUB_SAVEDEFAULT=true' >> /etc/default/grub
|
|
|
|
# On met à jour GRUB
|
|
update-grub
|
|
}
|
|
|
|
|
|
del_itself() {
|
|
# On ne supprime que si c'est un fichier physique existant
|
|
if [ -f "$0" ]; then
|
|
echo -e "\n==> Nettoyage : Suppression du script d'installation..."
|
|
rm "$0"
|
|
fi
|
|
}
|
|
|
|
|
|
##############################
|
|
# Auto-destruction du script #
|
|
##############################
|
|
|
|
if [ "$(id -u)" != "0" ]; then
|
|
personnalisation_utilisateur
|
|
# On relance le script en root pour la partie système
|
|
if sudo "$0" "$@"; then
|
|
echo -e "\nInstallation terminée avec succès !"
|
|
del_itself
|
|
else
|
|
echo -e "\nErreur lors de l'exécution en root."
|
|
exit 1
|
|
fi
|
|
else
|
|
modif_systeme
|
|
echo -e "\n${GREEN}Terminé ! Un redémarrage est conseillé.${NC}"
|
|
fi |