WSL2にUbuntu Desktop環境をインストールしてみた
Windows 10のWSL2(Windows Subsystem for Linux)のUbuntu 20.04に、デスクトップ環境(Ubuntu Desktop)をインストールしてみました。
Windows 10の仮想環境でUbuntuのデスクトップ環境を使うというと、通常はVirtualBoxやVMWare、Hyper-V+RDP(リモートデスクトップ接続)などを使うと思いますが、フレームレートが低いため個人的にはレスポンスが悪いように感じます(設定が悪いだけかもしれません)。
対して、WSL2のUbuntu+VcXsrvでは、フレームレートが高いため、サクサク感があります。
WSL2のインストール
まだWindowsにWSL2をインストールしていない、という方は、こちらを参考にWSL2とUbuntu 20.04をインストールしてください。
Windows側でVcXsrvを設定
まず始めに、GUI環境を表示する先として、Windows側にXサーバーをインストールします。今回は、XサーバーソフトとしてVcXsrvを使用します。
VcXsrvのインストールと設定は上記の記事をご覧ください。ただし、「Display setting」の所では、「Multiple windows」ではなく「One large window」を選択してください。
理由は、「Multiple windows」のままUbuntu Desktop環境を起動すると、フルスクリーンでUbuntuの画面が表示されてしまって扱いづらいためです。
設定が終わると、ただの黒い画面が表示されます。後ほど、ここにUbuntu Desktopが表示されます。
Ubuntu Desktopのインストール
Ubuntu Desktop自体は、コマンド一つでインストールできるのですが、そもそもUbuntu Desktopを動かすには、WSL2でGUIアプリが動くように設定してある必要があります。
まっさらなWSL2+Ubuntu 20.04の状態からUbuntu Desktopをインストールする場合と、既にGUIアプリが動くように設定済みの場合の、2パターンでインストール方法をまとめました。どちらか適切な方でインストールしてください。
まっさらなUbuntu 20.04にUbuntu Desktopをインストールするには
WSL2をインストール → Microsoftストアで「Ubuntu 20.04」アプリをインストール → 「Ubuntu 20.04」アプリを起動 → Unixユーザーの作成とパスワードの設定をしただけ、という所から環境を構築する人向けにBashスクリプトを用意しました。
これを任意の場所に保存して実行すれば、関連ソフトのインストールと初期設定ができます(例えば、Windows上のC:\init.sh
に保存したとすると、Ubuntu上でbash /mnt/c/init.sh
を実行すればOKです)。結構時間がかかります。
#!/bin/bash
# Copyright (c) 2020 astherier
# This software is released under the MIT License.
# http://opensource.org/licenses/mit-license.php
#
#WSL2+Ubuntu 20.04でGUIアプリが動くように設定し、Ubuntu Desktopをインストールします
# https://astherier.com/blog/2020/07/install-wsl2-on-windows-10-may-2020/
#WSL環境の各パッケージをアップデートします。
sudo apt update -y
sudo apt upgrade -y
# https://astherier.com/blog/2020/08/run-gui-apps-on-wsl2/
#GUIアプリを動かすため、いくつかソフトを入れて設定します。
#Windows側の設定も必要です。詳細はリンクを見てください。
sudo apt install -y libgl1-mesa-dev xorg-dev xbitmaps x11-apps
echo 'export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk '\''{print $2}'\''):0.0' >> ~/.profile
cat << 'EOS' | sudo tee /etc/fonts/local.conf
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
<dir>/mnt/c/Windows/Fonts</dir>
</fontconfig>
EOS
#起動確認:
# $ xeyes
#https://astherier.com/blog/2020/08/install-ubuntu-desktop-on-wsl2/
#Ubuntu Desktopのインストール
sudo apt -y install ubuntu-desktop
sudo service x11-common start
sudo service dbus start
#起動確認:
#WSLを再起動し、VcXsrvの設定を変更して
# $ sudo service x11-common start && sudo service dbus start && gnome-shell --x11 -r
echo "
一旦、WSL2を終了してください。
例)wsl.exe -t Ubuntu-20.04
その後、もう一度WSL2 Ubuntuを起動してからGUIを起動してください。
"
これで準備完了です。次に、起動確認のためUbuntu Desktopを起動するに進んでください。
GUIアプリが動く環境にUbuntu Desktopをインストールするには
既にGUIアプリが動くように設定済みの場合は、単にUbuntu DesktopをインストールするだけでOKです。先に、こちらの記事の Ubuntu側にGUIアプリをインストール の設定を終わらせておいてください。
そうしたら、Ubuntu Desktopをインストールするため、次のコマンドを実行します。
$ sudo apt install ubuntu-desktop
依存ソフトも大量にインストールされるため、結構時間がかかります。
これで準備完了です。
Ubuntu Desktopを起動する
ubuntu-desktop
をインストールした直後はうまく起動できないようなので、一旦WSL2を終了します。
まずは、上記のインストール作業を行ったコンソールを、exit
か×ボタンで閉じます。
次にコマンドプロンプトを起動して、WSL2を終了するコマンドを実行します。次のコマンドは、Microsoftストアから「Ubuntu 20.04」アプリをインストールしている場合の例です。「Ubuntu」アプリをインストールしている場合は、末尾の「-20.04」を省いてください。
> wsl.exe -t Ubuntu-20.04
これでWSL2が終了できますので、もう一度「Ubuntu 20.04」アプリを起動します。では、Ubuntuのデスクトップ環境を起動してみましょう。起動するには次のコマンドを実行します。
$ sudo service x11-common start && sudo service dbus start && gnome-shell --x11 -r
&&で区切って三つのコマンドを実行していますが、前二つは関連サービスの起動で、三つ目がGUIを起動するコマンドです。
Windows側のVcXsrvにUbuntuのデスクトップ環境が表示されたら成功です。通常のUbuntuと同じように、マウス操作でいろいろ操作できます。
冒頭で「サクサク」と書きました。マウスでウィンドウを移動したり、動画を視聴したりしても高フレームレートで表示されて、サクサク感はあります。
ただし、動画をフルスクリーンで再生したりすると、かなり負荷が大きく、Core i7 9700KのCPU使用率が50~60%くらい、GeForce RTX 2080のGPU使用率が30%くらいになります。また、(LANを経由しているわけではないと思いますが、)WSLの仮想イーサネットが4Gbpsくらい通信しています。
なので、WSL2でデスクトップ環境を動かしてパフォーマンスを求めるのはやめた方が良さそうです。
画面録画してみました(2021/06/13追記)
実際の使用感がどんな感じかは文字では伝えきれないので、画面録画をYouTubeに上げてみました。
マウス操作に対するレスポンスがよく、動画のフレームレートも高いためサクサク使えます。ただ、画面の描画が重いようで、スクロールしたり動画を再生したりするとCPU使用率がかなり上がります。
画面描画の負荷は解像度(VcXsrvの画面サイズ)によっても変わります。YouTubeに上げた動画は、フルHDディスプレイに対して半分くらいのサイズでVcXsrvを表示しています。これくらいのサイズだと動画も難なく再生できます(体感50~60fpsくらい)が、4Kディスプレイ全体で表示させたりすると、動画がカクつきます(体感20fpsくらい)。
参考サイト
この記事は、こちらのページを参考にさせていただきました。
おすすめの記事
本記事の解説の場合、日本語フォントが表示できるように設定していますが、日本語の入力はできません。日本語入力も必要な場合は、こちらをご覧ください。
また、Ubuntu側で音を鳴らしたい場合は、こちらの記事が参考になると思います。
ついでに、Ubuntu 20.04にGoogle Chromeをインストール方法もまとめています。こちらもどうぞ。
Bashシェルスクリプトをイチから学べる本です。よく見かけるものの一見トリッキーな「ifの条件式にコマンドを書く」、「&&や||でコマンドをいくつか並べる」などの書き方も、一つ一つ細かく動きを解説していて分かりやすかったです。また、grep、sed、xargs、getoptなどの使い方や正規表現についても、詳細に説明があります。
網羅的に書かれており、辞書的に使えるおすすめの書籍です。
記事の修正履歴
WSL2の再起動が必要なことを明記 他(2020/12/27)
ubuntu-desktop
のインストール後、WSL2の再起動を行っておかないと、GUI起動時にエラーが発生してしまうようです。そのため、GUI起動の前にWSL2を終了する、という説明を書き加えました。(jazzwalker様、コメント欄でのご指摘ありがとうございます)
WSL2の終了方法については、別記事に詳しくまとめています。こちらも合わせてご覧ください。
また、シェルスクリプト中のcat << EOS
を、cat << 'EOS'
に変更しました。(上記コードの場合、この変更をしても意味は変わらないはずですが、他の記事での記載内容に合わせました)
ディスカッション
コメント一覧
うまく進んでいたはずだったのですが、
$ sudo service x11-common start && sudo service dbus start && gnome-shell –x11 -r
このコマンドで、デスクトップが出るはずでしょうが、出ませんでした。
その代わりに、以下の文面が出ました。
* Setting up X socket directories… [ OK ]
* system message bus already started; not starting.
Xlib: extension “DPMS” missing on display “172.23.160.1:0.0”.
Xlib: extension “DPMS” missing on display “172.23.160.1:0.0”.
(gnome-shell:11665): Gjs-WARNING **: 16:57:21.850: JS ERROR: Gio.DBusError: Error calling StartServiceByName for org.freedesktop.login1: Launch helper exited with unknown return code 1
_injectToMethod/klass[method]@resource:///org/gnome/gjs/modules/core/overrides/Gio.js:290:25
_makeProxyWrapper/<@resource:///org/gnome/gjs/modules/core/overrides/Gio.js:267:17
LoginManagerSystemd@resource:///org/gnome/shell/misc/loginManager.js:95:23
getLoginManager@resource:///org/gnome/shell/misc/loginManager.js:85:29
_init@resource:///org/gnome/shell/ui/background.js:257:41
getBackground@resource:///org/gnome/shell/ui/background.js:586:30
_createBackgroundActor@resource:///org/gnome/shell/ui/background.js:742:49
BackgroundManager@resource:///org/gnome/shell/ui/background.js:678:37
_createBackgroundManager@resource:///org/gnome/shell/ui/layout.js:448:25
_updateBackgrounds@resource:///org/gnome/shell/ui/layout.js:483:34
_monitorsChanged@resource:///org/gnome/shell/ui/layout.js:543:14
_init@resource:///org/gnome/shell/ui/layout.js:297:14
_initializeUI@resource:///org/gnome/shell/ui/main.js:180:21
start@resource:///org/gnome/shell/ui/main.js:146:5
@:1:47
** Message: 16:57:21.850: Execution of main.js threw exception: Script threw an exception
どうしてうまく行かないのでしょうか?
追伸:目玉は動きました。
jazzwalkerさま、コメントありがとうございます!
確認してみたのですが、
sudo apt install ubuntu-desktop
の直後にGUI起動コマンドを実行すると、そのようなエラーが出てしまうみたいです。WSL2を再起動してから起動コマンドを打ったところ、正常に起動しました。
コマンドプロンプトから
wsl -t Ubuntu-20.04
を実行するとUbuntuを終了させられます。それからもう一度「Ubuntu 20.04」アプリを起動して、GUI起動コマンドを実行してみてください。
※WSL2の終了に関しては、こちらの記事にもまとめていますので、良ければご覧ください。
(PCではなく)WSL2のみを終了、再起動する方法
既にパソコン自体を終了・再起動している場合は、多分そのまま起動できるのではないかと思います。
VcXsrvを起動して、もう一度GUI起動コマンドを試してみてください。
記事もこれから更新しようと思います、ご指摘ありがとうございました!
$ sudo service x11-common start && sudo service dbus start && gnome-shell –x11 -r
このコマンドで、一度はうまく行ったものの、今回は以下のエラーメッセージが出て失敗しました。
Failed to start dbus.service: Operation refused, unit dbus.service may be requested by dependency only (it is configured to refuse manual start/stop).
手詰まりです。お手数ですが、コメントを頂けませんか?
現在、最初からやり直しておりますので、この件については保留で結構です。
またご報告いたします。
無印Ubuntsuを使い、うまく行きました。
ところで、「冒頭で「サクサク」と書きました。マウスでウィンドウを移動したり、動画を視聴したりしても高フレームレートで表示されて、サクサク感はあります。」とありますが、自分のマシンではサクサクどころか、Ubuntuデスクトップ自体がトロトロ動作なのです。CPUは第3世代のi7だからでしょうか? コメントいただければありがたいです。
訂正
✕Ubuntsu
◯Ubuntu
よろしくどうぞ。
すみません、またコメントへの返信が遅くなってしまいました・・・
私のパソコンですと、やはり「サクサク使える」という印象です。動画を撮ってYouTubeに上げてみました。記事中に動画を貼っていますので、そちらをご覧ください。
ただ、サクサクとは言っても、他の仮想化ソフト(VMwareなど)と比べるとかなり高負荷ですので、CPUがネックになってトロトロ、ということもあり得ると思います。CPU使用率が100%近くで張り付いているなら、CPUが原因とみて良いかもしれません。
質問です。
デスクトップ環境を起動する際のコマンドを起動時に自動実行することは可能でしょうか?
ピンバック & トラックバック一覧
[…] こちらのサイトを参考に bash スクリプトを Windows のホームディレクトリに配置。なお Windows と Linux では改行コードが異なるため予め変換しておくこと。Windows だと Mery を使用しました。また私の環境では bash は /usr/bin/bash なのでそこを変更。なお Ubuntu から Windows のホームディレクトリは私の場合 /mnt/c/Users/user/ になります。これも各人で変更すること。 […]