1 points par GN⁺ 2024-04-08 | 1 commentaires | Partager sur WhatsApp
  • WinBtrfs v1.9 est un pilote qui permet de lire et d’écrire le système de fichiers Linux Btrfs sous Windows, et il a été réimplémenté entièrement sans utiliser le code du noyau Linux
  • Il doit fonctionner à partir de Windows XP, est également inclus dans le système d’exploitation libre ReactOS, et si Btrfs repose sur un RAID logiciel MD de Linux, WinMD est nécessaire séparément
  • Le périmètre fonctionnel inclut la lecture/écriture, RAID0/1/10/5/6, sous-volumes·instantanés, copie reflink, send/receive, compression zlib/LZO/Zstd, prise en charge de LXSS, ainsi que le mappage ACL·ADS·permissions
  • L’installation peut se faire en téléchargeant la dernière release puis en installant btrfs.inf, ou via Chocolatey·Scoop ; sous Windows 10/11 avec Secure Boot, une modification du registre ou la désactivation de Secure Boot peut être nécessaire
  • Le projet est distribué sous LGPL, mais décline toute responsabilité en cas de corruption du système de fichiers et recommande des sauvegardes, tout en affirmant convenir à un usage quotidien

Ce que fait WinBtrfs

  • WinBtrfs est un pilote Windows pour Btrfs, le système de fichiers nouvelle génération de Linux
  • Il a été entièrement réimplémenté sans inclure le code du noyau Linux, et doit fonctionner à partir de Windows XP
  • Il est également inclus dans le système d’exploitation libre ReactOS
  • Si le système de fichiers Btrfs se trouve sur un périphérique RAID logiciel MD créé sous Linux, WinMD est nécessaire pour qu’il soit visible sous Windows
  • Parmi les projets liés, on trouve le chargeur de démarrage expérimental Quibble, qui permet de démarrer Windows depuis Btrfs, ainsi que Ntfs2btrfs, qui convertit NTFS sur place

Fonctionnalités prises en charge

  • Fonctionnalités de base
    • Lecture et écriture du système de fichiers Btrfs
    • Détection des partitions Btrfs que Windows ignorerait normalement
    • Volumes Btrfs sans partition
    • Lecture et écriture asynchrones
    • Cache, free-space cache, free space tree
  • RAID et gestion des volumes
    • RAID0, RAID1, RAID10
    • RAID5, RAID6
    • Balancing, y compris la reprise d’un balance lancé sous Linux
    • Ajout et suppression de périphériques
    • degraded mount
    • Réduction et extension de volume
  • Fonctions du système de fichiers
    • Extension shell pour créer et identifier des sous-volumes et instantanés
    • Liens physiques, liens symboliques, reparse points
    • sparse file, preallocation
    • Copie reflink
    • send et receive de sous-volumes
    • Scrubbing, TRIM/DISCARD
  • Interopérabilité Windows·Linux
    • Récupération et définition des ACL comme xattr security.NTACL
    • Stockage des Alternate Data Streams comme xattr ; par exemple, :Zone.Identifier est enregistré comme user.Zone.Identifier
    • Mappage entre utilisateurs Linux et utilisateurs Windows
    • Prise en charge de LXSS, c’est-à-dire « Ubuntu on Windows »
    • Passthrough des métadonnées comme les permissions pour LXSS
    • Prise en charge du drapeau de répertoire sensible à la casse de Windows 10
  • Compression et compatibilité
    • Compression zlib, LZO, Zstd
    • Le drapeau d’incompatibilité Metadata UUID est pris en charge au niveau de Linux 5.0
    • Le RAID1 sur 3 ou 4 disques, ainsi que les checksums xxhash·sha256·blake2, sont pris en charge au niveau de Linux 5.5
    • Le block group tree est pris en charge au niveau de Linux 6.1

Travaux encore en attente

  • La prise en charge complète de fs-verity reste listée dans les éléments Linux 5.15
  • La prise en charge de Zoned reste listée dans les éléments Linux 5.11, avec la réserve que HM-SMR pourrait ne pas être pris en charge sous Windows
  • La défragmentation, les quotas Btrfs, la prise en charge complète du transaction log et la prise en charge de TxF, le système de transactions de Windows, figurent dans la liste des tâches à faire

