Create a virtual monitor or display on Linux with xrandr.
注意:本文討論的內容僅支援X11環境,不支援Wayland。
Ivon將在這篇文章討論如何給Linux做個虛擬顯示器,好讓遠端桌面軟體擷取該顯示器的畫面,達成用另一台裝置當做Linux無線延伸桌面的效果。
1. 問題點#
在研究 Moonlight平板當作電腦第二螢幕的時候,我發現Linux沒有一個萬用的做法,能夠生出第二個虛擬顯示器(virtual monitor)。
最簡單的方式是買個HDMI欺騙器,但如果不想花錢呢?
網路資料很多人說使用xrandr指令,並且只要寫個X.org設定檔標註VirtualHeads
就能軟體模擬一個虛擬顯示器出來,但是只有Intel GPU支援這種模擬方式,Nvidia GPU要用其他方式繞過。還有,Intel的這個驅動過時了,需要modesetting核心參數才能用。。
另一種方式是讓xrandr使用未插上顯示器的視訊孔輸出,再利用xrandr --output
指令強制啟用螢幕。可這個的運作條件是電腦必須有二個以上的視訊輸出孔,且處於閒置狀態才能讓xrandr控制。如果電腦只有一個CPU內顯,就沒有額外的孔能給xrandr利用了。
最後一種方式是依賴桌面環境實作,這個更不可靠,GNOME有 RDP Screen Share Mode,KDE則是 krfb-virtualmonitor,那麼其他桌面環境該怎麼辦呢?
為了解決以上問題,我採用xrandr搭配EVDI的做法。
EVDI (Extensible Virtual Display Interface) 是專為Synaptics DisplayLink設計的開源專案,但我們不是要它的DisplayLink功能,而是生成一個虛擬顯示器的功能。EVDI提供一個讓userspace管理的介面,載入核心模組後,Linux就會多出一個dummy能讓xrandr控制輸出畫面,這樣就彷彿有兩個顯示器了。
如果覺得裝EVDI太麻煩,下面設定EVDI的xrandr指令也適用其他閒置的顯示器,只要把EVDI的DVI-*
顯示器名稱換掉就好了。
2. 安裝EVDI核心模組#
- Ubuntu可從套件庫安裝DKMS核心模組:
sudo apt install evdi-dkms
Arch Liunx從AUR安裝
yay -S evdi
- 設定開機自動載入EVDI核心模組,生出一個虛擬顯示器
echo "evdi options initial_device_count=1" | sudo tee -a /etc/modprobe.d/local-evdi.conf
電腦重開機
檢查核心模組是否有載入,若無,手動載入
sudo lsmod | grep evdi
sudo modprobe evdi options initial_device_count=1
3. 設定虛擬顯示器#
- 用xrandr指令,列出可用顯示器
xrandr -q
- 例如我的主顯示器是
eDP-1
,而EVDI生成的顯示器應該都是DVI-*
開頭
Screen 0: minimum 320 x 200, current 1920 x 1080, maximum 16384 x 16384
eDP-1 connected primary 1920x1080+0+0 (normal left inverted right x axis y axis) 344mm x 193mm
DVI-I-1-1 disconnected (normal left inverted right x axis y axis)
- 設定解析度
xrandr --addmode DVI-I-1-1 "1920x1080"
- 設定DVI顯示器,使其位於eDP顯示器的右邊
xrandr --output DVI-I-1-1 --mode 1920x1080 --right-of eDP-1
- 這樣就有二個顯示器了,用
xrandr -q
指令確認
Screen 0: minimum 320 x 200, current 3840 x 1080, maximum 16384 x 16384
eDP-1 connected primary 1920x1080+0+0 (normal left inverted right x axis y axis) 344mm x 193mm
DVI-I-1-1 disconnected 1920x1080+1920+0 (normal left inverted right x axis y axis) 0mm x 0mm
1920x1080 60.01*
1920x1080 (0x46) 152.840MHz -HSync -VSync
h: width 1920 start 2000 end 2054 total 2250 skew 0 clock 67.93KHz
v: height 1080 start 1086 end 1094 total 1132 clock 60.01Hz
- 實測KDE X11下,EVDI生成的螢幕是黑色背景的,沒有任何桌布,不過確實能把視窗拖曳過去。此外EVDI螢幕使用的時候KDE滑鼠會有點閃爍。
4. 測試軟體能否擷取到EVDI的虛擬顯示器#
Weylus:可
x11VNC:可
Sunshine:可,指定顯示器編號就行