WSLに仮想HDDを常時マウントする方法

WSL

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環境の柔軟性と効率をさらに高めることができるため、今後の開発作業においても安定した作業環境を維持するための一助となれば幸いです。常時マウントの設定は、作業効率を高めるだけでなく、日々の開発をより快適なものにしますので、ぜひ実践してみてください。

タイトルとURLをコピーしました