Installation et désinstallation

  • Pour l’installation, il faut télécharger la dernière release, décompresser l’archive, puis faire un clic droit sur btrfs.inf et choisir Install
  • Le pilote est signé et devrait fonctionner directement sur les versions récentes de Windows
  • Si Secure Boot est activé sous Windows 10 ou 11, une modification du registre peut être nécessaire pour charger le pilote
    • Une méthode plus simple consiste aussi à désactiver Secure Boot dans le BIOS
    • Il est indiqué que Windows 11 exige faiblement Secure Boot lors de l’installation, mais qu’il peut être désactivé ensuite
  • L’installation via gestionnaire de paquets est aussi possible
    • Chocolatey: choco install winbtrfs
    • Scoop: scoop bucket add nonportable, scoop install winbtrfs-np -g
  • La désinstallation peut se faire avec la commande RUNDLL32.EXE SETUPAPI.DLL,InstallHinfSection DefaultUninstall 132 btrfs.inf ou en supprimant « Btrfs controller » dans le Device Manager
  • Si une suppression via le registre est nécessaire, il faut définir la valeur HKLM\SYSTEM\CurrentControlSet\services\btrfs\Start à 4 pour désactiver le service, redémarrer, puis supprimer la clé et C:\Windows\System32\drivers\btrfs.sys

Build et mappage des utilisateurs

  • Pour compiler avec Visual C++ 2019, il suffit d’ouvrir le répertoire et de laisser CMake le traiter ; si le Windows DDK est correctement installé, cela devrait fonctionner
  • Pour compiler avec GCC sous Linux, un compilateur croisé i686-w64-mingw32 ou x86_64-w64-mingw32 est nécessaire
  • Le mappage des utilisateurs est stocké dans la clé de registre HKLM\SYSTEM\CurrentControlSet\services\btrfs\Mappings
    • Il faut créer un DWORD au nom du SID Windows et y placer la valeur uid Linux
    • Le SID actuel peut être obtenu avec wmic useraccount get name,sid
  • Le mappage des groupes est stocké sous GroupMappings
    • L’entrée par défaut mappe le groupe Users de Windows vers le gid 100, généralement users sous Linux
    • Il est possible de spécifier un SID utilisateur afin que les fichiers créés par un utilisateur donné appartiennent à un groupe spécifique
  • À noter qu’un processus exécuté avec un jeton User Access Control crée les fichiers avec le SID BUILTIN\Administrators, et non celui du compte utilisateur

Prise en charge de WSL/LXSS

  • Le pilote peut faire du passthrough des métadonnées Linux vers les versions récentes de LXSS
  • Pour l’utiliser, il faut configurer /etc/wsl.conf dans l’invite Bash de Windows sous cette forme
    • [automount]
    • enabled = true
    • options = "metadata"
    • mountFsTab = false
  • Les changements sont appliqués au redémarrage suivant
  • Il est indiqué qu’il devrait être possible d’utiliser chroot vers une installation Linux réelle

Opérations en ligne de commande

  • shellbtrfs.dll fournit une interface GUI, mais certaines opérations peuvent être exécutées en ligne de commande avec rundll32.exe
  • rundll32 n’a aucun moyen de retourner un code d’erreur, donc une commande peut échouer silencieusement
  • Commandes générales
    • CreateSubvol <path>
    • CreateSnapshot <source> <destination>
    • ReflinkCopy <source> <destination> ; accepte les jokers et plusieurs fichiers source
  • Commandes nécessitant les droits administrateur
    • SendSubvol <source> [-p <parent>] [-c <clone subvol>] <stream file>
    • RecvSubvol <stream file> <destination>
    • StartScrub <drive>
    • StopScrub <drive>

Contraintes importantes pour le dépannage

  • Tous les noms de fichiers sont supposés encodés en UTF-8
  • Sur les versions récentes de Windows 10 avec Secure Boot activé, il est indiqué que les exigences de signature de Microsoft imposent des conditions qui semblent inaccessibles à un pilote open source
    • Une solution de contournement consiste à créer le DWORD UpgradedSystem dans HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CI\Policy, à le définir sur 1, puis à redémarrer
    • Ou bien désactiver Secure Boot dans le BIOS
  • Dans LXSS, le fait que la racine du lecteur ne soit pas sensible à la casse est un comportement codé en dur par Microsoft
  • Il n’est pas possible d’ajouter Btrfs à la boîte de dialogue de formatage native de Windows, car la liste des systèmes de fichiers est codée en dur
    • Le formatage Btrfs utilise mkbtrfs.exe
    • Si les options spécifiques à Btrfs ne sont pas nécessaires, format /fs:btrfs fonctionne aussi
  • Les NAS Synology semblent utiliser LVM sur les périphériques bloc, et sans pilote LVM pour Windows, ils ne peuvent pas être montés
  • Les NAS Thecus utilisent Linux MD RAID ; il faut donc installer aussi WinMD
  • Les modèles de permissions Windows et POSIX sont trop différents pour permettre un mappage réellement pratique ; pour empêcher la modification depuis Windows, il est possible de créer des ACL Windows

