1 pontos por GN⁺ 2024-04-08 | 1 comentários | Compartilhar no WhatsApp
  • WinBtrfs v1.9 é um driver que permite ler e gravar o sistema de arquivos Btrfs do Linux no Windows, reimplementado do zero sem usar código do kernel Linux
  • Deve funcionar a partir do Windows XP e também está incluído no sistema operacional livre ReactOS; para Btrfs sobre RAID de software MD do Linux é necessário o WinMD separadamente
  • O escopo de recursos inclui leitura/gravação, RAID0/1/10/5/6, subvolumes e snapshots, reflink copy, send/receive, compressão zlib/LZO/Zstd, suporte a LXSS e até mapeamento de ACL, ADS e permissões
  • A instalação pode ser feita baixando a release mais recente e instalando btrfs.inf, ou usando Chocolatey e Scoop; em ambientes com Secure Boot no Windows 10/11 pode ser necessário alterar o registro ou desativar o Secure Boot
  • O projeto é distribuído sob LGPL, mas não se responsabiliza por corrupção do sistema de arquivos e, embora afirme ser adequado para uso diário, recomenda backup

O que o WinBtrfs faz

  • WinBtrfs é um driver para Windows do Btrfs, o sistema de arquivos de próxima geração do Linux
  • Foi reimplementado do zero sem incluir código do kernel Linux e deve funcionar a partir do Windows XP
  • Também está incluído no sistema operacional livre ReactOS
  • Se o sistema de arquivos Btrfs estiver sobre um dispositivo RAID de software MD criado no Linux, será necessário o WinMD para que ele apareça no Windows
  • Projetos relacionados incluem o bootloader experimental Quibble, que permite inicializar o Windows a partir de Btrfs, e o Ntfs2btrfs, que converte o sistema de arquivos NTFS no local

Recursos suportados

  • Recursos básicos
    • Leitura e gravação do sistema de arquivos Btrfs
    • Detecção de partições Btrfs que o Windows normalmente ignoraria
    • Volumes Btrfs sem partição
    • Leitura e gravação assíncronas
    • Cache, free-space cache, free space tree
  • RAID e gerenciamento de volumes
    • RAID0, RAID1, RAID10
    • RAID5, RAID6
    • Balancing, incluindo retomada de balances iniciados no Linux
    • Adição e remoção de dispositivos
    • degraded mount
    • Redução e expansão de volume
  • Recursos do sistema de arquivos
    • Extensão de shell para criar e identificar subvolumes e snapshots
    • Hard links, links simbólicos, reparse point
    • Sparse file, preallocation
    • reflink copy
    • subvolume send e receive
    • scrubbing, TRIM/DISCARD
  • Interoperabilidade Windows·Linux
    • Obter e definir ACL como xattr security.NTACL
    • Armazenar Alternate Data Streams como xattr; por exemplo, :Zone.Identifier é armazenado como user.Zone.Identifier
    • Mapeamento entre usuários Linux e usuários Windows
    • Suporte a LXSS, ou seja, “Ubuntu on Windows”
    • passthrough de metadados como permissões para LXSS
    • Suporte ao sinalizador de diretório sensível a maiúsculas/minúsculas do Windows 10
  • Compressão e compatibilidade
    • Compressão zlib, LZO, Zstd
    • O sinalizador incompatível Metadata UUID é suportado com base no Linux 5.0
    • RAID1 de 3 e 4 discos, checksums xxhash·sha256·blake2 são suportados com base no Linux 5.5
    • block group tree é suportado com base no Linux 6.1

Trabalho que ainda falta

  • O suporte completo a fs-verity continua pendente como item do Linux 5.15
  • O suporte a Zoned continua pendente como item do Linux 5.11, com a observação de que HM-SMR pode não ser suportado no Windows
  • Desfragmentação, quota do Btrfs, suporte completo ao transaction log e suporte a TxF, o sistema de transações do Windows, estão na lista de tarefas

