Windows Terminal + WSL + GWSL で Linux : Part 4
今回の目標
- WSL を複製して、WSL2 にコンバートしよう!
内容:
- WSL2は何が違う?
- WSL1をWSL2へコンバート
次回以降の目標
期待してお待ちいただけたらと思います。
目次:
では、本編のはじまりです。
WSL2は何が違う?
詳細はMicrosoftのページを参照していただきたいと思います。
ここでは、私が調べたことを中心に比較しつつ、注意点的な内容もあげておこうと思いますが、結論を先に言えば、特別な使い方をしない限りどちらでも同じと考えますが、起動とファイル操作に関してかなりスピードアップされたそうです。
WSL2ではできて、バージョン1ではできないことがある点は指摘しておくべきでしょう。有名なところでは、
ですね。これはWSLとWSL2の大きな違いであるシステムコールの処理方法の違い、
によるもので、すなわちWSL2は、Microsoftが手を加えているとは言え本物のLinusカーネルを実装しているわけです。カーネルのバージョンアップに伴いMicrosoftが新カーネルを提供するようです。
WSLバージョン1で得意なこと
Windows側とLinux側の両方からファイルにアクセスする使い方は、WSL1 の方がパフォーマンスが良いそうです。
ファイルにアクセスする方法をまとめておきます。
Windows側からLinux側にあるファイルにアクセスする方法
- エクスプローラーで開く
Linux側で実行
- Linux側からpowershell.exeを使ってカレントディレクトリ「.」を引数にstartすることでエクスプローラーを起動する
- または、直接explorerを起動する
- notepad.exe(などWindowsアプリ)で開く
Linux側のファイルシステムにアクセスするにはネットワーク接続経由のパスを使う
Windows側で実行
notepad.exe //wsl$/Debian/home/denn/.bashrcネットワーク接続経由のパスは「//wsl$/「ディストロ名」/ファイルパス」のように記述します
- VSCode で開く
Linux側からWindows側にあるファイルにアクセスする方法
WSL2へコンバート
ここからが今回の本題です。まず作業の流れを整理しておきます。
- WSL1のディストロをexportしてtarファイルを作成する
- 作成したtarファイルからディストロを複製する
- 複製したディストロをバージョン2にセットする
いずれもコマンド一行の作業ですが、完了まで多少の待ち時間があります。
この作業の結果WSL1のディストロはそのまま残り、新しくWSL2のディストロが追加されます。このWSL2ディストロはWSL1の複製から作られたので、作成した環境(apt install したパッケージや自分でコンパイルしたものなど)はすべてそのまま実行可能です。
(3の作業だけを行なって、今あるWSL1のディストロを直接WSL2へ変更してもよいです。複製しておけば両方使うことができます)
WSL1 -> WSL2を作成する
作業はすべてPowerShellで行います。
WSL1のディストロをexportしてtarファイルを作成
まずはWSL2ディストロを生成する場所を作って移動しておきましょう。
作業前にwslの状態を確認しておきます。
次のコマンドでtarファイルを作成します。
「wsl --export [ディストロ名] [tarファイル名]」で、DebianWSL.tarファイルが作成されます。
作成したtarファイルからWSL2ディストロを作成
ついでこのtarファイルからWSLのディストロを作成(複製)します。
「wsl --import [新ディストロ名] [新ディストロをおくパス] [tarファイル名]」と指定しています。
新ディストロ名に「_」(アンダースコア)を含めない方が良いようです。
GWSLが新ディストロを取り込むときに「_」を無視した名前で登録するようなので、新ディストロで X Window が使えない状態になってしまいました。
wslの現状を確認します。
二つのディストロがあり、どちらのバージョンも1になっています。DebianWSL2のバージョンを2にコンバートします。
もう一度確認すると
DebianWSL2のバージョンが2になりました。
ディストロの削除方法
もし二つもいらないのなら削除することができます。WindowsストアからインストールしたDebianを削除しても再びWindowsストアからインストールすることができます。
これがディストロ名:Debian を削除するコマンドで、wsl --unregister [WSLディストロ名] の形式で記述します。
WSLをインストールするときに初めからWSL2としてインストールする
このコマンドを実行します。
WSL2の起動
起動状況確認
Windows Terminal タブにある「v」をクリックすると「DebianWSL2」が追加されていることがわかります。それをクリックします。
または、図のリストを確認すると上から4番目なので「Ctrl + Shift + 4」でDebianWSL2を起動することができます。
今度は、タスクバーのGWSLをクリックして確認します。
GWSL Distro Tools をクリックすると
DebianWSL2 が追加されました。DebianWSL2 をクリックすると以前に見たのと同じ「Display Is Set To Auto-Export」がありますが「X」になっているのでクリックしてDebianWSL2を再起動すれば X Window が立ち上がり、ディスプレイを使うことができるようになります。
WSL2はスーパーユーザでログイン?
WSL1では、ログインユーザが一般ユーザでしたが、WSL2を起動すると、スーパーユーザとしてログインしていました。
一般ユーザになるには「su ユーザ名」を入力します。
ユーザdennになりました。
スーパーユーザへ戻るには
します。
画像で色がついているのは、スーパーユーザかそうでないかが一目で区別ができるようにそれぞれユーザの「.bashrc」をいじった結果です。
一般ユーザでログインする
や
でスーパーユーザから一般ユーザへなり変わると、 環境変数が違っていたり、Xが使えなかったりして、少し不便でした。
そこでユーザを指定してログインするコマンドを探したところありました。
PowerShell またはCMD.exe で次を実行すると指定したユーザでログインできました。
この内容をsettings.jsonに書き込めば良いので、"profiles"メンバー"list"内のDebianWSL2の箇所を次の様にしました。
{ "guid": "{86f8842c-fddc-5203-a6aa-1b7656ad6f66}", "hidden": false, "name": "DebianWSL2", "source": "Windows.Terminal.Wsl", "commandline": "wsl.exe ~ -d DebianWSL2 -u denn" },
「~」をいれておくとログイン後、ホームディレクトリにいます。
お疲れ様でした。今回はここまでです。