Recette de reconstruction Stretch amd64, Linux 6.12.115 StackX

Cette recette rassemble les entrées des quatre paquets du lot Debian 9 :
image, headers avec kbuild, métapaquet 6.12.115-1 et toolchain GCC 12.4.0-1.
La release attendue est 6.12.115-stackx-stretch-1. Le GCC privé utilise les
binutils natifs de Stretch 2.28 et la glibc 2.24, sans les remplacer.
Les modules restent en .ko non compressés ; l'image du noyau utilise gzip. L'initramfs
est généré par Debian à l'installation des paquets, pas par cette recette.

Périmètre et provenance
----------------------
Les scripts, configurations, patchs et modèles sont copiés des entrées du lot
Stretch qualifié, avec trois adaptations documentées dans DERIVATION.txt :
le driver de bootstrap GCC réellement exécuté, le contrôle rootfs compatible
avec mawk et la bibliothèque common.sh adaptée à la recette autonome. La recette dérivée n'a pas fait l'objet d'une reconstruction complète.
Une reconstruction future doit recevoir ses propres contrôles et essais.
Les résultats ne sont pas annoncés reproductibles octet par octet : dates
et environnement complet ne sont pas normalisés.

Le répertoire recipe/ contient les scripts et les preuves publiques de source.
Les cinq archives amont intactes, le patch perf et la configuration finale
sont fournis séparément. sources-manifest.tsv fixe leurs tailles et SHA256.
Ce ne sont pas des paquets sources Debian : aucun .dsc, index Sources ou accès
deb-src n'est livré. Les licences originales restent dans les archives et les
notices utiles sont rappelées dans LICENCES.txt.

La recette vise Stretch amd64 uniquement. Les branches conditionnelles
Bullseye/Buster des scripts historiques ne sont pas des cibles de ce lot.
Aucun reçu runtime privé ni contrôleur de VM ne figure dans l'arbre. Les
sources des paquets Debian natifs ne sont pas incorporées ; leurs versions
enregistrées figurent dans dependencies/native-packages.tsv.

Entrées et environnement
-----------------------
Préparer séparément une copie arrêtée d'un rootfs Debian 9 amd64, contenant
les outils décrits dans DEPENDENCIES.txt. Il ne doit pas s'agir de / ni d'une
racine vivante. Aucun script ne télécharge ou installe silencieusement une
dépendance. Préparer aussi un répertoire de travail isolé. L'extraction Linux
doit être neuve, intacte et séparée du rootfs et du travail.

Choisir des chemins absolus RECIPE_ROOT, SOURCES_DIR, SOURCE_ROOT,
EXTERNAL_ROOT et TARGET_ROOTFS. SOURCES_DIR contient à sa racine les sept
fichiers de sources-manifest.tsv. SOURCE_ROOT désigne la source Linux extraite,
EXTERNAL_ROOT une racine de travail déjà créée et TARGET_ROOTFS la copie
Stretch. MAX_JOBS doit être adapté au budget CPU et mémoire disponible. Les
valeurs par défaut de réserve et coût par job sont 4096 et 2048 Mio ; elles
restent contrôlées par les scripts.

Vérifier les fichiers avant emploi :

  (cd "$RECIPE_ROOT" && sha256sum --strict -c SHA256SUMS)
  (cd "$SOURCES_DIR" && sha256sum --strict -c "$RECIPE_ROOT/SOURCES.sha256")

Extraire Linux dans un répertoire neuf avec un utilisateur non privilégié,
sans changer les textes des liens symboliques de l'archive :

  test ! -e "$SOURCE_ROOT" && test ! -L "$SOURCE_ROOT" && \
  mkdir -- "$SOURCE_ROOT" && \
  tar --extract --xz --no-same-owner --no-same-permissions \
    --strip-components=1 --file "$SOURCES_DIR/linux-6.12.115.tar.xz" \
    --directory "$SOURCE_ROOT"

Les métadonnées dans evidence/upstream-6.12.115/ sont des exports de faits
antérieurs, pas une nouvelle authentification. Une vérification indépendante
de la signature amont reste possible avec l'archive officielle. Aucune
connexion réseau n'est requise pendant la reconstruction.

Définir les chemins et les paramètres avant toute étape :

  : "${RECIPE_ROOT:?chemin absolu de la recette}"
  : "${SOURCES_DIR:?répertoire des sept entrées}"
  : "${SOURCE_ROOT:?extraction Linux intacte}"
  : "${EXTERNAL_ROOT:?racine de travail isolée}"
  : "${TARGET_ROOTFS:?rootfs Stretch préparé}"
  : "${MAX_JOBS:?allocation CPU positive}"
  export SOURCE_ROOT EXTERNAL_ROOT TARGET_ROOTFS MAX_JOBS
  export TARGET_DIST=stretch ABI_REV=1 KERNEL_VERSION=6.12.115
  export TYPE_HOTE=local LC_ALL=C
  export STACKX_ALLOW_TOOLCHAIN_FALLBACK=1
  export TOOLCHAIN_DIR="$SOURCES_DIR"
  export TOOLCHAIN_SHA256="$RECIPE_ROOT/evidence/toolchain-fallback/SHA256SUMS"
  export HISTORICAL_CONFIG_DIR="$RECIPE_ROOT/evidence/reference/configs"
  export CONFIG_ACCEPT_INCONNUS="$RECIPE_ROOT/review/accepted-unknown.txt"
  export CONFIG_ACCEPT_LISTNEW="$RECIPE_ROOT/review/accepted-listnew-stretch.txt"
  export CONFIG_ACCEPT_ECARTS="$RECIPE_ROOT/review/accepted-ecarts-stretch.txt"

