• Windows Subsystem for Linuxガイド 第012回 外部ドライブのマウント

WSL2には、外付けドライブなどをLinux側に直接マウントする機能がある。この機能は、LinuxパーティションやHDD/SDDなどの物理ドライブおよび仮想ハードディスク(VHDX)をWSL側に接続する機能。ただし、WSLが接続するため、すべてのWSLディストリビューションからアクセスが可能になる。

なお、現時点では、WSLには、Windows 10付属のもの、Windows 11に付属のもの、Microsoftストアで配布中のものの大きく3つがある(Windows 10/11ではバージョンで若干の相違がある)。「最新」のWSLは、Microsoftストアで配布が行われているものになる。この記事では、Microsoftストア版とWindows 11 Ver.22H2のWSLで評価を行った。結果が異なる場合には、その都度記述してある。

ドライブ、パーティション

外部記憶装置のオペレーティングシステムでの扱いは少し複雑な部分がある。ここでは、以後の説明の用語解説を兼ねて、PCアーキテクチャ上での外部記憶に関して簡単な解説を行う。外部記憶装置についてすでに理解しているというのであれば読み飛ばしていただいてもかまわない。

HDDやSDDのような外部記憶装置を「ドライブ」と呼ぶ。このドライブの記憶領域を複数に分割して使うのがパーティションだ。パーティションは、記憶領域の先頭にあるパーティションテーブルに記録される。このパーティションテーブルには、MBR形式とGPT形式の2つがある。

MBR形式は、MS-DOSの頃(IBM PC/XTのときに作られた)から使われている古い形式である。これに対してGPTは、UEFIとともに作られた新しい形式だ。現在は、GPT(GUID Partition Table)が標準である。

WSL2のドライブ接続機能は、MBR形式でも動作するが、記事が煩雑になることを避けるためにGPTであることを前提とさせていただく。

一般にパーティション上にファイルシステムを作り、読み書きを可能にしたものを「ボリューム」と呼ぶことがある。過去からの慣例で、ボリュームを「ドライブ」と表記することがある点には注意されたい。たとえば、Windowsで「Cドライブ」という場合、特定のドライブ、パーティションではなく、その上に作られたボリュームを意味していることがほとんどだ。

このボリュームをアプリケーションなどから利用可能にするには、「マウント」と呼ばれる操作が必要になる。マウント処理の逆を「アンマウント」といい、アンマウントされたパーティションは、アプリケーションからはアクセスができなくなる。

ドライブやパーティションの情報を得る

WSL2で外部ドライブをマウントするには、Linuxパーティションが必要になる。Linuxパーティションは、Linuxマシンで作成することはもちろん、WSL2で作成することも可能だ。ただし、事前の準備や手順は異なる。まずは、Win32側で接続されたドライブにLinuxパーティションが存在するかどうか、〈ドライブ番号〉や〈パーティション番号〉などを確認する方法を解説する。以下“〈”と“〉”でくくったものは、コマンドラインで使う引数を示す。

簡易な方法としては、「コンピュータの管理」にある「ディスクの管理」(写真01)を使う方法がある。Windows 11はスタートメニュー ⇒ すべてのアプリ ⇒ Windowsツール」から、Windows 10までは「コントロールパネル ⇒ 管理ツール」から開くことができる。また、コマンドラインや「ファイル名を指定して実行」(スタートメニューの右クリックやWin+R)からは、「diskmgmt.msc」で起動が可能だ。

  • 写真01: ディスクの管理(diskmgmt.msc)では、接続しているドライブとパーティションがグラフィックス表示される。ここでパーティションに「プライマリパーティション」としか表示されないのがWindows以外で作成されたパーティションだ

外部ドライブがGPT形式なら、ディスクの管理の下部に、グラフィカル表示されるドライブの先頭部分にある「ディスク xx」の部分が〈ドライブ番号〉でその左側がパーティションである。これは、左から順に1、2、3……という〈パーティション番号〉になる。

パーティションのところにNTFSなどのファイルシステムが表示されないものは、Windows以外から作られたパーティションである。ただし、ディスクの管理では、Windowsから作成されたものではない、ということしかわからない。自分で作成したものであれば、この程度の情報でも判断には十分だが、正確に判定したい場合には、PowerShellのコマンドを使う。

PowerShellコマンドで詳細な情報を得る

(表01)にディスク関連の情報を取得するためのPowerShellのコマンドを示す。まずは、“Get-Disk”コマンドを使い、ディスクを列挙させる(写真02)。

  • ■表01

  • 写真02: Get-Diskコマンドの出力で外部ドライブを探す。このとき先頭のNumberに表示されるのが〈ディスク番号〉である。〈ディスク番号〉をGet-Partitionコマンドの引数とすると、該当ディスクのパーティション一覧が表示される。LinuxのGUIDを持つパーティションの先頭にあるNumberが〈パーティション番号〉である。なおMBR形式ではGUIDは表示されない

Get-Diskコマンドの出力にある“FriendlyName”プロパティや"Size"プロパティで、対象ドライブを見つけ先頭にあるNumberを調べる。これが〈ディスク番号〉である。

その〈ディスク番号〉をGet-Partitionコマンドの引数としてコマンドを実行する。このとき、“PartitionNumber”、“GptType”の2つのプロパティを、select-objectコマンドで表示させる(それぞれタブキーでの補完入力が可能)。


Get-Partition 〈ディスク番号〉 | select PartitionNumber,GptType

