Open17

最新安定版Debian 12.7 + LXDEで超軽量Moonlightシンクラを作ってみる

キノ🍀キノ🍀

このスクラップについて

調べて分かったことを後で振り返るための個人用メモです
作業後にやったことを思い出しながら書いているので記入漏れがあるかもしれません

書きたいと思ったことを書きたいだけ書いているので煩雑だと思います。すみません。

Moonlightについて

Moonlightというゲームストリーミング(リモートプレイ、リモートデスクトップ)アプリケーションがあります。
https://moonlight-stream.org/
これ自体はNVIDIAが過去に出していたらしい「NVIDIA SHIELD」というデバイスシリーズで使われていたGameStreamプロトコルを一般的なPC/スマホなどの汎用デバイスで使えるようにするもの、という位置付けなのですが、最近はSunshineというホストアプリケーションを導入することでNVIDIA以外のGPUでも利用できるという噂もあります(まだ試していないので詳しいことは分かりません)

Moonlightは他のゲームストリーミングシステム(SteamLinkなど)と比較しても体感上の遅延が少なく使用感も非常に良好です。
これによりiPhone/iPadやAndroid端末がゲーミングPC用のワイヤレスディスプレイとして活用できます。

現状について

最初は5.9inchのAndroid端末をベッドの頭上から吊るしてゲームストリーミングクライアントとして使っていたのですが、最近フレンドとプレイしているゲームはSatisfactoryです。

Minecraftなどと違って筋金入りのPCゲームなので、文字が読めません。スマホの画面で読めるわけがありません。アイテムが毎分何個消費されて、何個生産されているのか分からなくては、ゲームを進める上で非常にストレスになります。しかし、ゲームのためだけにPCデスクに向かうというのも正直億劫です。休日ぐらい横になっていたい。

そこで私は家に転がっていた古いタブレットPCに目を付けました。これは私がゲーミングPCを購入する前にメインPCとして利用していたものですが、非常にお粗末なスペックで、何故かUEFIが32bitなのでWindows11がインストールできません。というか、未だに中身はWindows8.1のままです。セキュリティ的にも良くありません。そしてMoonlightはWin8.1に非対応です(残当)

Model: NEC VersaPro VT-J (PC-VK24VTAMJ)
CPU: Intel Atom® Processor Z3795
RAM: 4GB (32bitのため実際に利用できるのは3GB)
Storage: eMMC 64GB
Display: 10.1型IPS液晶 WUXGA (1,920 x 1,200)
Wi-Fi: IEEE802.11a/b/g/n, Wi-Fi Direct™
Bluetooth: Bluetooth® Ver.4.0 (Class1)

※この機種は俗に「Atom婆」と呼ばれていたらしいです。
デジタイザー搭載で、お絵描きの練習にも使う想定で中古購入しました。結局は数枚ぐらいしか描きませんでしたが……

Linuxをインストールしてみよう

今回は、この今となってはゴミ同然お粗末なタブレットPCで、何とかMoonlightを動かして「ごろ寝用のワイヤレスモニター」としてセットアップし、快適な休日ゲーミング環境を構築したいと思います。

Moonlightに対応していて、かつ軽量なOSをインストールすれば、この目的を達成できるはずです。

前述の通り、この機種は何故かUEFIが32bitです。OEMの某Lenovoブランドのモデルは64bit対応らしいので、そのBIOSデータを持ってきて無理やり焼いてみるなどの方法も検討できますが、タブレットPCで文鎮化は流石に怖いので32bit対応のLinuxを検討します。

ディストリビューション、デスクトップ環境の選定

有名どころだとUbuntuは既に32bit対応をやめてしまったそうですが、そのベースとなっているDebianは未だに最新版でi386を公式サポートしています。

噂によれば2038年以降も32bit環境で動作できるように取り組んでいるとのことで、まだまだ32bitの対応をやめる気はなさそうです。このPCも延命できそうな気がしました。

2024年9月時点での最新安定版はDebian 12.7(2024年8月31日リリース)でした。
https://www.debian.org/releases/

