広告

WSL2 でデスクトップ環境(xfce4)

Ubuntu

これまでマルチブート環境で Ubuntu と Windows を使い分けてきましたが、今回、PC を更新したことで Hyper-V による仮想マシンの運用も現実的になりました。

また、Windows Subsystem for Linux(WSL)2.0 では近い将来、WSL 内でグラフィカルなLinuxアプリケーションを実行できるようになる(※)ということで、長年お世話になったマルチブート環境は不要になるかも、と思っています。
※今でも少し工夫をすれば GUI アプリを使用できます。

そこで今回、マルチブート環境は残したまま、仮想マシンと WSL2 の両方で Ubuntu の使用感を試してみたので、その備忘録です。
とはいっても、Hyper-V による仮想マシンに関しては沢山のサイトで解説されているので、WSL2 へのデスクトップ環境の導入を主に書き残します。

仮想マシンへの接続

Hyper-V の仮想マシンに接続するときは、Hyper-V Administrators にユーザーを登録しておくと何かと便利です。デスクトップのアイコン「PC」を右クリックで「管理」から「ローカルユーザーとグループ」で設定できます。

WSL のインストール(有効化)

特に悩むこともなく、以下に詳しい説明があるので割愛です。
今回は Ubuntu 20.04 LTS をインストールしました。

CUI 環境の日本語化

パッケージ情報の更新

user は hoge です。

hoge:~$ sudo apt update
hoge:~$ sudo apt -y upgrade

日本語言語パックのインストール

hoge:~$ sudo apt -y install language-pack-ja

ロケールを日本語に設定

hoge:~$ sudo update-locale LANG=ja_JP.UTF8

「CTRL + D」でシェルを閉じて、再起動してからコマンド「 locale 」で確認します。

hoge:~$ locale
LANG=ja_JP.UTF8
LANGUAGE=
LC_CTYPE="ja_JP.UTF8"
LC_NUMERIC="ja_JP.UTF8"
LC_TIME="ja_JP.UTF8"
LC_COLLATE="ja_JP.UTF8"
LC_MONETARY="ja_JP.UTF8"
LC_MESSAGES="ja_JP.UTF8"
LC_PAPER="ja_JP.UTF8"
LC_NAME="ja_JP.UTF8"
LC_ADDRESS="ja_JP.UTF8"
LC_TELEPHONE="ja_JP.UTF8"
LC_MEASUREMENT="ja_JP.UTF8"
LC_IDENTIFICATION="ja_JP.UTF8"
LC_ALL=
WSL再起動

Ubuntu 20.04 そのものを終了したいときは、Windows PowerShell やコマンドプロンプトから「 wsl -t Ubuntu-20.04」で終了します。
何かの事情で WSL を停止・起動するには、管理者として実行した Windows PowerShell などで、「net stop LxssManager」・「net start LxssManager」とします。

タイムゾーンを設定

hoge:~$ sudo dpkg-reconfigure tzdata

日本語マニュアルのインストール

hoge:~$ sudo apt -y install manpages-ja manpages-ja-dev

xfce4 のインストール

kde も xfce4 も安定して導入できましたが、以前に使っていた軽快な xfce4 を選択しました。
gnome-session はどうしても有効化できなかったので諦めました。

パッケージのインストール

hoge:~$ sudo apt -y install xubuntu-desktop

シンプルに xfce4 と xfce4-goodies のインストールでも OK です。

./.xsession , ./.xsessionrc の作成

もちろん、vi で直接編集してもいいです。

hoge:~$ echo xfce4-session > ~/.xsession
hoge:~$ vi ./.xsessionrc

export XDG_SESSION_DESKTOP=xubuntu
export XDG_DATA_DIRS=/usr/share/xfce4:/usr/share/xubuntu:/usr/local/share:/usr/share:/var/lib/snapd/desktop:/usr/share
export XDG_CONFIG_DIRS=/etc/xdg/xdg-xubuntu:/etc/xdg:/etc/xdg

XRDP のインストール

Windows からは標準機能のリモートデスクトップで接続するので追加するものはありません。

hoge:~$ sudo apt -y install xrdp

立ち上げてみます。
このままだと毎回 dbus と xrdp を手動で起動しないといけないので、後ほどスクリプトで自動起動するように変更します。

hoge:~$ sudo service dbus start
 * Starting system message bus dbus                                                                              [ OK ]
hoge:~$ sudo service xrdp start
 * Starting Remote Desktop Protocol server                                                                       [ OK ]
hoge:~$ ps ax
  PID TTY      STAT   TIME COMMAND
    1 ?        Sl     0:00 /init
    6 ?        Ss     0:00 /init
    7 ?        R      0:00 /init
    8 pts/0    Ss     0:00 -bash