GptTypeプロパティは、パーティションを識別するGUIDを返す。GUIDは、作成したプログラムやオペレーティングシステムで固有の値を使う(表02)。Windowsの通常パーティションなら“{EBD0A0A2-B9E5-4433-87C0-68B6B72699C7}”、Linuxなら“{0fc63daf-8483-4772-8e79-3d69d8477de4}”といった値を使う。表示されたGUIDを“パーティション”などのキーワードとともにインターネット検査すれば、さまざまな情報が見つかる。手軽な参照先のリンクとしては、Wikipediaなどがある。LinuxパーティションのGUIDが表示された“PartitionNumber”が対象の〈パーティション番号〉である。

  • ■表02

既存のLinuxパーティションをマウントする

Linuxパーティションが存在する場合、以下の手順でLinuxパーティションをマウントすることができる。なお、マウント操作には、Linuxパーティションの〈パーティション番号〉が必要になる。前述の方法で〈ディスク番号〉と〈パーティション番号〉をあらかじめ調べておく。

まず、対象ドライブの“DeviceID”を調べる(写真03)。それには、以下のコマンドを使う。


Get-CimInstance Win32_DiskDrive | select index,caption,DeviceID
  • 写真03: Get-CimInstance Win32_DiskDriveコマンドを使って、ドライブの〈デバイスID〉を調べる。出力の“DeviceID”がこれに該当する。出力先頭のindexが〈ディスク番号〉と一致する

表示される行のなかで、Linuxパーティションを持つ〈ディスク番号〉と、一致する「Number」もつ行の「DeviceID」が、以後のコマンドで指定する〈デバイスID〉になる。〈デバイスID〉は、「\.\PHYSICALDRIVE2」のような形式になっており、末尾の数字が〈ディスク番号〉と一致する。これは、Win32デバイス空間のパスで、Windows内部で利用されるデバイスの表現形式の1つだ。

〈デバイスID〉、〈パーティション番号〉が判明したところで、外部ドライブのマウントが可能になる。管理者権限で以下のコマンドを実行する(写真04)。


wsl.exe --mount 〈デバイスID〉 --partition 〈パーティション番号〉
  • 写真04: 得られた〈デバイスID〉と〈パーティション番号〉を使ってwsl.exeでマウントを実行する。このとき管理者権限が必要になる

そののち、WSLディストリビューションを起動すれば、該当のパーティションがマウントされているはずだ。

なお、WSLのプレビュー版とWindows 11 Ver.22H2に付属しているWSLでは、マウント時のメッセージに若干違いがある(詳細は次回解説予定)。

外部ドライブのマウントをWSLで確認

wsl.exeコマンドで外部ドライブをマウントすると、パーティションは、“/mnt/wsl/”以下にマウントされる。このとき、〈デバイスID〉の“\.\”以下の部分(PHYSICALDRIVE〈ドライブ番号〉と〈パーティション番号〉を組み合わせて、


/mnt/wsl/PHYSICALDRIVE〈ドライブ番号〉p〈パーティション番号〉

のようなディレクトリにマウントが行われる。

とりあえずは、lsコマンドなどで“/mnt/wsl/”以下のディレクトリなどを確認し、アクセスが可能ならば問題ないはずだ(写真05)。

  • 写真05: WSLディストリビューション側では、/mnt/wslの下に外部ドライブのパーティションがマウントされる。lsコマンドのほかブロックデバイスを表示するlsblkコマンドも利用できる

より正確には、lsblkコマンドなどでデバイス名などを確認できる。

外部ドライブのアンマウント

外部ドライブを取り外す場合などにはアンマウント処理が必要になる。まずは、すべてのWSLディストリビューションのウィンドウを閉じるなどしてログオフしておく。これは、WSL側でマウントしていたパーティションをアクセスしている最中にアンマウント処理を行わないようにするためだ。その後、管理者権限でアンマウントコマンドを実行する(写真06)。


wsl.exe --unmount 〈デバイスID〉

とする。

  • 写真06: 作業が終わったら必要に応じて、外部ドライブのマウントを解除する。これをアンマウントという。ファイルシステムを壊さないためには、WSLディストリビューションをすべて終了させたのちアンマウント処理を行うのが望ましい

なお、wsl自体をシャットダウン(wsl.exe --shutdown)すると、マウントされていたすべての外部ドライブがアンマウントされる。ただし、パーティションの状態を正しく保つという点では、WSLディストリビューションをすべて停止したあと、アンマウント処理を行うことが望ましい。

これでWSL2へのマウントは解除された。USB接続の外部ドライブなどでは、このあと通知領域にある「ハードウェアの安全な取り外し」で、該当のデバイスを選択して取り外し処理を行うことでUSBケーブルを抜くことが可能になる(写真07)。

  • 写真07: アンマウント処理が終わったら、システムトレー(タスクバー右側)のオーバーフロー領域にある「ハードウェアの安全な取り外し」アイコンをクリックしてドライブの接続を解除するのが、Windowsの正式なUSBドライブの取り外しかたである

まずは、Linuxパーティションが存在する場合の外部ドライブのマウントについて解説した。次回は、Linuxパーティションを持たない外部ドライブを接続して、WSLディストリビューション側でパーティションの作成からExt4ファイルシステムの作成を行い、WSL2で利用できるようにする方法を解説する。

Windows Subsystem for Linuxガイド 連載バックナンバー
https://news.mynavi.jp/tag/winsubsystem/