Changements de la v1.9

  • v1.9 est sortie le 15 mars 2024
  • La prise en charge du block group tree de Linux 6.1 a été ajoutée
  • Un problème de blocage du système sous forte charge a été corrigé
  • Les options /blockgrouptree et /freespacetree ont été ajoutées à mkbtrfs
  • Dans mkbtrfs, la valeur par défaut de /noholes a été alignée sur Linux, donc activée par défaut
  • La prise en charge des instructions CRC32C a été ajoutée sur aarch64

Debug et options de montage

  • WinBtrfs divise les messages de debug en trois niveaux : errors/FIXMEs, warnings et traces
  • Le pilote en version release n’enregistre via DbgPrint que les errors et FIXMEs, visibles avec Microsoft DebugView
  • Pour joindre le journal de debug complet lors d’un signalement de problème, il faut utiliser la version debug du pilote et des paramètres du registre
    • DebugLogLevel: 0 pour aucun message, 1 pour errors/FIXMEs, 2 avec warnings inclus, 3 pour toutes les traces
    • LogDevice: optionnel, périphérique série de sortie
    • LogFile: optionnel, fichier de sortie
  • Les options de montage sont stockées sous les sous-clés UUID de chaque système de fichiers dans HKLM\SYSTEM\CurrentControlSet\Services\btrfs
  • Principales options
    • Ignore: ne pas charger ce système de fichiers
    • Readonly: n’autorise pas l’écriture, comme le drapeau Linux ro
    • Compress, CompressForce, CompressType: définissent la compression par défaut, la compression forcée et le type de compression préféré
    • FlushInterval: intervalle de flush des métadonnées, avec une valeur par défaut de 30 secondes comme sous Linux
    • SubvolId: ID du sous-volume à monter comme racine
    • SkipBalance: ignore la reprise du balance en cours lors du dernier arrêt
    • NoTrim: désactive la prise en charge de TRIM
    • AllowDegraded: autorise le montage d’un volume dégradé avec périphérique manquant
    • NoDataCOW: désactive le copy-on-write pour les nouveaux fichiers, comme le drapeau Linux nodatacow

Licence et périmètre de responsabilité

  • L’ensemble du projet est distribué sous la GNU Lesser General Public Licence, c’est-à-dire la LGPL
  • Il est précisé que l’utilisation du logiciel se fait aux risques de l’utilisateur et qu’aucune responsabilité n’est assumée pour d’éventuelles corruptions du système de fichiers
  • Tout en indiquant qu’il devrait convenir à un usage quotidien, le projet recommande de faire des sauvegardes
  • Des mentions de droits d’auteur et de licences sont incluses pour du code tiers lié à Zlib, LZO, Zstd, BLAKE2 et SHA256

