WSL2 + btrfs
WSL2 内では vibe は Linux として動作し、clone(cp --reflink)または rsync のコピー戦略を自動的に選択します(設定不要)。しかし WSL2 のルートファイルシステムは常に ext4 であり reflink に対応していないため、cp --reflink=auto は黙ってフルコピーにフォールバックします。
WSL2 で実 Copy-on-Write を得るには、別途 btrfs ボリュームをマウントし、プロジェクト(例: node_modules)をその上に置きます。プロジェクトが btrfs 上に乗れば、vibe の既存の clone 戦略が自動的に瞬時の CoW コピーを生成します。
WSL ルートで CoW ができない理由
Section titled “WSL ルートで CoW ができない理由”- WSL2 のルートは ext4 でハードコードされており、
.wslconfigやwsl.confで変更できません(参照: microsoft/WSL#9339)。 - 「btrfs ディストリ」(openSUSE / Fedora)を使っても解決しません。WSL はディストリに関係なく rootfs を自身の ext4 VHDX に展開するためです。
- ルートに対する
btrfs-convertは実用的ではありません。変換後のルートは WSL で起動しません。 - reflink は同一ファイルシステム内でのみ動作するため、コピー元とコピー先の両方が btrfs ボリューム上に存在する必要があります。
推奨セットアップ — 二次 btrfs VHD をマウントする
Section titled “推奨セットアップ — 二次 btrfs VHD をマウントする”Windows 側で、管理者権限の PowerShell を開き、VHD を作成して WSL にアタッチします:
New-VHD -Path C:\wsl\dev-btrfs.vhdx -Dynamic -SizeBytes 128GB -BlockSizeBytes 1MBwsl --mount --vhd C:\wsl\dev-btrfs.vhdx --bare次に WSL 内で、ボリュームを一度だけフォーマットしてマウントします:
lsblk # 新しいデバイスを確認(例: /dev/sdd)sudo mkfs.btrfs /dev/sddsudo mkdir -p /mnt/btrfssudo blkid /dev/sdd # UUID をコピーecho 'UUID=<uuid> /mnt/btrfs btrfs defaults,nofail 0 0' | sudo tee -a /etc/fstabsudo mount -asudo chown $USER:$USER /mnt/btrfs
# プロジェクトを btrfs ボリュームに置く。reflink はその中で動作するmv ~/myproject /mnt/btrfs/myprojectcd /mnt/btrfs && cp --reflink=always -r myproject myproject-copy再起動後の再アタッチ
Section titled “再起動後の再アタッチ”wsl --mount --vhd ... --bare はホスト側の操作であり、Windows の再起動後に再実行する必要があります(例: ログイン時に「最上位の特権で実行する」よう設定したタスクスケジューラのエントリ)。ディスクがアタッチされれば、/etc/fstab が自動的にマウントします(automount.mountFsTab の既定値は true)。