Windows向けオープンソースBtrfsドライバー、WinBtrfs
(github.com/maharmstone)- 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.Identifierはuser.Zone.Identifierとして保存 - LinuxユーザーとWindowsユーザーのマッピング
- LXSS、つまり「Ubuntu on Windows」対応
- LXSS向けの権限などメタデータ passthrough
- Windows 10の大文字小文字を区別するディレクトリフラグ対応
- ACLをxattr
- 圧縮と互換機能
- 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
- Chocolatey:
- 削除は
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を指定し、特定ユーザーが作成したファイルを特定グループに所属させることもできる
- 既定の項目ではWindowsのUsersグループを、Linuxで通常
- User Access Controlトークンで実行されるプロセスは、ユーザーアカウントではなく
BUILTIN\AdministratorsSIDでファイルを作成するという注意点がある
WSL/LXSS対応
- ドライバーは最新のLXSSバージョンにLinuxメタデータを passthrough できる
- これを使うには、WindowsのBashプロンプトで
/etc/wsl.confを次のように設定する[automount]enabled = trueoptions = "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\PolicyにUpgradedSystemDWORDを作成して1に設定し、再起動すること - またはBIOSでSecure Bootを無効にできる
- 回避策は
- LXSSでドライブのルートが大文字小文字を区別しないのはMicrosoftがハードコードした挙動
- Windows標準のフォーマットダイアログにBtrfsを追加することはできず、ファイルシステム一覧はハードコードされている
- Btrfsのフォーマットには同梱の
mkbtrfs.exeを使う - Btrfs固有オプションが不要なら
format /fs:btrfsも使える
- 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: ルートとしてマウントするサブボリュームIDSkipBalance: 前回終了時に進行中だったbalance再開をスキップNoTrim: TRIM対応を無効化AllowDegraded: デバイス欠損のあるdegradedボリュームのマウントを許可NoDataCOW: 新規ファイルの copy-on-write を無効化し、Linuxのnodatacowフラグと同じ
ライセンスと責任範囲
- プロジェクト全体は GNU Lesser General Public Licence、つまりLGPLで配布される
- ソフトウェアの使用はユーザー責任であり、ファイルシステムに生じうる損傷について責任を負わないと明記している
- 日常利用に適しているはずとしている一方で、バックアップを取るよう推奨している
- 同梱のサードパーティコードとして、Zlib、LZO、Zstd、BLAKE2、SHA256関連の著作権・ライセンス表記が含まれている
1件のコメント
Hacker News のコメント
しばらく使ってみたいと思っていたが、GitHub Issues をざっと見てすぐ諦めた
ブルースクリーン、ロック、使用量の急増、破損といった問題が見えたし、安定した btrfs/ZFS ドライバーがあるなら喜んでお金を払うつもり
なぜこういうプロジェクトがもっと注目されないのか、よく理解できない
なので前述の問題が直ったとしても、Windows を btrfs から起動するのは依然として難しい可能性が高い
ローマに入ればローマに従えというし、Windows は単に仮想化して動かすだけにすべきなのかもしれない
Linux のコードを使わずに完全に再実装している点が本当に素晴らしく、XP/2k3 と ReactOS までサポートしているのも見事
古いマシンの一つで一度試してみたい
この現象をどこにリンクするのがよいかは分からないが、2019年に投稿された入出力なしの QUIC ライブラリの Issue がある: https://github.com/aiortc/aioquic/issues/4
ファイルシステムもこういうパターンに従うと本当に良さそう
ファイルシステムのロジックを再利用しつつ、Windows、FUSE、Linux、wasm の線形アドレスストアなどに適用できるなら、移植性や再利用性、ハックしやすさがものすごく高まる可能性がある
関連記事:
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 にデータを預けるつもりはない
なぜかは分からないが、前者には「高度な」パリティ計算のようなものが不要だからかもしれない
Steam Deck でライブラリを事前に入れておくために、このドライバーと btrfs を使った
ネットワーク経由で受け取ると時間がかかりすぎたし、当時のインターネットではその100倍はかかったと思う
これは FAT 以来、nix、Mac、Windows でそのまま動く初のファイルシステムになるかもしれない
素晴らしい
長期間または本番環境で使っている人がいるなら、実際どうだったのか気になる
TRIM はサポートされているのを見たけれど、RETRIM もサポートされているのか気になる
最初にコマンドキューがいっぱいで TRIM できなかった領域を、ドライブの最適化中に解放するために必要な機能のこと
ReFS が嫌いな人にとって、データパリティのある NTFS の代替として使えるのか、また Windows 向け ZFS と比べてどれくらい成熟しているのかも知りたい
Windows パーティション、Linux パーティション(LUKS 上の btrfs)、そしてファイルを保管する3つ目の btrfs パーティションがある構成
頻繁には使わないが、使うときはその存在を意識しないほど
Windows がもともと btrfs をネイティブに読めたかのように感じられ、単にファイルへアクセス・変更・削除する程度の使い方では、特に「高度な」機能は使わなかった
気づいてビルドをキャンセルしたとき、名前は同じだが内容が異なるフォルダーが2つできていて、同じフォルダー名を2回削除しなければならなかった
このドライバーには 並行性の問題があるようだ
“Win OpenZFS driver and WinBtrfs driver dont play well with each other”
https://github.com/openzfsonwindows/openzfs/issues/364
聞いた話では、BTRFS には少しでも誤って触ると停止したりデータを破損したりする不具合のリストが、とんでもなく長いらしい
ネイティブOS上ですら信頼性が疑わしいものを、Windows に無理やり組み込んで使うのは狂気に近い
遊びで試すのは構わないが、実データは絶対にこの組み合わせには任せない
「自分の2ディスクミラーではうまく動いている」というのは逸話にすぎず、データではない
これを使うと、btrfs でフォーマットした Windows USB スティックから Windows 10/11 を起動できるようになるのか気になる
しばらく 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