ようやく手元の環境でも WSL2 が導入できるようになったので、やったことまとめ。
Contents
WSL2
Windows Subsystem for Linux の ver2。
WSL1 が Linux の system-call を Windows API に変換していたのに対して、WSL2 は仮想マシン実装。
WSL専用で軽量実装、専用Linux-kernel らしい。。。
そのため、WSL1 にあった各種制約はかなり緩和される。
しかし、仮想上の "別" マシンなので、例えばネットワークや Xサーバー などは取り扱い方が変わってくる。
Windows 10 1903/1909 でも導入可能に
Windows 10 2004 の評判があまりよろしくないので、WSL2 を目的とした導入を見送ってきたが、
(そもそもMS自社ハードの Surface Pro 7 すら、いまだに 2004 のアップデートが "できない" 状態だし。。。)
ver 1903/1909 にバックポートされたので導入可能となった。
なお、導入には「KB4566116」が必要で、適用後は OS リビジョンナンバーが “1049” 以降になる。
[安定版] WSL2 の導入
"WSL2 install" などで検索すると、preview版での導入方法、あるいはそれを引きずった記事が散見されるが、
このタイミングなら、以下で導入できる。
(管理者権限のある PowerShell から)
1 2 |
Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform -NoRestart Restart-Computer |
再起動後、以下で以降のデフォルトを WSL2 にできる(一般権限で可)。
1 |
wsl.exe --set-default-version 2 |
既存環境(WSL1) の移行
上記を設定しても、既存の環境は WSL2 には移行されず、WSL1 のまま残る。
(逆を言うと、WSL1, WSL2 を併用することが可能)
既存環境を WSL2 に移行する場合は以下。
1 2 |
$ wsl.exe -l -v # "distribution-name", ver の確認 $ wsl.exe —set-version "distribution-name" 2 |
Xサーバーの対応
前述したように、WSL2 は "別" の仮想マシン上で動作している。
格好として、別のマシンからの通信に見えるため、いくつかの対処が必要になる。
環境変数 DISPLAY の設定
私は WSL用のXサーバーとしてVcXsrvを利用している。
通常 VcXsrv に限らず、Xサーバーの指定として DISPLAY 環境変数 localhost:0.0 などを設定する。
しかし、前述したようにホストの Windows10 上で動くXサーバーに対して、WSL2 は別の仮想マシン上で動作している。
そのため、Xサーバーを指定する DISPLAY 環境変数には、仮想ネットワーク上のホストアドレスを指定する必要がある。
では、仮想ネットワーク上のホストのIPを指定しようとなるわけだが、
このIPは動的に振られるため、毎度調べて適切に変更する必要がある。
以下を .bashrc などに記述すると毎回自動で適切に設定される。
1 |
export DISPLAY=$(cat /etc/resolv.conf | grep name server | awk ‘{print $2; exit;}’):0.0 |
ファイアーウォールの設定
Xサーバーへの信号は、別マシンからの通信にみえるため、ファイアーウォールも通過させる必要がある。
Windows 標準のファイアーウォールの場合なら、Xサーバー・アプリケーションへの通信を許可すると良い。
Xサーバーアプリケーションの設定
Xサーバーのアプリケーションによるが、アプリ自身でも外部からのアクセスを許可する必要がある。
VcXsrv の場合は、"Additiona parameters for VcXsrv" に "-ac" を設定すればよい。
メモリ肥大化の対応
仮想マシンである WSL2 へのメモリ割り当ては、必要に応じて動的になされるが、
Linux はメモリがあるだけ、ファイルキャッシュなどをメモリ上に展開する。
すると Windows はメモリが足りなくなったと判断して、割当メモリを増加させる。
これが連鎖的に起こって WSL2 がホストのメモリを食いつぶす問題が起こるようだ。
初期設定ではホストの全メモリの8割まで、WSL2への割当メモリが増加する。
これを回避するには WSL2 への割り当てメモリサイズを固定する。
設定ファイルは、C:\Users\xxxx\.wslconfig。
以下の例は WSL2 へのメモリ割り当てを 4GB, スワップを無効化している。
1 2 3 |
[wsl2] memory=4GB swap=0 |
WSL2 で、できるようになったこと
WSL側のファイルなどを Windows側から読み書きする
WSL1 では、Windows のファイルを WSL から読み書きできたが、その逆はできなかった。
WSL2 では、WSLのファイルを Windows側から読み書きできるようになった。
エクスプローラからアクセスする場合は、アドレスバーに "\wsl$" と入力する。
するとその下に WSL の distribution名で、各WSLのファイル群が配置されている。
WSL上で NFS を利用する
WSL1 では kernel に nfs が組み込まれておらず、利用できなかった。
WSL2 では kernel が nfs をサポートしているので、
"$ mount -t nfs ..." のようにして普通にマウントできる。