Debian 12のインストーラーでは、デスクトップ環境を

  • GNOME
  • xfce
  • GNOME Flashback
  • KDE Plasma
  • Cinnamon
  • MATE
  • LXDE
  • LXQT

の中から選ぶことが出来ます。

今回導入予定のPCはスペックが難アリなので、とことん軽量なものを導入します。使用感は二の次です。私はLinux初心者ですが何とかなるでしょう。

LXQtの前身であるLXDEですが、何故かアプデが続いていて、xfceやKDE、LXQtよりも軽いとの噂を聞いたので、一旦これを使ってみて、それから考えることにします。

VMでの動作確認

ISOイメージを拾ってきて、Hyper-Vの仮想マシンに展開します。
https://www.debian.org/distrib/

debian-12.7.0-amd64-netinst.iso

仮想マシンの設定は第2世代(UEFI)としたので、確認としては不十分ですが動作確認には64bit版のイメージを使用しました。

https://snapcraft.io/install/moonlight/debian
snapdをセットアップしてMoonlightをインストールし、問題なくストリーミングが動作することが確認できました。

念の為、今入っているWin8.1の環境も残しておきたいので、テスト用にWin10がインストールされたVHDXを用意して上からインストールするパターンも検証。

WindowsのCドライブを縮小して、あとはDebianのインストーラーに任せておけば、既存のEFIシステムパーティションを利用してデュアルブートをセットアップしてくれるようです。Windows側で使われていたブートエントリが消えてしまうようなこともありませんでした。

このディストリビューションで問題なさそうです。

キノ🍀キノ🍀

ハードウェアの準備

このタブレットPCですが、外部インターフェースも非常にお粗末です。USB2.0が1つと、Mini-DPが1つ。microSDスロットが1つです。オマケに電源スイッチは陥没していて、付属のスタンドキーボードは最近完全に動作しなくなってしまいました。

陥没した電源スイッチはスマホ分解用の吸盤で無理やり筐体の粘着部分を少し引き剥がしたら取れたので、マイナスドライバーを突っ込んで押します。基本的には電源を繋げっぱなしにしてコマンドで再起動する運用を想定。

あとはUSB2.0のハブが自宅に転がっていたので、これを使います。
USBキーボードは余りを持っていないのでメインPCから引っこ抜きました(Bluetoothキーボードがあるので何とかなる)
USBワイヤレスのトラックボールも引っこ抜いて持ってきます。

Easy2Bootについて

今回インストーラーのISOイメージの実行にはEasy2Boot(agFM)としてセットアップしたUSBメモリを利用しました。

これ一本でBIOS/UEFI、32bit/64bit関係なくブートメニューからライブ起動が出来て、メモリ内に素で配置しただけのISOイメージを選んで起動することが出来るというスグレモノです。

専用ツールでISOを焼きこんだり、何本もインストールUSBを用意する必要はありません。オススメです。
https://easy2boot.xyz/download/

実機でのOSイメージ展開

WindowsUpdateは非常に優秀です。どれほど優秀かと言えば、ノートパソコンに入っていたWindowsのSSDを、そのままデスクトップPCに繋ぐだけで必要なドライバを勝手に当て直して問題なく動作してしまうほどです。

この点、Linuxには真似できないと思います。マイナーなデバイスだとLinux用のドライバが端から存在しないなんてことも有り得そうです。

しかし、私の不安を他所に、殆どのデバイスドライバは自動で適用されました。使用したISOイメージはnetinst版(必要なデータをインターネット上から拾ってくるタイプ)ですが、インストーラー上で問題なくWi-Fiカードを認識して無事にセットアップを完了できました。何故かマウスが動きませんが、タッチパネルが効きます。
https://x.com/Akeyroid7/status/1838331316867338655

SDカードへのインストールは出来ませんでした

丁度256GBのmicroSDを余らせていたので、一旦パンパンなCドライブを放置して、microSDへのインストールを試みました。インストーラー上ではeMMC同様に問題なく認識していて、インストール先として選択できるようになっていますが……これは罠です。

