最新安定版Debian 12.7 + LXDEで超軽量Moonlightシンクラを作ってみる
このスクラップについて
調べて分かったことを後で振り返るための個人用メモです
作業後にやったことを思い出しながら書いているので記入漏れがあるかもしれません
書きたいと思ったことを書きたいだけ書いているので煩雑だと思います。すみません。
Moonlightについて
Moonlightというゲームストリーミング(リモートプレイ、リモートデスクトップ)アプリケーションがあります。
これ自体は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日リリース)でした。
Debian 12のインストーラーでは、デスクトップ環境を
- GNOME
- xfce
- GNOME Flashback
- KDE Plasma
- Cinnamon
- MATE
- LXDE
- LXQT
の中から選ぶことが出来ます。
今回導入予定のPCはスペックが難アリなので、とことん軽量なものを導入します。使用感は二の次です。私はLinux初心者ですが何とかなるでしょう。
LXQtの前身であるLXDEですが、何故かアプデが続いていて、xfceやKDE、LXQtよりも軽いとの噂を聞いたので、一旦これを使ってみて、それから考えることにします。
VMでの動作確認
ISOイメージを拾ってきて、Hyper-Vの仮想マシンに展開します。
debian-12.7.0-amd64-netinst.iso
仮想マシンの設定は第2世代(UEFI)としたので、確認としては不十分ですが動作確認には64bit版のイメージを使用しました。
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を用意する必要はありません。オススメです。
実機でのOSイメージ展開
WindowsUpdateは非常に優秀です。どれほど優秀かと言えば、ノートパソコンに入っていたWindowsのSSDを、そのままデスクトップPCに繋ぐだけで必要なドライバを勝手に当て直して問題なく動作してしまうほどです。
この点、Linuxには真似できないと思います。マイナーなデバイスだとLinux用のドライバが端から存在しないなんてことも有り得そうです。
しかし、私の不安を他所に、殆どのデバイスドライバは自動で適用されました。使用したISOイメージはnetinst版(必要なデータをインターネット上から拾ってくるタイプ)ですが、インストーラー上で問題なくWi-Fiカードを認識して無事にセットアップを完了できました。何故かマウスが動きませんが、タッチパネルが効きます。
SDカードへのインストールは出来ませんでした
丁度256GBのmicroSDを余らせていたので、一旦パンパンなCドライブを放置して、microSDへのインストールを試みました。インストーラー上ではeMMC同様に問題なく認識していて、インストール先として選択できるようになっていますが……これは罠です。
インストールが完了しても、普通にWin8.1が起動してしまいます。おやおや……?
この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同様に利用できます。
参考
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できるようになっています。
参考
一連の流れを分かりやすく解説している記事がありました。
余談: RHEL系の場合
sudoが実行できるグループの名前がデフォルトではwheelに設定されているようです。
usermod --aG wheel <username>
今後、AlmaLinuxを使ってみたいと思っているので、覚えておきます。
[不要かも]一部のコマンドで名前解決が出来ない?
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で保存。
保存したアイコンをダブルクリックで実行確認のダイアログが出ます。
参考
Z3795でスペックは問題なさそう
軽くPCのブラウザ画面を映してみましたが、サクサクでした。Moonlight自体が軽いので、デスクトップ環境の軽さがパフォーマンスに直結するみたいです。Win8.1で動かしてたリモートデスクトップアプリとは比べ物にならん。
Ctrl+Alt+Shift+Qで接続を終了できます。
画面の明るさ調整方法の確認
さっきまでの作業は画面の明るさ100%で進めていましたが……
xrandr
xrandr --output eDP-1 --brightness 0.5
というコマンドで変更自体は出来るみたいです。自動実行に関しては……後で何とかします。
参考
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
が必要です。これも後で何とかします。
参考
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
参考
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、お前は何なんだ。
参考
Bluetoothを使用可能な状態にする
いつまでもUSBハブを繋げておくと邪魔なので、とっととBluetoothキーボードを繋げてしまいたい。
Bluetoothの管理コマンドは、最初からbluetoothctl
というものが利用できました。
systemctl status bluetooth
の実行結果を見ると、いくつかエラーが出ていたので、なんとか解決します。
sap-server: Operation not permitted (1)
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
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
Bluetoothのrfkillにはbluemanが効くらしい
以外のコマンドを実行すると、LXDEのタスクバーにBluetoothのアイコンが出現します。
sudo apt install blueman
blueman-manager
GUIでBluetoothのペアリングが実行できます。
(まだ上手く動いていませんが、ハードウェアが壊れ掛けな疑いもあるので、今のところ何とも言えない)
このbluemanですが、Bluetoothを再起動後に自動で有効化する機能があります。
これによって再起動後にsudo rfkill unblock all
を実行せずともBluetoothは利用できるようになりました。Wi-Fiは依然としてblockされたままです。どうして。
参考
無線を殺すrfkillを絶対殺すman
準備中
Bluetoothの不具合はハードウェア都合かもしれない
準備中
垂直同期は出来るけれどしない方が良いかも
準備中
明るさの変更方法、間違ってた
xrandr
コマンドを用いた明るさの調整ですが、どうやらこれはバックライトではなくソフトウェア的に画面の黒っぽさを変更しているだけだった模様……
調べを進めてみると「特定のテキストファイルを書き換える」という方法で物理的なバックライトの明るさを変更できることが確認できました。
$ 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
この端末の場合、有効な値は0
~7812
で、1
で最低輝度、0
を入力すると画面消灯という挙動をするようです(SSHや外部モニターが使えない環境でやると詰みそう)
xbacklightが動かない
専用のコマンドがあるらしいのでインストールしてみましたが、上手く動きませんでした。どうして。
$ sudo apt install xbacklight
(省略)
$ xbacklight -get
RANDR Query Version returned error -1
面倒くさいので関数を定義した
以下のファイルを編集してエイリアスや関数が定義できるとのことだったので
$ nano ~/.bashrc
(前略)
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
例外処理とかを全く入れていないので操作をミスったりすると詰みそうですが(おい)
テキストエディタで書き換えるより圧倒的に楽なので、一旦はこれでいいや……
参考
再起動後にパスワードの入力が面倒くさい
まあ使い古しのタブレットなのでフリーズすることもあります。時々。
そんな時、SSHさえ生きているなら何も考えずに
sudo systemctl reboot
するわけですが。このあとユーザー名のパスワードの入力を求められるので物凄く面倒くさいです。
流石にオートログインの手段が用意されているようで、以下のファイルを編集します。
sudo nano /etc/lightdm/lightdm.conf
#autologin-user=
という部分を
autologin-user=ユーザー名
に書き換えれば良いらしい。普通にログイン画面をバイパス出来てしまって感動した。
参考
今更ながらゲーミングPC側をSunshineに乗り換えてみた
GeForce Experience から SHIELD の GAMESTREAM を無効にしまして。
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を起動せずに普通にリモートデスクトップアプリとして使えること。うん、全然こっちのほうが良い。
カーネルパニックが起きると辛い
「電源ボタン陥没してるけど、フリーズしたらSSH経由でrebootすれば良いや」なんて適当も極まりない考えで運用していたタブレットですが、結局のところはpingすらも通らない状態になることも多々ありました。
これは恐らく「ハードウェアフリーズ」というか、Unix的な言い回しだと「カーネルパニック」と呼ばれる状態のような気がします。
以下のコマンドで意図的にカーネルパニックが起こせるようです。sudoではなくrootアカウントへの切り換えが必要でした。
su
echo c > /proc/sysrq-trigger
このDebian(LXDE)環境で試した限り、WindowsのBSoDみたいなエラーメッセージが表示されたり……とかではなく、その瞬間の状態のまま画面が固まるという挙動をするっぽい。放置中のフリーズはまんまこれです。
陥没してマトモに押せなくなった電源ボタンは外してしまったので、その度にマイナスドライバーを突っ込んで基板上の小さなスイッチを頑張って押すことになるわけですが、正直めちゃくちゃ疲れるのでやりたくないです。あと何度もグリグリやってると電源スイッチ自体がダメになりそう。
面倒なので無かったことにする
まあ、ぶっちゃけMoonlightだけ使えれば困らないので、この際フリーズしても自動で再起動するならヨシとします。
sudo nano /etc/sysctl.d/local.conf
kernel.panic = 1
保存しただけでは反映されません。念の為に再起動してから手動パニックを起こしてみると、一瞬だけ固まって再起動という動きをしました。狙い通りです。ちなみにkernel.panic = 10
とすると10秒間はフリーズしたまま再起動せずに待つという挙動になるようです。
一旦はコレで様子見。
あまりに酷いようならカーネルダンプ取ることも考える……
参考