Instalação e remoção

  • A instalação é feita baixando a release mais recente, extraindo o arquivo e clicando com o botão direito em btrfs.inf para selecionar Install
  • O driver é assinado e deve funcionar diretamente nas versões mais recentes do Windows
  • Se o Secure Boot estiver ativado no Windows 10 ou 11, pode ser necessário alterar o registro para carregar o driver
    • Como método mais simples, também é sugerido desativar o Secure Boot na BIOS
    • O Windows 11 exige Secure Boot de forma mais branda na instalação, mas é informado que ele continua funcionando mesmo se for desativado depois
  • Também é possível instalar com gerenciadores de pacotes
    • Chocolatey: choco install winbtrfs
    • Scoop: scoop bucket add nonportable, scoop install winbtrfs-np -g
  • A remoção pode ser feita com o comando RUNDLL32.EXE SETUPAPI.DLL,InstallHinfSection DefaultUninstall 132 btrfs.inf ou removendo “Btrfs controller” no Device Manager
  • Se for necessário remover via registro, defina o valor HKLM\SYSTEM\CurrentControlSet\services\btrfs\Start como 4 para desativar o serviço, reinicie e então exclua a chave e C:\Windows\System32\drivers\btrfs.sys

Build e mapeamento de usuários

  • Para compilar com Visual C++ 2019, basta abrir o diretório e deixar o CMake processá-lo; se o Windows DDK estiver instalado corretamente, deve funcionar
  • Para compilar no Linux com GCC, é necessário um compilador cruzado i686-w64-mingw32 ou x86_64-w64-mingw32
  • O mapeamento de usuários é armazenado na chave de registro HKLM\SYSTEM\CurrentControlSet\services\btrfs\Mappings
    • Crie um DWORD com o nome do SID do Windows e insira o valor uid do Linux
    • O SID atual pode ser verificado com wmic useraccount get name,sid
  • O mapeamento de grupos é armazenado em GroupMappings
    • A entrada padrão mapeia o grupo Users do Windows para o gid 100, normalmente users, no Linux
    • É possível especificar um SID de usuário para que arquivos criados por um usuário específico pertençam a um grupo específico
  • Há a observação de que processos executados com token do User Access Control criam arquivos usando o SID BUILTIN\Administrators, e não a conta do usuário

Suporte a WSL/LXSS

  • O driver pode fazer passthrough de metadados Linux para versões recentes do LXSS
  • Para usar isso, configure /etc/wsl.conf no prompt Bash do Windows da seguinte forma
    • [automount]
    • enabled = true
    • options = "metadata"
    • mountFsTab = false
  • As mudanças passam a valer na próxima reinicialização
  • É informado que deve ser possível fazer chroot em um ambiente Linux instalado de fato

Operações de linha de comando

  • shellbtrfs.dll fornece uma interface GUI, mas algumas operações podem ser executadas pela linha de comando com rundll32.exe
  • rundll32 não tem como retornar códigos de erro, então os comandos podem falhar silenciosamente
  • Comandos gerais
    • CreateSubvol <path>
    • CreateSnapshot <source> <destination>
    • ReflinkCopy <source> <destination>, que pode receber curingas e vários arquivos de origem
  • Comandos que exigem privilégios de administrador
    • SendSubvol <source> [-p <parent>] [-c <clone subvol>] <stream file>
    • RecvSubvol <stream file> <destination>
    • StartScrub <drive>
    • StopScrub <drive>

