WSL2 でいい感じのデスクトップ環境を作りたい


WSL Advent Calendar に書こうと思ってたけど色々悩んでたら枠埋まってしまった

はじめに

3年半前,↓のような記事を書きました (個人ブログ)

Bash on Ubuntu on Windows でデスクトップ環境(Xfce)を動かしてみた

時代も変わって WSL2 が登場したり,色々あったので,今の環境で改めてWSLでデスクトップ環境を作る方法を模索してみました

最終目的

この記事では, Windows デスクトップの代わりに,WSLのデスクトップ環境を使う ことを目的にしています

なので別にイケてる開発環境を作りたいとかだけでなく,その他一般的なPCで行う行為をできるようにしてみたいという動機で作っています

いろんな方が書かれたやり方を試してみたのですが,やり方によって結構パフォーマンスに差が出そうで,快適に扱える環境を作ることに苦労していました

自分の中で現状いい感じだと思ったやり方についてまとめたいと思います

「デュアルブートでよくね」「VMでよくね」は禁句

前提

PC環境

  • OS: Windows 10 Pro
  • バージョン 2004
  • OSビルド: 19041.630
  • CPU: i7-9700K
  • RAM: 32GB

WSL 環境

  • WSLのバージョン: WSL2
  • ディストリビューション: Ubuntu 18.04 (20でも Wlinux でもあまり変わらなさそう)

大雑把な手順

  • WSL でディスプレイマネージャ (今回は lightdm) を起動し, VcXsrv を用いて XDMCP 接続する
  • デスクトップ環境を起動する
  • その他音声周りの設定

やったこと

インストール

  • WSL2 の有効化と,インストールは省略します
  • 今回は, Ubuntu 18.04 を入れました

とりあえず GUI 開けるようにしてみる

  • ここは最終目的に対して予備知識なのでなくても問題ないです
  • WSL環境から,GUIを開く方法の再確認

  • GUI が必要なアプリを入れてみます (xeyes)
$ sudo apt install x11-apps
  • 起動してみる
$ xeyes
Error: Can't open display:
  • 何も準備していないと,↑のように怒られて起動できないはずです

X Server を用意する

  • Windows 側に, X Server のクライアントソフトを入れます
  • 今回は VcXsrv を使用しました
    • 他にも XMing とか, (WLinux 側が推奨している) X410 とかありますが,自分で試した限り VcXsrv が一番良さそうでした (他のだとかなり動作が重い事があった...? )
  • VcXsrv をWindowsにインストールしたら,とりあえず XLaunch から起動してみます
  • 設定は,基本的にデフォルトのままで大丈夫ですが, 3ページ目の Extra settings で, Disable access control にチェックを付けます
    • (WSL1 ではこの設定は不要だった気がしますが, WSL2 ではネットワークの仕組みが変わって不要になった?)
    • 参考

  • VcXsrv を起動したら,WSL側で $DISPLAY 環境変数を設定します
  • Windowsで ipconfig コマンドを実行して, vEthernet (WSL) と書かれた部分の IP アドレスを入力します

$ export DISPLAY=XXX.XXX.XXX.XXX:0
  • とはいえ毎回調べるの大変なので,上述の参考リンクに, WSL 側からこの IP アドレスを取得する方法が書かれていました
$ export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}'):0

このコマンドで,$DISPLAY 変数が設定できるはずです
便利なので .profile とかに書いておくのも良いかも

  • 設定できたら,GUIアプリを起動してみます
$ xeyes

こんな感じに, WSL から GUI を開くことができました

デスクトップ環境を入れて起動してみる

  • さて,主題の方に移ります
  • デスクトップ環境を実際にいれてみます
  • とりあえずシンプルで使いやすそうな xfce
$ sudo apt install xfce4

(400Mb ぐらいでした)

xfce を起動する場合, VcXsrv の1つ目の設定は, Multiple windows 以外にしたほうが良いです

一旦 VcXsrv を One large window で起動し直して, $ xfce4-session を実行してみました

こんな感じにデスクトップ環境を起動することができました

日本語入力

コーディングで英語しか打たないなら不要ですが,今回は一般的な作業,ブラウジングとかこの Qiita の記事を書く用途とかも視野に入れてるので,日本語入力は必須です

色々日本語入力を実現する方法を試したのですが, fcitx + fcitx-mozc の組み合わせが最も扱いやすそうに感じました

WSL2にFcitx+Mozcを入れて日本語入力する

fcitx-mozc の導入

$ sudo apt install fcitx fcitx-mozc

(170Mb ぐらいでした)

以下の環境変数設定とコマンドで fcitx を起動できます

これもデスクトップ環境だけを使う想定なら, .profile とかに書いても良いかも

export GTK_IM_MODULE=fcitx
export QT_IM_MODULE=fcitx
export XMODIFIERS=@im=fcitx
export DefaultIMModule=fcitx
fcitx-autostart

$ fcitx-configtool で設定画面を開き, Input Method から Mozc を追加します

