wsl: VHD(X)ファイルを作ってext4フォーマット
2025/10/24
WSL2 を使っている。
Cドライブの ext4.vhdx が肥大化するのはあまりよくない気がするし、もし Cドライブが壊れたらと思うと怖いので、仮想ディスクの VHD ファイルを作って mount している。
これで節約できていると思ったが、既に ext4.vhdx は 84GB を超していた。
Cドライブはスカスカだし、気にするのも馬鹿らしい気がしている。
けど、やる。
今まで VirtualBox などで作っていた VHD ファイルを使い回していたのだが、新規で VHD ファイルを作ってマウントしてみたいと思った。
VHD ファイルの作成
エクスプローラで「PC」のアイコンを右クリックしたコンテキストメニューから「管理」を選択(スタートメニューの “Windowsツール” の中にもあると思う)。
「コンピュータの管理 > ディスクの管理」でドライブ一覧が表示される。
メニュー「操作 > VHDの作成」から作成することができる。
拡張子は VHD でも VHDX でもよさそうだ。今回は VHDX かつ可変容量にした。
作成すると、ディスクの管理画面に追加されている。
「操作 > VHDの接続」をしたのと同じ状態だろう。「不明」と表示されていた。
パーティション作成の手前
VHDファイルを接続しても、まだまっさらなので何もできない。
パーティションを作ることができる状態まで持っていく。
これもディスクの管理画面からできる。
右クリックしてコンテキストメニューから「ディスクの初期化」を選択。
パーティションスタイルは、私が分かるのが MBR なのでそうした。
サイズは 64GB。
このときに出てきたディスク番号が、物理ディスクの番号になっているようだ。
今の私だと 7 になっている。
WSL2 の現状を見ておこう
この状態で WSL2 にて ls /dev/sd* などとして認識しているドライブを見ておこう。
$ ls /dev/sd*
/dev/sda /dev/sdc /dev/sde /dev/sdf
/dev/sdb /dev/sdd /dev/sde1 /dev/sdf1
bare マウント
フォーマット済み VHD ファイルをマウントする場合はだいたいこんな感じである。
wsl.exe --mount --vhd "$VHDFILE" --partition $PARTNUM --name $MNTNAME
しかしまだフォーマットしていないからか、まだ使ったことが無いからか分からないが WSL2 上で何かしてもアタッチに失敗する。
管理者モードの PowerShell ならできそうだ。
PS S:\> wsl --mount \\.\PHYSICALDRIVE7 --bare
この操作を正しく終了しました。
先ほどの 7 を使ったが、心配なら GET-CimInstance -query "SELECT * from Win32_DiskDrive" で一覧を見てからやると良いだろう。
私は確認した。
> GET-CimInstance -query "SELECT * from Win32_DiskDrive"
DeviceID Caption Partitions Size Model
-------- ------- ---------- ---- -----
\\.\PHYSICALDRIVE4 KBG5AZNV256G LA KIOXIA 1 256052966400 KBG5AZNV256G LA KIOXIA
\\.\PHYSICALDRIVE1 ADATA SP550 1 240054796800 ADATA SP550
\\.\PHYSICALDRIVE2 TOSHIBA DT01ACA100 1 1000202273280 TOSHIBA DT01ACA100
\\.\PHYSICALDRIVE0 Samsung SSD 870 QVO 1TB 1 1000202273280 Samsung SSD 870 QVO 1TB
\\.\PHYSICALDRIVE3 TOSHIBA DT01ACA100 1 1000202273280 TOSHIBA DT01ACA100
\\.\PHYSICALDRIVE5 WD_BLACK SN7100 1TB 4 1000202273280 WD_BLACK SN7100 1TB
\\.\PHYSICALDRIVE6 Microsoft 仮想ディスク 1 858990666240 Microsoft 仮想ディスク
\\.\PHYSICALDRIVE7 Microsoft 仮想ディスク 0 68713989120 Microsoft 仮想ディスク
ext4 フォーマット
この状態で WSL2 にて ls /dev/sd* などとして見ると、PowerShell 前に比べて増えていると思う。
ここでは /dev/sdg だ。
$ ls /dev/sd*
/dev/sda /dev/sdc /dev/sde /dev/sdf /dev/sdg
/dev/sdb /dev/sdd /dev/sde1 /dev/sdf1
$ sudo fdisk -l /dev/sdg
Disk /dev/sdg: 64 GiB, 68719476736 bytes, 134217728 sectors
Disk model: Virtual Disk
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: dos
Disk identifier: 0xfc541691
Virtual Disk だし、64 GiB だし、たぶん間違いないだろう。
あとは Linux でやるように、fdisk で n とか p とか w とかで適当に Linux のパーティションを作って、
sudo mkfs -t ext4 /dev/sdg1 などとして ext4 フォーマットすればよい。
PowerShell から WSL2 にマウント
管理者モードの PowerShell コンソールからこんな感じで WSL2 側にマウントさせることができる。
PS S:\> wsl --mount --vhd T:\wsl_work2.vhdx --partition 1 --name work2
ディスクは '/mnt/wsl/work2' として正常にマウントされました。
注: /etc/wsl.conf で automount.root 設定を変更した場合、場所は異なります。
ディスクのマウントを解除してデタッチするには、'wsl.exe --unmount \\?\T:\wsl_work2.vhdx' を実行します。
WSL2 だと /mnt/wsl/ 以下に --name で指定したディレクトリ名でマウントされている。
WSL2 だけでマウントする(sudoなし)
今までの VHD ファイルはこんな感じのスクリプトを作り、~/.profile で bash mnt.sh で呼び出してもらっている。
特に sudo もせずにマウントできている。よく考えたら不思議だ。
#!/bin/bash
function mount() {
VHDFILE=$1
MNTNAME=$2
PARTNUM=$3
wsl.exe --mount --vhd "$VHDFILE" --partition $PARTNUM --name $MNTNAME > /dev/null
}
if [ ! -d /mnt/wsl/home2 ]; then
mount "u:\\wsl_home2.vhd" "home2" 1
fi
しかし今回作った VHD ファイルはエラーになってしまう。
VHDX(可変容量) も VHD(固定容量) も試してみたが、どちらもダメだ。
$ wsl.exe --mount --vhd "t:\\wsl_work2.vhdx" --partition 1 --name work2
ディスク '\\?\T:\wsl_work2.vhdx' を WSL2 にアタッチできませんでした: アクセスが拒否されました。
エラー コード: Wsl/Service/AttachDisk/MountDisk/HCS/E_ACCESSDENIED
これは Windows 側で VHDファイルの「セキュリティ」で Users グループにフルコントロールの権限を与えるとできるようになった。
理由は分からんが、なんかできた。