1 commentaires

 
GN⁺ 2024-04-08
Avis sur Hacker News
  • J’ai voulu l’essayer pendant un moment, mais après avoir parcouru les issues GitHub, j’ai vite abandonné
    J’y ai vu des problèmes comme des écrans bleus, des blocages, des pics d’utilisation et de la corruption, et je serais prêt à payer pour un pilote btrfs/ZFS stable
    Je ne comprends pas bien pourquoi ce genre de projets ne reçoit pas plus d’attention

    • Si tu es « prêt à payer », il y a un lien de don : https://github.com/maharmstone/btrfs?tab=readme-ov-file#dona...
    • Parce que Microsoft ne le prend pas en charge, et que les développeurs de pilotes ne peuvent pas lire le code du noyau Windows
      Donc même si les problèmes mentionnés plus haut sont corrigés, il restera probablement difficile de démarrer Windows depuis btrfs
      À Rome, fais comme les Romains : peut-être qu’il faudrait tout simplement ne faire tourner Windows qu’en virtualisation
  • Le fait que ce soit une réimplémentation complète, sans utiliser le code Linux, est vraiment impressionnant, et la prise en charge de XP/2k3 ainsi que de ReactOS est excellente
    Je devrais l’essayer sur l’une de mes vieilles machines

    • Côté Rust, on voit apparaître de plus en plus de bibliothèques sans entrées/sorties, un pattern intéressant
      Je ne sais pas trop vers quoi lier ce phénomène, mais il y a cette issue de 2019 sur une bibliothèque QUIC sans entrées/sorties : https://github.com/aiortc/aioquic/issues/4
      Ce serait vraiment bien que les systèmes de fichiers suivent aussi ce pattern
      Si l’on pouvait réutiliser la logique d’un système de fichiers et l’appliquer à Windows, FUSE, Linux, au stockage linéaire adressable de wasm, etc., la portabilité, la réutilisation et les possibilités de bidouille pourraient devenir énormes
    • ReactOS vise la compatibilité API avec Windows, donc le fait de prendre en charge à la fois XP/2k3 et ReactOS n’est pas si surprenant
  • Articles liés :
    WinBtrfs – A Windows driver for the next-generation Linux filesystem Btrfs - https://news.ycombinator.com/item?id=15177002 - septembre 2017, 100 commentaires
    WinBtrfs v0.7 - https://news.ycombinator.com/item?id=12794214 - octobre 2016, 1 commentaire

  • Il y a quelques semaines, j’ai essayé de l’utiliser avec un disque dur en btrfs, mais je n’ai pas réussi à le faire fonctionner correctement
    Ensuite, j’y ai accédé via WSL : ça a marché quelques fois, puis les échecs sont devenus de plus en plus fréquents, jusqu’à ce qu’il ne puisse même plus être monté
    Finalement, j’ai compris qu’il suffisait de démarrer sur une ISO live Linux pour copier/déplacer les fichiers entre le disque Windows et le disque btrfs ; maintenant, j’utilise une ISO live Fedora Workstation sur une clé USB Ventoy

    • Ça ressemble à une expérience authentique
      Maintenant, on peut aussi perdre ses données en btrfs sous Windows :-D
  • J’utilise ce pilote sur mon ordinateur portable depuis un moment
    C’est une configuration partagée : Linux pour coder au travail, Windows pour les jeux, les films et les médias
    Si vous vous inquiétez d’une corruption des données sur les partitions et disques btrfs, concentrez-vous sur les options de montage du README
    J’utilise Ignore pour la partition système Arch Linux, et Readonly pour tout le reste
    Cela dit, même avec un disque dur externe de 20 To monté entièrement en btrfs avec compression zstd:2, je n’ai pas rencontré de pics CPU ni de corruption

  • Je recommande de lire tout le README
    L’auteur y répond aux questions que je me posais, et à bien d’autres encore

  • Je me demande comment ils peuvent dire prendre en charge le RAID 5/6 « de base et avancé »
    btrfs lui-même ne le fait pas vraiment, et ce que « de base/avancé » signifie ici n’est pas très clair non plus : https://btrfs.readthedocs.io/en/latest/btrfs-man5.html#raid5...

    • Ce n’est pas tout à fait exact
      Le btrfs de Linux prend généralement en charge RAID5, mais il existe des cas limites connus qui rendent son utilisation sûre difficile
      En pratique, on est plutôt sur du « utilisable, mais expérimental et réservé aux développeurs »
      WinBtrfs liste simplement le mode RAID5 parmi ses fonctionnalités, sans vraiment détailler à quel point il fonctionne bien
      Les questions dans les issues liées ont aussi été fermées sans véritable réponse : https://github.com/maharmstone/btrfs/issues/293
      Tant que le développeur n’aura pas donné de réponse claire sur son état et ses tests, je ne confierais pas mes données au RAID 5/6
    • On dirait qu’ils appellent RAID0/1/10 le RAID « de base » et RAID5/6 le RAID « avancé »
      Je ne sais pas pourquoi, mais c’est peut-être parce que les premiers n’ont pas besoin de calculs de parité « avancés »
  • J’ai utilisé ce pilote et btrfs pour préremplir une bibliothèque sur un Steam Deck
    Le téléchargement par le réseau aurait pris beaucoup trop longtemps, et avec ma connexion Internet de l’époque, cela aurait probablement pris 100 fois plus de temps
    Ça pourrait devenir le premier système de fichiers depuis FAT à fonctionner directement sous *nix, Mac et Windows

    • Tout le monde oublie toujours UDF
  • Excellent
    Je serais curieux de savoir ce que ça donne vraiment si quelqu’un l’utilise sur la durée ou en production
    J’ai vu que TRIM était pris en charge, mais je me demande si RETRIM l’est aussi
    Je parle de la fonction nécessaire pour libérer, pendant l’optimisation du lecteur, les zones qui n’ont pas pu être traitées par TRIM au départ parce que la file de commandes était pleine
    Je me demande aussi si ça peut servir de remplaçant à NTFS avec parité des données pour quelqu’un qui n’aime pas ReFS, et à quel point c’est mature par rapport à ZFS pour Windows

    • Je l’ai utilisé légèrement pendant quelques années sur ma machine principale
      Ma configuration comporte une partition Windows, une partition Linux (btrfs sur LUKS) et une troisième partition btrfs pour stocker des fichiers
      Je ne m’en sers pas souvent, mais quand je m’en sers, je ne remarque même pas sa présence
      J’avais l’impression que Windows avait toujours su lire btrfs nativement, et pour un usage consistant simplement à accéder à des fichiers, les modifier et les supprimer, je n’ai utilisé aucune fonctionnalité particulièrement « avancée »
    • Une fois, j’ai lancé par erreur un build Visual Studio depuis un clone git sur btrfs au lieu de mon disque NTFS principal
      Quand je m’en suis rendu compte et que j’ai annulé le build, deux dossiers portant le même nom mais avec un contenu différent étaient apparus, et j’ai dû supprimer deux fois le même nom de dossier
      Il semble y avoir un problème de concurrence dans ce pilote
    • Installer WinBTRFS avec OpenZFS on Windows peut poser problème
      « Win OpenZFS driver and WinBtrfs driver dont play well with each other »
      https://github.com/openzfsonwindows/openzfs/issues/364
    • ReFS et Storage Spaces répondent déjà à ce besoin, sont intégrés et entièrement pris en charge
      D’après ce que j’ai entendu, BTRFS aurait une liste absurdement longue de défauts où il suffit de peu pour qu’il se bloque ou corrompe des données
      Forcer sous Windows quelque chose dont la fiabilité est déjà douteuse sur son système d’exploitation natif frôle la folie
      Pour s’amuser, pourquoi pas, mais je ne confierais jamais de vraies données à cette combinaison
      « Ça marche bien sur mon miroir à 2 disques » n’est qu’une anecdote, pas une donnée
  • Je me demande si, avec ça, on peut démarrer Windows 10/11 depuis une clé USB Windows formatée en btrfs

    • Avec Rufus, on peut installer 10/11 en « Windows To Go » sur un boîtier de disque USB SATA/NVMe
      Pour avoir utilisé Windows 10 comme ça au quotidien pendant un temps, ça fonctionnait plutôt bien, mais il y a quelques points à surveiller
      Il faut une connexion USB stable, ainsi qu’un boîtier de disque USB avec une puce contrôleur fiable et qui ne surchauffe pas
      Le disque doit bien résister aux pertes d’alimentation
      Malheureusement, je ne connais aucune ressource qui évalue la capacité à gérer les pertes d’alimentation
      Certains disques peuvent très mal réagir à une coupure brutale du courant
      J’ai eu de bonnes expériences avec un SSD SATA Intel entreprise et avec un disque NVMe dans un Dockcase doté de condensateurs
      Si le disque n’apparaît plus, le remettre sous tension peut aider : https://dfarq.homeip.net/fix-dead-ssd/
      Il faut aussi mettre en place des sauvegardes automatiques
      C’est très utile pour des tests de performances ou des mises à jour de firmware matériel réservées à Windows
      Quand on change d’ordinateur, Windows est souvent un peu perdu après le démarrage et il faut redémarrer, puis ça fonctionne
      En revanche, je n’ai pas d’expérience avec WinBTRFS ni avec le projet de bootloader séparé, et ce bootloader semble être cassé depuis quelques mois
      Démarrer un fichier VHD Windows avec Ventoy peut aussi être une bonne option
    • Pas avec ça seul
      Il faut aussi un bootloader séparé
      L’auteur a créé une implémentation appelée Quibble, qui prend aussi en charge btrfs
      [0] https://github.com/maharmstone/quibble