WSL ディスク領域を管理する方法

このガイドでは、WSL 2 を使用してインストールされた Linux ディストリビューションで使用されるディスク領域を管理する方法について説明します:

Linux 用 Windows サブシステム (WSL 2) では、仮想化プラットフォームを使用してホスト Windows オペレーティング システムと共に Linux ディストリビューションをインストールし、インストールする各 Linux ディストリビューションのファイルを格納する仮想ハード ディスク (VHD) を作成します。 これらの VHD は ext4 ファイル システムの種類を使用し、Windows ハード ドライブでは ext4.vhdx ファイルとして表されます。

WSL 2 では、ストレージのニーズに合わせてこれらの VHD ファイルのサイズが自動的に変更されます。 既定では、WSL 2 で使用される各 VHD ファイルには、最初に最大 1 TB のディスク領域が割り当てられます (WSL リリース 0.58.0 より前では、この既定値は最大 512 GB、さらにそれ以前は最大 256 GB に設定されていました)。

Linux ファイルに必要なストレージ領域がこの最大サイズを超えると、ディスク領域が不足していることを示すエラーが表示されます。 このエラーを解決するには、WSL 2 仮想ハード ディスクのサイズを拡張する方法に関する以下のガイダンスに従ってください。

使用可能なディスク領域をチェックする方法

Linux Df コマンドを使用して、WSL 2 と共にインストールされた Linux ディストリビューションの VHD で使用可能なディスク領域の量を確認します。

使用可能なディスク領域をチェックするには、PowerShell コマンド ラインを開き、次のコマンドを入力します (<distribution-name> を実際のディストリビューション名に置き換えます):

wsl.exe --system -d <distribution-name> df -h /mnt/wslg/distro

このコマンドが機能しない場合は、wsl --update コマンドを使用するか wsl df -h / を試して WSL のストア バージョンにアップグレードしてください。

出力には次に含まれています:

  • Filesystem: VHD ファイル システムの識別子
  • Size: ディスクの合計サイズ (VHD に割り当てられた最大領域)
  • Used: VHD で現在使用されている領域の量
  • Avail: VHD に残っている領域の量 (割り当てられたサイズから使用量を差し引いた値)
  • Use%: 残りのディスク領域の割合 (使用済み / 割り当て済みサイズ)
  • Mounted on: ディスクがマウントされているディレクトリ パス

VHD に割り当てられている使用可能なディスク領域に近い場合、またはディスク領域が残っていないために既にエラーが発生している場合は、Linux ディストリビューションに関連付けられている VHD に割り当てられているディスク領域の最大容量を拡張する手順については、次のセクションを参照してください。 WSL によって VHD に割り当てられたディスク領域の量は、実際の Windows デバイス上のディスク領域の量がそれより小さい場合でも、常に既定の最大容量 (最新バージョンの WSL では 1 TB) が表示されます。 WSL では、使用する際にサイズが拡大する VHD がマウントされるため、Linux ディストリビューションでは、割り当てられた最大サイズの 1 TB まで拡大できることがわかります。 

WSL 2 仮想ハード ディスクのサイズを拡張する方法

