Contexte et motivations
Le développeur utilise VS Code depuis près de dix ans, mais signale une lenteur croissante et l’intrusion de fonctions d’IA. Le paramètre chat.disableAIFeatures permet de désactiver ces fonctions, sans toutefois rendre l’IDE agréable. Zed, en revanche, propose dès le départ un commutateur disable_ai qui désactive l’IA, offrant ainsi une expérience plus réactive. L’enjeu principal est de faire fonctionner Zed en mode remote editor sur un serveur FreeBSD, alors que Zed ne fournit aucun binaire serveur natif pour cette plateforme.
Mise en place du serveur Linux sous FreeBSD
FreeBSD possède un sous‑système de compatibilité Linux (linuxulator) capable d’exécuter des binaires Linux. Les étapes suivantes sont nécessaires :
sudo sysrc linux_enable=YES
sudo service linux start
sudo pkg install linux_base-rl9
kldstat -m linux64 # doit afficher le moduleUne fois le module chargé, le serveur Linux de Zed peut être lancé. Cependant, Zed interroge l’hôte via uname -s -m ; FreeBSD répond FreeBSD amd64, ce qui empêche la connexion. La solution consiste à introduire un petit wrapper uname qui ne ment que pour cette requête précise.
#!/bin/sh
case "$#:$*" in
1:-sm|1:-ms) printf 'Linux x86_64\n' ;;
*) exec /usr/bin/uname "$@" ;;
esacLe script, placé dans ~/.local/bin et ajouté au PATH des sessions SSH non interactives (ex. via ~/.zshenv), fait croire à Zed que le serveur exécute Linux x86_64, tout en conservant le comportement standard pour les autres appels.
Analyse du bug du noyau FreeBSD
Après connexion, Zed affiche un arbre de projet vide et consigne l’erreur : error processing entry failed to read directory entry – Invalid argument (os error 22). Le problème provient d’une régression introduite en février 2026 dans le module linux_file.c. Avant la régression, la taille du tampon était calculée ainsi :
buflen = min(args->count, MAXBSIZE);Après la modification, chaque requête était arrondie à un multiple de 512 octets :
buflen = min(roundup2(args->count, DEV_BSIZE), MAXBSIZE);Lorsque le tampon fourni par Zed n’est pas un multiple de 512 bytes (le client utilise un buffer de 768 bytes), le noyau Linux‑compatible lit plus d’entrées que le tampon ne peut contenir. L’émulateur convertit les enregistrements jusqu’à ce qu’un d’eux ne tienne plus, renvoie EINVAL, mais kern_getdirentries() a déjà avancé le pointeur de répertoire, entraînant la perte silencieuse de fichiers ou l’erreur affichée.
Le correctif (commit ec6629628cb, revu dans D60760) réintroduit la logique conditionnelle :
if (args->count >= DEV_BSIZE)
buflen = min(args->count, MAXBSIZE);
else
buflen = roundup2(args->count, DEV_BSIZE);Cette approche garantit que, pour des tampons inférieurs à 512 bytes, aucune arrondie n’est appliquée, évitant ainsi le dépassement. Le correctif est présent dans les branches stable/15, releng/15.2 et donc dans la version 15.2‑RELEASE. Le développeur recommande de vérifier le kernel avec uname -v pour s’assurer que le correctif est actif.
Implications et limites
Le contournement uname fonctionne tant que Zed ne requiert pas d’autres informations spécifiques à FreeBSD. Il reste limité aux sessions SSH où le PATH du wrapper est visible. Le correctif du noyau élimine la perte de fichiers et rend le serveur Zed fiable sur FreeBSD ; toutefois, il dépend d’une version du système d’exploitation post‑février 2026. Les utilisateurs de versions antérieures devront appliquer le patch manuellement ou migrer vers la branche 15.2‑RELEASE. Enfin, la désactivation de l’IA dans Zed et VS Code montre que la surcharge logicielle liée aux modèles LLM peut impacter la performance, justifiant le choix d’un éditeur plus léger pour des environnements de développement à ressources limitées.