学習したこと倉庫〜Linux関連を中心に

忘れてしまうことが多くなってきたので、学んだことを整理して記録しておかないと!と自らを戒めるためのブログです

Windows Terminal + WSL + GWSL で Linux : Part 4

X Window 起動

X window 起動

今回の目標

  • WSL を複製して、WSL2 にコンバートしよう!
    内容:
    1. WSL2は何が違う?
    2. WSL1をWSL2へコンバート

次回以降の目標

期待してお待ちいただけたらと思います。

 

目次:

 

では、本編のはじまりです。

 

WSL2は何が違う?

詳細はMicrosoftのページを参照していただきたいと思います。

docs.microsoft.com

 

ここでは、私が調べたことを中心に比較しつつ、注意点的な内容もあげておこうと思いますが、結論を先に言えば、特別な使い方をしない限りどちらでも同じと考えますが、起動とファイル操作に関してかなりスピードアップされたそうです。

WSL2ではできて、バージョン1ではできないことがある点は指摘しておくべきでしょう。有名なところでは、

  • Linux版のDocker
  • FUSE(Filesystem in Userspace)

ですね。これはWSLとWSL2の大きな違いであるシステムコールの処理方法の違い、

によるもので、すなわちWSL2は、Microsoftが手を加えているとは言え本物のLinusカーネルを実装しているわけです。カーネルのバージョンアップに伴いMicrosoftが新カーネルを提供するようです。

 

WSLバージョン1で得意なこと 

Windows側とLinux側の両方からファイルにアクセスする使い方は、WSL1 の方がパフォーマンスが良いそうです。

ファイルにアクセスする方法をまとめておきます。

Windows側からLinux側にあるファイルにアクセスする方法
  1. エクスプローラーで開く

    Linux側で実行

  2. notepad.exe(などWindowsアプリ)で開く

    Linux側のファイルシステムにアクセスするにはネットワーク接続経由のパスを使う

    Windows側で実行

    notepad.exe //wsl$/Debian/home/denn/.bashrc

    ネットワーク接続経由のパスは「//wsl$/「ディストロ名」/ファイルパス」のように記述します

  3. VSCode で開く

    VSCodeプラグイン「Remote-WSL」を使うことで、通常のVSCodeの使用感のままファイルを編集できます

Linux側からWindows側にあるファイルにアクセスする方法
  1. Windowsドライブはマウントされているため、マウント先のファイルを通常通りのLinux操作でアクセスできます
    • Cドライブは、「/mnt/c/」
    • Dドライブは、「/mnt/d/」

 

WSL2へコンバート

ここからが今回の本題です。まず作業の流れを整理しておきます。

  1. WSL1のディストロをexportしてtarファイルを作成する 
  2. 作成したtarファイルからディストロを複製する
  3. 複製したディストロをバージョン2にセットする

いずれもコマンド一行の作業ですが、完了まで多少の待ち時間があります。

この作業の結果WSL1のディストロはそのまま残り、新しくWSL2のディストロが追加されます。このWSL2ディストロはWSL1の複製から作られたので、作成した環境(apt install したパッケージや自分でコンパイルしたものなど)はすべてそのまま実行可能です。

 

(3の作業だけを行なって、今あるWSL1のディストロを直接WSL2へ変更してもよいです。複製しておけば両方使うことができます)

 

WSL1 -> WSL2を作成する

作業はすべてPowerShellで行います。

WSL1のディストロをexportしてtarファイルを作成

まずはWSL2ディストロを生成する場所を作って移動しておきましょう。

mkdir WSL_env
cd WSL_env

作業前にwslの状態を確認しておきます。

wsl -l --verbose

複製WSL作成前

複製WSL作成前

次のコマンドでtarファイルを作成します。

wsl --export Debian DebianWSL.tar

「wsl --export [ディストロ名] [tarファイル名]」で、DebianWSL.tarファイルが作成されます。

作成したtarファイルからWSL2ディストロを作成

ついでこのtarファイルからWSLのディストロを作成(複製)します。

wsl --import DebianWSL2 C:\home\WSL_env\ .\DebianWSL.tar

「wsl --import [新ディストロ名] [新ディストロをおくパス] [tarファイル名]」と指定しています。

新ディストロ名に「_」(アンダースコア)を含めない方が良いようです。

GWSLが新ディストロを取り込むときに「_」を無視した名前で登録するようなので、新ディストロで X Window が使えない状態になってしまいました。

wslの現状を確認します。

wsl -l --verbose

二つのディストロがあり、どちらのバージョンも1になっています。DebianWSL2のバージョンを2にコンバートします。

wsl --set-version DebianWSL2 2

もう一度確認すると

wsl -l --verbose

WSL2作成後

WSL2作成後

DebianWSL2のバージョンが2になりました。

ディストロの削除方法

もし二つもいらないのなら削除することができます。WindowsストアからインストールしたDebianを削除しても再びWindowsストアからインストールすることができます。

wsl --unregister Debian

これがディストロ名:Debian を削除するコマンドで、wsl --unregister [WSLディストロ名] の形式で記述します。

WSLをインストールするときに初めからWSL2としてインストールする

このコマンドを実行します。

wsl --set-version 2

 WSL2の起動

起動状況確認

Windows Terminal タブにある「v」をクリックすると「DebianWSL2」が追加されていることがわかります。それをクリックします。

Windows Terminal にWSL2が追加された

WSL2が追加された

または、図のリストを確認すると上から4番目なので「Ctrl + Shift + 4」でDebianWSL2を起動することができます。

 

今度は、タスクバーのGWSLをクリックして確認します。

GWSL ダッシュボード

GWSL ダッシボード

GWSL Distro Tools をクリックすると

変更されたGWSL Distro Tools

GWSL Distro Tools

DebianWSL2 が追加されました。DebianWSL2 をクリックすると以前に見たのと同じ「Display Is Set To Auto-Export」がありますが「X」になっているのでクリックしてDebianWSL2を再起動すれば X Window が立ち上がり、ディスプレイを使うことができるようになります。

設定後のAuto-Export

設定後のAuto-Export

 

WSL2はスーパーユーザでログイン?

WSL1では、ログインユーザが一般ユーザでしたが、WSL2を起動すると、スーパーユーザとしてログインしていました。

 

WSL2 スーパユーザでログイン

WSL2 スーパーユーザでログイン

一般ユーザになるには「su ユーザ名」を入力します。

su denn

ユーザdennになりました。

スーパユーザから一般ユーザへ

スーパユーザから一般ユーザへ

 

スーパーユーザへ戻るには

exit

します。

画像で色がついているのは、スーパーユーザかそうでないかが一目で区別ができるようにそれぞれユーザの「.bashrc」をいじった結果です。

 

一般ユーザでログインする

su denn

su - denn

でスーパーユーザから一般ユーザへなり変わると、 環境変数が違っていたり、Xが使えなかったりして、少し不便でした。

そこでユーザを指定してログインするコマンドを探したところありました。

PowerShell またはCMD.exe で次を実行すると指定したユーザでログインできました。

wsl -d DebianWSL2 -u denn

この内容を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"
},

「~」をいれておくとログイン後、ホームディレクトリにいます。

 

 

 お疲れ様でした。今回はここまでです。