インストールが完了しても、普通にWin8.1が起動してしまいます。おやおや……?
https://x.com/Akeyroid7/status/1838335180123336923
このPCですが、UEFI画面上のブートオーダー順に表示されるのは

  • Windows Boot Manager
  • Internal Storage
  • USB HDD
  • USB CD/DVD
  • USB FDD
  • Network Adapter

ぐらいのもので、SDカードらしきものが見当たりません。

てっきりSDはUSB HDDに含まれるかなと思っていたのですが、デスクトップPCにありがちなUSB接続のカードリーダーではなく「素のSDカード規格」として接続されていて、USBメモリとは扱いが異なるようです。

ブートローダーだけ内蔵ストレージに持ってきたりなど色々試しはしましたが、agFMから強引にdebianのブートエントリを起動するなどしてもgrubプロンプトが表示されて読み込まれない……そもそもEFIとして処理が実行されている段階ではSDカードが認識できていない説が浮上しました。

流石に解決が大変そうなので、今回は諦めて素直にCドライブを縮小します。

インストール後のストレージ使用量は5GBちょっとであることをHyper-Vで確認済みなので、10GB用意できれば問題なさそうです。スワップも無しで行きます。

Cドライブの整理とインストールの再試行

動かなかったDebianの入っているSDカードは思い切ってdiskpartでclean。create part primaryして、GUIからNTFSでフォーマットしました。256GBのDドライブの完成です。

WizTreeで容量を食っていそうなディレクトリを割り出して、robocopyでDドライブにコピー。問題なくコピー出来たことを確認して元ディレクトリを削除。

他には

  • 休止状態の無効化(hiberfil.sysの削除)
    powercfg.exe /hibernate off
  • コンポーネントストアのクリーンアップ(WinSxSの縮小)
    Dism.exe /online /Cleanup-Image /StartComponentCleanup
  • ゴミ箱を空にする

などの処置を実施。

最終的に22GB程の空き容量を確保できました。

再度インストーラーのISOイメージを実行して、インストーラー側で適当にeMMCのNTFSパーティションを10GB縮小して、ext4のパーティションを作成しルート/にマウント。改めてインストールを試みます。

すると無事、爽やかな色のGRUBから問題なくDebianが起動しました。LXDEはバチくそに軽いようで、使用メモリは数百MBです。スワップ無しでも全く問題ありません。

雰囲気はWindowsXPぐらいの時代を感じますが、こう見えて中身は最新のOSで動いているというのは中々にロマンがありますね。

ちなみにWindows Boot ManagerもGRUBから選択できるようになっています。Windowsも無事です。

SSHサーバーについて

ちなみにインストール時のオプションは、デスクトップ環境としてLXDEのみを有効化し、一応SSHサーバーにもチェックを入れてあります。IPアドレスさえ割り当てられれば、22ポートから接続できるようになるみたいです。

追記

「ホスト名.local」というアドレスを使うとIP指定なしでSSH接続できるみたい。
こういう機能をmDNS(マルチキャストDNS)と言うらしい?
固定IPを考える手間が無くなるのは助かる。

キノ🍀キノ🍀

やっぱりLinuxはインストールしただけでは使えなかった

色々試して後から「スペック不足でした!」となると悲しいので、問題なくMoonlightが使えることを早速確認しようと思います。

インストーラーで動いていなかったマウスが今は動いていますが、どういう訳か肝心のWi-Fiが死んでいます。

というわけで、Wiiに繋がってたUSBのイーサネットアダプタを、そのままUSBハブにぶっ刺します。これは動きました。

LXDEのショートカット

後の作業は殆どコマンドラインで行うことになりそうなので、LXDEの基本操作について確認しておきます。

最初に覚えるべきは

  • Ctrl+Escでスタートメニューを開く
  • 方向キーで[システムツール]>[LXTerminal]を選択
  • Alt+Space→Xでウインドウ最大化

でしょうか。Alt+TabもWindows同様に利用できます。

参考

https://komputilo.blogspot.com/2022/04/lxde.html

キノ🍀キノ🍀

sudoが出来ない