20855 ?        Ss     0:00 /usr/bin/dbus-daemon --system
20891 pts/0    S      0:00 /usr/sbin/xrdp-sesman
20894 pts/0    S      0:00 /usr/sbin/xrdp
20900 pts/0    R+     0:00 ps ax

リモートデスクトップ接続を試す

ここまでの設定で Windows10 のリモートデスクトップ接続が可能となっているハズなので試してみます。

リモートデスクトップ接続のコンピュータのところに「 localhost:3390 」と入力して「接続」をクリックします。

リモートデスクトップ画面

続いて表示される xrdp のログイン画面で、username と password を入力します。Session は Xorg になっていると思いますのでそのまま。

xrdpログイン画面

ログイン後のプロセスは↓こんな感じです。

hoge:~$ ps ax
PID TTY STAT TIME COMMAND
1 ? Sl 0:00 /init
6 ? Ss 0:00 /init
7 ? S 0:00 /init
8 pts/0 Ss 0:00 -bash
20855 ? Ss 0:00 /usr/bin/dbus-daemon –system
20891 pts/0 S 0:00 /usr/sbin/xrdp-sesman
20894 pts/0 S 0:00 /usr/sbin/xrdp
21228 ? Ss 0:00 /bin/gpg-agent –sh –daemon –write-env-file /home/hoge/.cache/gpg-agent-info
21253 ? Sl 0:00 /usr/lib/upower/upowerd
21292 ? Sl 0:00 /usr/libexec/colord
21296 pts/0 Sl 0:00 /usr/libexec/geoclue-2.0/demos/agent
21327 ? Sl 0:00 /usr/lib/policykit-1/polkitd –no-debug
21478 ? Sl 0:00 /usr/lib/udisks2/udisksd
21539 ? Sl 0:00 /usr/lib/accountsservice/accounts-daemon
22024 pts/0 Sl 0:00 /usr/libexec/geoclue-2.0/demos/agent
22259 pts/0 S 0:00 /usr/sbin/xrdp
22260 pts/0 S 0:00 /usr/sbin/xrdp-sesman
22261 pts/0 S 0:00 /bin/bash /home/hoge/.xsession
22262 pts/0 Sl 0:00 /usr/lib/xorg/Xorg :10 -auth .Xauthority -config xrdp/xorg.conf -noreset -nolisten tcp -logfi
22296 pts/0 Sl 0:00 /usr/sbin/xrdp-chansrv
22321 pts/0 S 0:00 dbus-launch –autolaunch 5de019220832f10653dd294b5f8be974 –binary-syntax –close-stderr
22322 ? Ss 0:00 /usr/bin/dbus-daemon –syslog-only –fork –print-pid 5 –print-address 7 –session
22381 pts/0 S 0:00 /usr/bin/dbus-launch –exit-with-session –sh-syntax
22382 ? Ss 0:00 /usr/bin/dbus-daemon –syslog –fork –print-pid 5 –print-address 7 –session
22390 ? Ss 0:00 /usr/bin/ssh-agent /usr/bin/im-launch /bin/bash /home/hoge/.xsession
22412 ? Ssl 0:00 /usr/bin/ibus-daemon –daemonize –xim
22413 pts/0 Sl 0:00 xfce4-session
22417 ? Sl 0:00 /usr/libexec/gvfsd
22422 ? Sl 0:00 /usr/libexec/gvfsd-fuse /home/hoge/.cache/gvfs -f -o big_writes
22424 ? Sl 0:00 /usr/libexec/ibus-memconf
22426 ? Sl 0:00 /usr/libexec/ibus-ui-gtk3
22427 ? Sl 0:00 /usr/libexec/ibus-extension-gtk3
22430 ? Sl 0:00 /usr/libexec/ibus-x11 –kill-daemon
22435 ? Sl 0:00 /usr/libexec/ibus-portal
22539 ? Sl 0:00 /usr/libexec/at-spi-bus-launcher
22546 ? S 0:00 /usr/bin/dbus-daemon –config-file=/usr/share/defaults/at-spi2/accessibility.conf –nofork —
22551 ? Sl 0:00 /usr/lib/x86_64-linux-gnu/xfce4/xfconf/xfconfd
22561 ? Sl 0:00 /usr/libexec/at-spi2-registryd –use-gnome-session
22567 ? Sl 0:00 /usr/bin/xfce4-screensaver –no-daemon
22573 ? Sl 0:00 /usr/libexec/ibus-engine-simple
22584 pts/0 Sl 0:00 xfwm4 –display :10.0 –sm-client-id 2a6b0bedf-08eb-4b0f-89c3-86f060736d7b
22612 ? Ssl 0:00 xfsettingsd –display :10.0 –sm-client-id 212a423b9-479d-4cab-b55b-4e7b176e3ca6
22623 pts/0 Sl 0:00 xfce4-panel –display :10.0 –sm-client-id 2df5d4144-bd0f-4288-b465-6a442cceb3a7
22627 pts/0 Sl 0:00 Thunar –sm-client-id 2bfcc2cf3-429b-4361-9da8-308ca6f0d171 –daemon
22632 pts/0 Sl 0:00 xfdesktop –display :10.0 –sm-client-id 2529749f8-4654-4632-b0a6-c05e8c8f04d5
22635 pts/0 Sl 0:00 /usr/lib/x86_64-linux-gnu/xfce4/panel/wrapper-2.0 /usr/lib/x86_64-linux-gnu/xfce4/panel/plugi
22636 pts/0 Sl 0:00 /usr/lib/x86_64-linux-gnu/xfce4/panel/wrapper-2.0 /usr/lib/x86_64-linux-gnu/xfce4/panel/plugi
22637 pts/0 Sl 0:00 /usr/lib/x86_64-linux-gnu/xfce4/panel/wrapper-2.0 /usr/lib/x86_64-linux-gnu/xfce4/panel/plugi
22638 pts/0 Sl 0:00 /usr/lib/x86_64-linux-gnu/xfce4/panel/wrapper-2.0 /usr/lib/x86_64-linux-gnu/xfce4/panel/plugi
22639 pts/0 Sl 0:00 /usr/lib/x86_64-linux-gnu/xfce4/panel/wrapper-2.0 /usr/lib/x86_64-linux-gnu/xfce4/panel/plugi
22640 pts/0 Sl 0:00 /usr/lib/x86_64-linux-gnu/xfce4/panel/wrapper-2.0 /usr/lib/x86_64-linux-gnu/xfce4/panel/plugi
22655 ? Ssl 0:00 xfce4-power-manager –restart –sm-client-id 2015b1b78-6365-4952-a995-04e8b2041154
22657 pts/0 Sl 0:00 xiccd
22659 ? SNl 0:00 /usr/lib/x86_64-linux-gnu/tumbler-1/tumblerd
22675 pts/0 Sl 0:00 /usr/libexec/geoclue-2.0/demos/agent
22685 ? Ssl 0:00 xfce4-power-manager
22694 ? Sl 0:00 /usr/lib/x86_64-linux-gnu/xfce4/notifyd/xfce4-notifyd
22699 ? Sl 0:00 /usr/libexec/gvfs-udisks2-volume-monitor
22704 pts/0 Sl 0:00 nm-applet
22707 pts/0 Sl 0:00 /usr/libexec/evolution-data-server/evolution-alarm-notify
22722 pts/0 Sl 0:00 update-notifier
22730 pts/0 S 0:00 /usr/bin/python3 /usr/share/system-config-printer/applet.py
22732 ? Sl 0:00 /usr/libexec/gvfs-goa-volume-monitor
22743 ? Sl 0:00 /usr/libexec/dconf-service
22746 ? Sl 0:00 /usr/libexec/goa-daemon
22754 ? Sl 0:00 /usr/libexec/evolution-source-registry
22770 ? Sl 0:00 /usr/libexec/goa-identity-service
22777 ? Sl 0:00 /usr/libexec/gvfs-afc-volume-monitor
22785 ? Sl 0:00 /usr/libexec/gvfs-mtp-volume-monitor
22790 ? Sl 0:00 /usr/libexec/gvfs-gphoto2-volume-monitor
22814 ? Sl 0:00 /usr/libexec/evolution-calendar-factory
22819 ? Sl 0:00 /usr/libexec/gvfsd-trash –spawner :1.3 /org/gtk/gvfs/exec_spaw/0
22829 pts/0 Sl 0:00 /usr/bin/python3 /usr/bin/blueman-tray
22833 ? Sl 0:00 /usr/libexec/gvfsd-metadata
22845 ? Sl 0:00 /usr/libexec/evolution-addressbook-factory
22863 ? Z 0:00 [dbus-daemon]
22886 pts/0 R+ 0:00 ps ax