Linux ディストリビューションの VHD サイズを、割り当てられたディスク領域の 既定の最大容量である 1 TB を超えて拡張するには、次の手順に従います。 (まだ更新されていない以前の WSL リリースの場合、この最大既定値は 512 GB または 256 GB に設定できます)。

  1. 次のコマンドを使用して、すべての WSL インスタンスを終了します: wsl.exe --shutdown

  2. マシンにインストールされている Linux ディストリビューションに関連付けられている ext4.vhdx ファイルへのディレクトリ パスをコピーします。 ヘルプについては、「Linux ディストリビューションの vhdx ファイルとディスク パスを見つける方法」を参照してください。

  3. 管理者特権で Windows コマンド プロンプトを開き、次のように入力して diskpart コマンド インタープリターを開きます:

    diskpart
    
  4. DISKPART> プロンプトが表示されます。 次のコマンドを入力し、<pathToVHD> を Linux ディストリビューションに関連付けられている ext4.vhdx ファイルへのディレクトリ パスに置き換えます (手順 2 でコピー済み)。

    Select vdisk file="<pathToVHD>"
    
  5. VHD が割り当てられている現在の最大サイズを表す仮想サイズなど、この仮想ディスクに関連付けられている詳細を表示します:

    detail vdisk
    
  6. 仮想サイズをメガバイトに変換する必要があります。 たとえば、仮想サイズ: 512 GB となっている場合、512000 MB に等しくなります。 入力する新しい値は、この元の値より大きくする必要があります。 仮想サイズを 512 GB から 1024 GB に倍増するには、値を 1024000 とし、MB 単位で入力します。 仮想ディスクのサイズを小さくするプロセスははるかに複雑であるため、実際に必要以上の値を入力しないように注意してください。

  7. Windows コマンド プロンプト DISKPART> を使用して、この Linux ディストリビューションに割り当てる新しい最大サイズの値を入力します:

    expand vdisk maximum=<sizeInMegaBytes>
    
  8. DISKPART> プロンプトを終了します:

    exit
    
  9. この Linux ディストリビューションを起動します。 (WSL 2 で実行されていることを確認します。これは、コマンド wsl.exe -l -v を使用して確認できます。WSL 1 はサポートされていません)。

  10. WSL ディストリビューションのコマンド ラインからこれらのコマンドを実行して、このディストリビューションのファイル システムのサイズを拡張できることを WSL に認識させます。 最初の mount コマンドへの応答として、"/dev: none already mounted on /dev" というメッセージが表示されることがあります。このメッセージは無視しても問題ありません。

    sudo mount -t devtmpfs none /dev
    mount | grep ext4
    
  11. /dev/sdX のようなこのエントリの名前をコピーします (X は他の文字を表します)。 次の例では、X の値は b です。

   sudo resize2fs /dev/sdb <sizeInMegabytes>M

上記の例を使用して、vhd サイズを 2048000 に変更したので、コマンドは次のようになります: sudo resize2fs /dev/sdb 2048000M

Note

resize2fs のインストールが必要になる場合があります。 その場合は、sudo apt install resize2fs というコマンドを使用してこれをインストールできます。

出力は次のようになります。

resize2fs 1.44.1 (24-Mar-2021)
Filesystem at /dev/sdb is mounted on /; on-line resizing required
old_desc_blocks = 32, new_desc_blocks = 38
The filesystem on /dev/sdb is now 78643200 (4k) blocks long.

この Linux ディストリビューションの仮想ドライブ (ext4.vhdx) が新しいサイズに正常に拡張されました。

重要

Windows ツールまたはエディターを使用して、AppData フォルダー内にある WSL 関連ファイルを変更、移動、またはアクセスしないことをお勧めします。 そうすると、Linux ディストリビューションが破損する可能性があります。 Windows から Linux ファイルにアクセスする場合は、パス \\wsl$\<distribution-name>\ を使用することで実現できます。 WSL ディストリビューションを開き、「explorer.exe .」と入力してそのフォルダーを表示します。 詳細については、次のブログ投稿を参照してください: 「Windows から Linux ファイルにアクセスする」。

VHD マウント エラーを修復する方法

"ディストリビューション ディスクのマウント" に関連するエラーが発生した場合は、突然のシャットダウンまたは停電が原因で、データ損失を回避するために Linux ディストリビューション VHD が読み取り専用に切り替えられる可能性があります。 次の手順に従って、Linux コマンドを e2fsck 使用してディストリビューションを修復および復元できます。

lsblk コマンドを使用してブロック デバイス名を識別する

WSL 2 は Linux ディストリビューションをインストールするときに、独自のファイル システムを使用して仮想ハード ディスク (VHD) としてディストリビューションをマウントします。 Linux は、これらのハード ドライブを "ブロック デバイス" と呼び、lsblk コマンドを使用してそれらに関する情報を表示できます。

WSL 2 で現在使用されているブロック デバイスの名前を見つけるには、ディストリビューションを開き、次のコマンドを入力します: lsblk。 (または PowerShell を開き、次のコマンドを入力します: wsl.exe lsblk。)出力は次のようになります。

NAME MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
sda    8:0    0 363.1M  1 disk
sdb    8:16   0     8G  0 disk [SWAP]
sdc    8:32   0   1.5T  0 disk
sdd    8:48   0     1T  0 disk /mnt/wslg/distro

