📌

DisplayLinkを使ってKiosk端末を作ってみた

に公開

はじめに(あらすじ)

DisplayLinkって知っていますか?

みなさまDisplayLinkってご存じでしょうか。
PCのCPUやGPUでエンコードして、映像を圧縮してUSBで流し込み、それをディスプレイ出力する仕組みを持った技術のことです。
Apple silliconなMacが世の中に出た時、おそらくSoCの仕様で出力できるVGAデバイスの数に制限があり、これを回避するのにDisplayLinkが脚光を浴びましたよね。
参考: M1 Macで外部ディスプレイを横方向1枚+縦方向1枚で使えるのか試してみた(DisplayLink接続) - DeveloppersIO

僕も、1枚しか外部出力できないのは困るため、DisplayLinkを搭載したUSBハブをメルカリで購入しました。
ただ、最近のM4からは、SoCの仕様が変わり、出力できる合計VGAデバイスが増えました。
参考: Apple公式

そのため、使い道がなくなったかわいそうなDisplayLinkちゃんを、なんとか有効活用してあげようというのが今回のあらすじであり背景です。

我が家のインフラ資産

我が家には、仮想化基盤としてProxmoxVEがございまして、それぞれ以下のスペックになっています。

  • Ryzen 5 5600X
    • KVM出力用GPU: GT1030 (うろ覚え)
  • Ryzen 9 5950X
    • KVM出力用GPU: GT710 (うろ覚え)
    • 所用で使うGPU: GT1030

CPUにGPUが内蔵されていないため、このようにGPUカードを刺しているのですが、これ以上挿しちゃうと、PCI-Eスロットが埋まるのでなるべくやりたくないところです。

また、実はこのほかにも吊るしで買ったJ4125なminiPCがあり、雑にProxmoxVEを入れ、内臓のIntelのGPUをVMにパススルーし、kiosk端末として使っていました。
どんなものを動かしていたかというと、Magic Mirror²で作ったスマート卓上時計です。
最近はこのkioskなVMから、GCP上にエイヤして立てたMagic Mirror²にtailscaleでアクセスして表示させていました。

[本題] Magic Mirror²のKioskデバイスとして使う

ならば、ろくに画面更新のないMagicMirror²程度なら、VMのCPU演算な貧弱仮想GPU使って軽量なエンコさせてDisplayLinkから映像出してやるでもいいのでは!?
→ 動かすなら仮想化基盤上で動かしちゃえばいいのでは!?
→ でもDisplayLinkをkioskデバイスとして使う人なんてなかなかいないのでPoCしなきゃ…

ということで、本題に入っていきます。

環境

今回の環境は、以下を想定としています。
やっていること自体はほかのディストリでも変わらないと思うのでお好みで。

  • ホスト(Virtualization Environment): Proxmox VE 9.0系
  • ゲスト(VM): Ubuntu server 24.04 LTS

TerraformでVMを作っていますが、VMのスペックや設定についてはスクショを貼っておきます。

手順

  1. 一時的にGPUを追加する。

GUIで設定をすることが多く、仮想化基盤側の仮想KVMを使って設定をしたほうが楽なためです。
あと、CPUやメモリもこのタイミングでそこそこに一時的に増やしておいたほうがいいです。

また、タイムゾーンの設定もしておきましょう。

sudo timedatectl set-timezone 'Asia/Tokyo'
date
Sun Nov 23 01:29:25 JST 2025 JSTになっている。
  1. GUIの設定

うちのサーバは、VGAの表示に対してGUIを使うことはほぼないので、minimalな状態のサーバテンプレートをもとに、リンククローンでサーバを作っています。
このため、GUIを用意しないといけません。ただ、余計なものはなるべく入れたくないので、なるべく最小にしています。

※firefoxは ubuntu-desktop-minimal で勝手についてくるので明示的にインストールしていません。Chrome使いたいとかあればここでお好みで入れましょう。

sudo apt install ubuntu-desktop-minimal -y
sudo apt purge libreoffice* thunderbird* -y
sudo apt -y autoremove
sudo apt autoclean
  1. DisplayLinkドライバインストール

GUI上のTerminalから実行します。SSHからだとディスプレイを検出しないためです。

git clone https://github.com/AdnanHodzic/displaylink-debian.git
cd displaylink-debian
sudo ./displaylink-debian.sh

Installを選んで、基本的にすべて Y 指定で大丈夫です。
最後まで処理が終わると、再起動が行われます。

  1. X11の設定を変更 /etc/X11/xorg.conf.d/20-displaylink.conf

既存の設定をコメントアウトないしバックアップし、設定を入れます。

以下はGitHubのコメントをベースにした設定です。

Section "Device"
    Identifier  "DisplayLink"
    Driver      "modesetting"
    Option      "PageFlip" "false"
EndSection
  1. 再起動する

  2. DisplayLinkのドライバ認識を確認 (GUI上のTerminalで実施)

