LoginSignup
21
19

WSL2のUbuntuにリモートデスクトップ接続する。(その1:genieインストール)

Last updated at Posted at 2021-07-18

2023.02.03追記
WSL2のネイティブSystemdでxrdpを動作させる記事を書きました。
WSL2でSystemdが公式にサポートされるようになったため今後は以下の記事を参照してください。

はじめに

WSL2Ubuntuを使用する場合、初期状態ではデスクトップ環境が使用できないため、CLIで操作することになります。

WSL2でそのままLinux GUIを動作させるためのWSLgというものもあるようですが、WindowsInsider Previewを利用しないとまだ使えないようで、ちょっとGUIを使いたい場合に使えるようにするためにxrdpをインストールして使えるようにしたいと思います。

環境

以下環境のマシンにインストールします。

リソース スペック
CPU AMD Ryzen 7 3700U 2.30 GHz
メモリ 16.0 GB

OSバージョンなど。

アプリケーション バージョン
Windows 10 Home 21H1
Ubuntu 20.04

WSL2のプロセス起動について

通常のLinuxではSystemdなどのサービスがPID 1で起動し、各種サービスを管理しますが、WSL2ではPID 1Windowsとやり取りするためにカスタマイズされたinitdが動いているため、Systemdなどのサービスが動きません。

そのため、WSLWSL2Linuxではsystemctlなどのコマンドが使えないため、常用するとなると何かと不便です。

ただ、WSL2でもPID 1Systemdを動作させることができるようになるgenieというパッケージが存在するため、genieをインストールして通常のLinuxと同じような使用感で使えるようにします。

Ubuntu 20.04の入手

Microsoft StoreからUbuntu 20.04を入手してインストールします。

なお、既にインストール済みの仮想マシンを初期状態に戻したい場合は「スタートメニュー」を右クリック→「アプリと機能」→「(ディストリビューション名)」の「詳細オプション」から「リセット」を選択することで、インストール直後の状態に戻すことができます。

環境が汚れて元に戻したくなったら実行しましょう。

capture_18072021_104340.jpg

genieインストール準備

以下genieGitHubページのDebian項目を見ると以下のパッケージがgenieインストール時の依存パッケージとなっております。

パッケージ 備考
daemonize 未インストール
dbus インストール済み
dotnet-runtime-5.0 未インストール
gawk インストール済み
libc6 インストール済み
libstdc++6 インストール済み
policykit-1 インストール済み
systemd インストール済み

但し、daemonizedotnet-runtime-5.0以外はWSLUbuntu 20.04にインストール済みとなるので、不足しているパッケージのみ追加でインストールしていきます。

daemonizeインストール

daemonizeUbuntuの標準リポジトリからそのまま入手できるので、aptコマンドでインストールします。

daemonizeのインストール
sudo apt update
sudo apt upgrade
sudo apt install daemonize

dotnet-runtime-5.0のインストール

Microsoftの公式ページにUbuntuでのインストール手順が記載されているので、公式ページの手順通りにセットアップしていきます。

.Netランタイムが公開されているリポジトリの登録と、署名キーを入手します。

リポジトリ登録と署名キーの入手
wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb
rm packages-microsoft-prod.deb

リポジトリの情報をupdateコマンドで更新してから.Net SDKをインストールします。

.NetSDKのインストール
sudo apt-get update; \
  sudo apt-get install -y apt-transport-https && \
  sudo apt-get update && \
  sudo apt-get install -y dotnet-sdk-5.0

同じく.Net runtimeもインストールします。

.Netランタイムのインストール
sudo apt-get update; \
  sudo apt-get install -y apt-transport-https && \
  sudo apt-get update && \
  sudo apt-get install -y aspnetcore-runtime-5.0

genieのインストール

genieGitHubページより、genieのインストールもリポジトリから取得することになるので、以下ページの通りリポジトリを登録します。

尚、上記ページではrootで実行する前提で書かれていますが、sudocatコマンドを使用したヒアドキュメントでファイル作成した場合、作られるファイルの権限はrootではなく実行ユーザ権限となるため、root権限が必要な場所にはヒアドキュメントでファイルを作成することができません。

そのため、いくつか書き換えた以下のコマンドを実行します。

genieリポジトリの登録
sudo wget -O /etc/apt/trusted.gpg.d/wsl-transdebian.gpg https://arkane-systems.github.io/wsl-transdebian/apt/wsl-transdebian.gpg
sudo chmod a+r /etc/apt/trusted.gpg.d/wsl-transdebian.gpg
sudo tee /etc/apt/sources.list.d/wsl-transdebian.list << EOF > /dev/null
deb https://arkane-systems.github.io/wsl-transdebian/apt/ $(lsb_release -cs) main
deb-src https://arkane-systems.github.io/wsl-transdebian/apt/ $(lsb_release -cs) main
EOF
sudo apt update

