在辦公室或學校教室中使用「雙螢幕」工作對我來說已是日常標配,但常處於行動狀態拿著筆電工作的我,就也很想利用手頭現有平板來達到雙螢幕工作。而本次實作讓我可以達到我所想要的效果:「跨平台」,「延伸螢幕」,以及「螢幕複製」。
感謝:本次實作係參考「把平板、手機作爲電腦第二屏幕(Linux系統下)」一文,實作而來。
本實作的概念圖如下:
要處理的問題有三部份,這三部份可以分別被更好的機制替換,以形成更佳的系統:
- 虛擬顯示卡的構建(這是最基礎也是目前最煩人部份)
- 配置與管理虛擬顯示器
- 連線部份
正文開始
- 虛擬顯示卡與虛擬顯示器的構建
- 安裝:xserver-xorg-video-dummy
- 在 /usr/share/X11/xorg.conf.d/ 目錄底下:
- 配置與管理虛擬顯示器
- 使用 cvt 來偵測平板螢幕解析度的配置值
- 使用 xrandr 來新增與配置平板螢幕解析度的設定值給虛擬顯示器
- 使用 xrandr 來將新增的平板螢幕解析度選項套用並啟用虛擬顯示器
- 連接部份
- 安裝 「x11vnc」與相關程式(套件)
- 安裝完成後便可以啟動:
- -nowf : 在移動窗口到虛擬屏幕時顯示內容,否則會顯示爲一個框。
- -listen : 可以指定 client 連接上的ip, 0.0.0.0 則表示任何機器都可以連上。
- -nopw: 不使用密碼
- -forever: 沒有這個參數的話,會在第一個使用者離線後,就停止 x11vnc程式
- -wait 1 : 是螢幕更新的時間間隔,預設值為 20毫秒,這樣視覺效果會比較頓,設置爲 1 的話,就會盡可能降低螢幕更新時間,以減少延遲。
- -defer 1 : vnc 向 client 端更新訊息的時間間隔,預設值為 20毫秒,設置爲 1 的話,就會盡可能縮短更新訊息時間,這樣比較會有即時感,但對網路頻寬要求會比較高。
- -sb 0 : 設定休眠時間,預設值爲 60秒。也就是螢幕若 60 秒內沒有活動的話,就會停止訊息封包的傳送,這樣會導致滑鼠游標從主要螢幕移動到延伸螢幕時有時會卡頓,設定爲 0 後,就不會休眠了。
- -clip xinerama1 :設定 x11vnc 對應螢幕的範圍。
- 平板(手機)等只要使用 vncviewer 來連接便可。
- 若平板(手機)為 android ,可以利用 adb 機制,透過 USB 線來進行連接
因為要接上顯示器(螢幕),才能有訊號輸出。所以要模擬出有顯卡,並模擬已接上螢幕,讓螢幕訊號可以往那邊跑。
目前而言,僅有 Intel 顯卡晶片組有內建提供模擬虛擬顯示卡功能,所以機器只要是使用 intel 顯卡,只要 (1)將底下設定值,寫成類似 20-intel.conf (可自訂檔名), (2)放入 /usr/share/X11/xorg.conf.d/ 目錄底下, (3)重新啟動 X11,便可以生效!
對於重新啟動X11,很多文件都會建議重新開機,而我試過最快的方法便是只要「登出並重新登入」便可。
Section "Device" Identifier "intelgpu0" Driver "intel" Option "VirtualHeads" "1" EndSection
Option “VirtualHeads” “1” ,是指只要啟動一個虛擬顯示卡。若想多啟動,自己更改數字便可。
若不是使用 intel 顯卡的機器,很多文件都建議使用「dummy」作法來虛擬顯示卡:
Section "Device" Identifier "virtual_Video_Device" Driver "dummy" EndSection
若是使用如此設定,在重新啟動 X11 之後,螢幕便會一片黑暗,因為那是虛擬顯示卡,所以沒有任何訊號會在螢幕上顯示出來。所以我放棄這種作法。
此外,我想到也許可以拿目前挖虛擬貨幣時的礦機常會使用「虛擬顯卡」來試試,理論上可行,但實際上不知。
(圖片來源:蝦皮購物–熱賣現貨24H急速 挖礦專用 遊戲專用 HDMI虛擬顯示器假負載 顯示卡欺騙器 HDMI假負載,連結:https://shopee.tw/%E7%86%B1%E8%B3%A3%E7%8F%BE%E8%B2%A824H%E6%80%A5%E9%80%9F-%E6%8C%96%E7%A4%A6%E5%B0%88%E7%94%A8-%E9%81%8A%E6%88%B2%E5%B0%88%E7%94%A8-HDMI%E8%99%9B%E6%93%AC%E9%A1%AF%E7%A4%BA%E5%99%A8%E5%81%87%E8%B2%A0%E8%BC%89-%E9%A1%AF%E7%A4%BA%E5%8D%A1%E6%AC%BA%E9%A8%99%E5%99%A8-HDMI%E5%81%87%E8%B2%A0%E8%BC%89-i.29704105.586551735)
連接上虛擬顯示卡與虛擬顯示器後,利用 cvt 和 xrandr 來配置與管理虛擬顯示器的解析度
這裡用目前這部筆電螢幕作為例子:
cvt 1920 1080 60
結果:
Modeline “1920x1080_60.00” 173.00 1920 2048 2248 2576 1080 1083 1088 1120 -hsync +vsync
解說:
60 為 螢幕更新率,預設為 60,可省略不寫。
平板螢幕的寬與長與螢幕更新率,要依據實際機器來做決定。
##先將剛剛偵測到的值,新增為一個解析度選項組
xrandr –newmode “1920x1080_pad” 173.00 1920 2048 2248 2576 1080 1083 1088 1120 -hsync +vsync
##再將此解析度選項組新增到 虛擬顯示器 的可用解析度選項中
xrandr –addmode VIRTUAL1 “1920x1080_pad”
##再將此解析度選項組套用到 虛擬顯示器 成為目前的解析度
xrandr –output VIRTUAL1 –mode “1920x1080_pad”
要套用與啟用虛擬顯示器的話,螢幕預設值是會從座標「0,0」開始,這樣便會與原螢幕重疊,所以先想一下虛擬顯示器(平板)擺放的位置,是要讓平板成為「延伸螢幕」,或是成為原螢幕的影分身:
##若要成為「延伸螢幕」,並放置到原螢幕的右邊(此部筆電原螢幕顯卡的代號為 eDP1)
xrandr –output VIRTUAL1 –right-of eDP1 –auto
##若要成為「原螢幕的影分身」(此部筆電原螢幕顯卡的代號為 eDP1)
xrandr –output VIRTUAL1 –same-as eDP1 –auto
此步驟可以利用工具程式來幫忙,若是使用 KDE 者,目前已經和系統設定無縫整合,十分方便。
設置虛擬顯示器之後,接下來便是利用 VNC ,讓平板(手機)等可連上網設備連接,並將虛擬顯示器部份對映過去。這裡選擇使用「x11vnc」。
x11vnc -nowf -listen 0.0.0.0 -nopw -forever -wait 1 -defer 1 -sb 0 -clip xinerama1
可以使用 -clip WxH+X+Y 來手動設定對應範圍。
也可以使用 -clip xinerama0 來自動對應顯示器,其中 xinerama0 爲從螢幕中從左往右數第一個顯示器,以此類推 xinerama1 爲第二個,所以主螢幕在左邊,虛擬延伸螢幕在右邊。
那如果設定爲 xinerama0 就會將主螢幕的顯示內容複製到虛擬螢幕上,也就是兩個螢幕的內容會一樣。
此原理為利用設定 adb 的反向連接,讓原本要走無線網路的封包,改走 adb 通道。這樣訊號應該會又快又穩,在無線網路不穩定的環境中,應該能發揮出更好功用。
指令: adb reverse tcp:5900 tcp:5900
解說:
此處前面的 tcp:5900 是指連接遠端機器的埠號。後面的 tcp:5900 指的是平板(手機)所對應的埠。
而此時若連接平板(手機)的 5900 的埠,便會主動連往遠端的 5900 埠。
今天若遠方 vnc 機器所對應的埠號若為 6000,那麼指令便需更改為:adb reverse tcp:6000 tcp:5900 , 而 vnc 連接的機器便需要更改為 localhost:6000 。
參考資料
- 把平板、手機作爲電腦第二屏幕(Linux系統下)
- HDMI虛擬顯示器
- adb命令-adb reverse的研究
https://www.twblogs.net/a/5eea9bb2264079afec94ce37