Limitações importantes na solução de problemas

  • Todos os nomes de arquivo são assumidos como codificados em UTF-8
  • Em versões mais recentes do Windows 10 com Secure Boot ativado, é informado que surgiram exigências de assinatura da Microsoft que aparentemente não podem ser usadas por drivers de código aberto
    • Uma forma de contornar isso é criar o DWORD UpgradedSystem em HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CI\Policy, definir seu valor como 1 e reiniciar
    • Ou desativar o Secure Boot na BIOS
  • No LXSS, o fato de a raiz da unidade não diferenciar maiúsculas de minúsculas é um comportamento hardcoded da Microsoft
  • Não é possível adicionar Btrfs à própria caixa de diálogo de formatação do Windows, porque a lista de sistemas de arquivos é hardcoded
    • A formatação em Btrfs usa o mkbtrfs.exe incluído
    • Se não forem necessárias opções específicas de Btrfs, format /fs:btrfs também pode ser usado
  • O Synology NAS aparentemente usa LVM em dispositivos de bloco, então não pode ser montado sem um driver LVM para Windows
  • O Thecus NAS usa RAID MD do Linux, então é necessário instalar também o WinMD
  • Os modelos de permissão do Windows e do POSIX são diferentes demais para haver um mapeamento prático; para arquivos que você não quer permitir editar no Windows, é possível criar ACLs do Windows

Mudanças da v1.9

  • v1.9 foi lançada em 15 de março de 2024
  • Foi adicionado suporte ao block group tree do Linux 6.1
  • Foi corrigido um problema em que o sistema travava sob carga alta
  • Foram adicionadas as opções /blockgrouptree e /freespacetree ao mkbtrfs
  • O padrão de /noholes no mkbtrfs foi ajustado para ficar ativado por padrão, como no Linux
  • Foi adicionado suporte a instruções CRC32C em aarch64

Debug e opções de montagem

  • O WinBtrfs divide as mensagens de debug em três níveis: errors/FIXMEs, warnings e traces
  • A versão release do driver registra apenas errors e FIXMEs via DbgPrint, e isso pode ser visto com o Microsoft DebugView
  • Para anexar o log completo de debug ao reportar problemas, use a versão debug do driver e configurações de registro
    • DebugLogLevel: 0 sem mensagens, 1 errors/FIXMEs, 2 inclui warnings, 3 inclui tudo até traces
    • LogDevice: opcional, dispositivo serial para saída
    • LogFile: opcional, arquivo para saída
  • As opções de montagem são armazenadas sob cada subchave de UUID do sistema de arquivos em HKLM\SYSTEM\CurrentControlSet\Services\btrfs
  • Opções principais
    • Ignore: não carrega esse sistema de arquivos
    • Readonly: não permite gravação, como o sinalizador ro do Linux
    • Compress, CompressForce, CompressType: definem compressão padrão, compressão forçada e método de compressão preferido
    • FlushInterval: intervalo de flush de metadados; o padrão é 30 segundos, como no Linux
    • SubvolId: ID do subvolume a ser montado como raiz
    • SkipBalance: ignora a retomada de um balance que estava em andamento no último desligamento
    • NoTrim: desativa suporte a TRIM
    • AllowDegraded: permite montar volumes degraded com dispositivos ausentes
    • NoDataCOW: desativa copy-on-write para arquivos novos, igual ao sinalizador nodatacow do Linux

Licença e escopo de responsabilidade

  • O projeto inteiro é distribuído sob a GNU Lesser General Public Licence, ou LGPL
  • Está explicitado que o uso do software é por conta e risco do usuário, e que não há responsabilidade por possíveis danos ao sistema de arquivos
  • Embora seja dito que ele deve ser adequado para uso diário, também é recomendado fazer backup
  • Estão incluídos avisos de copyright e licença para códigos de terceiros relacionados a Zlib, LZO, Zstd, BLAKE2 e SHA256