Linuxと言えばsudo、Ubuntuと言えばsudo apt update。Linux初心者の私でも、それぐらいは知っています。

しかし、インストールしたてのDebian曰く、私の名前が sudoers ファイルに無いらしいのです。

$ sudo apt update
[sudo] akeyroid7 のパスワード:
akeyroid7 は sudoers ファイル内にありません。この事象は記録・報告されます。

この sudoers ファイルですが、/etc/sudoersというパスに存在するようです。
どうしようもないので、rootアカウントに切り換えて中身を確認してみます。

su
ls /
ls /etc
cat /etc/sudoers
exit

catはネコちゃんじゃないです。やっぱLinuxてKawaiiよね
「concatenate(つなぐ、連結する)」の略だとか。
ファイルを連結するためのコマンドですが、単一ファイルの中身を出力するのにも使えます。

出力結果で気になったのは、この部分。

# User privilege specification
root    ALL=(ALL:ALL) ALL

# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL

これはどうやらsudoグループに属している人なら何でも出来ちゃうぞということらしいです。私もsudoグループに属したい。

gpasswd -a ユーザー名 sudo

というわけで属しました。再起動したらsudoできるようになっています。

参考

一連の流れを分かりやすく解説している記事がありました。
https://kimamani89.com/2020/08/14/debian「sudoers-ファイル内にありません」の対象法/

余談: RHEL系の場合

sudoが実行できるグループの名前がデフォルトではwheelに設定されているようです。

usermod --aG wheel <username>

今後、AlmaLinuxを使ってみたいと思っているので、覚えておきます。
https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/8/html/configuring_basic_system_settings/granting-sudo-access-to-a-user_managing-sudo-access

キノ🍀キノ🍀

[不要かも]一部のコマンドで名前解決が出来ない?

sudoが使えるようになったので、改めて真っ先にsnapdとMoonlightのインストールを……

sudo apt update
sudo apt install snapd
sudo snap install snapd

と、此処でエラー発生。おかしいな、Hyper-Vでは問題なかったんだけど。

よくよく思い返してみたら、USBのイーサネットアダプタを接続したのは、この直前だったかもしれないです。最終的には直ってますが、どのタイミングで解決したかは厳密には不明です。

以下、一応やったことを纏めます。

sudo apt install systemd-resolved
sudo nano /etc/systemd/resolved.conf

DNS=1.1.1.1 1.0.0.1を追記(超適当)

sudo systemctl restart systemd-resolved

これで一応snapが動きました。気を取り直して。

sudo snap install snapd
sudo snap install moonlight
/snap/bin/moonlight

このコマンドでMoonlightが起動します。

キノ🍀キノ🍀

Moonlightの起動ショートカットの作成

デスクトップ画面を右クリックしてMoonlight.desktopという名前の空のファイルを作成します。

作成したファイルを右クリックしてMousepadで開きます。ダブルクリックだとLibleOfficeが起動してしまいます。

Mousepadで書き込む内容は以下の通り。

[Desktop Entry]
Name=Moonlight
Terminal=false
Exec=/snap/bin/moonlight
Icon=/snap/moonlight/2015/usr/share/icons/hicolor/scalable/apps/moonlight.svg
Type=Application

Ctrl+Sで保存。

保存したアイコンをダブルクリックで実行確認のダイアログが出ます。

参考

https://qiita.com/slniyi/items/099b1bf9ebdcb8eab9e6

Z3795でスペックは問題なさそう

軽くPCのブラウザ画面を映してみましたが、サクサクでした。Moonlight自体が軽いので、デスクトップ環境の軽さがパフォーマンスに直結するみたいです。Win8.1で動かしてたリモートデスクトップアプリとは比べ物にならん。

Ctrl+Alt+Shift+Qで接続を終了できます。
https://qiita.com/nagisawks/items/cca694c571e6be20fe56

キノ🍀キノ🍀

Wi-Fiどころか無線全部繋がらんのだけど!?

Wi-FiやBluetoothを有効化するコマンドを調べましたが、エラーが出てデバイスをupさせることが出来ません。どうやらrfkillというシステムでblockされているようです。デフォルトが機内モードってこと?

