>> 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)を動作させた環境を想定し、この環境で検証を行っている。
「仮想ハードディスク」とは、ソフトウェアで物理的なハードディスクのエミュレーションを行う機能だ。Windowsでは、NTFS上のファイルを記憶領域として使う。2つの形式があるが、ここではVHD v2に対応するVHDX形式を使う。
VHDXには、「容量固定」(Fixed)、「容量可変」(Dynamic)、「差分」(Differencing)の3つタイプがある(表02)。WSL用に利用するには「容量可変」タイプを使う。
VHDXファイルの作成、変更ツール
Windowsには、VHDXファイルの作成、編集などが可能な複数のツールがある。GUIツール、diskpart.exeコマンド、そしてWindows PowerShellのVHDコマンドだ(表03)。Windowsではパーティションサイズの変更なども可能だが、Linux用のパーティションやファイルシステム(ボリューム)は、Windowsのディスク関連ツールでは扱うことができないため、VHDXファイルの容量拡大以外の作業はWSL側ですべて行う。
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ファイルを作成する。コマンドなどは、この仕様を使うため、各自の環境や用途に合わせてパラメーターを変更して利用していただきたい。
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)。
作成したら、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
VHDの容量変更は3行目で行い、expandコマンドでは、最大容量をメガバイト単位で指定する。15ギガバイトに変更するのであれば、15GB=15×1024MBなので“15360”を指定する。
PowerShellを使う場合には、以下のコマンドを使う(写真04)。なお、ここでは、シェルとしてPowerShell(Ver.7.2.9)を想定している。
Resize-VHD c:\VHD\test.vhdx -SizeBytes 15GB
これで、既存の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”を入力すればよい。
これでパーティションがVHDXファイルの容量と一致したので、最後にファイルシステムをパーティションサイズに追従させる(写真06)。それには以下のコマンドを実行する(対象パーティションは/dev/sdd1とする)。
sudo e2fsck -f /dev/sdd1
sudo resize2fs /dev/sdd1
最初のコマンドは、ファイルシステムの整合チェックと修復を行うもの。“-f”は、チェックを強制するオプションである。次のコマンドは、ファイルシステムとパーティションサイズを一致させるものだ。これで、ファイルシステムが、パーティションサイズと一致した。
実際にファイルシステムの容量を調べてみる。それには以下のコマンドを使う(写真07)。なお、事前に“/mnt”にxというディレクトリが作られていると仮定する。
sudo mount /dev/sdd1 /mnt/x
df -T -h /dev/sdd1
あとは、“wsl.exe --unmount”でマウントし、容量を拡大したVHDXファイルを通常通りマウントすればよい。マウント方法は「容量可変VHDXファイルの新規作成」で示したものと同じ。
VHDXファイルは手軽に作成でき、簡単に容量を追加することができる。別ディスクとすることで、ディストリビューションのローカルファイルシステムと分離可能で、複数のディストリビューション間でも共有が可能だ。
>> Windows Subsystem for Linuxガイド 連載バックナンバー
https://news.mynavi.jp/tag/winsubsystem/