WSL 1とWSL 2の使い勝手の違い
「WSL 1」と「WSL 2」の使い勝手の違いを紹介します。Linuxアプリから頻繁にアクセスするファイルの配置場所
Linuxアプリから頻繁にアクセスするファイルは、Linuxアプリが配置されているルートファイルシステム内に配置します。Linuxアプリと同じ環境に配置されているファイル群は、従来より高速なファイルアクセスのパフォーマンスが得られます。
WindowsアプリからLinuxのファイルにアクセス可能
WindowsアプリからLinuxのルートファイルシステムにアクセスすることも可能です。例えば「bash」から「explorer.exe /」を実行すれば、ファイルエクスプローラーからLinuxのルートファイルシステムにアクセス可能です。
ネットワークアプリへのアクセス
「WSL 2」の初期ビルドでは、WindowsからLinuxのサーバー(サービス/アプリケーション)にアクセスする際、Linuxディストリビューション側のIPアドレスを使用してアクセスする必要があります。逆にLinuxからWindowsのサーバーにアクセスする際、ホストマシン側のIPアドレスを使用してアクセスする必要があります。
この仕様は一時的な処置であり、アクセス方法の改善を目指し最優先で作業が行われています。
WindowsからLinuxアプリケーションへアクセスする場合
WindowsからLinuxアプリケーションへアクセスする場合、Linuxアプリケーションが動作している仮想マシンのIPアドレスを調べる必要があります。そしてそのIPアドレスを指定してWindowsからLinuxアプリケーションへアクセスします。
仮想マシンでは「eth0」ネットワークインターフェースを提供しており、「eth0」のIPアドレス(inet)を調べれば仮想マシンのIPアドレスが分かります。
アクセス対象のLinuxディストリビューション内で以下のコマンドを実行します。
ip addr | grep eth0
上記の画像では、仮想マシンのIPアドレスは「192.168.189.62」であることが分かります。
後はWindowsアプリでこのIPアドレスを指定し、Linuxアプリケーションへ接続します。
LinuxからWindowsアプリケーションへアクセスする場合
LinuxからWindowsアプリケーションへアクセスする場合、ホストマシンのIPアドレスを調べる必要があります。ホストマシンのIPアドレスは、「/etc/resolv.conf」ファイルの「nameserver」に記述されています。
Linuxディストリビューション内で以下のコマンドを実行します。
cat /etc/resolv.conf
上記の画像では、ホストマシンのIPアドレスは「192.168.96.193」であることが分かります。
WSL 2はVHDを使用する・最大サイズを大きくするには
「WSL 2」はLinuxディストリビューションのストレージ領域に、「VHD」を使用します。「VHD」は「ext4」ファイルシステムでフォーマットされており、Linuxディストリビューションのファイル群はこのファイルシステム内に配置されます。
「VHD」のサイズは自動的に調整され、最大サイズの初期値は256GBです。
もしLinuxディストリビューションのサイズがこの最大サイズを越えようとした場合、ディスク容量不足のエラーが発生します。
このエラーが発生したら以下の方法で「VHD」の最大サイズを大きくすることもできます。
1.すべてのWSLインスタンスを終了する
以下のコマンドを実行し、すべてのWSLインスタンス(Linuxディストリビューション)を終了します。
wsl --shutdown
2.パッケージ情報の取得
Linuxディストリビューションが使用しているVHDファイルを特定するため、まずパッケージ情報を取得します。「PowerShell」を起動して以下のコマンドを実行します。
Get-AppxPackage -Name "*<distro>*" | Select PackageFamilyName
<distro>にはLinuxディストリビューション名を指定します。
例えば「Ubuntu」を指定する場合、以下のコマンドになります。
Get-AppxPackage -Name "*Ubuntu*" | Select PackageFamilyName
以下のようにVHDファイルの特定に必要なパスの一部が表示されます。
PackageFamilyName
-----------------
CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc
CanonicalGroupLimited.Ubuntu18.04onWindows_79rhkp1fndgsc
CanonicalGroupLimited.Ubuntu16.04onWindows_79rhkp1fndgsc
-----------------
CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc
CanonicalGroupLimited.Ubuntu18.04onWindows_79rhkp1fndgsc
CanonicalGroupLimited.Ubuntu16.04onWindows_79rhkp1fndgsc
「Ubuntu」の場合、一番上の情報がパスの一部になります。
- CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc
3.VHDファイルの特定
「2.」の情報を以下のパスに当てはめます。
%LOCALAPPDATA%\Packages\<PackageFamilyName>\LocalState
<PackageFamilyName>に「2.」の情報を当てはめます。
「Ubuntu」の例では、以下のパスになります。
%LOCALAPPDATA%\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState
「%LOCALAPPDATA%」は環境変数であり、通常以下のパスになります。
- C:\Users\ユーザー名\AppData\Local
環境変数は、コマンドプロンプトでは「set」コマンドで、「PowerShell」では「get-childitem env:」で確認できます。
set LOCALAPPDATA
get-childitem env:LOCALAPPDATA
上記のパスをエクスプローラーで開くと、「vhdx」ファイルが見つかります。
「vhdx」ファイルが「VHD」ファイルです。
「Ubuntu」では「ext4.vhdx」が見つかります。
つまり「VHD」ファイルのフルパスは、以下のようになります。
- C:\Users\ユーザー名\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState¥ext4.vhdx
4.VHDファイルの指定
管理者でコマンドプロンプトを起動し、「diskpart」を起動します。まず操作対象の「VHD」ファイルを指定します。
select vdisk file="<VHDファイル>"
<VHDファイル>には、「3.」で特定した「VHD」ファイルをフルパスで指定します。
5.最大サイズの変更
最大サイズを指定します。
expand vdisk maximum=<最大サイズ>
<最大サイズ>には、「VHD」の最大サイズをMB単位で指定します。
6.デバイスファイルの確認
Linuxディストリビューションを起動し、ファイルシステムのサイズを拡大するデバイスファイルを確認します。以下のコマンドを1行ずつ実行します。
sudo mount -t devtmpfs none /dev
mount | grep ext4
mount | grep ext4
「/dev/sd」で始まるデバイスファイルが見つかるので、この内容をコピーしておきます。
ここでは例として「/dev/sda1」とします。
7.ファイルシステムのリサイズ
以下のコマンドを実行し、ルートファイルシステムのサイズを変更します。
sudo resize2fs /dev/sdXX
「/dev/sdXX」には「6.」で見つかったデバイスファイルを指定します。
例では「/dev/sda1」になります。
もし「resize2fs」コマンドが見つからない場合は、以下のコマンドで「resize2fs」をインストールします。(Ubuntuの場合)
apt install resize2fs
WSL 2起動時にメモリーを多少使用する
「WSL 2」は「WSL 1」と同等の軽量さ、高速、統合性、そして応答性を実現しつつ、実Linux kernel上で優れたファイルシステムパフォーマンスと完全な互換性のあるシステムコールを提供するため、軽量なVMを使用します。このVMのメモリーへの影響は小さく、起動時に仮想メモリーを確保します。
これは全メモリーのごく一部を使用するように調整されます。
Windows/Linux間のファイルアクセスが遅い
「WSL 2」の初期プレビュービルドでは、「WSL 1」と比較してWindows/Linux間のファイルアクセスが遅くなります。これは「WSL 2」のアーキテクチャーの変更によるものであり、開発チームは改善に向け作業しています。