というわけで、有線LANを接続した状態で

sudo apt install rfkill
sudo rfkill unblock all
ip link
sudo ip link set wlan0 up

を実行。これ有線LAN使えないと辛いですね……

現時点では再起動後に毎回sudo rfkill unblock allが必要です。これも後で何とかします。

参考

https://a244.hateblo.jp/entry/2017/12/28/024238
https://gordiustears.net/linux-ifconfigコマンドがない!と慌てた時のチートシート/

キノ🍀キノ🍀

Wi-Fi管理をiwdに変更

iwctlというコマンドを使ってコマンドラインからWi-Fiの接続が可能らしい」という噂を聞いて、早速試しました。

調べを進めるうちに後で分かったことですが、Debianではwpa_supplicantという別のWi-Fi管理システムが動作しているようで……こっちは古い方らしいので無効化します。新しいシステムがちゃんと使えるなら、そっちの方が良いじゃない。

sudo apt install iwd
sudo systemctl enable iwd
systemctl status wpa_supplicant
sudo systemctl mask wpa_supplicant
systemctl reboot
systemctl status iwd

参考

https://kledgeb.blogspot.com/2020/08/ubuntu-2010-6-iwdinet-wireless-daemon.html

iwdでWi-Fiのペアリングを実行

以下のコマンドを実行します。

iwctl
help
device list
device wlan0 show
station wlan0 show
station wlan0 scan
station wlan0 get-networks
station wlan0 connect [SSID]
known-networks list

無事にペアリングが完了して、再起動後もsudo rfkill unblock allさえ実行すれば、あとは待つだけで勝手にWi-Fiが繋がるようになりました。rfkill、お前は何なんだ。

参考

https://wiki.archlinux.jp/index.php/Iwd

キノ🍀キノ🍀

Bluetoothを使用可能な状態にする

いつまでもUSBハブを繋げておくと邪魔なので、とっととBluetoothキーボードを繋げてしまいたい。

Bluetoothの管理コマンドは、最初からbluetoothctlというものが利用できました。

systemctl status bluetooth

の実行結果を見ると、いくつかエラーが出ていたので、なんとか解決します。

sap-server: Operation not permitted (1)

https://zenn.dev/izszzz/articles/5747cd8b65f201

sudo nano /etc/systemd/system/bluetooth.target.wants/bluetooth.service

ExecStart=/usr/lib/bluetooth/bluetoothd --noplugin=sapを追記

sudo systemctl daemon-reload
sudo service bluetooth restart

systemctl status bluetoothのエラーが少し減りました。

src/plugin.c:plugin_init() Failed to init vcp plugin

https://askubuntu.com/questions/1465957/bluetooth-manager-not-connecting-to-devices-after-upgrading-to-ubuntu-23-04

sudo apt install bluez-alsa-utils
sudo apt purge bluez-alsa-utils

↑これは要らなかったかも。

sudo apt install --reinstall libspa-0.2-bluetooth

↑重要なのはコレらしい。

A2DPのコーデック周り

使う予定は無いけれど、一応使えるようにしておく。

sudo apt install pipewire-pulse

https://wiki.archlinux.jp/index.php/Bluetooth_ヘッドセット

キノ🍀キノ🍀

Bluetoothのrfkillにはbluemanが効くらしい

以外のコマンドを実行すると、LXDEのタスクバーにBluetoothのアイコンが出現します。

sudo apt install blueman
blueman-manager

GUIでBluetoothのペアリングが実行できます。
(まだ上手く動いていませんが、ハードウェアが壊れ掛けな疑いもあるので、今のところ何とも言えない)

このbluemanですが、Bluetoothを再起動後に自動で有効化する機能があります。

これによって再起動後にsudo rfkill unblock allを実行せずともBluetoothは利用できるようになりました。Wi-Fiは依然としてblockされたままです。どうして。

参考

https://wiki.archlinux.jp/index.php/Blueman

キノ🍀キノ🍀

明るさの変更方法、間違ってた

