Vagrant Synced Folders : Le casse-tête Windows vs Linux résolu
Par Nicolas DELAHAYE | v.1974 | Architecte Solution
STATUS: FILESYSTEM_OPTIMIZATION
Si vous travaillez dans une équipe mixte, vous avez sûrement remarqué ce comportement étrange concernant les Vagrant Synced Folders. Sur Linux ou macOS, vous devez écrire des blocs de configuration complexes (spécifiant NFS, versions, UDP, etc.), alors que sur Windows, une simple ligne suffit souvent.
Est-ce que Windows est "plus intelligent" ? Non. Au contraire, cette différence cache un compromis technique majeur entre performance et compatibilité. Décortiquons ce qui se passe sous le capot de vos montages de fichiers.
1. Le malentendu : Vagrant ne monte rien lui-même
Il faut comprendre que Vagrant est un chef d'orchestre, pas un ouvrier. Quand vous demandez un dossier partagé, Vagrant délègue cette tâche au "Provider" (VirtualBox, Hyper-V, VMWare) et aux capacités du système hôte.
Les Vagrant Synced Folders n'utilisent pas la même technologie selon l'OS sur lequel ils tournent :
- Sur Windows : Utilise par défaut VirtualBox Shared Folders (vboxsf).
- Sur Linux/macOS : Peut utiliser vboxsf, mais les développeurs forcent quasi-systématiquement NFS.
2. Pourquoi Linux/Mac exige plus de config (NFS)
Linux et macOS sont des systèmes POSIX. Ils gèrent les permissions (chmod, chown), les liens symboliques et les sockets de manière standardisée.
Pour obtenir des performances décentes (surtout avec des projets contenant des milliers de fichiers comme Symfony, Laravel ou node_modules), on utilise le protocole NFS (Network File System).
Cependant, NFS n'est pas "magique". Pour qu'il fonctionne via Vagrant, il faut être explicite :
👉 Quelle version de NFS ? (souvent la 4)
👉 UDP ou TCP ? (TCP est plus stable)
👉 Quelles options de montage ?
C'est pour cela que votre configuration Linux est verbeuse. Vous demandez de la performance, et Vagrant a besoin de détails pour configurer le serveur NFS localement.
3. Pourquoi Windows semble "plus simple"
Windows n'est pas POSIX. Son système de fichiers (NTFS) ne gère pas les permissions comme Linux. Installer un serveur NFS sur Windows est possible mais fastidieux et instable.
Par défaut, Vagrant sur Windows se rabat donc sur le plus petit dénominateur commun : VirtualBox Shared Folders.
Vous n'avez rien à configurer, ça "juste marche". MAIS :
1. C'est beaucoup plus lent (I/O disque catastrophique sur les gros projets).
2. Les permissions sont "simulées" (tout appartient souvent à root ou vagrant).
3. Les événements de fichiers (inotify) pour le hot-reload passent mal.
4. Optimisation : Refactoriser votre Vagrantfile
Votre configuration actuelle avec des if/else imbriqués fonctionne, mais elle viole le principe DRY (Don't Repeat Yourself). Elle est difficile à maintenir si vous ajoutez un troisième dossier.
Voici une approche "DevSecOps" plus propre. Nous allons créer une méthode Ruby qui génère la configuration adaptée selon l'OS détecté.
# Au début de votre Vagrantfile ou dans un fichier require séparé def get_mount_options(is_nfs_capable) if is_nfs_capable { type: "nfs", nfs_version: 4, nfs_udp: false, mount_options: ["rw", "actimeo=1"] # actimeo booste le cache NFS } else # Fallback Windows / vboxsf { mount_options: ["rw", "dmode=777", "fmode=777"] # On force les perms sur Windows } end end # Détection simple IS_UNIX = !Vagrant::Util::Platform.windows? Vagrant.configure("2") do |config| # Configuration dynamique et propre config.vm.synced_folder ".", "/home/dev", **get_mount_options(IS_UNIX) if PERSONNAL_CONFIG[:add_project_source_code] config.vm.synced_folder PERSONNAL_CONFIG[:src_path], "/home/project", **get_mount_options(IS_UNIX) end end
// NOTE : L'opérateur ** en Ruby permet d'éclater le hash retourné par la fonction directement en arguments pour Vagrant.
5. Conclusion : Pragmatique avant tout
Ne cherchez pas à avoir une configuration identique à l'octet près entre Windows et Linux pour vos Vagrant Synced Folders. C'est un combat perdu d'avance à cause des différences d'architecture OS.
L'approche recommandée est celle-ci :
✅ Linux/Mac : Forcez NFS pour la vitesse.
✅ Windows : Acceptez vboxsf pour la simplicité (ou passez à WSL2).
✅ Le Code : Abstraire cette complexité dans une fonction Ruby pour garder un Vagrantfile lisible.