1 ポイント 投稿者 GN⁺ 2024-04-08 | 1件のコメント | WhatsAppで共有
  • WinBtrfs v1.9は、LinuxファイルシステムBtrfsをWindowsで読み書きできるようにするドライバーであり、Linuxカーネルのコードを使わずにゼロから再実装されている
  • Windows XP以降で動作するはずで、無料OS ReactOS にも含まれており、LinuxのMDソフトウェアRAID上にあるBtrfsには別途 WinMD が必要
  • 機能範囲には読み書き、RAID0/1/10/5/6、サブボリューム・スナップショット、reflink copy、send/receive、zlib/LZO/Zstd圧縮、LXSS対応、ACL・ADS・権限マッピングまで含まれる
  • インストールは最新リリースをダウンロードして btrfs.inf をインストールするか、Chocolatey・Scoopを利用でき、Windows 10/11の Secure Boot 環境ではレジストリ変更やSecure Bootの無効化が必要な場合がある
  • プロジェクトはLGPLで配布されるが、ファイルシステム破損について責任を負わず、日常利用に適しているとしている一方で バックアップ を推奨している

WinBtrfsが行うこと

  • WinBtrfs はLinuxの次世代ファイルシステムBtrfs向けのWindowsドライバー
  • Linuxカーネルコードを含まずにゼロから再実装されており、Windows XP以降で動作するはず
  • 無料OS ReactOS にも含まれている
  • BtrfsファイルシステムがLinuxで作成されたMDソフトウェアRAIDデバイス上にある場合、Windowsで見えるようにするには WinMD が必要
  • 関連プロジェクトとして、WindowsをBtrfsから起動可能にする実験的ブートローダー Quibble、NTFSファイルシステムをインプレース変換する Ntfs2btrfs がある

対応機能

  • 基本機能
    • Btrfsファイルシステムの 読み書き
    • Windowsが通常は無視するBtrfsパーティションの検出
    • パーティションなしのBtrfsボリューム
    • 非同期読み書き
    • キャッシュ、free-space cache、free space tree
  • RAIDとボリューム管理
    • RAID0、RAID1、RAID10
    • RAID5、RAID6
    • Linuxで開始したbalanceの再開を含む balancing
    • デバイスの追加と削除
    • degraded mount
    • ボリュームの縮小と拡張
  • ファイルシステム機能
    • サブボリュームとスナップショットの作成・識別のためのシェル拡張
    • ハードリンク、シンボリックリンク、reparse point
    • sparse file、preallocation
    • reflink copy
    • subvolume send と receive
    • scrubbing、TRIM/DISCARD
  • Windows・Linux相互運用
    • ACLをxattr security.NTACL として取得・設定
    • Alternate Data Streamsをxattrとして保存し、たとえば :Zone.Identifieruser.Zone.Identifier として保存
    • LinuxユーザーとWindowsユーザーのマッピング
    • LXSS、つまり「Ubuntu on Windows」対応
    • LXSS向けの権限などメタデータ passthrough
    • Windows 10の大文字小文字を区別するディレクトリフラグ対応
  • 圧縮と互換機能
    • zlib、LZO、Zstd圧縮
    • Metadata UUID incompat flagはLinux 5.0基準で対応
    • 3・4ディスク RAID1、xxhash・sha256・blake2 checksumはLinux 5.5基準で対応
    • block group treeはLinux 6.1基準で対応

まだ残っている作業

  • fs-verity の完全対応はLinux 5.15項目として残っている
  • Zoned対応はLinux 5.11項目として残っており、HM-SMRがWindowsでサポートされない可能性があるとの注記がある
  • デフラグ、Btrfs quota、完全なtransaction log対応、Windows transactionsであるTxF対応がToDoにある

インストールと削除

  • インストールは 最新リリース をダウンロードして展開し、btrfs.inf を右クリックして Install を選ぶ
  • ドライバーは署名済みで、最新のWindowsではそのまま動作するはず
  • Windows 10または11でSecure Bootが有効な場合、ドライバー読み込みのためにレジストリ変更が必要なことがある
    • より簡単な方法として、BIOSでSecure Bootを無効にする方法も示されている
    • Windows 11はインストール時にSecure Bootを緩く要求するが、インストール後は無効にしても動作するとされている
  • パッケージマネージャーでのインストールも可能
    • Chocolatey: choco install winbtrfs
    • Scoop: scoop bucket add nonportable, scoop install winbtrfs-np -g
  • 削除は RUNDLL32.EXE SETUPAPI.DLL,InstallHinfSection DefaultUninstall 132 btrfs.inf コマンド、またはDevice Managerの「Btrfs controller」削除で実行できる
  • レジストリから削除する必要がある場合は、HKLM\SYSTEM\CurrentControlSet\services\btrfs\Start の値を4に設定してサービスを無効化し、再起動後にキーと C:\Windows\System32\drivers\btrfs.sys を削除する