ブロック デバイスに関する情報には、次のものが含まれます:

  • NAME: デバイスに割り当てられる名前は sd[a-z] になります。これは SCSI ディスクを参照し、使用されている各ディスクに文字を指定します。 sda は常にシステム分散です。
  • MAJ:MIN: Linux カーネルがデバイスの種類を表す最初の番号を持つデバイスを内部的に識別するために使用される数値を表します (8 は、Small Computer System Interface/SCSI ディスクに使用されます)。
  • RM: デバイスがリムーバブル (1) かそうでない (0) かをお知らせください。
  • SIZE: ボリュームの合計サイズ。
  • RO: デバイスが読み取り専用 (1) かそうでない (0) かをお知らせください。
  • TYPE: デバイスの種類 (この場合はディスク) を参照します。
  • MOUNTPOINTS: ブロック デバイスが配置されているファイル システム上の現在のディレクトリを参照します (SWAP は事前構成済みの非アクティブ メモリ用であるため、マウントポイントはありません)。

読み取り専用フォールバック エラー

Linux ディストリビューションを開くときに WSL で "マウント エラー" が発生した場合、ディストリビューションはフォールバックとして読み取り専用として設定される可能性があります。 その場合、起動中にディストリビューションに次のエラーが表示されることがあります:

An error occurred mounting the distribution disk, it was mounted read-only as a fallback.

ディストリビューションが読み取り専用として開始されると、ファイルシステムに書き込もうとすると、次のようなエラーで失敗します:

$ touch file
touch: cannot touch 'file': Read-only file system

WSL でディスク マウント エラーを修復し、再び使用可能/書き込み可能な状態に復元するには、wsl.exe --mount コマンドを使用して、次の手順でディスクを再マウントできます:

  1. PowerShell を開いてコマンドを入力して、すべての WSL ディストリビューションをシャットダウンします:

    wsl.exe --shutdown
    
  2. 管理者として PowerShell を開き (管理者特権でのコマンド プロンプトで) mount コマンドを入力し、<path-to-ext4.vhdx> をディストリビューションの .vhdx ファイルへのパスに置き換えます。 このファイルの検索については、「Linux ディストリビューションの VHD ファイルとディスク パスを見つける方法」を参照してください。

    wsl.exe --mount <path-to-ext4.vhdx> --vhd --bare
    
  3. PowerShell から wsl.exe lsblk コマンドを使用して、ディストリビューションのブロック デバイス名 (sd[a-z]) を識別し、次のコマンドを入力してディスクを修復します (<device> を "sdc" のような正しいブロック デバイス名に置き換えます)。 コマンド e2fsck は、ext4 ファイル システム (WSL と共にインストールされたディストリビューションで使用される型) でエラーをチェックし、それに応じて修復します。

    wsl.exe sudo e2fsck -f /dev/<device>
    

Note

Linux ディストリビューションが 1 つだけインストールされている場合は、"ext file in use" エラーが発生する可能性があり、wsl.exe lsblk を実行するには追加のディストリビューションをインストールする必要があります。 修復が完了したら、ディストリビューションをアンインストールできます。

  1. 修復が完了したら、次のように入力して PowerShell でディスクのマウントを解除します:

    wsl.exe --unmount
    

警告

sudo mount -o remount,rw / コマンドを使用すると、読み取り専用ディストリビューションを使用可能な/書き込み可能な状態に戻すことができますが、すべての変更はメモリ内にあるため、ディストリビューションの再起動時に失われます。 上記の手順を使用して、代わりにディスクをマウントして修復することをお勧めします。

Linux ディストリビューションの .vhdx ファイルとディスク パスを見つける方法

Linux ディストリビューションの .vhdx ファイルとディレクトリ パスを見つけるには、PowerShell を開き、次のスクリプトを使用して、<distribution-name> を実際のディストリビューション名に置き換えます:

(Get-ChildItem -Path HKCU:\Software\Microsoft\Windows\CurrentVersion\Lxss | Where-Object { $_.GetValue("DistributionName") -eq '<distribution-name>' }).GetValue("BasePath") + "\ext4.vhdx"

結果には、%LOCALAPPDATA%\Packages\<PackageFamilyName>\LocalState\<disk>.vhdx のようなパスが表示されます。 次に例を示します。

C:\Users\User\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\ext4.vhdx

これは、一覧表示した Linux ディストリビューションに関連付けられている ext4.vhdx ファイルへのパスです。