Comments: style plus concis (calé sur modules/anssi/, écrit par des pros)
Aucun changement fonctionnel -- juste les commentaires : essais de justification en plusieurs paragraphes remplacés par des notes courtes, type/quoi/pourquoi en une ou deux lignes. Corrige au passage un commentaire obsolète dans installer-base.nix qui décrivait encore l'usage de disko-install (abandonné depuis pour disko + nixos-install séparés). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
+21
-56
@@ -4,65 +4,36 @@
|
||||
{
|
||||
imports = [ ../../modules/anssi ];
|
||||
|
||||
# Toutes les machines de la flotte portent le même nom : pas
|
||||
# d'identification individuelle pour l'instant (voir README du repo
|
||||
# racine). À revoir plus tard via le numéro de série DMI si un vrai
|
||||
# besoin d'identification apparaît.
|
||||
# Nom uniforme, pas d'identification individuelle pour l'instant (voir
|
||||
# README). À revoir via le numéro de série DMI si le besoin apparaît.
|
||||
networking.hostName = "Nixos_Fleet";
|
||||
networking.networkmanager.enable = true;
|
||||
|
||||
# Firmware au maximum (wifi/Bluetooth/PCI en tout genre), pour coller à
|
||||
# un parc de PC hétérogène et inconnu à l'avance -- même logique que
|
||||
# Linux Mint, qui embarque les firmwares non-libres par défaut plutôt
|
||||
# que de s'en tenir au strict libre.
|
||||
# enableAllFirmware inclut déjà enableRedistributableFirmware (son
|
||||
# défaut est `config.hardware.enableAllFirmware`, vérifié dans le
|
||||
# source nixpkgs : nixos/modules/hardware/all-firmware.nix), donc pas
|
||||
# besoin de déclarer les deux. Ce que enableAllFirmware ajoute EN PLUS
|
||||
# du strict redistribuable (même fichier source) :
|
||||
# - broadcom-bt-firmware (Bluetooth Broadcom, très répandu)
|
||||
# - b43Firmware (wifi Broadcom BCM43xx)
|
||||
# - xone-dongle-firmware, facetimehd-firmware
|
||||
# Nécessite nixpkgs.config.allowUnfree = true (déjà réglé plus bas).
|
||||
# hardware.wirelessRegulatoryDatabase s'active automatiquement dès que
|
||||
# l'un des deux est vrai (même fichier source) -- pas besoin de le
|
||||
# régler à la main.
|
||||
# mkDefault : un profil peut désactiver au cas par cas.
|
||||
# Couverture matérielle maximale (wifi/Bluetooth/PCI) sur un parc
|
||||
# hétérogène inconnu à l'avance. Inclut enableRedistributableFirmware.
|
||||
hardware.enableAllFirmware = lib.mkDefault true;
|
||||
|
||||
# Durcissement : reprend le module ANSSI de SécurixOS (modules/anssi/,
|
||||
# vendored ci-dessus), qui remplace/couvre déjà tous les sysctls qui
|
||||
# étaient déclarés à la main sur le profil oreo (dmesg_restrict,
|
||||
# kptr_restrict, yama.ptrace_scope, rp_filter, tcp_syncookies,
|
||||
# protected_hardlinks/symlinks -- mêmes valeurs, vérifié règle par
|
||||
# règle dans modules/anssi/kernel-options.nix : R9, R11, R12, R14).
|
||||
# level "intermediary" : c'est le niveau que couvraient déjà TOUTES
|
||||
# les valeurs qu'on avait mises à la main sur oreo -- rien de plus
|
||||
# fort n'a été inventé ici. category "client" : ce sont des postes de
|
||||
# travail, pas des serveurs (les règles actuellement implémentées sont
|
||||
# toutes "category = base" donc ça ne change rien pour l'instant, mais
|
||||
# c'est le bon réglage si Sécurix ajoute des règles catégorisées).
|
||||
# Durcissement ANSSI (modules/anssi/, vendored depuis SécurixOS).
|
||||
# level "intermediary" : couvre déjà tout ce qui était réglé à la main
|
||||
# sur le profil oreo (R9/R11/R12/R14). category "client" : postes de
|
||||
# travail, pas des serveurs.
|
||||
#
|
||||
# ATTENTION : R12 force net.ipv4.ip_forward = 0. Sans impact ici (ce
|
||||
# sont des postes clients), mais à ne SURTOUT PAS importer sur
|
||||
# pxe-server/configuration.nix, qui a besoin l'inverse (voir son
|
||||
# networking.nat) -- pxe-server n'importe pas ce fichier, donc ok.
|
||||
# R12 force net.ipv4.ip_forward = 0 : sans impact sur des postes
|
||||
# clients. Ne pas importer ce module sur pxe-server/configuration.nix
|
||||
# (a besoin du forwarding inverse).
|
||||
security.anssi = {
|
||||
enable = true;
|
||||
level = "intermediary";
|
||||
category = "client";
|
||||
|
||||
# R8 (mitigations CPU) désactive l'hyperthreading via "mds=full,nosmt"
|
||||
# -- impact perf trop lourd sur le matériel bas de gamme du parc (PC
|
||||
# à 4 Go de RAM). On désactive donc la règle via le mécanisme d'exception
|
||||
# prévu par le module lui-même (modules/anssi/options.nix), PAS en la
|
||||
# contournant en silence.
|
||||
exceptions.R8.rationale = "SMT (hyperthreading) volontairement conservé : impact perf trop lourd sur le parc (matériel bas de gamme, parfois 4 Go de RAM). Les autres mitigations de R8 sont réappliquées ci-dessous, à l'identique du texte source (modules/anssi/kernel-options.nix), sauf 'nosmt' remplacé par la valeur alternative documentée 'mds=full' (mitige MDS sans couper l'hyperthreading).";
|
||||
# R8 (mitigations CPU) coupe l'hyperthreading via "mds=full,nosmt" :
|
||||
# trop coûteux sur le matériel bas de gamme du parc. Désactivé via
|
||||
# exception plutôt que contourné en silence ; réappliqué ci-dessous
|
||||
# sans le "nosmt".
|
||||
exceptions.R8.rationale = "SMT conservé : impact perf trop lourd sur le parc (matériel bas de gamme, parfois 4 Go de RAM). Mitigations réappliquées ci-dessous sans 'nosmt'.";
|
||||
};
|
||||
|
||||
# Reprise verbatim de modules/anssi/kernel-options.nix (règle R8), sauf
|
||||
# "mds=full,nosmt" -> "mds=full" (voir exception R8 ci-dessus). Toutes
|
||||
# les autres valeurs viennent du texte source, aucune n'est inventée.
|
||||
# R8 (modules/anssi/kernel-options.nix), sauf mds=full,nosmt -> mds=full.
|
||||
boot.kernelParams = [
|
||||
"l1tf=full,force"
|
||||
"page_poison=on"
|
||||
@@ -77,9 +48,8 @@
|
||||
"rng_core.default_quality=500"
|
||||
];
|
||||
|
||||
# Pas (encore) couvert par le module ANSSI ci-dessus (R45 y est
|
||||
# explicitement listé en exception : "AppArmor is partially supported
|
||||
# on NixOS", modules/anssi/base.nix) -- repris tel quel du profil oreo.
|
||||
# Pas couvert par le module ANSSI (R45 en exception : AppArmor
|
||||
# partiellement supporté sur NixOS).
|
||||
systemd.coredump.enable = false;
|
||||
security.apparmor.packages = [ pkgs.apparmor-profiles ];
|
||||
security.apparmor.enableCache = true;
|
||||
@@ -109,9 +79,7 @@
|
||||
services.openssh.enable = true;
|
||||
networking.firewall.enable = true;
|
||||
|
||||
# Certains PC du parc n'ont que 4 Go de RAM (Cinnamon + Firefox +
|
||||
# LibreOffice + VLC peuvent solliciter la mémoire) — swap compressé en
|
||||
# RAM, marche identiquement quelle que soit la machine.
|
||||
# Swap compressé en RAM : couvre le bas du parc (4 Go, desktop complet).
|
||||
zramSwap = {
|
||||
enable = true;
|
||||
memoryPercent = 50;
|
||||
@@ -129,10 +97,7 @@
|
||||
options = "--delete-older-than 30d";
|
||||
};
|
||||
|
||||
# Convergence : chaque machine de la flotte tire ses mises à jour du
|
||||
# même repo public, sans intervention humaine (pas de netrc nécessaire
|
||||
# ici, contrairement au repo nixos_users). Voir README pour adapter
|
||||
# l'URL réelle du repo.
|
||||
# Convergence automatique depuis le repo public, sans netrc.
|
||||
system.autoUpgrade = {
|
||||
enable = true;
|
||||
dates = "daily";
|
||||
|
||||
@@ -15,19 +15,16 @@
|
||||
warpinator
|
||||
];
|
||||
|
||||
# Fond d'écran par défaut (juste le logo NixOS, pas la galerie perso de
|
||||
# nixos_cinnamon -- repo public, on n'y met que ce qui est nécessaire).
|
||||
# Ce chemin (/etc/nixos) suppose la config installée là -- voir
|
||||
# nixos_fleet/installer/install.sh (do_install copie le clone sur le
|
||||
# disque cible après nixos-install).
|
||||
# Fond d'écran par défaut (logo NixOS, pas la galerie perso de
|
||||
# nixos_cinnamon). Suppose la config installée sur /etc/nixos (voir
|
||||
# installer/install.sh).
|
||||
environment.etc."dconf/db/local.d/00-background".text = ''
|
||||
[org/cinnamon/desktop/background]
|
||||
picture-uri='file:///etc/nixos/hosts/common/wallpaper/Nix/13977413.png'
|
||||
'';
|
||||
system.activationScripts.dconfUpdate.text = "${pkgs.dconf}/bin/dconf update";
|
||||
|
||||
# Réglages de confidentialité génériques (pas de SearXNG/DNS personnels
|
||||
# comme sur le poste perso — cette config est destinée à être publique).
|
||||
# Confidentialité générique (pas de SearXNG/DNS perso : repo public).
|
||||
programs.firefox = {
|
||||
enable = true;
|
||||
languagePacks = [ "fr" ];
|
||||
|
||||
+44
-79
@@ -1,47 +1,37 @@
|
||||
# Pas de shebang ici : ce fichier est injecté comme corps de script par
|
||||
# pkgs.writeShellScriptBin dans installer-base.nix (qui ajoute juste
|
||||
# `#!...`, PAS de mode strict — d'où le `set` explicite ci-dessous : sans
|
||||
# lui, une erreur (ex: DNS indisponible) n'arrête pas le script, qui
|
||||
# continuait jusqu'au reboot final en masquant l'échec.
|
||||
# Injecté comme corps de script par pkgs.writeShellScriptBin
|
||||
# (installer-base.nix) : pas de mode strict par défaut, d'où le `set`
|
||||
# explicite ci-dessous.
|
||||
set -euo pipefail
|
||||
|
||||
# Installeur unique pour les deux repos :
|
||||
# - branche "flotte" -> nixos_fleet (public, jamais chiffré)
|
||||
# - branche "flotte" -> nixos_fleet (public, jamais chiffré)
|
||||
# - branche "utilisateur nommé" -> nixos_users (privé, chiffrement au choix)
|
||||
# Ce script ne contient aucun secret : le token du repo privé est saisi en
|
||||
# direct, jamais stocké dans ce fichier ni dans un repo git.
|
||||
# Le token du repo privé est saisi en direct, jamais stocké dans ce
|
||||
# fichier ni dans un repo git.
|
||||
|
||||
FLEET_REPO="git+https://gitea.miniclic.net/Damien/Nixos_Fleet.git"
|
||||
USERS_REPO_HOST="gitea.miniclic.net"
|
||||
USERS_REPO_PATH="Damien/Nixos_Users.git"
|
||||
|
||||
# Le script se lance dès le login (autologin), potentiellement avant que
|
||||
# NetworkManager ait fini de négocier le DHCP. On attend une route par
|
||||
# défaut avant de continuer (jusqu'à 30s), plutôt que d'échouer trop tôt.
|
||||
# NetworkManager ait fini de négocier le DHCP.
|
||||
echo "Attente du réseau..."
|
||||
for _ in $(seq 1 30); do
|
||||
ip route | grep -q '^default' && break
|
||||
sleep 1
|
||||
done
|
||||
|
||||
# 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).
|
||||
# 4 étapes séparées (clone -> partition -> swap sur le disque cible ->
|
||||
# build) plutôt qu'un seul `disko-install` : ce dernier construit tout
|
||||
# dans le tmpfs RAM de l'environnement live, qui sature sur les PC à
|
||||
# 4 Go avant même de toucher le disque cible. Le swapfile posé sur /mnt
|
||||
# donne accès au disque comme mémoire virtuelle pendant le build.
|
||||
#
|
||||
# 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.
|
||||
# Le clone local est nécessaire : `disko` seul (contrairement à
|
||||
# `disko-install`) n'a aucun mécanisme de substitution de disque nommé.
|
||||
# On substitue donc le vrai disque dans une copie locale du fichier
|
||||
# disko (sed), puis `disko` et `nixos-install` pointent tous les deux
|
||||
# sur ce même clone.
|
||||
do_install() {
|
||||
local remote_url="$1" # URL flake (git+https://...), pour cloner
|
||||
local attr="$2"
|
||||
@@ -58,21 +48,16 @@ do_install() {
|
||||
sed -i "s#/dev/placeholder#$DEVICE#" "$repo_dir/$disko_rel_path"
|
||||
|
||||
echo "Partitionnement de $DEVICE..."
|
||||
# --yes-wipe-all-disks : évite la confirmation interactive "type yes to
|
||||
# continue" (vu dans le code source de la commande disko) — un install
|
||||
# de flotte ne doit pas dépendre de quelqu'un présent au clavier pour
|
||||
# confirmer, l'effacement est le but assumé de ce script.
|
||||
# --yes-wipe-all-disks : évite la confirmation interactive, un install
|
||||
# de flotte ne doit dépendre de personne au clavier.
|
||||
nix run --no-write-lock-file --refresh 'github:nix-community/disko' -- \
|
||||
--mode destroy,format,mount \
|
||||
--yes-wipe-all-disks \
|
||||
"$repo_dir/$disko_rel_path"
|
||||
|
||||
echo "Swap temporaire sur le disque cible (RAM limitée sur certains PC du parc)..."
|
||||
# Sur btrfs (notre système de fichiers), le CoW doit être désactivé
|
||||
# (chattr +C) AVANT toute écriture de données dans le fichier, sinon
|
||||
# swapon échoue avec "Invalid argument" (source : btrfs.readthedocs.io/
|
||||
# en/latest/Swapfile.html — chattr +C sur un fichier déjà écrit ne
|
||||
# s'applique pas rétroactivement).
|
||||
# btrfs : chattr +C (NOCOW) doit précéder toute écriture dans le
|
||||
# fichier, sinon swapon échoue avec "Invalid argument".
|
||||
truncate -s 0 /mnt/.install-swapfile
|
||||
chattr +C /mnt/.install-swapfile
|
||||
fallocate -l 4G /mnt/.install-swapfile
|
||||
@@ -81,49 +66,32 @@ do_install() {
|
||||
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é. --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é.
|
||||
# --no-root-passwd : le mot de passe root est déjà déclaré
|
||||
# (initialPassword) côté cible, on évite juste un prompt interactif.
|
||||
# --flake pointe sur le clone local (disque déjà substitué).
|
||||
nixos-install --root /mnt --flake "${repo_dir}#${attr}" --no-channel-copy --no-root-passwd
|
||||
|
||||
swapoff /mnt/.install-swapfile
|
||||
rm -f /mnt/.install-swapfile
|
||||
|
||||
# Sans cette étape, la machine installée n'a AUCUNE config sur son
|
||||
# disque : le clone ci-dessus vit dans /tmp de l'environnement live, en
|
||||
# RAM, effacé au reboot. La convergence auto (system.autoUpgrade, voir
|
||||
# hosts/common/base.nix) continue de fonctionner sans ça (elle pointe
|
||||
# sur l'URL distante), mais un technicien qui arrive sur la machine
|
||||
# après coup n'a alors ni /etc/nixos, ni moyen d'ajouter/enlever un
|
||||
# paquet à la main. On installe donc le même clone (déjà substitué avec
|
||||
# le vrai disque) à l'emplacement standard NixOS, en conservant .git
|
||||
# pour que `git pull`/`git log` marchent dessus normalement ensuite.
|
||||
# Persiste la config sur le disque cible : sans ça, le clone ne vit
|
||||
# que dans /tmp du live (RAM), effacé au reboot -- plus rien à éditer
|
||||
# ni à `git pull` ensuite. system.autoUpgrade continue de fonctionner
|
||||
# sans ça (il pointe sur l'URL distante), mais un technicien n'a alors
|
||||
# aucun accès local.
|
||||
echo "Installation de la configuration dans /mnt/etc/nixos..."
|
||||
rm -rf /mnt/etc/nixos
|
||||
mkdir -p /mnt/etc
|
||||
cp -a "$repo_dir" /mnt/etc/nixos
|
||||
|
||||
# Une machine installée n'a besoin que de ce qui sert à rebuild/pull :
|
||||
# flake.nix/flake.lock, hosts/, modules/ et les fichiers de conf disko
|
||||
# (diskos/). installer/ (le script d'install lui-même, obsolète une
|
||||
# fois l'install faite) et pxe-server/ (la config d'un tout autre host,
|
||||
# le serveur PXE) n'ont rien à faire sur un poste client -- ça ne
|
||||
# concerne que nixos_fleet (nixos_users n'a ni l'un ni l'autre, ces rm
|
||||
# ne trouvent alors rien à supprimer). Nix ne lit ces fichiers que si on
|
||||
# build l'attribut correspondant (#installer-netboot, #pxe-server) --
|
||||
# jamais le cas ici (#usagers ou un profil nommé), donc rien ne casse.
|
||||
# installer/ (script d'install, obsolète une fois fait) et
|
||||
# pxe-server/ (config d'un autre host) ne servent à rien sur un poste
|
||||
# client -- ne concerne que nixos_fleet, ces rm sont des no-op côté
|
||||
# nixos_users.
|
||||
rm -rf /mnt/etc/nixos/installer /mnt/etc/nixos/pxe-server
|
||||
|
||||
# Le disque cible a été substitué localement (sed plus haut), et
|
||||
# installer/+pxe-server/ viennent d'être retirés : tout ça diffère donc
|
||||
# de ce qui est sur git. On le committe en local (jamais poussé) pour
|
||||
# que `git status` reste propre sur la machine installée -- sinon
|
||||
# chaque `git pull` ultérieur affiche des fichiers modifiés/supprimés,
|
||||
# source de confusion pour un technicien.
|
||||
# Committé en local (jamais poussé) pour que `git status` reste propre
|
||||
# sur la machine installée.
|
||||
git -C /mnt/etc/nixos \
|
||||
-c user.name="Installeur Nixos_Fleet" \
|
||||
-c user.email="installeur@nixos-fleet.local" \
|
||||
@@ -138,9 +106,8 @@ echo "2) Poste utilisateur nommé"
|
||||
read -rp "Choix [1/2] : " CHOICE
|
||||
|
||||
# --- Détection automatique du disque cible -------------------------------
|
||||
# On exclut les disques amovibles (la clé USB de boot elle-même) et les
|
||||
# loop/rom. S'il en reste plusieurs (rare), on prend le plus gros et on le
|
||||
# signale clairement dans les logs plutôt que de bloquer sur un menu.
|
||||
# Exclut les disques amovibles (la clé USB de boot) et les loop/rom.
|
||||
# S'il en reste plusieurs, on prend le plus gros et on le signale.
|
||||
echo
|
||||
echo "Détection du disque cible..."
|
||||
mapfile -t CANDIDATES < <(
|
||||
@@ -164,14 +131,12 @@ fi
|
||||
|
||||
case "$CHOICE" in
|
||||
1)
|
||||
# --- Branche flotte : rien d'autre à saisir -----------------------
|
||||
echo
|
||||
echo "Installation du profil générique 'usagers' sur $DEVICE..."
|
||||
do_install "$FLEET_REPO" "usagers" "diskos/plain.nix"
|
||||
;;
|
||||
|
||||
2)
|
||||
# --- Branche utilisateur nommé -------------------------------------
|
||||
read -rp "Utilisateur (thomas/clara/jade/oreo) : " USER_PROFILE
|
||||
USER_PROFILE=$(echo "$USER_PROFILE" | tr '[:upper:]' '[:lower:]' | xargs)
|
||||
case "$USER_PROFILE" in
|
||||
@@ -191,8 +156,8 @@ case "$CHOICE" in
|
||||
read -rsp "Token Gitea (repo privé Nixos_Users) : " TOKEN
|
||||
echo
|
||||
|
||||
# Le token n'est utilisé qu'en mémoire/ligne de commande pour ce fetch
|
||||
# ponctuel : il n'est jamais écrit dans un fichier suivi par git.
|
||||
# Utilisé seulement en mémoire/ligne de commande pour ce fetch
|
||||
# ponctuel, jamais écrit dans un fichier suivi par git.
|
||||
AUTHED_URL="git+https://${TOKEN}@${USERS_REPO_HOST}/${USERS_REPO_PATH}"
|
||||
|
||||
echo
|
||||
@@ -204,13 +169,13 @@ case "$CHOICE" in
|
||||
fi
|
||||
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é,
|
||||
# jamais dans le Nix store (nix.settings.netrc-file dans le repo
|
||||
# nixos_users pointe vers ce même chemin).
|
||||
# Netrc laissé pour que le système installé continue de tirer ses
|
||||
# mises à jour du repo privé tout seul (nix.settings.netrc-file
|
||||
# pointe vers ce même chemin côté nixos_users). Jamais commité,
|
||||
# jamais dans le Nix store.
|
||||
#
|
||||
# ATTENTION : le format exact attendu par Gitea (login=token vs
|
||||
# login+password séparés) dépend de la version/config du serveur —
|
||||
# login+password séparés) dépend de la version/config du serveur --
|
||||
# à vérifier sur l'instance réelle avant le déploiement pilote.
|
||||
mkdir -p /mnt/etc/nix
|
||||
{
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# Environnement live commun aux deux formes d'image (PXE netboot / ISO
|
||||
# USB). Contient juste de quoi partitionner et lancer disko-install ; la
|
||||
# vraie configuration cible est toujours récupérée depuis git au moment
|
||||
# de l'install (repo public nixos_fleet ou repo privé nixos_users).
|
||||
# USB). Contient juste de quoi partitionner et installer ; la config
|
||||
# cible est toujours récupérée depuis git au moment de l'install (repo
|
||||
# public nixos_fleet ou repo privé nixos_users).
|
||||
{ pkgs, lib, ... }:
|
||||
|
||||
let
|
||||
@@ -13,22 +13,13 @@ in
|
||||
"flakes"
|
||||
];
|
||||
|
||||
# netboot.nix définit DEUX tmpfs distincts, ni l'un ni l'autre avec une
|
||||
# taille explicite -> plafonnés à 50% de la RAM chacun par défaut :
|
||||
# - "/" : la racine du système live lui-même (petite)
|
||||
# - "/nix/.rw-store" : la vraie zone où atterrissent tous les nouveaux
|
||||
# paquets téléchargés/construits pendant l'install
|
||||
# (overlay au-dessus du squashfs .ro-store en
|
||||
# lecture seule). C'est CELLE-LÀ qui sature en
|
||||
# premier sur un système complet (Cinnamon +
|
||||
# Firefox + LibreOffice + VLC...), pas "/".
|
||||
#
|
||||
# netboot.nix définit ces deux options via mkImageMediaOverride, qui vaut
|
||||
# mkOverride 60 — une simple assignation ici (priorité 100 par défaut)
|
||||
# est donc entièrement ignorée, pas fusionnée (constaté : le premier
|
||||
# essai n'a eu aucun effet). Il faut lib.mkForce (priorité 50, plus
|
||||
# fort que 60) pour vraiment gagner — et comme mkForce REMPLACE toute la
|
||||
# liste plutôt que de la compléter, on remet mode=0755 dedans aussi.
|
||||
# netboot.nix définit "/" et "/nix/.rw-store" (overlay où atterrissent
|
||||
# les paquets téléchargés/construits pendant l'install) sans taille
|
||||
# explicite -> 50% de la RAM chacun par défaut. .rw-store sature en
|
||||
# premier sur un système complet (Cinnamon + Firefox + LibreOffice +
|
||||
# VLC), pas "/". mkForce nécessaire : netboot.nix utilise
|
||||
# mkImageMediaOverride (priorité 60), une assignation simple (100) est
|
||||
# ignorée ; mkForce remplace toute la liste, d'où mode=0755 remis ici.
|
||||
fileSystems."/".options = lib.mkForce [
|
||||
"mode=0755"
|
||||
"size=20%"
|
||||
@@ -38,11 +29,9 @@ in
|
||||
"size=90%"
|
||||
];
|
||||
|
||||
# Certains PC du parc n'ont que 4 Go de RAM. Le disque cible ne peut pas
|
||||
# servir de secours (disko-install l'efface entièrement en une seule
|
||||
# opération, un swap posé dessus avant serait détruit en cours de
|
||||
# route) : on utilise du swap compressé en RAM (zram) à la place, qui
|
||||
# marche pareil en PXE et en USB sans dépendre d'un périphérique externe.
|
||||
# Certains PC du parc n'ont que 4 Go de RAM. Le disque cible ne peut
|
||||
# pas servir de secours ici (pas encore partitionné à ce stade) : swap
|
||||
# compressé en RAM (zram), identique en PXE et en USB.
|
||||
zramSwap = {
|
||||
enable = true;
|
||||
memoryPercent = 100; # jusqu'à 1x la RAM en swap compressé (~2-3x effectif)
|
||||
@@ -57,22 +46,14 @@ in
|
||||
installScript
|
||||
];
|
||||
|
||||
# disko-install n'est pas préinstallé : install.sh l'invoque via
|
||||
# `nix run github:nix-community/disko#disko-install`, ce qui évite de
|
||||
# dépendre d'un nom de paquet nixpkgs précis (pas de package `disko`
|
||||
# garanti tel quel côté nixpkgs) et reste conforme à l'usage documenté
|
||||
# du projet.
|
||||
|
||||
networking.networkmanager.enable = true;
|
||||
services.xserver.xkb.layout = "fr";
|
||||
console.keyMap = "fr";
|
||||
|
||||
# Root autologin sur tty1, l'installeur se lance automatiquement au
|
||||
# login. S'il échoue ou qu'on le quitte, on retombe sur un shell root
|
||||
# normal pour dépanner à la main — pas de piège sans issue.
|
||||
# login. Échec ou sortie -> shell root normal pour dépanner.
|
||||
# mkForce : le profil installeur officiel (installation-device.nix)
|
||||
# définit aussi cette option (autologin "nixos"), même priorité que la
|
||||
# nôtre sans mkForce -> conflit sinon.
|
||||
# définit aussi cette option, même priorité -> conflit sinon.
|
||||
services.getty.autologinUser = lib.mkForce "root";
|
||||
users.users.root.password = lib.mkForce "";
|
||||
|
||||
|
||||
@@ -9,7 +9,6 @@ SPDX-License-Identifier: MIT
|
||||
This is a self-contained NixOS implementation of <https://messervices.cyber.gouv.fr/guides/recommandations-de-securite-relatives-un-systeme-gnulinux>.
|
||||
It can be copy-pasted outside of Sécurix for your own needs.
|
||||
|
||||
> Vendored verbatim depuis [SécurixOS](https://github.com/cloud-gouv/securix)
|
||||
> (`modules/anssi/`, alpha) le 2026-09-09, tel que suggéré par ce README
|
||||
> ("can be copy-pasted outside of Sécurix"). Ne pas éditer ces fichiers
|
||||
> directement : en cas de correctif, le reprendre depuis Sécurix.
|
||||
> Vendored depuis [SécurixOS](https://github.com/cloud-gouv/securix)
|
||||
> (`modules/anssi/`, alpha), 2026-09-09. Ne pas éditer directement --
|
||||
> reprendre depuis Sécurix en cas de correctif.
|
||||
|
||||
Reference in New Issue
Block a user