猫の手なら貸せる

いろいろ共有できたらいいなとおもってます

RaspberryPiにLXDEを入れてリモート接続する

ラズベリーパイでUbuntu Server上にLXDEデスクトップを導入し、リモートデスクトップで接続することができたら嬉しいと思ったので設定した備忘録です。

LXDEについて

lubuntu Desktopにも利用されている超軽量デスクトップ環境です。壁紙すらありません。ベースがDebianなこともあり、RaspberryPiでもいい感じです。

f:id:nkhnd:20210522140239p:plain

GUIも画像の通り簡素で、ubuntu-desktopに比べると快適です。あくまでブラウザが見れるサーバくらいのノリで導入するのがよさそうです。

環境

  • ホストマシン
    • RaspberryPi4 8GB
    • Ubuntu 20.04 LTS server
  • クライアント

インストール

デスクトップ環境の導入

デスクトップ環境を入れます。

apt-get install -y lxde

lxdeインストールの自動化(expect)

cloudinitなどで導入する場合はexpectを使って次のようにかけます。 ただし、質問文が日本語化されていた場合はexpectの内容が変わってしまうため注意です。

sudo apt install -y expect
cat <<EOF | expect
set timeout -1
spawn sudo apt install -y lxde
expect "Default display manager: "
send "lightdm\n"
expect eof
EOF

バグ対応

ubuntu 20.04でlxdeを導入した後、接続後すぐに切断されてしまう問題を防ぐために以下を実行します。

apt-get purge -y gdm3 gnome-shell
apt autoremove
apt-get install -y xorg file-roller

参考:
apt - Best way to Install LXDE (Not LXQT) on Ubuntu 20.04 - Ask Ubuntu

xrdpの導入

リモートデスクトップ接続するためにxrdpを導入します。ここではubuntuユーザでログインすることを想定しています。

apt-get install -y xrdp
sed -i 's/allowed_users=console/allowed_users=anybody/' /etc/X11/Xwrapper.config # allowed_usersの値を変更

# 以下は初めにログインするユーザに向けて実施
sudo -u ubuntu echo "lxsession -s LXDE -e LXDE" > ~ubuntu/.xsession

使いやすくするため、以下の設定を追加します。

# かなキーをひらがなにするとデフォルトでひらがな変換になる
# .xsessionでlxsession前に挿入する
sudo -u ubuntu ed -i "1ixmodmap -e 'keycode 120 = Hiragana' 2>/dev/null" ~ubuntu/.xsession

apt-get install -y fcitx fcitx-mozc # 日本語入力用
setxkbmap -layout jp #キーレイアウトをMacbook日本語に

# chromiumの導入(RaspberryPiではGoogleChromeは依存関係を解消できない)
# 実際は snap install chromium が動いている
apt-get install -y chromium-browser

# メニューのインターネットカテゴリの非表示を解除
sed -i 's/^NoDisplay/#NoDisplay/' /usr/share/applications/chromium-browser.desktop 

# デスクトップショートカット作成
cat << EOF >> ~ubuntu/Desktop/chromium.desktop
[Desktop Entry]
Type=Link
Name=Chromium
Icon=chromium-browser
URL=/usr/share/applications/chromium-browser.desktop
EOF

# クリップボード用のマウントディレクトリを非表示
sed -i 's/FuseMountName=thinclient_drives/FuseMountName=.thinclient_drives/' /etc/xrdp/sesman.ini 
rmdir ~ubuntu/thinclient_drives

systemctl restart xrdp

以上で基本的な導入は完了です。

ネットワーク冗長化

bondingを使うことで同じIPアドレスWifiEthernetを利用することができ、Ethernetがダメな時はWifiで接続という設定が可能です。

以下のように/etc/netplan/99-manual.yamlを作成します。

network:
version: 2
renderer: networkd
ethernets:
    eth0:
    dhcp4: false
    dhcp6: false
wifis:
    wlan0:
    dhcp4: false
    dhcp6: false
    access-points:
        "WIFI-SSID":
        password: "WIFI-PASSWORD"
bonds:
    bond0:
    interfaces:
        - eth0
        - wlan0
    parameters:
        arp-interval: 1000
        arp-ip-targets: [192.168.3.1]
bridges:
    br0:
    interfaces:
        - bond0
    dhcp4: false
    dhcp6: false
    addresses:
        - 192.168.3.100/24 # 設定するIPアドレス
    gateway4: 192.168.3.1
    nameservers:
        addresses:
        - 192.168.3.250 # DNSサーバ
        - 8.8.8.8

音声転送の有効化

次を参照して実施しました。
w.vmeta.jp github.com

必要コンポーネントをインストールします。

apt install dpkg-dev build-dep pulseaudio

deb-srcを有効化します。

sed -i.bak -e "s/^# deb-src \(.*\)/deb-src \1/" /etc/apt/sources.list
apt update -y

PulseAudioを設定します。

cd /tmp
apt source pulseaudio
cd pulseaudio-13.99.1
./configure
# dpkg-buildpackage -rfakeroot -uc -b

モジュールを作成します。

cd ../
git clone https://github.com/neutrinolabs/pulseaudio-module-xrdp.git
./bootstrap && ./configure PULSE_DIR=/tmp/pulseaudio-13.99.1/
make

最後に作成したモジュールをインストールします。

make install

正常に完了すると、module-xrdp-sink.somodule-xrdp-source.soがモジュールディレクトリ内に作成されます。

ls $(pkg-config --variable=modlibexecdir libpulse)

pulseaudioを起動すると音声を転送することができるようになります。

pulseaudio -k 

.xsessionに追加すると、rdpの際に自動起動するようになります。

# .xsessionでlxsession前に挿入する
sudo -u ubuntu ed -i "1ipulseaudio -k" ~ubuntu/.xsession

所感

問題はいろいろありますが、遊びくらいに入れるには十分な印象です。 Wifi越しでの接続なので動きがもっさりしているのかもしれません。

f:id:nkhnd:20210522150541p:plain

また、lxdeが軽量なためか、8GBのRAMはさほど問題にならず、CPUが非力なためにブラウザーのタブをふやすともっさりする印象を受けました。

課題

まだできていないことが以下になります。

  • リモートオーディオが遅延する
  • トラックパッドのスクロールが早すぎる
  • 直接ディスプレイにつないでもServerモードで起動する

ちょっとてこずっているので、またできたら別途記事にしたいと思います。

参考

Ubuntu 18.04: デスクトップ環境のLXDEをインストールする - Narrow Escape