リポジトリの登録が完了したら後はaptコマンドでgenieをインストールするだけです。

genieのインストール
sudo apt install -y systemd-genie

genieインストール後のセットアップ

インストール直後の状態でgenieを起動するとエラーがいくつか表示されたりするため、対処を行います。

いくつかの問題の対処はgenieGitHubページにあるWikiに書かれているので、そちらの内容を取り込みます。

genie起動時に起動失敗するサービスの対処

WSL2Ubuntu 20.04genieを起動すると以下サービスの起動に失敗します。

サービス 備考
auditd.service 未インストール
multipathd.service インストール済み
ssh.service インストール済み
systemd-modules-load.service 未インストール
systemd-remount-fs.service インストール済み

auditd.servicesystemd-modules-load.serviceについては本手順実施時にはインストールされていないため、インストール済みで対処が必要となるサービスのみ対処を行います。

上記表のmultipathd.serviceはデフォルトのWSLカーネルではサポートされていないため、自動起動するためのリンクファイルを予め削除して起動しないようにしておきます。

multipathd.serviceの無効化
sudo rm /etc/systemd/system/multipath-tools.service
sudo rm /etc/systemd/system/sysinit.target.wants/multipathd.service
sudo rm /etc/systemd/system/sockets.target.wants/multipathd.socket

ssh.serviceは以下コマンドを予め実行しておくことでエラーが表示されなくなるため、以下実行します。

ssh-keygenコマンドの実行
sudo ssh-keygen -A

systemd-remount-fs.serviceは上記Wikiページによると、通常のUbuntuではcloudimg-rootfsというラベルが付いたパーティションをルートパーティションとして再マウントするようになっているが、WSLの場合は当てはまらないため失敗するので、ルートパーティションにcloudimg-rootfsをラベル付けすれば良いとのこと。

私の環境ではWikiページに書かれているデバイス名ではなかったため、以下コマンドでルートパーティションのデバイス名に対してラベル付けできるようにします。

ルートパーティションへのラベル付け
sudo e2label $(df / | awk '/\//{print $1}') cloudimg-rootfs

ラベル付けがされたことを確認する場合はblkidコマンドで確認してください。

/proc/sys/fs/binfmt_miscにアクセスできない問題の対処

Ubuntugenie使用時、/proc/sys/fs/binfmt_miscにアクセスするとエラーが表示されるため、/etc/rc.localに該当のディレクトリを再マウントする処理を追加します。

Wikiに記載の方法ではrc.local起動に失敗したため一部書き換えて以下実行

起動時remount実行
sudo tee /etc/rc.local << _EOF_ > /dev/null
#!/bin/bash
ls /proc/sys/fs/binfmt_misc > /dev/null 2>&1 || mount -t binfmt_misc binfmt_misc /proc/sys/fs/binfmt_misc
exit 0
_EOF_
sudo chmod +x /etc/rc.local

genieの自動起動

WSL2Ubuntuを起動したときにログインされるユーザの.bashrcgenieを自動実行するようにコマンドを仕込んでおきます。

genieを起動しない場合も考慮し、ログイン時に3秒猶予を持たせて、nの場合はgenieを起動しないようにしています。

ログイン時にgenie自動起動
cat << _EOF_ >> ~/.bashrc

# Are we in the bottle?
if [[ ! -v INSIDE_GENIE ]]; then
  read -t 3 -p "yn? * Preparing to enter genie bottle (in 3s); abort? " yn
  echo

  if [[ \$yn != "y" ]]; then
    echo "Starting genie:"
    exec /usr/bin/genie -s
  fi
fi
_EOF_

genieの起動確認

以下コマンドを実行することでgenieを起動できます。

起動時、timeoutやエラーが表示されなければ起動完了です。

genie -s

おわりに

今回はxrdpインストール前の準備としてgenieをインストールしました。

genieはボトルという疑似コンテナのような環境を構成することでsystemdPID 1で動かせるようにしているようなので、通常のUbuntuとまったく同じとはいきませんが、ちょっと使う分には十分かと思います。

いちいち仮想マシンを別で起動しなくてもWSLの軽量な環境でUbuntu等のサーバが動かせるのはメリットなので、常用したい方はgenieのインストールをお勧めします。

21
19
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
19