• Windows Subsystem for Linuxガイド 第15回 仮想ハードディスクをマウントする他

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

WSLでは、外部ハードディスクなど物理的な外部記憶デバイスだけでなく、仮想ハードディスク(Virtual Hard Disk。以下VHDと略す)をマウントすることもできる。WSLの外部ドライブマウント機能は、ローカルファイルシステムとは分離されるため、ここに残しておきたいファイルを置くことで、ディストリビューションを気軽に再インストールすることが可能だ。

また、外部ハードディスクは、WSL2ディストリビューション間で共有されている。WSL自体にはディストリビューション間のファイル転送機能はないが、これでディストリビューション間のファイル転送も可能になる。

ドライブファイルシステムでも似たようなことが可能ではあるが、Win32側から操作しなければならず、かつ9PFS経由になるため、ファイル転送速度が落ちるという欠点がある。

ここでは、VHDの作成やWSLへのマウント方法、VHDファイルの修正などについて解説する。まずは、本記事で利用する用語について、(表01)にまとめておく。なお、本記事では、Windows 11 Ver.22H2上で、Microsoftストア版WSL(Version 1.0.3.0)を動作させた環境を想定し、この環境で検証を行っている。

  • ■表01

「仮想ハードディスク」とは、ソフトウェアで物理的なハードディスクのエミュレーションを行う機能だ。Windowsでは、NTFS上のファイルを記憶領域として使う。2つの形式があるが、ここではVHD v2に対応するVHDX形式を使う。

VHDXには、「容量固定」(Fixed)、「容量可変」(Dynamic)、「差分」(Differencing)の3つタイプがある(表02)。WSL用に利用するには「容量可変」タイプを使う。

  • ■表02

VHDXファイルの作成、変更ツール

Windowsには、VHDXファイルの作成、編集などが可能な複数のツールがある。GUIツール、diskpart.exeコマンド、そしてWindows PowerShellのVHDコマンドだ(表03)。Windowsではパーティションサイズの変更なども可能だが、Linux用のパーティションやファイルシステム(ボリューム)は、Windowsのディスク関連ツールでは扱うことができないため、VHDXファイルの容量拡大以外の作業はWSL側ですべて行う。

  • ■表03

GUIツールは、「ディスクの管理」を使う。これは、スタートメニューの「Windowsツール」(Windows 11)、「Windows管理ツール」(Windows 10)にある「コンピュータの管理」の中にある。また、一部のVHD編集機能は、Hyper-Vマネージャーから「ディスクの編集」を起動して行う。Hyper-Vは、Homeエディションでは利用できない。本記事では、記事量も限られているため、GUIを使う方法については、割愛させていただくことにする。

コマンドラインプログラムとしてはdiskpart.exeがある。diskpart.exeは、ハードディスクの基本設定などを行うツールだが、VHDファイルの作成や簡単な編集操作が行える。diskpart.exeを実行し、その中で「サブコマンド」を指定して対話的に処理を行う。実行には管理者権限が必要だ。

コマンドラインシェルのWindows PowerShellからもVHDファイル関連のコマンドが利用できる。ただし、Windows PowerShellのVHDコマンドは、Hyper-Vに含まれているため、Homeエディションでは利用できない。つまり、Homeエディションの場合、diskpart.exeを使うしか方法がない。

容量可変VHDXファイルの新規作成

まずは、VHDXファイルを新規に作成しWSL2で利用可能にするまでを解説する。説明を簡易にするため、表04の仕様でVHDXファイルを作成する。コマンドなどは、この仕様を使うため、各自の環境や用途に合わせてパラメーターを変更して利用していただきたい。

  • ■表04

diskpart.exeを使う場合、管理者権限でコンソールウィンドウを起動したら、diskpart.exeを起動し、以下のコマンドでVHDXファイルを作成する(写真01)。


diskpart.exe
create vdisk file="C:\VHD\test.vhdx" maximum=10240 type=expandable
exit

PowerShellでは、


New-VHD -path C:\VHD\test.vhdx -SizeBytes 10GB -Dynamic

とする(写真02)。

  • 写真01: diskpart.exeでVHDXファイルを作成するには起動後、create vdiskサブコマンドを使う。このサブコマンドではVHDの容量は、メガバイト単位で指定する。10ギガバイトは、10240(=10×1024)と指定する

  • 写真02: PowerShellからは、New-VHDコマンドでVHDXファイルを作ることができる

作成したら、WSL側にマウントし、以後の作業はWSLで行う。マウントは、


wsl.exe --mount C:\VHD\test.vhdx --vhd --bare

とする。以後の作業は、前回解説と同じである。

・(前回解説)Windows Subsystem for Linuxガイド 第14回 外部ドライブを初期化する
https://news.mynavi.jp/article/20230116-2564693/

初期化が終わったら、WSLを抜け、以下のコマンドでマウントを解除、改めてパーティションをマウントする。


wsl.exe --unmount
wsl.exe  --mount C:\VHD\test.vhdx --vhd --partition 1 --name vhd1

最後のオプションである「--name vhd1」は、/mnt以下にマウントする場合のディレクトリ名になる。デフォルトではVHDXファイルのパスからディレクトリ名が作られるが、--nameオプションを使うことで分かりやすいマウント先パスにできる。