La valeur TYPE_HOTE=local concerne le poste de construction isolé ; elle ne
désigne pas un serveur de production. Les cinq chemins restent obligatoires
et leurs relations sont vérifiées. Utiliser bash pour les scripts même s'ils
sont distribués en mode 0644. Aucun script de cette recette ne lance de VM ou
de connexion SSH.

Étapes séparées
---------------
Exécuter chaque étape, lire son rapport avant la suivante et conserver un
échec. Ne pas fabriquer ni modifier un marqueur .ok pour passer un contrôle.

  bash "$RECIPE_ROOT/draft/common/scripts/prepare-source.sh"
  bash "$RECIPE_ROOT/draft/common/scripts/check-rootfs.sh"
  bash "$RECIPE_ROOT/draft/common/scripts/qualify-tools.sh"

Sur l'environnement Stretch enregistré, les capacités du GCC natif ne
suffisent pas au profil retenu ; qualify-tools autorise le repli avec le code
5 et decision=repli-possible. Seul ce constat précis autorise le bootstrap
privé. Un autre échec impose de corriger l'environnement, sans contournement.

  bash "$RECIPE_ROOT/draft/common/scripts/build-toolchain.sh"
  bash "$RECIPE_ROOT/draft/common/scripts/prepare-config.sh"

Le bootstrap GCC 12.4.0 intègre GMP/MPFR/MPC, compare les stages 2 et 3 et
installe sous /opt/stackx-toolchain dans une copie du rootfs. Les binutils
restent natifs. Le driver livré est celui effectivement exécuté sur Stretch ;
sa différence avec la copie du snapshot de paquetage est documentée.

prepare-config applique le patch perf aux fichiers attendus puis migre la
configuration Stretch historique avec common.fragment et stretch.fragment. Les
trois listes de revue sont figées et spécifiques à cette migration. Si une
liste ne correspond plus au rapport courant, examiner l'écart avant de
continuer ; ne pas recopier une nouvelle sortie par automatisme.

Comparer la configuration obtenue à la référence exacte avant compilation :

  cmp -- "$EXTERNAL_ROOT/work/stretch/6.12.115-1/obj/.config" \
    "$SOURCES_DIR/config-6.12.115-stackx-stretch-1"

SHA256 attendu :
a78c649281f6834c77a89c744d6d50bf604f21e28b25f3fcdfd3791995601231

  bash "$RECIPE_ROOT/draft/common/scripts/build-kernel.sh"
  env -u TMPDIR -u TMP -u TEMP \
    bash "$RECIPE_ROOT/draft/common/scripts/package-debs.sh"

Les quatre DEB sortent dans EXTERNAL_ROOT/packages/stretch/6.12.115-1. Le
paquetage exporte les headers/kbuild, compare la .config, vérifie les modules bruts, les
index des modules, les dépendances natives et les ELF vis-à-vis de glibc
2.24. Les modes et propriétaires des archives sont normalisés. Le gcc global,
ses alternatives, linux-libc-dev et /usr/include restent inchangés.
L'environnement du paquetage retire TMPDIR, TMP et TEMP avant d'entrer dans
le rootfs Stretch : conserver cette disposition du lot effectivement qualifié.

Limites
-------
Une recette ou une compilation ne prouvent pas le démarrage des nouveaux
paquets. Tester séparément toute reconstruction dans une VM isolée, avec
installation, ancien noyau, noyau candidat, réseau, stockage, filtrage,
modules externes, DKMS et retour à l'ancien noyau. Le pilote du lot d'origine
ne valide pas automatiquement un nouveau lot. La publication, les signatures
APT et les essais physiques sont des étapes distinctes. Secure Boot et les
autres matériels ne sont pas qualifiés par cette recette.

La migration de configuration conserve le support compilé NFSv2/ACL et
Squashfs en mode SINGLE, sans prouver leur usage chez un client. Les
anciennes capacités audio Intel ne sont pas toutes équivalentes dans 6.12 ;
certains pilotes dépréciés ou non sélectionnables, anciennes interfaces et
variantes cryptographiques AF_ALG obsolètes ne sont pas réactivés. Le noyau
utilise SLUB à la place de SLAB et expose 15 ports USB/IP par contrôleur au
lieu des 31 ports historiques. Ces limites sont documentées dans les revues
de configuration, sans inventaire du matériel des clients.

KEXEC_SIG_FORCE exige une signature pour kexec_file_load, mais le magasin
SYSTEM_TRUSTED_KEYS est vide et cette recette ne démontre pas qu'une clé de
signature externe est acceptée en exécution. La restriction historique EFI
securelevel sur kexec_load n'est pas conservée dans le profil sans lockdown.
Aucune équivalence Secure Boot ni démarrage sur matériel physique n'est
revendiquée. Le noyau Stretch historique était dans la série 4.9 ; la
présente migration n'en promet pas une couverture générale identique.

La bibliothèque conserve deux constantes historiques faisant référence à
binutils 2.42 ; le chemin GCC de cette recette ne les lit pas. Aucun
binutils 2.42 n'est construit ni fourni. La toolchain livrée porte la version
12.4.0-1 et dépend des binutils natifs Stretch 2.28.
