# Environnement de référence — machine hôte qui build FWS

Ce document décrit **l'environnement exact** sur lequel le build FWS fonctionne de bout en bout. Si le build échoue chez toi, **compare ligne par ligne** avec cette config et aligne ce qui diffère.

> ⚠️ Ce n'est pas une simple recommandation : chaque ligne ci-dessous a été vérifiée comme nécessaire (ou suffisante) à un build réussi. Une seule différence peut tout casser (keyring, kernel WSL, sandbox pacman, ligne d'encodage…).

---

## 0. Build natif Arch Linux — la référence actuelle

Depuis juillet 2026, l'environnement de référence est un **Arch Linux natif**
(même machine, sans Windows/WSL) : `build.sh` et `setup-aur.sh` détectent le
cas et s'exécutent directement. Les ISO récentes du dépôt sont produites ainsi.

| Composant | Valeur de référence |
|---|---|
| OS | Arch Linux (rolling), kernel `7.x-archN` |
| Paquets requis | `base-devel`, `git`, `archiso`, `dos2unix` (`pacman -S --needed …`) |
| Droits | `sudo` (mkarchiso et pacstrap exigent root) |
| Réseau | requis (pacstrap télécharge les paquets ; `setup-aur.sh` clone/compile l'AUR) |

```bash
sudo ./setup-aur.sh    # paquets AUR/anaconda → local-repo/
sudo ./build.sh        # mkarchiso → out/FWS-<date>-x86_64.iso
```

Le reste de ce document décrit le chemin **Windows 11 + WSL Arch**, toujours
fonctionnel (bascule automatique depuis Git Bash) mais qui n'est plus la
référence.

---

## 1. Matériel (host Windows)

| Composant | Valeur de référence | Minimum acceptable | Pourquoi |
|---|---|---|---|
| CPU | AMD Ryzen 9 9950X3D (16 cores / 32 threads) | x86_64 avec **VT-x ou AMD-V activé dans le BIOS** | WSL 2 = Hyper-V → la virtualisation **doit** être activée dans le firmware |
| RAM | 64 GB (61.67 GB utilisable) | 8 GB | `mkarchiso` charge l'image squashfs en RAM ; `makepkg` des paquets AUR compile en parallèle |
| Disque libre sur `C:` | ≥ 130 GB libres | 25 GB libres | WSL grossit dynamiquement ; squashfs intermédiaire peut atteindre 10 GB |
| Architecture | x86_64 | x86_64 | ArchWSL n'existe pas en ARM |

---

## 2. OS hôte

| Composant | Valeur exacte référence | Notes |
|---|---|---|
| OS | **Microsoft Windows 11 Professionnel** | Édition Pro/Entreprise/Éducation recommandée (Hyper-V natif) |
| Version | **10.0.26200** (build 26200) | Windows 11 24H2 ou plus récent |
| Architecture | 64 bits | — |

Vérifier :

```bash
powershell.exe -Command "(Get-CimInstance Win32_OperatingSystem).Caption + ' build ' + (Get-CimInstance Win32_OperatingSystem).BuildNumber"
```

Doit retourner : `Microsoft Windows 11 ... build 26200` (ou supérieur).

---

## 3. Git for Windows + Git Bash

| Composant | Valeur de référence |
|---|---|
| Git | **2.53.0.windows.2** |
| Bash (Git Bash) | **GNU bash 5.2.37(1)-release (x86_64-pc-msys)** |

Vérifier :

```bash
git --version
bash --version | head -1
```

> Git Bash < 2.40 a un quoting cassé sur `wsl.exe` — les scripts plantent silencieusement. Mets à jour si tu es en dessous.

---

## 4. WSL (Windows Subsystem for Linux)

| Composant | Valeur de référence |
|---|---|
| Version WSL | **WSL 2** (WSL 1 = pas supporté) |
| Distribution par défaut | **Arch** |
| Version de la distro | **2** |
| `.wslconfig` (côté Windows, `C:\Users\<toi>\.wslconfig`) | **Absent** (réglages par défaut suffisent) |

Vérifier :

```bash
wsl.exe --status
wsl.exe -l -v
```

Doit afficher exactement :

```
NAME    STATE     VERSION
* Arch    Stopped   2
```

⚠️ **Le nom doit être exactement `Arch`** (sinon exporter `ARCH_WSL_DISTRO=NomChezToi` avant de lancer les scripts).

---

## 5. WSL Arch — kernel et système

| Composant | Valeur de référence | Vérif |
|---|---|---|
| Kernel WSL | **6.6.114.1-microsoft-standard-WSL2** | `wsl.exe -d Arch -- uname -r` |
| Hostname (par défaut) | murasaki (peu importe le tien) | — |
| Distribution | **Arch Linux rolling** | `cat /etc/os-release` |
| Build ID | `20250302.0.316047` (ou plus récent) | — |

Mettre à jour le kernel WSL si nécessaire (PowerShell admin) :

```bash
powershell.exe -Command "Start-Process powershell -Verb RunAs -ArgumentList 'wsl --update'"
```

---

## 6. WSL Arch — `/etc/wsl.conf`

Fichier **obligatoire** : `/etc/wsl.conf` dans la distro Arch.

```ini
[boot]
systemd=true
```

Vérifier :

```bash
wsl.exe -d Arch -u root -- cat //etc/wsl.conf
```

> Sans `systemd=true`, l'activation de `NetworkManager.service` dans le live ne sera pas testable, et `pacman-key --populate` peut bloquer.

Après modification :

```bash
wsl.exe --shutdown
```

(redémarrage complet de la WSL pour appliquer `wsl.conf`).

---

## 7. WSL Arch — pacman

| Composant | Valeur de référence |
|---|---|
| pacman | **v7.1.0** |
| libalpm | **v16.0.1** |
| `/etc/pacman.conf` → `DisableSandbox` | **Présent et décommenté** |

`/etc/pacman.conf` doit contenir, dans la section `[options]` :

```ini
DisableSandbox
```

> pacman ≥ 7 utilise **landlock** pour sandboxer les opérations FS. **Le kernel WSL ne supporte pas landlock** → tout install bloque. `setup-aur.sh` l'ajoute automatiquement la première fois.

Vérifier :

```bash
wsl.exe -d Arch -u root -- grep -E "^DisableSandbox" //etc/pacman.conf
```

Doit retourner : `DisableSandbox` (sans `#`).

---

## 8. WSL Arch — paquets requis

Versions de référence (peuvent évoluer, l'important est que ces paquets soient installés et à jour) :

| Paquet | Version réf | Rôle |
|---|---|---|
| `archiso` | **88-1** | `mkarchiso` (build de l'ISO) |
| `base-devel` | **1-2** | `makepkg`, gcc, make, fakeroot |
| `git` | **2.54.0-1** | clone des paquets AUR |
| `reflector` | **2023-5** | mise à jour des miroirs |
| `dos2unix` | **7.5.5-1** | fix des CRLF Windows |

Vérifier :

```bash
wsl.exe -d Arch -u root -- pacman -Q archiso base-devel git reflector dos2unix
```

Tout doit retourner une version (pas `not found`). Si manquant :

```bash
wsl.exe -d Arch -u root -- pacman -Sy --noconfirm archiso base-devel git reflector dos2unix
```

---

## 9. WSL Arch — keyring pacman

État requis :

- `pacman-key --init` exécuté au moins une fois (crée `/etc/pacman.d/gnupg/`)
- `pacman-key --populate archlinux` exécuté au moins une fois
- `archlinux-keyring` à jour

Vérifier :

```bash
wsl.exe -d Arch -u root -- ls //etc/pacman.d/gnupg/
wsl.exe -d Arch -u root -- pacman -Q archlinux-keyring
```

Le dossier `gnupg/` doit exister et contenir `pubring.gpg`, `trustdb.gpg`, etc.

Si jamais initialisé :

```bash
wsl.exe -d Arch -u root -- bash -c "pacman-key --init && pacman-key --populate archlinux && pacman -Sy --noconfirm archlinux-keyring && pacman -Syu --noconfirm"
```

---

## 10. WSL Arch — espace disque

Mesuré sur la machine de référence :

```
Filesystem      Size  Used Avail Use% Mounted on
tmpfs            16G     0   16G   0% /tmp
/dev/sdd       1007G  4.3G  952G   1% /
```

Vérifier :

```bash
wsl.exe -d Arch -u root -- df -h //tmp /
```

| Point de montage | Minimum |
|---|---|
| `/tmp` (tmpfs) | ≥ 4 GB libres |
| `/` (rootfs WSL) | ≥ 20 GB libres |

> Si `/tmp` n'est pas un `tmpfs`, mkarchiso sera **5-10× plus lent**. Sur WSL avec systemd, c'est tmpfs par défaut.

---

## 11. Variables d'environnement (Git Bash)

Aucune variable n'est requise **pour que ça marche**, mais les scripts en utilisent en interne :

| Variable | Valeur | Quand |
|---|---|---|
| `MSYS_NO_PATHCONV=1` | forcée par `build.sh` et `setup-aur.sh` | empêche Git Bash de convertir `/tmp/...` en chemins Windows |
| `MSYS2_ARG_CONV_EXCL=*` | forcée par `setup-aur.sh` | empêche la conversion d'arguments passés à `wsl.exe` |
| `ARCH_WSL_DISTRO` | optionnel, défaut = `Arch` | nom de la distro WSL si tu as renommé |

---

## 12. Permissions & emplacement du repo

| Critère | Référence |
|---|---|
| Chemin du repo (host) | `C:\Users\<user>\Documents\1. FWS\FWS\` |
| Chemin équivalent WSL | `/mnt/c/Users/<user>/Documents/1. FWS/FWS/` |
| Espaces dans le chemin | **OK** (les scripts gèrent `"1. FWS"`) |
| Caractères accentués dans le chemin | **À éviter** (mkarchiso plante) |
| Antivirus / Defender exclusion sur le dossier | **Recommandé** (gros gain de perf sur `cp -ar`) |

Ajouter une exclusion Defender (PowerShell admin) :

```bash
powershell.exe -Command "Start-Process powershell -Verb RunAs -ArgumentList 'Add-MpPreference -ExclusionPath \"C:\Users\$env:USERNAME\Documents\1. FWS\"'"
```

---

## 13. Réseau

| Critère | État requis |
|---|---|
| Accès internet depuis WSL | obligatoire (pacman, AUR, reflector) |
| Proxy d'entreprise | configurer dans `/etc/wgetrc` + `/etc/pacman.d/mirrorlist` |
| `mirrorlist` à jour | `reflector --latest 10 --sort rate` (fait par `setup-aur.sh`) |

Tester depuis WSL :

```bash
wsl.exe -d Arch -u root -- bash -c "curl -sI https://archlinux.org/ | head -1"
```

Doit retourner : `HTTP/2 200`.

---

## 14. Procédure de remise à zéro complète

Si rien ne fonctionne, **réinitialise la WSL Arch** depuis Git Bash :

```bash
# Sauvegarde le repo FWS d'abord (il est sur C:, donc safe)
wsl.exe --shutdown
wsl.exe --unregister Arch

# Réinstalle ArchWSL
curl.exe -L -o "$TEMP/Arch.zip" "https://github.com/yuk7/ArchWSL/releases/latest/download/Arch.zip"
powershell.exe -Command "Expand-Archive -Force '$env:TEMP\Arch.zip' '$env:LOCALAPPDATA\ArchWSL'"
"$LOCALAPPDATA/ArchWSL/Arch.exe"  # ferme la fenêtre dès qu'elle s'ouvre

# Configure wsl.conf
wsl.exe -d Arch -u root -- bash -c 'printf "[boot]\nsystemd=true\n" > /etc/wsl.conf'
wsl.exe --shutdown

# Init complète
wsl.exe -d Arch -u root -- bash -c "pacman-key --init && pacman-key --populate archlinux && pacman -Sy --noconfirm archlinux-keyring && pacman -Syu --noconfirm && pacman -S --noconfirm --needed archiso base-devel git reflector dos2unix"

# Relance le build
cd "/c/Users/$USER/Documents/1. FWS/FWS"
./setup-aur.sh
./build.sh
```

---

## 15. Checklist rapide de diagnostic

À copier-coller dans Git Bash pour comparer ta machine avec la référence :

```bash
echo "=== Host ===" && powershell.exe -Command "(Get-CimInstance Win32_OperatingSystem).Caption + ' build ' + (Get-CimInstance Win32_OperatingSystem).BuildNumber"
echo "=== Git ===" && git --version
echo "=== Bash ===" && bash --version | head -1
echo "=== WSL ===" && wsl.exe -l -v
echo "=== Kernel ===" && wsl.exe -d Arch -u root -- uname -r 2>&1 | tr -d '\0'
echo "=== pacman ===" && wsl.exe -d Arch -u root -- bash -c "pacman --version | head -2" 2>&1 | tr -d '\0'
echo "=== Sandbox ===" && wsl.exe -d Arch -u root -- grep "^DisableSandbox" //etc/pacman.conf 2>&1 | tr -d '\0'
echo "=== Paquets ===" && wsl.exe -d Arch -u root -- pacman -Q archiso base-devel git reflector dos2unix 2>&1 | tr -d '\0'
echo "=== wsl.conf ===" && wsl.exe -d Arch -u root -- cat //etc/wsl.conf 2>&1 | tr -d '\0'
echo "=== Disque WSL ===" && wsl.exe -d Arch -u root -- df -h / //tmp 2>&1 | tr -d '\0'
```

Compare la sortie avec les valeurs de référence des sections 2 à 10 ci-dessus.

---

## 16. Configuration de référence en une page (résumé)

```
Host        : Windows 11 Pro build 26200, x86_64, VT/AMD-V activé
CPU         : x86_64 (Ryzen 9 9950X3D testé)
RAM         : 64 GB (8 GB min)
Disque libre: ≥ 130 GB sur C:
Git         : 2.53.0.windows.2
Bash        : 5.2.37(1)-release msys
WSL         : version 2, distro "Arch", version 2
Kernel WSL  : 6.6.114.1-microsoft-standard-WSL2
.wslconfig  : absent
wsl.conf    : [boot]\nsystemd=true
pacman      : v7.1.0 / libalpm v16.0.1
pacman.conf : DisableSandbox actif
Keyring     : initialisé + populé + archlinux-keyring à jour
Paquets     : archiso 88-1, base-devel 1-2, git 2.54.0-1,
              reflector 2023-5, dos2unix 7.5.5-1
Repo path   : C:\Users\<user>\Documents\1. FWS\FWS\
              (pas d'accents, espaces OK)
Defender    : exclusion sur le dossier du repo
Réseau      : accès archlinux.org (HTTP/2 200), pas de proxy bloquant
```

Si **tout** ce qui précède est aligné, `./setup-aur.sh && ./build.sh` doit produire `out/FWS-*.iso` en 25-55 min au total.

---

## 17. Build depuis Fedora / Linux non-Arch (bascule conteneur podman)

Les trois scripts (`setup-aur.sh`, `build.sh`, `build-offi.sh`) détectent un hôte
**non-Arch** et se relancent automatiquement à l'identique dans un conteneur Arch
podman. Aucune Arch native ni WSL n'est nécessaire — il suffit d'installer podman.

```bash
sudo dnf install -y podman      # Fedora
sudo apt install -y podman      # Debian / Ubuntu
./setup-aur.sh && ./build.sh    # exactement comme sur Arch
```

### Design (points à NE PAS « simplifier »)

| Choix | Pourquoi |
|---|---|
| **Détection hôte Arch** = `command -v pacman` **ET** `grep -qiE '^ID(_LIKE)?=.*arch' /etc/os-release` | Fedora empaquette aussi `pacman` → sa seule présence ne suffit pas à conclure « hôte Arch ». |
| **podman rootful** (`sudo podman`) | mkarchiso exige des mounts/chroot/loop privilégiés ; podman rootless ne les gère pas. |
| **`--privileged`** | Donne les capabilities mkarchiso **et** relâche SELinux (enforcing sur Fedora) sur le bind-mount, sans avoir besoin de `:Z` (qui relabellerait le dépôt). |
| **`pull` explicite** avant `run` | `run` ne re-résout jamais le tag `latest` une fois l'image en cache → sinon on build sur une image qui vieillit. |
| **`pacman -Syu archiso`** (pas `-Sy`) quand `FWS_IN_CONTAINER=1` | Évite le partial upgrade : sur une image de base vieillissante, `-Sy archiso` tire des deps plus récentes que la base installée. |
| **`FWS_IN_CONTAINER=1`** | Garde anti-récursion **et** active `DisableSandbox` (landlock) comme le chemin WSL. |
| **Dépôt monté au MÊME chemin absolu** + volume `fws-pacman-cache` | `WORK_DIR`, `out/` et `local-repo/` restent identiques côté hôte ; le cache pacman persiste entre les runs. Les artefacts (root, podman rootful) sont re-`chown` vers le propriétaire du dépôt en fin de run. |

> Validé par revue adversariale sur Fedora 43 (podman 5.8.2, SELinux enforcing).
> Image : `docker.io/library/archlinux:latest`.
