Ça marche chez moi.
Prouvé chez eux.

Testez votre programme sur les vrais noyaux des distributions.
Voyez pourquoi il échoue ailleurs.

POURQUOI ÇA CASSE AILLEURS

Le même programme.
Une autre machine.

Un programme qui marche sur votre machine peut casser ailleurs : musl au lieu de glibc, un noyau RHEL 4.18, pas de BTF, perf_event_paranoid à 3, le lockdown activé…

Testé, jamais deviné.
Les fonctionnalités sont testées directement — BPF avec de vrais appels bpf() — et jamais déduites d’un numéro de version, car les noyaux RHEL reçoivent beaucoup de rétroportages.
Jetable par défaut.
Les images sont téléchargées une fois, vérifiées avec la somme de contrôle publiée par la distribution, puis mises en cache. Chaque exécution travaille sur une copie qcow2 jetable, supprimée à la fin — même après un délai dépassé ou un Ctrl+C.
Des rapports prêts pour la CI.
Un tableau cibles × résultats dans le terminal et, sur demande, --json, --junit pour la CI et --markdown pour un commentaire de pull request.

ENVPROBE / LA SONDE EN DESSOUS

Tout ce qui peut
changer un programme.

envprobe recense ce qui peut changer le comportement d’un programme, côté utilisateur comme côté noyau. Il fonctionne seul, en lecture seule, et signale les valeurs absentes ou refusées avec leur raison.

◎01 / IDENTITÉ

Identité et machine

Distribution, famille, architecture, virtualisation, conteneur ; le matériel (processeur, cœurs, mémoire, cartes graphiques, disques) et les outils de compilation (gcc, clang, rustc, go, python…).

⌘02 / NOYAU

Noyau

Version, ligne de commande, configuration (CONFIG_BPF*, KPROBES, DEBUG_INFO_BTF, FUNCTION_TRACER et ftrace dynamique…), modules.

⛉03 / SÉCURITÉ

Sécurité et droits

sysctls, LSM, SELinux, AppArmor, lockdown, Secure Boot, capacités, seccomp, espaces de noms utilisateur et RLIMIT_MEMLOCK souple et stricte.

◇04 / BPF · PERF

BPF et perf

Types de programmes, types de tables et helpers testés avec de vrais appels bpf() ; perf_event_open logiciel et matériel, PMU ; tracefs, kallsyms, BTF.

▤05 / ESPACE UTILISATEUR

Espace utilisateur

La libc et sa version, les bibliothèques courantes, l’arborescence FHS (merged-usr, multiarch), /bin/sh, coreutils, init, gestionnaire de paquets, cgroups, XDG.

✓06 / STATUT

Un statut pour chaque entrée

ok avec la valeur, unavailable avec la raison, denied quand l’accès a été refusé — et privileged signale ce qui change selon les droits du processus.

{ }07 / SCHÉMA

Un rapport versionné

Du JSON avec un schema_version, et son schéma publié avec le code.

envprobe schema
⧉08 / SANS VM

Une autre distribution, sans machine virtuelle

Comparez l’espace utilisateur d’une autre distribution à partir de son système de fichiers extrait, dans des espaces de noms utilisateur, montage et pid, sans root. Le noyau reste celui de la machine hôte.

scripts/probe-rootfs.sh <rootfs> <envprobe> --json
▣09 / STATIQUE

Des binaires statiques

Compilé avec musl : envprobe tourne tel quel dans n’importe quelle machine virtuelle ou conteneur x86_64.

D’UN FICHIER TOML À UN VERDICT

Une matrice.
Chaque cible expliquée.

Décrivez les cibles une fois ; distroproof up les démarre en parallèle et vous dit ce qui diffère là où ça échoue.

DANS LE TERMINAL

Un échec,
avec sa cause.

Pas « ça a cassé sur Ubuntu 18.04 » — mais quelle différence, parmi toutes, en est la cause probable.

● ● ●distroproof upLINUX
[ubuntu-18.04] failed (exit code 1)
  compared with ubuntu-22.04: 65 significant differences
  likely cause: btf.vmlinux: present, 5286152 bytes → unavailable (/sys/kernel/btf/vmlinux missing)
  also: kernel.CONFIG_DEBUG_INFO_BTF: y → missing from config

Une cible en échec comparée à la plus proche qui réussit. Sortie du programme, en anglais.

