diff --git a/installer/install.sh b/installer/install.sh index 9a93e8c..98bed13 100644 --- a/installer/install.sh +++ b/installer/install.sh @@ -24,6 +24,48 @@ for _ in $(seq 1 30); do sleep 1 done +# Installe en 3 étapes séparées (partition -> swap sur le disque cible -> +# vrai build) au lieu d'un seul `disko-install`. Raison : disko-install +# fait tout d'un coup dans le tmpfs RAM de l'environnement live, qui sature +# sur les PC à peu de RAM (4 Go) avant même de toucher le disque cible. +# Un swapfile posé sur /mnt (une fois partitionné) donne accès aux ~200 Go +# du disque comme mémoire virtuelle pendant la vraie construction — méthode +# documentée officiellement pour les machines à RAM limitée, voir +# wiki.nixos.org/wiki/Swap et le manuel NixOS (section installation). +# +# Point non confirmé à 100% : que `disko` (seul, pas `disko-install`) +# accepte le même `--disk main ` que `disko-install`. La doc de +# référence de disko ne montre que `--argstr`, mais disko-install n'étant +# qu'un wrapper autour de disko, c'est très probable que ça marche pareil. +# Si la commande le refuse, l'erreur sera explicite. +do_install() { + local flake_url="$1" + local attr="$2" + + echo "Partitionnement de $DEVICE..." + nix run --no-write-lock-file --refresh 'github:nix-community/disko' -- \ + --mode destroy,format,mount \ + --flake "${flake_url}#${attr}" \ + --disk main "$DEVICE" + + echo "Swap temporaire sur le disque cible (RAM limitée sur certains PC du parc)..." + dd if=/dev/zero of=/mnt/.install-swapfile bs=1M count=4096 status=none + chmod 600 /mnt/.install-swapfile + mkswap /mnt/.install-swapfile + swapon /mnt/.install-swapfile + + echo "Construction et installation du système (peut prendre plusieurs minutes)..." + # --no-channel-copy, --no-root-passwd : confirmés dans le man nixos-install + # (mankier.com/8/nixos-install, miroir du manuel officiel). Le mot de + # passe root est de toute façon déjà déclaré (initialPassword) dans la + # config cible, --no-root-passwd évite juste tout risque de prompt + # interactif qui bloquerait un install non surveillé. + nixos-install --root /mnt --flake "${flake_url}#${attr}" --no-channel-copy --no-root-passwd + + swapoff /mnt/.install-swapfile + rm -f /mnt/.install-swapfile +} + echo "=== Installeur Nixos_Fleet ===" echo "1) PC de la flotte (générique)" echo "2) Poste utilisateur nommé" @@ -59,9 +101,7 @@ case "$CHOICE" in # --- Branche flotte : rien d'autre à saisir ----------------------- echo echo "Installation du profil générique 'usagers' sur $DEVICE..." - nix run --no-write-lock-file --refresh 'github:nix-community/disko#disko-install' -- --write-efi-boot-entries \ - --flake "${FLEET_REPO}#usagers" \ - --disk main "$DEVICE" + do_install "$FLEET_REPO" "usagers" ;; 2) @@ -94,9 +134,7 @@ case "$CHOICE" in if [[ "$ATTR" == *-luks ]]; then echo "Disque chiffré : disko va demander une passphrase LUKS pendant le partitionnement." fi - nix run --no-write-lock-file --refresh 'github:nix-community/disko#disko-install' -- --write-efi-boot-entries \ - --flake "${AUTHED_URL}#${ATTR}" \ - --disk main "$DEVICE" + do_install "$AUTHED_URL" "$ATTR" # Le système installé doit pouvoir continuer à tirer ses mises à jour # du repo privé tout seul : on lui laisse un netrc, jamais commité,