diff --git a/installer/install.sh b/installer/install.sh index 98bed13..75e8790 100644 --- a/installer/install.sh +++ b/installer/install.sh @@ -24,29 +24,43 @@ 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). +# Installe en 4 étapes séparées (clone -> 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 RAM limitée +# (wiki.nixos.org/wiki/Swap, 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. +# Le clone local est nécessaire car la commande `disko` seule (contrairement +# à `disko-install`) n'a AUCUN mécanisme de substitution de disque nommé +# (`--disk`/diskMappings n'existe que dans install-cli.nix, utilisé +# uniquement par disko-install — vérifié dans le code source de +# nix-community/disko : fichiers disko, disko-install, cli.nix). On substitue +# donc le vrai disque directement dans une copie locale du fichier disko +# avec sed, puis on pointe `disko` ET `nixos-install` sur ce même clone +# (chemin local, pas l'URL distante) pour que le partitionnement et le +# système construit restent cohérents entre eux. do_install() { - local flake_url="$1" + local remote_url="$1" # URL flake (git+https://...), pour cloner local attr="$2" + local disko_rel_path="$3" # diskos/plain.nix ou diskos/luks.nix + + local repo_dir="/tmp/install-repo" + local clone_url="${remote_url#git+}" # git clone ne comprend pas le préfixe git+ + + echo "Récupération de la config ($attr)..." + rm -rf "$repo_dir" + git clone --depth 1 "$clone_url" "$repo_dir" + + echo "Substitution du disque cible dans la config disko..." + sed -i "s#/dev/placeholder#$DEVICE#" "$repo_dir/$disko_rel_path" 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" + "$repo_dir/$disko_rel_path" 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 @@ -59,8 +73,10 @@ do_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 + # interactif qui bloquerait un install non surveillé. --flake pointe sur + # le clone local (avec le disque déjà substitué), pas l'URL distante, + # pour rester cohérent avec ce qui a été partitionné. + nixos-install --root /mnt --flake "${repo_dir}#${attr}" --no-channel-copy --no-root-passwd swapoff /mnt/.install-swapfile rm -f /mnt/.install-swapfile @@ -101,7 +117,7 @@ case "$CHOICE" in # --- Branche flotte : rien d'autre à saisir ----------------------- echo echo "Installation du profil générique 'usagers' sur $DEVICE..." - do_install "$FLEET_REPO" "usagers" + do_install "$FLEET_REPO" "usagers" "diskos/plain.nix" ;; 2) @@ -131,10 +147,12 @@ case "$CHOICE" in echo echo "Installation du profil '$ATTR' sur $DEVICE..." + DISKO_REL_PATH="diskos/plain.nix" if [[ "$ATTR" == *-luks ]]; then echo "Disque chiffré : disko va demander une passphrase LUKS pendant le partitionnement." + DISKO_REL_PATH="diskos/luks.nix" fi - do_install "$AUTHED_URL" "$ATTR" + do_install "$AUTHED_URL" "$ATTR" "$DISKO_REL_PATH" # Le système installé doit pouvoir continuer à tirer ses mises à jour # du repo privé tout seul : on lui laisse un netrc, jamais commité,