起動直後の画面はこんな感じです。

xfce4起動直後の画面

起動時にスクリプトを自動実行する

このままだと Ubuntu を起動するたびに dbus と xrdp を手動で立ち上げる必要があります。
なので、スクリプトを準備して /etc/profile の最終行に書き込みます。
今回は /usr/local/sbin/service_start.sh を準備して実行権を付与し、パスワード無しで起動できるようにします。

スクリプトの内容はこんな感じ。二重起動をチェックして、プロセスがなければ起動します。

#!/bin/bash

# xrdp
retval=$(service xrdp status >/dev/null 2>&1; echo $?)
if [ ! $retval == "0" ]; then
	  service xrdp start
fi

# dbus
retval=$(service dbus status >/dev/null 2>&1; echo $?)
if [ ! $retval == "0" ]; then
	  service dbus start
fi

セキュリティ的には如何なものかとは思いますが、このスクリプトをパスワード無しで sudo 実行するために hoge:~$ sudo visudo で sudoers を編集します。
次の1行を追加するだけ。

hoge   ALL=(ALL:ALL) NOPASSWD: /usr/local/sbin/service_start.sh

最後に、/etc/profile の最終行に1行追加します。

hoge:~$ sudo vi /etc/profile

~
sudo /usr/local/sbin/service_start.sh