Exemples tirés de la référence de distroproof. file_caps donne des capacités au binaire installé après la préparation ; collect rapporte des fichiers de résultats pour chaque cible. La préparation et la commande reçoivent DP_TARGET et DP_IMAGE. L’interface du terminal ajoute les journaux en direct, les différences entre rapports et une console.

CIBLES / LES NOYAUX QU’IL DÉMARRE

Vingt images.
Leurs propres noyaux.

Les images cloud officielles, sur leurs propres noyaux. Les versions ci-dessous ont été observées lors de l’étude de cas d’octobre 2026 ; les images en continu et quotidiennes changent.

ImageNoyau observéRemarque
debian-10 · 11 · 12 · 134.19 · 5.10 · 6.1 · 6.124.19 sans BTF ; 13 démarre en UEFI
ubuntu-18.04 · 20.04 · 22.04 · 24.044.15 · 5.4 · 5.15 · 6.84.15 sans BTF
rocky-8 · 94.18 · 5.14noyaux RHEL avec rétroportages ; 9 démarre en UEFI
debian-sid7.2.11image quotidienne ; UEFI
fedora-previous · fedora-latest6.17 · 6.19 (Fedora 43 · 44)versions résolues en ligne
arch7.2.9 lors de l’étude de casen continu
gentoo6.18 dist-kernelOpenRC ; UEFI
alpine6.18 virtmusl, busybox
nixos6.12 (NixOS 25.05)l’image Proxmox de Hydra ; pas de chemins FHS
aarch64 : debian-13 · ubuntu-24.04 · fedora-latestleurs propres noyaux arm64émulés sur une machine x86_64

La machine hôte a besoin de qemu-system-x86_64, qemu-img, curl, de KVM (sinon TCG, sans /dev/kvm) et d’OVMF pour les images uniquement UEFI.

EN PRATIQUE / LES PREUVES

Un problème.
Ce qui a changé.

Choisissez une cible pour lire ce qui s’est passé : le problème, la découverte et le résultat. Chaque histoire cite ses preuves et l’étendue de sa validation.

Campagne de portabilité

Ça marchait sur Arch. La version publiée échouait ailleurs.

Problème
Un outil d’observation du noyau avait été développé sur une seule machine. Sa version publiée ne démarrait même pas sur un tiers des images de distributions.
Découverte
Lancer les archives installées sur 17 images et 5 variantes, 3 images arm64 et 8 conteneurs sans root a révélé 27 défauts : 13 dans l’outil et 14 dans ses tests. Les rapports d’environnement ont expliqué les échecs du chargeur, la politique perf de Debian, une limite memlock de 64 Kio et l’absence de traceur de fonctions sur Alpine.
Résultat
La version publiée a gagné des compilations pour glibc 2.17 et musl. À la relance, aucune des 158 exécutions de sources annoncées à tort comme utilisables n’était encore refusée au démarrage ; les raisons des refus concordaient avec envprobe sur les 21 cibles. La dernière exécution a réussi sur 25 cibles sur 25, soit 33 cellules.

Les paires de référence d’Omniscient tournent désormais sur la chaîne devutils : neuf cibles, toutes les vérifications tiennent dans les dernières exécutions, une paire étant ignorée quand une distribution n’a pas son outil témoin ou que celui-ci ne se charge pas. Les images arm64 sont émulées sur une machine x86_64.

Omniscient · docs/distroproof.md · octobre 2026Voir les résultats de portabilité d’Omniscient →

OPEN SOURCE / CONÇU POUR LINUX

Prouvez que ça tient
avant qu’ils ne le découvrent.

Téléchargez les binaires statiques, puis lancez votre première cible.

TÉLÉCHARGER · BINAIRES STATIQUES X86_64
v=v0.1.0 t=x86_64-unknown-linux-musl
curl -fLO https://github.com/devutils-org/distroproof/releases/download/$v/distroproof-$v-$t.tar.gz
gh attestation verify distroproof-$v-$t.tar.gz --repo devutils-org/distroproof
tar xzf distroproof-$v-$t.tar.gz && export PATH="$PWD/distroproof-$v-$t:$PATH"

# then
distroproof run --target rocky-8 -- envprobe --json > rocky8.json
distroproof up       # the matrix in distroproof.toml
v0.1 : sonde, matrice de machines virtuelles, rapports et interface terminal · versions x86_64 et aarch64 signées · MIT / Apache-2.0