ビルドとユーザーマッピング

  • Visual C++ 2019でビルドするにはディレクトリを開いてCMakeに処理させればよく、Windows DDKが正しくインストールされていれば動作するはず
  • LinuxでGCCを使ってビルドするには i686-w64-mingw32 または x86_64-w64-mingw32 クロスコンパイラが必要
  • ユーザーマッピングは HKLM\SYSTEM\CurrentControlSet\services\btrfs\Mappings レジストリキーに保存される
    • Windows SID名のDWORDを作成し、Linuxのuid値を入れる
    • 現在のSIDは wmic useraccount get name,sid で確認できる
  • グループマッピングは GroupMappings 配下に保存される
    • 既定の項目ではWindowsのUsersグループを、Linuxで通常 users であるgid 100にマッピングする
    • ユーザーSIDを指定し、特定ユーザーが作成したファイルを特定グループに所属させることもできる
  • User Access Controlトークンで実行されるプロセスは、ユーザーアカウントではなく BUILTIN\Administrators SIDでファイルを作成するという注意点がある

WSL/LXSS対応

  • ドライバーは最新のLXSSバージョンにLinuxメタデータを passthrough できる
  • これを使うには、WindowsのBashプロンプトで /etc/wsl.conf を次のように設定する
    • [automount]
    • enabled = true
    • options = "metadata"
    • mountFsTab = false
  • 変更は次回再起動時に適用される
  • 実際のLinuxインストール環境へ chroot できるはずとされている

コマンドライン操作

  • shellbtrfs.dll はGUIインターフェースを提供するが、rundll32.exe で一部の操作をコマンドラインから実行できる
  • rundll32 はエラーコードを返す方法がないため、コマンドが 黙って失敗 することがある
  • 一般コマンド
    • CreateSubvol <path>
    • CreateSnapshot <source> <destination>
    • ReflinkCopy <source> <destination> で、ワイルドカードや複数の元ファイルを受け取れる
  • 管理者権限が必要なコマンド
    • SendSubvol <source> [-p <parent>] [-c <clone subvol>] <stream file>
    • RecvSubvol <stream file> <destination>
    • StartScrub <drive>
    • StopScrub <drive>

問題解決で重要な制約

  • ファイル名はすべて UTF-8 でエンコードされていると仮定する
  • Secure Bootが有効なWindows 10後期バージョンでは、Microsoftの署名要件によりオープンソースドライバーでは使えないとみられる条件が生じたとされている
    • 回避策は HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CI\PolicyUpgradedSystem DWORDを作成して1に設定し、再起動すること
    • またはBIOSでSecure Bootを無効にできる
  • LXSSでドライブのルートが大文字小文字を区別しないのはMicrosoftがハードコードした挙動
  • Windows標準のフォーマットダイアログにBtrfsを追加することはできず、ファイルシステム一覧はハードコードされている
    • Btrfsのフォーマットには同梱の mkbtrfs.exe を使う
    • Btrfs固有オプションが不要なら format /fs:btrfs も使える
  • Synology NASはブロックデバイスにLVMを使っているようで、Windows向けLVMドライバーがなければマウントできない
  • Thecus NASはLinux MD RAIDを使うため、WinMD を併せてインストールする必要がある
  • WindowsとPOSIXの権限モデルはあまりに異なるため実用的なマッピングはなく、Windowsで編集させたくないファイルにはWindows ACLを作成できる

v1.9の変更点

  • v1.9 は2024年3月15日にリリース
  • Linux 6.1のblock group tree対応を追加
  • システムが高負荷時にフリーズする問題を修正
  • mkbtrfs/blockgrouptree/freespacetree オプションを追加
  • mkbtrfs/noholes の既定値をLinuxと同様に有効へ調整
  • aarch64でCRC32C命令対応を追加

デバッグとマウントオプション

  • WinBtrfsはデバッグメッセージを errors/FIXMEs、warnings、traces の3段階に分けている
  • リリース版ドライバーは errors と FIXMEs だけを DbgPrint で記録し、Microsoft DebugViewで確認できる
  • 問題報告時に完全なデバッグログを添付するには、デバッグ版ドライバーとレジストリ設定を使う
    • DebugLogLevel: 0はメッセージなし、1はerrors/FIXMEs、2はwarningsを含む、3はtracesまで全て
    • LogDevice: 任意、出力するシリアルデバイス
    • LogFile: 任意、出力先ファイル
  • マウントオプションは HKLM\SYSTEM\CurrentControlSet\Services\btrfs 配下の各ファイルシステムUUIDサブキーに保存される
  • 主なオプション
    • Ignore: そのファイルシステムを読み込まない
    • Readonly: Linuxの ro フラグのように書き込みを許可しない
    • Compress, CompressForce, CompressType: 既定圧縮、強制圧縮、優先圧縮方式を設定
    • FlushInterval: メタデータ flush 間隔で、既定値はLinuxと同じ30秒
    • SubvolId: ルートとしてマウントするサブボリュームID
    • SkipBalance: 前回終了時に進行中だったbalance再開をスキップ
    • NoTrim: TRIM対応を無効化
    • AllowDegraded: デバイス欠損のあるdegradedボリュームのマウントを許可
    • NoDataCOW: 新規ファイルの copy-on-write を無効化し、Linuxの nodatacow フラグと同じ