1 comentários

 
GN⁺ 2024-04-08
Comentários do Hacker News
  • Eu queria testar isso há um tempo, mas dei uma olhada nas issues do GitHub e desisti na hora
    Vi problemas como tela azul, travamentos, picos de uso e corrupção, e eu pagaria tranquilamente por um driver estável de btrfs/ZFS
    Não entendo muito bem por que projetos assim não recebem mais atenção

    • Se você “pagaria tranquilamente”, há um link para doação: https://github.com/maharmstone/btrfs?tab=readme-ov-file#dona...
    • Porque não há suporte da Microsoft, e os desenvolvedores de drivers não podem ler o código do kernel do Windows
      Então, mesmo que os problemas mencionados acima sejam corrigidos, provavelmente ainda será difícil inicializar o Windows a partir de btrfs
      Em Roma, faça como os romanos; talvez o Windows simplesmente tenha que rodar apenas virtualizado
  • O fato de ser uma reimplementação completa sem usar código do Linux é muito legal, e o suporte até para XP/2k3 e ReactOS também é excelente
    Vou ter que testar isso em uma das minhas máquinas antigas

    • No lado do Rust, há um padrão interessante de crescimento de bibliotecas sem I/O
      Não sei qual seria o melhor lugar para linkar isso, mas há uma issue de 2019 sobre uma biblioteca QUIC sem I/O: https://github.com/aiortc/aioquic/issues/4
      Seria muito bom se sistemas de arquivos seguissem esse padrão também
      Se desse para reutilizar a lógica do sistema de arquivos e aplicá-la ao Windows, FUSE, Linux, armazenamento com endereçamento linear em wasm etc., isso poderia aumentar enormemente a portabilidade, a reutilização e a hackeabilidade
    • O ReactOS tem como objetivo ser compatível em nível de API com o Windows, então suportar tanto XP/2k3 quanto ReactOS não é algo tão surpreendente
  • Posts relacionados:
    WinBtrfs – Um driver do Windows para o sistema de arquivos Linux de nova geração Btrfs - https://news.ycombinator.com/item?id=15177002 - setembro de 2017, 100 comentários
    WinBtrfs v0.7 - https://news.ycombinator.com/item?id=12794214 - outubro de 2016, 1 comentário

  • Tentei usar isso em um HD btrfs há algumas semanas, mas não consegui fazer funcionar direito
    Depois tentei acessar via WSL, e até funcionou algumas vezes, mas foi falhando cada vez mais, e mais tarde nem montava
    No fim, percebi que bastava inicializar com uma ISO live do Linux e copiar/mover os arquivos entre a unidade do Windows e a unidade btrfs, e agora estou usando a ISO live do Fedora Workstation no Ventoy USB

    • Parece literalmente a mesma experiência
      Agora também dá para perder dados em btrfs no Windows :-D
  • Estou usando esse driver no meu notebook já faz um tempo
    É um ambiente compartilhado, com Linux para programar no trabalho e Windows para jogos, filmes e mídia
    Se você estiver preocupado com corrupção de dados na partição e na unidade btrfs, basta prestar atenção nas opções de montagem do README
    Use Ignore na partição de sistema do Arch Linux e Readonly em todo o resto
    Dito isso, também usei um HDD externo de 20 TB com compressão btrfs zstd:2 montado completamente, e não tive picos de CPU nem corrupção

  • Recomendo ler o README inteiro
    O autor responde às perguntas que eu tinha e a muitas outras também

  • Fico curioso sobre como isso diz suportar RAID 5/6 “básico e avançado”
    O próprio btrfs não suporta isso dessa forma, e também não está claro o que “básico/avançado” quer dizer aqui: https://btrfs.readthedocs.io/en/latest/btrfs-man5.html#raid5...

    • Isso não está exatamente correto
      O btrfs no Linux em geral suporta RAID5, mas há casos de borda conhecidos que tornam difícil usá-lo com segurança
      Na prática, é algo mais próximo de “utilizável, mas experimental e só para desenvolvedores”
      O WinBtrfs apenas lista o modo RAID5 como um de seus recursos, sem tratar adequadamente de quão bem isso funciona
      As perguntas na issue relacionada também foram encerradas sem respostas concretas: https://github.com/maharmstone/btrfs/issues/293
      Eu não confiaria meus dados a RAID 5/6 antes de ouvir do desenvolvedor uma resposta clara sobre o estado e os testes
    • Parece que chamam RAID0/1/10 de RAID “básico” e RAID5/6 de RAID “avançado”
      Não sei por quê, mas talvez seja porque os primeiros não exigem cálculos de paridade “avançados”
  • Usei esse driver e btrfs para pré-carregar a biblioteca no Steam Deck
    Baixar pela rede demorava demais, e pela minha internet na época provavelmente levaria 100 vezes mais tempo
    Isso pode acabar sendo o primeiro sistema de arquivos que simplesmente funciona em nix, Mac e Windows desde o FAT

    • Todo mundo sempre esquece do UDF
  • Excelente
    Se alguém usa isso há muito tempo ou em produção, tenho curiosidade de saber como foi na prática
    Vi que TRIM é suportado, mas queria saber se RETRIM também é
    Quero dizer a função necessária para liberar durante a otimização da unidade as áreas que não puderam ser trimadas no início porque a fila de comandos estava cheia
    Também queria saber se serve como um substituto do NTFS com paridade de dados para quem não gosta do ReFS, e quão maduro é em comparação com o ZFS para Windows

    • Uso de forma leve na minha máquina principal há alguns anos
      A configuração tem uma partição Windows, uma partição Linux (btrfs sobre LUKS) e uma terceira partição btrfs para armazenar arquivos
      Não uso com frequência, mas quando uso é a ponto de nem perceber que ele está lá
      Parecia como se o Windows sempre tivesse conseguido ler btrfs nativamente e, nesse nível de uso de apenas acessar, modificar e apagar arquivos, não usei nenhum recurso mais “avançado”
    • Uma vez rodei por engano um build do Visual Studio em um clone git no btrfs em vez da minha unidade NTFS principal
      Quando percebi e cancelei o build, haviam surgido duas pastas com o mesmo nome, mas com conteúdos diferentes, e tive que apagar o mesmo nome de pasta duas vezes
      Parece que esse driver tem problemas de concorrência
    • Pode haver problemas ao instalar WinBTRFS e OpenZFS on Windows juntos
      “Win OpenZFS driver and WinBtrfs driver dont play well with each other”
      https://github.com/openzfsonwindows/openzfs/issues/364
    • ReFS e Storage Spaces já atendem a esse objetivo, são integrados e têm suporte completo
      Pelo que ouvi, a lista de falhas do BTRFS é absurdamente longa, com casos em que ele trava ou corrompe dados por qualquer mexida errada
      Forçar algo de confiabilidade questionável até no sistema operacional nativo para dentro do Windows beira a insanidade
      Brincar com isso por diversão tudo bem, mas eu nunca confiaria dados reais a essa combinação
      “No meu espelho de 2 discos funciona bem” é só anedota, não é dado
  • Fico curioso se usar isso permite dar boot no Windows 10/11 a partir de um pendrive Windows formatado em btrfs

    • Dá para usar o Rufus para instalar o 10/11 como “Windows To Go” em um enclosure USB SATA/NVMe
      Pela minha experiência usando o Windows 10 assim diariamente por um tempo, funciona bem razoavelmente, mas há alguns cuidados
      Você precisa de uma conexão USB estável e de um enclosure USB com chip controlador estável e que não superaqueça
      A unidade precisa ser resistente a perda de energia
      Infelizmente, não conheço nenhum material que avalie a capacidade de lidar com perda de energia
      Algumas unidades podem sofrer bastante com corte repentino de energia
      Tive boas experiências com SSDs SATA enterprise da Intel e com unidades NVMe em um Dockcase com capacitores
      Se a unidade deixar de aparecer, religar a energia pode ajudar: https://dfarq.homeip.net/fix-dead-ssd/
      Também é bom configurar backup automático
      É muito útil para testes de desempenho ou atualizações de firmware de hardware exclusivo de Windows
      Ao usar em computadores diferentes, muitas vezes o Windows fica confuso após o boot e precisa reiniciar; depois disso funciona
      Mas não tenho experiência com WinBTRFS nem com projetos de bootloader separados, e esse bootloader parece estar quebrado atualmente já há alguns meses
      Dar boot em um arquivo VHD do Windows com Ventoy também pode ser uma boa opção
    • Sozinho isso não basta
      Também é necessário um bootloader separado
      O autor criou uma implementação chamada Quibble, que também suporta btrfs
      [0] https://github.com/maharmstone/quibble