コンテンツにスキップ

WSL2 + btrfs

WSL2 内では vibe は Linux として動作し、clonecp --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 でハードコードされており、.wslconfigwsl.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 にアタッチします:

Terminal window
New-VHD -Path C:\wsl\dev-btrfs.vhdx -Dynamic -SizeBytes 128GB -BlockSizeBytes 1MB
wsl --mount --vhd C:\wsl\dev-btrfs.vhdx --bare

次に WSL 内で、ボリュームを一度だけフォーマットしてマウントします:

Terminal window
lsblk # 新しいデバイスを確認(例: /dev/sdd)
sudo mkfs.btrfs /dev/sdd
sudo mkdir -p /mnt/btrfs
sudo blkid /dev/sdd # UUID をコピー
echo 'UUID=<uuid> /mnt/btrfs btrfs defaults,nofail 0 0' | sudo tee -a /etc/fstab
sudo mount -a
sudo chown $USER:$USER /mnt/btrfs
# プロジェクトを btrfs ボリュームに置く。reflink はその中で動作する
mv ~/myproject /mnt/btrfs/myproject
cd /mnt/btrfs && cp --reflink=always -r myproject myproject-copy

wsl --mount --vhd ... --bare はホスト側の操作であり、Windows の再起動後に再実行する必要があります(例: ログイン時に「最上位の特権で実行する」よう設定したタスクスケジューラのエントリ)。ディスクがアタッチされれば、/etc/fstab が自動的にマウントします(automount.mountFsTab の既定値は true)。