VHDXファイルの容量を増加する

ここでは、上記で作成したVHDXファイルの容量を15ギガバイトに拡大して、パーティションやファイルシステムを拡大した容量に対応させる方法を解説する。ただし、対象のVHDXファイルは、過去にWSLにマウントされ、ファイルが書き込まれた状態であるとする。

最初の作業は、VHDXファイルの最大容量の変更だ。このパラメーターは、VHDXファイルの内部に書き込まれているため、これを書き換えるだけだ。この作業だけは、Win32側で行う必要がある。

まずは、diskpart.exeを使う方法を解説する。予めWindows Terminalを管理者権限で開いてからdiskpart.exeを起動する。

以下のコマンドを使い、VHDの容量を変更する(写真03)。


diskpart.exe
select vdisk file=c:\vhd\test.vhdx
expand vdisk maximum=15360
exit
  • 写真03: VHDXファイルを使った仮想ハードディスクの容量を増やすには、diskpart.exeで、select vdiskコマンド、expand vdiskコマンドを使う。またdetail vdiskコマンドで状態を表示させることもできる

VHDの容量変更は3行目で行い、expandコマンドでは、最大容量をメガバイト単位で指定する。15ギガバイトに変更するのであれば、15GB=15×1024MBなので“15360”を指定する。

PowerShellを使う場合には、以下のコマンドを使う(写真04)。なお、ここでは、シェルとしてPowerShell(Ver.7.2.9)を想定している。


Resize-VHD c:\VHD\test.vhdx -SizeBytes 15GB
  • 写真04: PowerShellで仮想ハードディスクの容量を増やすには、Resize-VHDコマンドを使う。Get-VHDコマンドでVHDXファイルの状態を表示できる

これで、既存のVHDXファイルの容量を拡大することができた。

パーティションとファイルシステムを適合させる

万一の事故を考慮し、マウントする前にWin32側でVHDXファイルのコピーを作ることをお勧めする。

以後の作業はLinux側から行う。すぐにマウントしてもいいが、先にWSLを起動しておくと、WSL2のローカルファイルシステムが先にマウントされ、仮想ハードディスクファイルが次にマウントされる。このようにすることで、ローカルファイルシステムを/dev/sdc、仮想ハードディスクファイルを/dev/sddにすることができる。

ここでは、マウントしたVHDXファイルは、/dev/sddに対応すると仮定する。なお、Linux側で“lsblk”コマンドを使うことで、ディスク(ブロックデバイス)の状態を確認できる。

wsl.exeでWSL2ディストリビューションを起動したあと、bareモードでVHDXファイルをWSL側にマウントする。マウントは、前述の「容量可変VHDXファイルの新規作成」で示したものと同じである。

Linux側では、gdiskコマンドを使う。作業としては、GPTパーティションテーブルを作り直し、その後、新規にフルサイズでパーティションを新規作成する。gdiskでのこれらの作業はパーティションの内部にあるセクターには手をつけない。

gdiskを起動したら「o」、「n」、「w」の3つのコマンドを実行する(写真05)。コマンドを実行するとパラメーターや実行の可否を聞いてくるが、パラメーターはすべてエンターキーで先に進み、可否に関してはすべて“y”を入力すればよい。

  • 写真05: VHDXファイルの容量を増やしたら、以後の作業はLinuxのgdiskコマンドを使いパーティションを増加した容量に適合させる。oコマンドでGPTを作り直し、nコマンドを使い最大容量で新規にパーティションを作り直し、最後にwコマンドでGPTを書き込んでgdiskコマンドを抜ける

これでパーティションがVHDXファイルの容量と一致したので、最後にファイルシステムをパーティションサイズに追従させる(写真06)。それには以下のコマンドを実行する(対象パーティションは/dev/sdd1とする)。


sudo e2fsck -f /dev/sdd1
sudo resize2fs /dev/sdd1
  • 写真06: gdiskコマンドでパーティションをディスクに適合させたら、次は、resize2fsコマンドでファイルシステムをパーティションサイズに適合させる。ただしその前にe2fsckコマンドを使い、ファイルシステムを正しい状態にしておく必要がある

最初のコマンドは、ファイルシステムの整合チェックと修復を行うもの。“-f”は、チェックを強制するオプションである。次のコマンドは、ファイルシステムとパーティションサイズを一致させるものだ。これで、ファイルシステムが、パーティションサイズと一致した。

実際にファイルシステムの容量を調べてみる。それには以下のコマンドを使う(写真07)。なお、事前に“/mnt”にxというディレクトリが作られていると仮定する。


sudo mount /dev/sdd1 /mnt/x
df -T -h /dev/sdd1
  • 写真07: ファイルシステムを適合させたら、マウントして、dfコマンドでファイルシステムの状態をチェックすることができる

あとは、“wsl.exe --unmount”でマウントし、容量を拡大したVHDXファイルを通常通りマウントすればよい。マウント方法は「容量可変VHDXファイルの新規作成」で示したものと同じ。

VHDXファイルは手軽に作成でき、簡単に容量を追加することができる。別ディスクとすることで、ディストリビューションのローカルファイルシステムと分離可能で、複数のディストリビューション間でも共有が可能だ。

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