ASCII.jp WSL2で用いるルートファイルシステムの容量を拡大する方法は?
WSL2(Windows Subsystem for Linux 2)では、仮想マシンを使ってLinux環境を実現している。そのネイティブファイルシステムは、仮想ハードディスクファイル上にある。「ext4.vhdx」と呼ばれるこのファイルは、容量可変形式で作られ、最大容量は256GBに指定されている。この値は固定値なので、場合によっては足りなくなることがある。今回はこの容量を拡大する方法を解説しよう
WSL2ではディストリビューションのインストール時に容量可変の仮想ハードディスクファイルにext4ファイルシステムを作る。このときの容量は256GB固定だ
仮想ハードディスクファイルの最大容量を拡大する
仮想ハードディスクファイルには一般に「容量可変」と「容量固定」の2タイプがあるが、通常は利用した分だけ記憶容量を消費する、容量可変を用いるケースが多い。容量可変の仮想ハードディスクファイルでは最大容量が指定してあり、ソフトウェア側からはその容量を持つドライブであるように見える。
容量可変の仮想ハードディスクファイルはDISKPARTコマンドを使うことで最大容量を増やすことが可能だ。ただし、対象がext4形式の場合は、DISKPARTコマンドの機能には制限がある。
たとえば、最大容量を小さくすることはNTFS形式のみ可能で、ext4形式でフォーマットされた仮想ハードディスクファイルには対応していない。もっとも最大容量は名目上の容量であり、これを大きくしたからといって、ただちにファイルサイズが拡大するわけではない。その意味では気軽に拡大してしまいがちだが、小さくはできないとなると注意が必要だ。
どうしても小さくしたい場合には、wsl.exeでディストリビューションをファイルにエクスポート(--exportオプションを使う)して、新規に作成した同一ディストリビューションにインポート(--importオプション)するしかなさそうだ。また、最大容量を変更したあと、WSLディストリビューション側で容量を再認識させる必要がある。
WSLディストリビューションのext4.vhdxを探す
最初に処理対象となるWSLディストリビューションのext4.vhdxファイルを探す必要がある。DISKPARTコマンドで仮想ハードディスクファイルをあつかうには、そのフルパスが必要になるからだ。
ext4.vhdxは、ユーザーフォルダー以下の「Appdata\packages」にあるWSLディストリビューションのパッケージフォルダーのLocalStateフォルダーに含まれている。インストールしているWSLディストリビューションが1つしかなければ、探すのはそれほど難しくない。しかし、複数のWSLディストリビューションがある場合には、以下の方法を使う。なお、コマンドの機能などからWindows PowerShellを用いる。また、DISKPARTコマンドには管理者権限が必要となる。
まずは処理するWSLディストリビューションが停止していることを確認する。開いているコンソールがあれば、exitで抜け、念のため「wsl.exe --shutdown」を実行しておく。次に以下のコマンドを使って、ディストリビューションのパッケージ名を探す。また、表は入手可能な主なWSLディストリビューションの名称とパッケージ名である。
Get-AppxPackage "*WSLディストリビューション名の一部*" | select packagefullname
Get-AppxPackageの引数は、たとえばUbuntu-18.04を見つけたい場合には、「Get-AppxPackage "*Ubuntu*"」などと指定する。パッケージ名がわかったら、次はユーザーフォルダーのAppData\local\packageの下でパッケージ名を探す。PowerShellなら、
Get-ChildItem $env:LOCALAPPDATA\packages\
と入力して、パッケージ名先頭の文字(たとえば、Ubuntu系ならCanonicalなど)を続けて入力してタブキーで補完してパッケージのパスを作り、さらに「\localstate\ext4.vhdx」を続けてフルパスを得る。これをクリップボードにコピーしておく。
続いて実際にDISKPARTを起動する
DISKPARTコマンドを起動する。
仮想ハードディスクファイル(.vhdx)の最大容量を大きくするには、DISKPARTコマンドを使う。パスが長く補完機能も使えないため事前に仮想ハードディスクファイルのフルパスをクリップボードにコピーしておく必要がある
もし、起動したコンソールが管理者権限でなければ、別ウィンドウが開く。DISKPARTコマンドのプロンプトでVDISK(仮想ディスク)を選択するために以下のサブコマンドを入れる。
select vdisk file="ext4.vhdxのフルパス"
その後、確認のために「detail vdisk」コマンドで情報を表示させる。デフォルトのままであれば、「仮想サイズ」に256GBと表示されているはずである。
では、最大サイズを300GBに拡大する。それには、
expand vdisk maximum=307200
とする。
DISKPARTのEXPANDコマンドで仮想ハードディスク(VDISK)の最大容量を拡大できる
307200は、300×1024である。maximumではMB単位でサイズを指定するため、GBにするには1024を掛ける必要がある。コマンドが終了したらexitコマンドでDISKPARTを終了させる。
次に仮想ハードディスクファイルの最大容量を変更したWSLディストリビューションを起動する。対象ディストリビューションを間違えないように注意する。起動はwsl.exeからで、以下のようにきちんとディストリビューション名をつけたほうがよい。
wsl.exe -d Ubuntu-18.04
起動したら、先に現在のファイルシステムのサイズを確認しておく。それには、dfコマンドを使う。
事前にdfコマンドやlsblkコマンドでルートファイルシステムに対応するデバイス名と容量を確認しておく
df -h
ここで、ルートファイルシステムを確認しておく。dfコマンドの出力で「Mounted on」が「/」になっているデバイスがルートファイルシステムである。前記の例では「/dev/sdc」だった。ただし、実行環境により、他のデバイス名になることがある。デバイス名が判定できたら、以下のコマンドを使う。
sudo resize2fs /dev/sdc 300G
このコマンドは、パーティション内のファイルシステムのサイズを変更するもの。これで/dev/sdcの容量が大きくなったはずだ。最後にexitコマンドでWSLを抜け、一回シャットダウンしておく。
1つ前の画面と比較すると、/dev/sdcの容量が増えている。dfは容量値の計算方法が違うため、resize2fsやDISKPARTの表示とは一致しない。lsblkコマンドでは300GBとなっている
仮想ハードディスクの最大容量の変更は、NTFSならマウントしてGUI(「コンピュータの管理」→「ディスクの管理」)からでも可能なのだが、Windowsのツールはext4に対応していないため、ファイルシステムの変更(前記のresize2fsに相当する機能)をすることができない。
一方でDISKPARTコマンドは、今の感覚からすれば相当古いものであり、パスの補完機能がないため、事前にフルパスを調べておく必要がある。しかしWSLディストリビューションは、Microsoftストアのパッケージとして配布されているため、その位置を探すのが面倒。できればPowerShellに管理ツールぐらい用意してほしいところだ。