2023.02.03追記
WSL2のネイティブSystemdでxrdpを動作させる記事を書きました。
WSL2でSystemdが公式にサポートされるようになったため今後は以下の記事を参照してください。
はじめに
WSL2
でUbuntu
を使用する場合、初期状態ではデスクトップ環境が使用できないため、CLI
で操作することになります。
WSL2
でそのままLinux GUI
を動作させるためのWSLg
というものもあるようですが、Windows
のInsider 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 1
はWindows
とやり取りするためにカスタマイズされたinitd
が動いているため、Systemd
などのサービスが動きません。
そのため、WSL
、WSL2
のLinux
ではsystemctl
などのコマンドが使えないため、常用するとなると何かと不便です。
ただ、WSL2
でもPID 1
でSystemd
を動作させることができるようになるgenie
というパッケージが存在するため、genie
をインストールして通常のLinux
と同じような使用感で使えるようにします。
Ubuntu 20.04の入手
Microsoft Store
からUbuntu 20.04
を入手してインストールします。
なお、既にインストール済みの仮想マシンを初期状態に戻したい場合は「スタートメニュー」を右クリック→「アプリと機能」→「(ディストリビューション名)」の「詳細オプション」から「リセット」を選択することで、インストール直後の状態に戻すことができます。
環境が汚れて元に戻したくなったら実行しましょう。
genieインストール準備
以下genie
のGitHub
ページのDebian
項目を見ると以下のパッケージがgenie
インストール時の依存パッケージとなっております。
パッケージ | 備考 |
---|---|
daemonize | 未インストール |
dbus | インストール済み |
dotnet-runtime-5.0 | 未インストール |
gawk | インストール済み |
libc6 | インストール済み |
libstdc++6 | インストール済み |
policykit-1 | インストール済み |
systemd | インストール済み |
但し、daemonize
とdotnet-runtime-5.0
以外はWSL
のUbuntu 20.04
にインストール済みとなるので、不足しているパッケージのみ追加でインストールしていきます。
daemonizeインストール
daemonize
はUbuntu
の標準リポジトリからそのまま入手できるので、apt
コマンドでインストールします。
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
をインストールします。
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
もインストールします。
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のインストール
genieのGitHub
ページより、genie
のインストールもリポジトリから取得することになるので、以下ページの通りリポジトリを登録します。
尚、上記ページではroot
で実行する前提で書かれていますが、sudo
でcat
コマンドを使用したヒアドキュメントでファイル作成した場合、作られるファイルの権限はroot
ではなく実行ユーザ権限となるため、root
権限が必要な場所にはヒアドキュメントでファイルを作成することができません。
そのため、いくつか書き換えた以下のコマンドを実行します。
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
をインストールするだけです。
sudo apt install -y systemd-genie
genieインストール後のセットアップ
インストール直後の状態でgenie
を起動するとエラーがいくつか表示されたりするため、対処を行います。
いくつかの問題の対処はgenie
のGitHub
ページにあるWiki
に書かれているので、そちらの内容を取り込みます。
genie起動時に起動失敗するサービスの対処
WSL2
のUbuntu 20.04
でgenie
を起動すると以下サービスの起動に失敗します。
サービス | 備考 |
---|---|
auditd.service | 未インストール |
multipathd.service | インストール済み |
ssh.service | インストール済み |
systemd-modules-load.service | 未インストール |
systemd-remount-fs.service | インストール済み |
auditd.service
とsystemd-modules-load.service
については本手順実施時にはインストールされていないため、インストール済みで対処が必要となるサービスのみ対処を行います。
上記表のmultipathd.service
はデフォルトのWSLカーネルではサポートされていないため、自動起動するためのリンクファイルを予め削除して起動しないようにしておきます。
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
は以下コマンドを予め実行しておくことでエラーが表示されなくなるため、以下実行します。
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にアクセスできない問題の対処
Ubuntu
でgenie
使用時、/proc/sys/fs/binfmt_misc
にアクセスするとエラーが表示されるため、/etc/rc.local
に該当のディレクトリを再マウントする処理を追加します。
Wiki
に記載の方法ではrc.local
起動に失敗したため一部書き換えて以下実行
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の自動起動
WSL2
のUbuntu
を起動したときにログインされるユーザの.bashrc
にgenie
を自動実行するようにコマンドを仕込んでおきます。
genie
を起動しない場合も考慮し、ログイン時に3秒猶予を持たせて、n
の場合は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
はボトルという疑似コンテナのような環境を構成することでsystemd
をPID 1
で動かせるようにしているようなので、通常のUbuntu
とまったく同じとはいきませんが、ちょっと使う分には十分かと思います。
いちいち仮想マシンを別で起動しなくてもWSL
の軽量な環境でUbuntu
等のサーバが動かせるのはメリットなので、常用したい方はgenie
のインストールをお勧めします。