hiro99ma blog

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 でやるように、fdiskn とか 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 ファイルはこんな感じのスクリプトを作り、~/.profilebash 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 グループにフルコントロールの権限を与えるとできるようになった。
理由は分からんが、なんかできた。

writer: hiro99ma

 
About me
About me
comment
Comment Form
🏠
Top page
GitHub
GitHub
Twitter
X/Twitter
My page
Homepage