その他の設定はいい感じに (自分は普段Windowsでも Ctrl+Space でIME切り替えしてるので大体デフォルトの設定で

日本語文字化け

日本語入力はできたのですが,文字化けしてしまいました (事前に Ubuntu 20.04 で試したときは起きなかったのに何か手順違ったかな )

確か日本語対応のフォントをWSL環境に追加すればできたはずです

こちらの記事を参考に,(ちょっと強引なやり方ですが) Windows に入ってるフォントを WSL 環境にインストールしたら解決できました

(多分本来は使うべき日本語フォントを個別にインストールするほうが良いと思います)

WSL上のXサーバで、Windows 10にインストールされているフォントを利用する

/etc/fonts/local.conf
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
    <dir>/mnt/c/Windows/Fonts</dir>
</fontconfig>

(ついでにWSL環境の言語設定も日本語に変えています)

ブラウザ入れてみる

割と使うであろうブラウザは入れておきます

chromium-browser なり firefox なり好きなのを入れればいいと思いますが, WSLのディストロが Ubuntu-20.04 とか使っていると chromium-browser は snap 経由で入るようになったらしく,そのままでは動かせないかもです

第596回 snapパッケージ版Chromiumを使用する

一応 WSL2 で snap 動かすようにすることは可能らしいですが,以前試したら別の部分で意図してない問題が起きたので今回は行っていません..

とりあえず chromium-browser 動きました

音が聞こえない

WSLで作ったデスクトップ環境から Youtube とか見てたら,音声が再生されないことに気づきました

当たり前といえば当たり前なのですが,X Window System では音は関与していないので,Windows側に音声情報を渡す方法を別途用意する必要があります

この件に対して,こちらの記事がとても参考になりました

WSL2+Ubuntu 20.04環境から音声を出力する

ちょっと長いので詳細は割愛します

途中 Windows側の pulseaudio を起動する部分がありますが, WSL2 なら exe ファイルの実行もできるので, /mnt/c/... のように Windows 側の pulseaudio の実行パスを直接入力して起動処理を .profile に書いておいても良いかもです
( WLinux だと ホームディレクトリに winhome がデフォルトで用意されているので,そこから繋ぐのも良さそう)

というわけで,これで音声も再生できるようになりました

一通りできた

ここまでで,割といい感じにできるようになったと思ってるのですが,最近このような記事を見て, XDMCP でWSLに接続するのを追加で試してみました
( WSL で使うのなら,↑でやっていた xfce4-session を叩いて実行するやり方とどちらが良いんだろう... )

Using XDMCP with Windows 10’s Windows Subsystem for Linux (WSL)

XDMCP接続を試してみる

ディスプレイマネージャのインストール

↑の記事に沿って lightdm を入れてみます

$ sudo apt install lightdm

設定

/etc/lightdm/lightdm.conf
[LightDM]
start-default-seat=false

[XDMCPServer]
enabled=true
port=177

起動

$ sudo service dbus start 
$ sudo /etc/init.d/lightdm start&

VcxSrvで接続

XLaunch から, Open session via XDMCP で起動します

Connect to host の部分に, WSL 側の ip アドレスを入力します
(おそらく hostname -I で出てきた値を入力すれば大丈夫なはず?)

うまく行っていればこのようにログイン画面が表示されると思います

ユーザ名とパスワードを入力したら,無事ログインできて XFce セッションが起動しました
(上の方で入れた sudo apt install xfce4 だけだと,ログイン時にエラーが起きたので, sudo apt install xubuntu-desktop で改めてデスクトップ環境を入れています)

画面解像度を大きくした場合,マルチディスプレイで使う場合とかに,体感パフォーマンスが良くなっている気がするけど,定量的に測れていないので違いがよくわからず...

起動を自動化してみる

  • この辺の起動処理を毎回やるのも面倒なので,一発で起動できるようなスクリプトをちょっと書いてみました
#!/bin/sh
ip=`hostname -I`
vcxsrv.exe -ac -nodecoration -keyhook -multimonitors -query $ip &
sudo service dbus start
sudo service lightdm start

多分IPアドレス毎回入力するの面倒だと思うので,WSL 側から VcXsrv を起動して,起動オプションにIPアドレスを渡す形で実現しています

あとは必要に応じてこれを叩く bat などを書いてあげれば,Windows側から一発でWSLのGUI環境を起動できます

終わりに

以前WSL環境で遊んでたときと比べて,色々できること増えてて凄いなーというお気持ちでした (前試したときは日本語入力するだけですごい苦労していた記憶がある)

あとこれだけ設定したものの,実際この環境を常用するかと言われると...

まあそこは作ったデスクトップ環境のカスタマイズによるかもしれません

自分は i3 入れて Windows ではできなさそうな操作性にしてみたりして遊んでいました

まだ試していないですが,Windowsの上で動いているというWSLの利点を持ち出すなら, Wine とかがスムーズに使えると便利そう