cd displaylink-debian
sudo ./displaylink-debian.sh --debug

---------------- DisplayLink info ----------------

Driver version: 5.1.26
DisplayLink service status: up and running
EVDI service version: 1.6.0
  1. ディスプレイプロバイダーの認識を確認 (GUI上のTerminalで実施)

1~4のものがDisplayLinkのプロバイダーになります。

xrandr --listproviders
Providers: number : 5
Provider 0: id: 0x44 cap: 0x9, Source Output, Sink Offload crtcs: 3 outputs: 2 associated providers: 0 name:Intel
Provider 1: id: 0x138 cap: 0x2, Sink Output crtcs: 1 outputs: 1 associated providers: 0 name:modesetting
Provider 2: id: 0x116 cap: 0x2, Sink Output crtcs: 1 outputs: 1 associated providers: 0 name:modesetting
Provider 3: id: 0xf4 cap: 0x2, Sink Output crtcs: 1 outputs: 1 associated providers: 0 name:modesetting
Provider 4: id: 0xd2 cap: 0x2, Sink Output crtcs: 1 outputs: 1 associated providers: 0 name:modesetting
  1. (all in one構成にしたい場合) kioskに表示させたいアプリケーションを設定する

このkioskなVMでアプリケーションを動かしたい! (Firefoxからは localhost でアクセスしたい)場合は、設定しておきましょう。
僕はDockerを使ってMagicMirror²を用意するようにしているので、Dockerとかもろもろ設定してall in one構成想定でアプリケーションを起動しました。

  1. ログインをパスワードレスにする

Settings→System→Users→Unlock→Automatic Loginを有効にします。

  1. kiosk向けの設定をする
sudo apt install gnome-kiosk gnome-kiosk-script-session -y
mkdir -p ~/.local/bin
cat > ~/.local/bin/gnome-kiosk-script
/usr/bin/firefox --kiosk --private-window --new-instance http://localhost:8080 # アクセスさせたいURLなどに置き換えてください
chmod +x ~/.local/bin/gnome-kiosk-script
  1. ログインをkiosk向けにする

10-1. スリープを無効化

Settings→Power→Power Savingを 5 minutes からNeverにします。

Privacy & SecurityのScreen Lockも設定します。基本全部無効化でいいと思います。

sudo vim /usr/share/X11/xorg.conf.d/10-monitor.conf して以下の設定を入れましょう。

Section "ServerFlags"
    Option "StandbyTime" "0"
    Option "SuspendTime" "0"
    Option "OffTime"     "0"
    Option "BlankTime"   "0"
EndSection

10-2. ログイン設定を変更

一度ユーザーセッションをログアウトし、ログイン画面にします。
右下の歯車からログインを Kiosk Script Session (X11 Display Server) に変更して、Passwordを入れてログインします。

  1. kioskモードでアプリケーションが立ち上がることを確認

Firefoxがうまくページを開いてくれることを確認したらOKです。

  1. 仮想KVMを使わない状態に戻して再起動

ここまで、仮想KVM上で多く作業していましたが、いよいよディスプレイに出力します。
再起動してしばらくすると、先ほどまで仮想KVMで表示されていた画面が、DisplayLinkで接続されているディスプレイに出力されるはずです。

ここで、10分ちょっとくらい経っても画面が消えないことも確認しておくといいでしょう。

Tips

/etc/gdm3/custom.conf の、 AutomaticLoginEnable をFalseにして再起動すると、ログイン画面が表示されるようになります。

あとから仮想KVM上でなにかしたいときとかに、一時的にこの設定にし、仮想KVMで操作するときに便利です。

やってみて

アイドル現場やバンドの現場に行ってライブを楽しむのが趣味なのですが、ちょうど昨日、ライブと物販/特典会の待ち時間ができたので、その隙に設定もろもろやりましたw
基本的な検証は、仮想KVM上で実施すればいいので、k8sノード上で動かしているtailscale subnet router経由で操作してました。こういうのが設定してあると、今回みたいに暇にならず便利なんですよね。
家に帰ってきて、ディスプレイにちゃんとMagicMirror²が写っていてやった~ってなりました✌
作った後に気が付いたんですが、Ubuntu Frameなるものがあるらしいですね。 こっち使うほうがよかったのでは

プチIoTというかエンジニアリングによるライフハック、結構楽しいので皆さんもぜひやってみませんか~
あまりものでうまく作れた時の達成感はたまらないですよ~!

キモいポイント

またキモいものを作ってしまった…
(displaylinkがProxmoxVEで割り当てられているw)(こんなへんてこなことやってるのどこ探しても多分僕くらいだと思いますw)

クラウド上にNASOSをセットアップしてタダで200GBのクラウドNASを手に入れたり、プライベートでEntraIDやMDMがあったり、人と違った気持ち悪いことをするのが好きなのでいろいろやっています。

Discussion