WSLに仮想HDDを常時マウントする方法
はじめに
WSLはWindows上のファイルシステムへのアクセス手段を提供しており非常に扱いやすい環境ですがファイルフォーマットの違いによりファイル圧縮・伸張をおこなうとオーバーヘッドが発生し充分なパフォーマンスが得られないケースがあります、今回はWSL用の仮想HDDを作成しlinuxのフォーマットext4を適用しWSLのパフォーマンス改善と作業スペースの確保を行います
WSLからWindows上の仮想HDDを利用する手順
※ 利用条件
・仮想HDDの格納場所:C:\VHDX
・仮想HDDのファイル名: DK90.vhdx
・仮想HDDのフォーマット:ext4
・WSL起動時に常時 /mnt/dk90 にマウント
・WSLのLinuxは Ubuntu-20.04
① PowerShell を管理者権限で起動します
② diskpart起動
PS C:\> diskpart
③ 仮想HDD【VHDXファイル】作成
DISKPART> create vdisk file="C:\VHDX\DK90.vhdx" maximum=20480 type=expandable
100% 完了しました
DiskPart により、仮想ディスク ファイルが正常に作成されました。
④ DISKPARTを終了
DISKPART> exit
⑤ 仮想HDDファイルをフルアクセス可能にします
PS C:\> icacls "C:\VHDX\DK90.vhdx" /grant Everyone:F
⑥ 仮想HDDをWSLでマウントするスクリプトを作成
●ファイル名:C:\VHDX\mount_vhdx.ps1
# mount_vhdx.ps1
param (
[string]$vhdxPath = "C:\VHDX\DK90.vhdx"
)
# VHDX ファイルのマウント
wsl --mount $vhdxPath --vhd --bare
⑦ マウントスクリプトを管理者権限で実行するスクリプトを作成
●ファイル名:C:\VHDX\run_as_admin.bat
@echo off
PowerShell -NoProfile -ExecutionPolicy Bypass -Command "Start-Process PowerShell -ArgumentList '-NoProfile -ExecutionPolicy Bypass -File ""C:\VHDX\mount_vhdx.ps1""' -Verb RunAs"
⑧ 仮想HDDをWSLでマウント
PS C:\> wsl --mount "C:\VHDX\DK90.vhdx" --vhd --bare
⑨ WSL(Linux)上ターミナルで追加したデバイスを確認
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 389.8M 1 disk
sdb 8:16 0 256G 0 disk /mnt/wslg/distro
sdc 8:32 0 20G 0 disk <== 追加したHDD
⑩ マウントしたHDDをフォーマットします
$ sudo mkfs.ext4 /dev/sdc
※ 処理中に出力されるUUIDを確認する
mke2fs 1.45.5 (07-Jan-2020)
Discarding device blocks: done
Creating filesystem with 5242880 4k blocks and 1310720 inodes
Filesystem UUID: a708a3bf-6442-4b0f-b186-32d977068ce6
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000
⑪ マウントポイントを作成
$ mkdir -p /mnt/dk90
⑫ マウントスクリプトを作成
$ vi /root/mount.sh
/root/mount.sh の内容
#!/bin/bash
# UUIDの値でマウント判定
# 検索するUUID
UUID="cb102773-f017-4ff2-b12a-19f64a5f2302"
# UUIDが存在するか確認
if ls -l /dev/disk/by-uuid | grep -q "$UUID"; then
echo "UUID $UUID が見つかりました。"
else
# 管理者権限でバッチファイルを呼び出す
/mnt/c/Windows/System32/cmd.exe /c "C:\VHDX\run_as_admin.bat"
fi
# マウントポイントのディレクトリ
MOUNT_POINT="/mnt/dk90"
# マウントされているかどうかを確認
if ! mountpoint -q "$MOUNT_POINT"; then
# マウントされていない場合のみマウントを実行
echo "Mounting the drive..."
# ⑩で確認した UUIDを下記設定で使用
# Filesystem UUID: a708a3bf-6442-4b0f-b186-32d977068ce6
mount UUID=a708a3bf-6442-4b0f-b186-32d977068ce6 "$MOUNT_POINT"
else
echo "Drive is already mounted."
fi
⑬ 実行権限を付与
$ chmod +x /root/mount.sh
⑭ /root/startup.sh の編集
$ vi /root/startup.sh
/root/startup.sh の内容
#!/bin/bash
bash /root/mount.sh
⑮ /etc/wsl.conf の編集
・[bool]セクションのcommand を修正
[wsl2]
memory=10GB
[network]
generateResolvConf = false
[boot]
systemd=true
command = /bin/bash /root/startup.sh # この部分を追加又は修正
※ 既に command が指定されていたら /root/startup.sh に既存の定義を記述する
・【例】command = systemctl start hello が定義済みだった場合
/root/startup.sh の内容
#!/bin/bash
systemctl start hello
bash /root/mount.sh
⑯ PowerShell から WSLをシャットダウンし再起動
PS C:\> wsl --shutdown
PS C:\> wsl -d Ubuntu-20.04
⑰ WSL(Linux)上のコマンドでマウント状況を確認
$ df -h
Filesystem Size Used Avail Use% Mounted on
none 4.9G 4.0K 4.9G 1% /mnt/wsl
none 950G 389G 562G 41% /usr/lib/wsl/drivers
/dev/sdb 251G 26G 213G 11% /
none 4.9G 76K 4.9G 1% /mnt/wslg
none 4.9G 0 4.9G 0% /usr/lib/wsl/lib
rootfs 4.9G 2.1M 4.9G 1% /init
none 4.9G 0 4.9G 0% /dev
none 4.9G 800K 4.9G 1% /run
none 4.9G 0 4.9G 0% /run/lock
none 4.9G 0 4.9G 0% /run/shm
tmpfs 4.9G 0 4.9G 0% /sys/fs/cgroup
none 4.9G 76K 4.9G 1% /mnt/wslg/versions.txt
none 4.9G 76K 4.9G 1% /mnt/wslg/doc
C:\ 950G 389G 562G 41% /mnt/c
/dev/sdc 20G 24K 20G 0% /mnt/dk90 <==※
Windowsから仮想HDDの内容を確認するには
- Windowsから認識できないext4 でフォーマットしましたがエクスプローラーからアクセスできます
ファイルエクスプローラのディレクトリ指定に
\\wsl.localhost\Ubuntu-20.04\mnt\dk90
で確認できます
※ Windows側からの操作はパフォーマンスが多少低下します
最後に
WSLに仮想HDDを常時マウントすることで、Windowsファイルシステムのオーバーヘッドを回避し、パフォーマンスの向上が期待できます。これにより、Linuxネイティブのファイルシステムであるext4を使用することで、WSLのパフォーマンスが最適化され、特に大容量のファイル操作やコンパイル作業などの重い処理でも安定した動作を実現できます。
また、仮想HDDの使用によって、システムドライブとは独立した作業スペースを確保でき、データの安全性を高めることも可能です。仮想HDDのバックアップやクローン作成を活用することで、環境の再構築や復元が簡単に行える点も大きな利点です。
本手順を通じて、WSL環境の柔軟性と効率をさらに高めることができるため、今後の開発作業においても安定した作業環境を維持するための一助となれば幸いです。常時マウントの設定は、作業効率を高めるだけでなく、日々の開発をより快適なものにしますので、ぜひ実践してみてください。