WSL2で外付けSSDを使う(ext4でフォーマットして使用する)

最終更新日:2023年7月1日

はじめに

WSL2からWindows側のドライブにアクセスするだけなら非常に簡単です。
「/mnt/c」「/mnt/d」などでそれぞれCドライブ、Dドライブにアクセスできます。

しかし、それらのドライブはWindowsファイルシステムでフォーマットされているのでWSL2で読み書きする時に本来の速度が出ません。

今回は外付けSSDをext4形式でフォーマットしてWSL2専用の外付けドライブとして使用してみました。

使用したもの

KIOXIA 500GB NVMe M.2 SSD『EXCERIA SSD-CK500N3/N』
FIDECO M.2 NVMe SATA SSDケース 『M203CP』

使用環境

C:\>wsl --status
既定のディストリビューション: Ubuntu-20.04
既定のバージョン: 2
WSL1 は、現在のマシン構成ではサポートされていません。
WSL1 を使用するには、"Linux 用 Windows サブシステム" オプション コンポーネントを有効にしてください。
WSL バージョン: 0.50.2.0
カーネル バージョン: 5.10.74.3
WSLg バージョン: 1.0.29
Windows バージョン: 10.0.22000.376

方法

SSDのフォーマット

Windowsの標準機能ではext4形式でのフォーマットはできないのでフリーソフト『AOMEI Partition Assistant』を使わせて頂きました。
www.diskpart.com

Windows側から使用するデバイスを見る

コマンドプロンプトで wmic.exe diskdrive get deviceID,Caption を実行します。

C:\>wmic.exe diskdrive get deviceID,Caption
Caption                            DeviceID
CT500MX500SSD1                     \\.\PHYSICALDRIVE1
SAMSUNG MZ7LN256HMJP-000H1         \\.\PHYSICALDRIVE0
JMicron Tech SCSI Disk Device      \\.\PHYSICALDRIVE3
Generic- SD/MMC/MS PRO USB Device  \\.\PHYSICALDRIVE2

自分の環境では3番目の『JMicron Tech SCSI Disk Device \\.\PHYSICALDRIVE3』が外付けSSDです。
どれかわからない時は外付けSSDを外した状態でもう一回実行すれば良いと思います。
『\\.\PHYSICALDRIVE3』を次で使います。

WSL2側からデバイスを見る

まずはWSL2を立ち上げて lsblk を実行します。
この時点では外付けSSDは見えていません。

user@OMEN-870-281jp:~$ lsblk
NAME MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda    8:0    0 344.9M  1 disk
sdb    8:16   0     4G  0 disk [SWAP]
sdd    8:48   0   256G  0 disk /



次にWindows側で外付けSSDをアタッチします。
管理者として実行したコマンドプロンプトで以下のようbareオプションをつけてmountを実行するとアタッチされます。

C:\>wsl --mount \\.\PHYSICALDRIVE3 --bare
この操作を正しく終了しました。



最後にWSL2に戻って lsblk をもう一回実行します。

user@OMEN-870-281jp:~$ lsblk
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda      8:0    0 344.9M  1 disk
sdb      8:16   0     4G  0 disk [SWAP]
sdc      8:32   0 465.8G  0 disk
└─sdc1   8:33   0 465.8G  0 part
sdd      8:48   0   256G  0 disk /

最初の出力と比較するとsdc, sdc1が今回のSSDだとわかります。sdc1の1はバーティション番号です。次で使います。

最後にマウントする

管理者として実行したコマンドプロンプトでパーティション番号を指定してmountを実行します。

C:\>wsl --mount \\.\PHYSICALDRIVE3 --partition 1
ディスク \\.\PHYSICALDRIVE3 は、名前 'PHYSICALDRIVE3p1' で正常にマウントされました。マウントポイントは、自動マウント設定が指すパス (既定: /mnt/wsl) の下にあります。
ディスクのマウントを解除してデタッチするには、'wsl.exe --unmount \\.\PHYSICALDRIVE3' を実行します。

これでWSL2からext4でフォーマットされた外付けSSDを使用することが可能になります。


2回目以降は最後のここだけ実行すれば良いです。


マウントの解除はこのようにします。

wsl --unmount \\.\PHYSICALDRIVE3

WSL2の作業を終了するのであれば以下で自動的にマウントは解除されます。

wsl --shutdown

注意点

ファイルやフォルダの作成、変更、削除にroot権限が必要ですと警告が出る場合があります。

その場合には以下を実行すれば良いと思います。

sudo chmod -R 777 /mnt/wsl/PHYSICALDRIVE3p1/

フォルダのアクセス権限を変更しています。
「-R」は「recursive」を設定しています。そのフォルダだけでなくフォルダ以下を一括して変更可能です。
このコマンドは一時的な変更ではないようです。どこかに保存されているのでしょう。
2回目以降は不要です。

補足

C#で以下のようなコンソールアプリを作っておくとマウントを自動化できます。

using System.Diagnostics;

namespace mountDISK
{
    internal class Program
    {
        static void Main(string[] args)
        {
            var proc = new Process();
            proc.StartInfo.FileName = @"c:\Windows\System32/cmd.exe";
            proc.StartInfo.Verb = "RunAs";
            proc.StartInfo.UseShellExecute = true;
            proc.StartInfo.Arguments = @"/C wsl --mount \\.\PHYSICALDRIVE3 --partition 1";
            proc.Start();
        }
    }
}

さいごに

改善点や間違いがあればコメントして頂けたらうれしいです。

高パフォーマンスのための設定(2022年4月14日追記)

こちらに注意点を書きました。
touch-sp.hatenablog.com

2023年7月1日追記

良かったらこちらの記事も読んで下さい。
touch-sp.hatenablog.com