Desktopでは便利だということがわかったのだけど、普通はLite版を使うので、あんまり便利さを享受できない。ひょっとしたら、コンソールでも使えないかなと思って試してみることにした。

さすがに、これはすんなり行かないだろうと、方針を下調べ。だいたい、こんなところかな。
1. cmdline.txtにfbcon=map:1:0を追記
2. agettyサービスを作る
3. con2fbmapで仮想コンソールをfbに切り替え
何にもしなくてもコンソールが出てくれるといいな...
Desktopでは、DisplayLink単体時は、/dev/fb0で認識していたので、おそらくLite版でも起動順に認識するものと思われる。HDMIもfbとして認識するので、fb0はHDMIになり、後からDisplayLinkが認識されるとfb1になるものと思われる。
いずれにせよなんらかの設定を後で行う必要がありそう。それはそれで面倒ではある。
1. cmdline.txtにfbcon=map:1:0を追記
起動時のコンソールをフレームバッファコンソールに指定してやる。
具体的には、cmdline.txtにfbcon=map:1:0を追記して再起動する。
「仮想コンソール1 (tty1) を、フレームバッファ0 (/dev/fb0) にマッピングして切り替えるという感じ。tty1はログイン用のユーザーコンソール。これをfb0に割り当てする。
この方法であれば、起動前にSD書き込みを行なったOSから設定の変更ができる。
ただ、HDMIが接続されていると、tty1はそちらに拘束されてしまう。またデバイスの認識順序でデバイス割り当て番号が変わることがあるので汎用的ではなかったりする。
2. agettyサービスを作る
DisplayLinkディスプレイ用のagettyサービスを作成する。
$ sudo vi /etc/systemd/system/getty-fb0.service
[Unit]
Description=Getty on fb0
Documentation=man:agetty(8) man:systemd-getty-generator(8)
After=systemd-user-sessions.service plymouth-quit-wait.service getty-pre.target
After=rc-local.service
[Service]
ExecStart=-/sbin/agetty --noclear %I 115200 linux
Type=idle
Restart=always
RestartSec=0
UtmpIdentifier=%I
TTYPath=/dev/tty1
TTYReset=yes
TTYVHangup=yes
TTYVTDisallocate=yes
KillMode=process
IgnoreSIGPIPE=no
SendSIGHUP=yes
[Install]
WantedBy=getty.target
agettyの --noclear オプションは、切り替え時にコンソールをクリアしないようにする設定。
作成したサービスを有効にして起動する。
$ sudo systemctl enable getty-fb0.service
$ sudo systemctl start getty-fb0.service
この方法もデバイス番号の動的変更の影響を受ける。スクリプトで作成されたfbデバイスを判定して動的に変更してやらないといけない。udevをトリガーにgettyの設定を行うようにサービス起動するのが賢明かな。この方法が妥当ではあるのだけど、一旦は起動して設定を書き込む必要があるのが面倒ではある。
ここでは予備調査なのであまり突っ込まない。
3. con2fbmapで仮想コンソールをfbに切り替え
con2fbmapというツールを使って、「既存のメインコンソール(tty1)の出力先を、オンボードHDMIからDisplayLinkディスプレイ(fb0)に切り替える」という方法。
con2fbmapは、Linuxの 仮想コンソール(tty1〜tty6など)とフレームバッファデバイス(/dev/fb0, fb1…) の対応を切り替えるためのユーティリティ。
con2fbmap を使うと、特定の仮想コンソールの描画先を別のフレームバッファに変更できる。簡単に言うと、「このコンソールの出力をこっちの画面に映せ」と命令するツール。
con2fbmap は単純に描画先を切り替えるだけで、ドライバや解像度設定は変更しない。つまり、指定したフレームバッファが存在しない場合や、対応していないデバイスだと何も映らない。
この方法も、残念ながら起動したあとの操作が必要になるので面倒ではある。
con2fbmapはfbsetというパッケージに含まれているツール。追加インストールがいるかもしれない。(fbsetはデフォルトでインストール済みであった)
$ sudo apt install fbset
現在のマッピングを確認する。
$ con2fbmap <コンソール番号>
Raspberry Pi では /dev/fb0 が通常HDMI、/dev/fb1 が SPIディスプレイやUSBディスプレイ(udlfb)になります。
コンソールをDisplayLinkに割り当てる。
$ con2fbmap <コンソール番号> <フレームバッファ番号>
$ sudo con2fbmap 1 1
第1引数:コンソール番号(Ctrl+Alt+F1なら1)
第2引数:フレームバッファ番号(/dev/fb1なら1)
起動時に自動でDisplayLinkにコンソールを出したい場合は /etc/rc.local に以下を追記する。
modprobe udlfb
con2fbmap 1 1
なんかスマートじゃないね...
実際に試す
Lite版を焼いて、HDMIを接続せずに起動する。
この場合、HDMIに何も接続されていない状態で起動しているので、ビデオ出力自体が無効化されて起動する。そのため、OSが起動した後にHDMIケーブルを接続しても、ディスプレイは信号を認識せず、画面は真っ暗なまま(No Signal)になる。
DisplayLinkディスプレイを接続する。
ふつーにコンソール出るじゃん... ちゃんとしててつまらないw

HDMIが有効で起動された場合にも試してみたけれど、その場合は、このようなコンソール表示は起きてこない。画面はブラックアウトのまま。それはそれでデバッグ時なんかに困るな...
つまり、デフォルトの設定で、HDMIを接続している場合は、DisplayLinkを接続してもコンソールは出ない。HDMIを接続していないと、DisplayLink後刺しでもコンソールが出る。
チーン! この項目は終了!
いえ、まだ続きます。
オリジナル投稿:
USBディスプレイがデフォで使える? -3-|kinneko|pixivFANBOX
https://kinneko.fanbox.cc/posts/10376400