xrandrコマンドを用いた明るさの調整ですが、どうやらこれはバックライトではなくソフトウェア的に画面の黒っぽさを変更しているだけだった模様……
https://zenn.dev/link/comments/0ec16e00466940

調べを進めてみると「特定のテキストファイルを書き換える」という方法で物理的なバックライトの明るさを変更できることが確認できました。

$ ls /sys/class/backlight/
intel_backlight
$ ls /sys/class/backlight/intel_backlight/
actual_brightness  bl_power  brightness  device  max_brightness  power  scale  subsystem  type  uevent
$ cat /sys/class/backlight/intel_backlight/max_brightness
7812
$ sudo nano /sys/class/backlight/intel_backlight/brightness

この端末の場合、有効な値は07812で、1で最低輝度、0を入力すると画面消灯という挙動をするようです(SSHや外部モニターが使えない環境でやると詰みそう)

xbacklightが動かない

専用のコマンドがあるらしいのでインストールしてみましたが、上手く動きませんでした。どうして。

$ sudo apt install xbacklight
(省略)

$ xbacklight -get
RANDR Query Version returned error -1

面倒くさいので関数を定義した

以下のファイルを編集してエイリアスや関数が定義できるとのことだったので

$ nano ~/.bashrc
.bachrc
(前略)

backlight() {
  echo $1 | sudo tee /sys/class/backlight/intel_backlight/brightness
}

maxbacklight() {
  sudo cat /sys/class/backlight/intel_backlight/max_brightness
}

以下のコマンドで設定ファイルを読み込み直せば、すぐに使えるようになります。

$ source ~/.bashrc

maxbacklight:最大輝度の値を表示
backlight x:輝度を直接指定

$ maxbacklight
7812
$ backlight 500
500
$ backlight 7000
7000
$ backlight 1
1

例外処理とかを全く入れていないので操作をミスったりすると詰みそうですが(おい)
テキストエディタで書き換えるより圧倒的に楽なので、一旦はこれでいいや……

参考

https://wiki.archlinux.jp/index.php/バックライト
https://qiita.com/belion_freee/items/528ff57b920d559abf3d

キノ🍀キノ🍀

再起動後にパスワードの入力が面倒くさい

まあ使い古しのタブレットなのでフリーズすることもあります。時々。
そんな時、SSHさえ生きているなら何も考えずに

sudo systemctl reboot

するわけですが。このあとユーザー名のパスワードの入力を求められるので物凄く面倒くさいです。

流石にオートログインの手段が用意されているようで、以下のファイルを編集します。

sudo nano /etc/lightdm/lightdm.conf
/etc/lightdm/lightdm.conf
#autologin-user=

という部分を

autologin-user=ユーザー名

に書き換えれば良いらしい。普通にログイン画面をバイパス出来てしまって感動した。

参考

https://qo-op.cyou/blog/archives/2019_7_10_184.html

キノ🍀キノ🍀

今更ながらゲーミングPC側をSunshineに乗り換えてみた

GeForce Experience から SHIELD の GAMESTREAM を無効にしまして。

Windows Terminal
PS C:\Users\Akeyroid7> winget install LizardByte.Sunshine
見つかりました Sunshine [LizardByte.Sunshine] バージョン 0.23.1
このアプリケーションは所有者からライセンス供与されます。
Microsoft はサードパーティのパッケージに対して責任を負わず、ライセンスも付与しません。
ダウンロード中 https://github.com/LizardByte/Sunshine/releases/download/v0.23.1/sunshine-windows-installer.exe
  ██████████████████████████████  11.0 MB / 11.0 MB
インストーラーハッシュが正常に検証されました
パッケージのインストールを開始しています...
インストールが完了しました
PS C:\Users\Akeyroid7>

通知領域(通称タスクトレイ)にアイコンが出現するので、クリックしてWebGUIを開き、管理画面のパスワードを設定。
あとはIPアドレスでサーバーを再追加して、適当にPINで再ペアリングすればOK。

NVIDIA標準と比較した場合のメリットとしては、SteamのBig Pictureを起動せずに普通にリモートデスクトップアプリとして使えること。うん、全然こっちのほうが良い。