WSL2のGUI環境作成
2021/05/05
実は予定してなかった
  • 今回はWindows 10上のWSL2によるLinux(Ubuntu)のGUI環境構築を扱います。

  • ここでWSLとは何かですが、Windows Subsystem for Linux、Windows上で動作するLinux Subsystemです。そしてWSL2とはWSLのVersion 2という意味で、現行最新のWSLです。

  • 今回WSL2のGUI環境を扱う理由ですが、Windows PCしか無い状況にてLinux上でのみ動作するツールを使用する必要が出てしまったからです。しかもX-WindowによるGUIも必要だったため急遽調べる(*1)ことになりました。

  • ネットを調べると、どうやらもう少し待てばGUIもすんなり動きそうですが、まだ正式リリースは先なので、本レポートでは違う方法を紹介します。

まずはWSL2のインストール
  • WSL2インストールの情報についてはこちらを参照しました。

  • WSLの有効化
    • Windows PowerShell を管理者権限で起動します。(スタートメニュー内のPowerShellを逆クリックして「管理者として実行する」を選んでください。)
    • PowerShellで下記コマンドを入力します。("PS > "はPowerShellのプロンプト表示を意味しています)
      PS > dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart

  • 仮想マシン機能の有効化
    • 引き続きPowerShellで下記コマンドを入力します。
      PS > dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

  • WSL2向けLinuxカーネルのダウンロードとインストール

  • WSLのdefault versionを2に設定する
    • 管理者権限で起動したPowerShellにて下記コマンドを入力します。
      PS > wsl --set-default-version 2

Linuxディストリビューションのインストール
  • Linuxカーネルまでの準備ができたところで、次はディストリビューションのインストールですが、これは通常のWindows10アプリケーションと同様で、スタートメニューのMicrosoft Storeから好きなディストリビューションを選んでインストールします。(そのため特にインストールの方法は説明しません)

  • 現時点(2021/5/5)では下記ディストリビューションがWSL2対応です。本レポートではUbuntu 20.04 LTSを選びました。
    Ubuntu 16.04 LTS
    Ubuntu 18.04 LTS
    Ubuntu 20.04 LTS
    openSUSE Leap 15.1
    SUSE Linux Enterprise Server 12 SP5
    SUSE Linux Enterprise Server 15 SP1
    Kali Linux
    Debian GNU/Linux
    Fedora Remix for WSL
    Pengwin
    Pengwin Enterprise
    Alpine WSL

インストール後初回起動...トラブることもあり
  • インストール後に起動します。ですが初回起動はインストールプロシージャに含まれるため、状況によっては起動に失敗します。成功時はユーザアカウントの作成を促すプロンプトが表示されます。
    Installing, this may take a few minutes...
    Installation successful!
    Please create a default UNIX user account. The username does not need to match your Windows username.
    For more information visit: https://aka.ms/wdlusers
    Enter new UNIX username:

  • そして起動失敗時ですが...参考ページには対処法も書かれています。内容について幾つか紹介します。
    • Installation failed with error 0x80070003
      • WSLがインストールできるのはSystem Drive(通常はC:)だけなので、ストレージ設定を確認する。
      • スタートメニュー→設定→システム→記憶域→新しいコンテンツの保存先を先行する→新しいアプリの保存先
    • WslRegisterDistribution failed with error 0x8007019e
      • WSLが有効化されていない。
      • 本レポート前述の「WSLの有効化」「仮想マシン機能の有効化」「WSLのdefault versionを2に設定する」をPowerShell上で実行する。(もちろんエラー無いことも確認)
      • 管理者権限でPowerShellを起動することに注意。
    • Installation failed with error 0x80070003 or error 0x80370102
      • 仮想マシン機能が有効化されていない。(※私はこのエラーに遭遇しました)
      • 前述の「仮想マシン機能の有効化」がOKならば、BIOS側で仮想マシン機能が無効になっている可能性大。
      • BIOSメニューの起動と設定はPC機種毎に異なるが、ASUSマザボ(私の例)ではIntel Virtualization Technologyが該当項目
      • BIOS変更後は、完全シャットダウン(Shift押しながらシャットダウン)してから再起動がおすすめ。

WSL2として動作していることを確認
  • コマンドプロンプト又はPowerShell(どちらでも良いです)にて、下記コマンドを実行します。
    > wsl --list --verbose
    
    NAME STATE VERSION * Ubuntu-20.04 Running 2

  • 実行結果のVersion表示が2であればOKです。