ライセンスと責任範囲

  • プロジェクト全体は GNU Lesser General Public Licence、つまりLGPLで配布される
  • ソフトウェアの使用はユーザー責任であり、ファイルシステムに生じうる損傷について責任を負わないと明記している
  • 日常利用に適しているはずとしている一方で、バックアップを取るよう推奨している
  • 同梱のサードパーティコードとして、Zlib、LZO、Zstd、BLAKE2、SHA256関連の著作権・ライセンス表記が含まれている

1件のコメント

 
GN⁺ 2024-04-08
Hacker News のコメント
  • しばらく使ってみたいと思っていたが、GitHub Issues をざっと見てすぐ諦めた
    ブルースクリーン、ロック、使用量の急増、破損といった問題が見えたし、安定した btrfs/ZFS ドライバーがあるなら喜んでお金を払うつもり
    なぜこういうプロジェクトがもっと注目されないのか、よく理解できない

    • 「喜んでお金を払うつもり」なら寄付リンクがある: https://github.com/maharmstone/btrfs?tab=readme-ov-file#dona...
    • Microsoft がサポートしておらず、ドライバー開発者が Windows カーネルコードを読めないから
      なので前述の問題が直ったとしても、Windows を btrfs から起動するのは依然として難しい可能性が高い
      ローマに入ればローマに従えというし、Windows は単に仮想化して動かすだけにすべきなのかもしれない
  • Linux のコードを使わずに完全に再実装している点が本当に素晴らしく、XP/2k3 と ReactOS までサポートしているのも見事
    古いマシンの一つで一度試してみたい

    • Rust の方面では、興味深いパターンとして入出力を持たないライブラリが増えている
      この現象をどこにリンクするのがよいかは分からないが、2019年に投稿された入出力なしの QUIC ライブラリの Issue がある: https://github.com/aiortc/aioquic/issues/4
      ファイルシステムもこういうパターンに従うと本当に良さそう
      ファイルシステムのロジックを再利用しつつ、Windows、FUSE、Linux、wasm の線形アドレスストアなどに適用できるなら、移植性や再利用性、ハックしやすさがものすごく高まる可能性がある
    • ReactOS は Windows との API 互換を目標にしているので、XP/2k3 と ReactOS の両方をサポートしているのはそれほど驚くことではない
  • 関連記事:
    WinBtrfs – A Windows driver for the next-generation Linux filesystem Btrfs - https://news.ycombinator.com/item?id=15177002 - 2017年9月、コメント100件
    WinBtrfs v0.7 - https://news.ycombinator.com/item?id=12794214 - 2016年10月、コメント1件

  • 数週間前に btrfs のハードドライブで使ってみようとしたが、うまく動かせなかった
    その後 WSL でアクセスしたところ、何度かはうまくいったものの、だんだん失敗するようになり、後にはマウントすらできなくなった
    結局 Linux ライブ ISO で起動して Windows ドライブと btrfs ドライブの間でファイルをコピー/移動すればよいと気づき、今は Ventoy USB の Fedora Workstation ライブ ISOを使っている

    • いかにもありそうな体験に聞こえる
      これで Windows でも btrfs でデータを失えるようになった :-D
  • このドライバーをノート PC でしばらく使っている
    Linux では仕事用のコーディングに、Windows ではゲーム・映画・メディア用に併用している環境
    btrfs パーティションやドライブのデータ破損が心配なら、README のマウントオプションに注目すればいい
    Arch Linux のシステムパーティションには Ignore を使い、それ以外はすべて Readonly を使えばいい
    ただし、20TB の外付け HDD に btrfs の zstd:2 圧縮をかけて完全にマウントして使っていても、CPU の急増や破損は経験していない

  • README を全部読んでみることをおすすめする
    投稿者が気になっていた質問と、それ以上の内容に答えてある

  • これはどうやって「基本および高度な」RAID 5/6 をサポートしていると言えるのか気になる
    btrfs 自体はそうではないし、ここでいう「基本/高度」が何を意味するのかも曖昧: https://btrfs.readthedocs.io/en/latest/btrfs-man5.html#raid5...

    • それは正確には合っていない
      Linux btrfs も一般的には RAID5 をサポートしているが、安全に使うのを難しくする既知のエッジケースがある
      実質的には「利用可能だが実験的で開発者向け」に近い
      WinBtrfs は RAID5 モードを機能の一つとして挙げているだけで、どれくらいうまく動作するかはきちんと扱っていない
      関連 Issue の質問も、実質的な回答なしに閉じられている: https://github.com/maharmstone/btrfs/issues/293
      開発者から状態とテストについて明確な回答を得るまでは、RAID 5/6 にデータを預けるつもりはない
    • RAID0/1/10 を「基本」RAID、RAID5/6 を「高度な」RAID と呼んでいるようだ
      なぜかは分からないが、前者には「高度な」パリティ計算のようなものが不要だからかもしれない
  • Steam Deck でライブラリを事前に入れておくために、このドライバーと btrfs を使った
    ネットワーク経由で受け取ると時間がかかりすぎたし、当時のインターネットではその100倍はかかったと思う
    これは FAT 以来、nix、Mac、Windows でそのまま動く初のファイルシステムになるかもしれない

    • みんな UDF のことをいつも忘れている
  • 素晴らしい
    長期間または本番環境で使っている人がいるなら、実際どうだったのか気になる
    TRIM はサポートされているのを見たけれど、RETRIM もサポートされているのか気になる
    最初にコマンドキューがいっぱいで TRIM できなかった領域を、ドライブの最適化中に解放するために必要な機能のこと
    ReFS が嫌いな人にとって、データパリティのある NTFS の代替として使えるのか、また Windows 向け ZFS と比べてどれくらい成熟しているのかも知りたい

    • 数年にわたってメインマシンで軽く使ってきた
      Windows パーティション、Linux パーティション(LUKS 上の btrfs)、そしてファイルを保管する3つ目の btrfs パーティションがある構成
      頻繁には使わないが、使うときはその存在を意識しないほど
      Windows がもともと btrfs をネイティブに読めたかのように感じられ、単にファイルへアクセス・変更・削除する程度の使い方では、特に「高度な」機能は使わなかった
    • 一度、誤って Visual Studio のビルドをメインの NTFS ドライブではなく、btrfs 上の git クローンで走らせてしまった
      気づいてビルドをキャンセルしたとき、名前は同じだが内容が異なるフォルダーが2つできていて、同じフォルダー名を2回削除しなければならなかった
      このドライバーには 並行性の問題があるようだ
    • WinBTRFS と OpenZFS on Windows を一緒にインストールすると問題が起きる可能性がある
      “Win OpenZFS driver and WinBtrfs driver dont play well with each other”
      https://github.com/openzfsonwindows/openzfs/issues/364
    • ReFS と Storage Spaces がすでにこの目的を満たしており、統合され、完全にサポートされている
      聞いた話では、BTRFS には少しでも誤って触ると停止したりデータを破損したりする不具合のリストが、とんでもなく長いらしい
      ネイティブOS上ですら信頼性が疑わしいものを、Windows に無理やり組み込んで使うのは狂気に近い
      遊びで試すのは構わないが、実データは絶対にこの組み合わせには任せない
      「自分の2ディスクミラーではうまく動いている」というのは逸話にすぎず、データではない
  • これを使うと、btrfs でフォーマットした Windows USB スティックから Windows 10/11 を起動できるようになるのか気になる

    • Rufus を使えば、USB SATA/NVMe ドライブエンクロージャーに 10/11 を「Windows To Go」としてインストールできる
      しばらく Windows 10 を毎日そのように使ってみた経験ではかなり良好に動作したが、いくつか注意点がある
      安定した USB 接続が必要で、コントローラーチップが安定していて過熱しない USB ドライブエンクロージャーが必要
      ドライブは電源喪失に強くなければならない
      残念ながら、電源喪失への耐性を評価してくれる資料は知らない
      一部のドライブは突然の電源断で大きな問題を起こす可能性がある
      Intel のエンタープライズ SATA SSD と、コンデンサー付き Dockcase の NVMe ドライブでは良い経験をした
      ドライブが見えなくなった場合は、電源を入れ直すと助けになることがある: https://dfarq.homeip.net/fix-dead-ssd/
      自動バックアップも設定しておくべき
      性能テストや Windows 専用ハードウェアのファームウェア更新に非常に有用
      コンピューターを変えながら使う場合は、起動後に Windows が混乱し、再起動が必要になることが多く、その後は動作する
      ただし WinBTRFS や別のブートローダープロジェクトを使った経験はなく、そのブートローダーは数か月前から現在壊れているようだ
      Ventoy で Windows VHD ファイルを起動するのも良い選択肢になり得る
    • それだけでは無理
      別途 ブートローダーも必要
      作者が Quibble という実装を作っていて、これも btrfs をサポートしている
      [0] https://github.com/maharmstone/quibble