細かな設定

カスタム DPI 設定

文字サイズが小さいので文字サイズを130%等に変更します。

カラープロファイル関係の認証ダイアログを消す

次のサイトを参考としました。

hoge:~$ sudo vi /etc/polkit-1/localauthority.conf.d/02-allow-colord.conf

polkit.addRule(function(action, subject) {
   if ((action.id == "org.freedesktop.color-manager.create-device" ||
        action.id == "org.freedesktop.color-manager.create-profile" ||
        action.id == "org.freedesktop.color-manager.delete-device" ||
        action.id == "org.freedesktop.color-manager.delete-profile" ||
        action.id == "org.freedesktop.color-manager.modify-device" ||
        action.id == "org.freedesktop.color-manager.modify-profile") &&
       subject.isInGroup("**")) {
      return polkit.Result.YES;
   }
});

「システムプログラムの問題が見つかりました」を出さなくする。

こちらと同じです。

日本語入力メソッド

iBus-Mozc が入っていなかったので apt でインストールしました。
設定は下画像の iBus の設定から日本語 -Mozc を追加します。

不完全な言語サポート

GUI でうまくインストールされませんでした。なので、次のコマンドを実行します。

hoge:~$ sudo -E apt install $(check-language-support) 

systemctl を使えるようにする ※必須ではありません。

これまでの手順で一通り基本的なデスクトップ環境は整ったと思いますが、WSL はもともと systemctl が使用できません。
それだと何かと不便なこともあるので使用できるようにしてみます。

しきゆらさんのサイト「しきゆらの備忘録」で簡潔にまとめられています。

genie を使うための準備です。

hoge:~$ sudo apt -y install daemonize
hoge:~$ sudo dpkg --purge packages-microsoft-prod && sudo dpkg -i packages-microsoft-prod.deb
hoge:~$ sudo apt update
hoge:~$ sudo apt -y install dotnet-runtime-3.1

genie をインストールします。

hoge:~$ curl -s https://packagecloud.io/install/repositories/arkane-systems/wsl-translinux/script.deb.sh | sudo bash
hoge:~$ sudo apt -y install systemd-genie

genie を自動起動するため、/usr/local/sbin/service_start.sh を再編集します。
xrdp と dbus は systemctl で自動起動するので記述は不要です。

#!/bin/bash

# genie
if [ "`ps -eo pid,lstart,cmd | grep systemd | grep -v -e grep -e systemd- | sort -n -k2 | awk 'NR==1 { print $1 }'`" != "1" ]; then
   genie -s
fi

使用感

  • ブラウザ、ターミナル、ファイルマネージャーなど、重たくない作業ならイライラすることなく使用できます。
    定量的なコメントではなくてスミマセン。
  • 初期設定では音がでませんが、PulseAudio を使うとリモートマシン(WSL)の音をローカル PC のスピーカから出すことができるようです。が、試していません。
  • Chrome のブックマークバーの入れ子になっているサブフォルダ内をマウスで正常に選択できませんでした。リフレッシュレートの問題?
    矢印キーでなら正常に選択できます。

Hyper-V も含めた感覚的な使いやすさは上から順に、

  1. Hyper-V
    同一PC内の仮想マシンに接続するなら仮想マシンマネージャ(またはvmconnect.exe)で接続するのが一番快適っぽいです。
    ただし、Wi-Fi 接続が関係すると極端にネット速度が下がるので注意が必要かな。
  2. xrdp
    導入が容易でシンプル、かつ想像以上に速くて使いやすい環境でした。
  3. VcXsrv
    ちょっとした GUI アプリを起動するには良いかも。
    見直す点はいろいろあったとは思うけど、デスクトップ環境にはイマイチでした。

という感じです。

Posted by @think