GUI環境のインストールと設定
  • WSL2としてLinuxが動作する状況になったので次はGUI環境を仕込みます。方針としては、LinuxにX-Window環境を準備し、Windowsからはリモートデスクトップ(*2)でアクセスします。以後Ubuntu 20.04を例にして説明します。

  • ディストリビューションの更新
    • スタートメニューからUbuntuを起動し、コンソールを表示させます。
    • GUI環境インストール前にディストリビューションの更新を行います。
      $ sudo apt update
      $ sudo apt upgrade

  • Xfce4のインストール
    • X-Window ManagerとしてXfce4をインストールします。
      $ sudo apt install xfce4
    • データが大きいため、10〜20分程度かかります。
    • 途中Display Managerの選択画面になりますがgdm3(*3)を選んでください。

  • xrdpのインストールと設定
    • xrdpをインストールします。(X-windowをRemote DesktopのProtocolで飛ばせるようにします)
      $ sudo apt install xrdp

    • xrdpのwindow manager設定をxfce4起動に変更します。最初に設定ファイル置き場所へ移動し、オリジナル設定を保存します。
      $ cd /etc/xrdp
      $ sudo cp -p startwm.sh startwm.sh.org
    • startwm.shを編集します。オリジナル記述の最後2行をコメントアウトし、startxfce4を追加します。
      $ sudo vim startwm.sh # ←エディタは好みでどうぞ

      ...(中略)...
      # test -x /etc/X11/Xsession && exec /etc/X11/Xsession # ←コメントアウト
      # exec /bin/sh /etc/X11/Xsession # ←コメントアウト

      startxfce4 # ←追加

    • Ubuntu上でxrdpをスタートし、リモートデスクトップから接続してみます。まずはxrdpスタート。
      $ sudo service xrdp start
    • エラーが起きた場合は、後述の「ポート番号の問題でxrdpの起動エラーが起きた場合」を参照下さい。

    • 次にリモートデスクトップから接続。スタートメニュー→Windowsアクセサリ→リモート デスクトップ接続にて起動して下さい。コンピュータ名は localhost を指定します。

      ※クリックで別画面拡大します

    • アクセスに成功すればログイン画面の後、下記のデスクトップが開きます。

      ※クリックで別画面拡大します

  • ポート番号の問題でxrdpの起動エラーが起きた場合
    • ネット上では、ポート番号を3389から3390へ変更するといった記述が見受けられます。ですがWindows 10 Home Editionを使用している場合、ポート番号の変更無しでもxrdp起動及びアクセス成功していないでしょうか。

    • 私の環境では確認できないので予想になりますが、使用しているPCがリモートデスクトップのホストになり得る場合、すでに3389ポートは使っている/予約済みだという状況でエラーになると考えています。

    • このエラーが起きた場合、xrdpのポート番号を3389から3390へずらすことになります。xrdpのポート番号は
       /etc/xrdp/xrdp.ini で設定されてるので、この中で定義されているポート番号3389を3390へ置換します。コメント中の記述などもありますが一括置換が無難です。下記は操作例ですが、sedの--in-placeではなくエディタを使ってもOKです。
      $ cd /etc/xrdp
      $ sudo cp -p xrdp.ini xrdp.ini.org
      $ sudo sed -i 's/3389/3390/g' xrdp.ini

    • 設定変更後、xrdpを再スタートして下さい。  $ sudo service xrdp restart

    • ポート番号をデフォルトの3389から変更した場合、リモートデスクトップ接続のコンピュータ指定は"localhost:ポート番号"になります(例: localhost:3390)。

xrdp自動起動...の代わり
  • WSL上のLinuxではsystemctrlが普通には動きません。xrdpのserviceファイルを作って、/usr/lib/systemd の下に置く方法を取りたかったのですが、別途調査することにして今回は見送ります。

  • 代わりに.bashrcの中で起動ステートメントを書き、bash起動をWindowsのスタートアップに入れることとしました。

  • .bashrcに下記記述を追加します。xrdpのプロセスが無ければ起動を行います。
    # xrdp autostart
    if ps ax | grep '/xrdp$' > /dev/null
    then
        echo -n ""
    else
        echo "==== start xrdp ===="
        sudo service xrdp start > /dev/null 2>&1
    fi

  • 次にUbuntuを起動するバッチファイルです。コマンドプロンプトからはbashで起動(*4)するので、下記のようなバッチファイルを作成します。(echo付けてますが、意味があるのはbashの1行だけです)
    @echo off
    echo ===================================================================
    echo ==== 仮想CPU の Ubuntuを起動します
    echo ==== ログインパスワードを入力してください
    echo ==== パスワード入力後はリモートデスクトップからUbuntuを利用できます
    echo ===================================================================
    echo Ubuntu起動中。しばらくお待ち下さい...
    bash

  • Windowsのコマンドプロンプトから下記を実行するとstartupのフォルダがエクスプローラで開かれるので、先程作成したバッチファイルをstartupフォルダに置きます。
    > start shell:startup

  • この設定により、Windows起動時にWSLのUbuntuも起動させます。Windows立ち上げ時に下記画面が出るので、パスワードを入力して下さい(*5)。以後リモートデスクトップでアクセス可能になります。

  • ※クリックで別画面拡大します

これから実験するのが本題
  • 冒頭でも書きましたが今回のレポートは作成する予定がありませんでした。必要なら Linuxのマシンを置けば良いと思っていたのですが、予想よりハードルが(技術的ではない要素で)高く、各自のWindows PC内でLinux環境を作ることにしました。

  • コマンドベースであれば、普通にWSL入れて終わりですが、波形ビューアなどのGUIも必要だったため、急遽WSLでGUIを使う方法について調べたのが、今回のレポートになっています。

  • コンテンツ/レポートとしてはこれで終了ですが、この後私は本題の実験/検証を始めようかなと思います。
Notes
  • こうやって5月連休を過ごしていました。今年もお出かけは難しいので。
  • Windows PCしかない環境ではVNCがマイナーなためリモートデスクトップを選びました。
  • 最近のUbuntuではlightdmよりgdm3の方が相性良いと思います。
  • もともとWSLはBash on Ubuntu on Windowsという名前でした。
  • /etc/sudoers.dを編集すればパスワード入力も不要になると思いますが、これも後で確認するつもりです。
Copyright(C) 2021 Altmo
本HPについて