運用「虛擬顯示器」概念並結合 x11vnc 服務,讓平板(手機)甚至可連上網設備,成為第二個螢幕(Linux系統下)

在辦公室或學校教室中使用「雙螢幕」工作對我來說已是日常標配,但常處於行動狀態拿著筆電工作的我,就也很想利用手頭現有平板來達到雙螢幕工作。而本次實作讓我可以達到我所想要的效果:「跨平台」,「延伸螢幕」,以及「螢幕複製」。

感謝:本次實作係參考「把平板、手機作爲電腦第二屏幕(Linux系統下)」一文,實作而來。

本實作的概念圖如下:

要處理的問題有三部份,這三部份可以分別被更好的機制替換,以形成更佳的系統:

  1. 虛擬顯示卡的構建(這是最基礎也是目前最煩人部份)
  2. 配置與管理虛擬顯示器
  3. 連線部份

 

正文開始

  1. 虛擬顯示卡與虛擬顯示器的構建
  2. 因為要接上顯示器(螢幕),才能有訊號輸出。所以要模擬出有顯卡,並模擬已接上螢幕,讓螢幕訊號可以往那邊跑。

    目前而言,僅有 Intel 顯卡晶片組有內建提供模擬虛擬顯示卡功能,所以機器只要是使用 intel 顯卡,只要 (1)將底下設定值,寫成類似 20-intel.conf (可自訂檔名), (2)放入 /usr/share/X11/xorg.conf.d/ 目錄底下, (3)重新啟動 X11,便可以生效!

    對於重新啟動X11,很多文件都會建議重新開機,而我試過最快的方法便是只要「登出並重新登入」便可。

    20-intel.conf :

            Section "Device"
             Identifier "intelgpu0"
             Driver "intel"
             Option "VirtualHeads" "1"
            EndSection
                

    Option “VirtualHeads” “1” ,是指只要啟動一個虛擬顯示卡。若想多啟動,自己更改數字便可。

     

    若不是使用 intel 顯卡的機器,很多文件都建議使用「dummy」作法來虛擬顯示卡:

    1. 安裝:xserver-xorg-video-dummy
    2. 在 /usr/share/X11/xorg.conf.d/ 目錄底下:
    3. 20-dummy.conf (可自訂檔名):

              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)

  3. 配置與管理虛擬顯示器
  4. 連接上虛擬顯示卡與虛擬顯示器後,利用 cvt 和 xrandr 來配置與管理虛擬顯示器的解析度

    1. 使用 cvt 來偵測平板螢幕解析度的配置值
    2. 這裡用目前這部筆電螢幕作為例子:
      cvt 1920 1080 60

      結果:
      Modeline “1920x1080_60.00” 173.00 1920 2048 2248 2576 1080 1083 1088 1120 -hsync +vsync

      解說:
      60 為 螢幕更新率,預設為 60,可省略不寫。
      平板螢幕的寬與長與螢幕更新率,要依據實際機器來做決定。

    3. 使用 xrandr 來新增與配置平板螢幕解析度的設定值給虛擬顯示器
    4. ##先將剛剛偵測到的值,新增為一個解析度選項組
      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”

    5. 使用 xrandr 來將新增的平板螢幕解析度選項套用並啟用虛擬顯示器
    6. 要套用與啟用虛擬顯示器的話,螢幕預設值是會從座標「0,0」開始,這樣便會與原螢幕重疊,所以先想一下虛擬顯示器(平板)擺放的位置,是要讓平板成為「延伸螢幕」,或是成為原螢幕的影分身:

      ##若要成為「延伸螢幕」,並放置到原螢幕的右邊(此部筆電原螢幕顯卡的代號為 eDP1)
      xrandr –output VIRTUAL1 –right-of eDP1 –auto

      ##若要成為「原螢幕的影分身」(此部筆電原螢幕顯卡的代號為 eDP1)
      xrandr –output VIRTUAL1 –same-as eDP1 –auto

      此步驟可以利用工具程式來幫忙,若是使用 KDE 者,目前已經和系統設定無縫整合,十分方便。

  5. 連接部份
  6. 設置虛擬顯示器之後,接下來便是利用 VNC ,讓平板(手機)等可連上網設備連接,並將虛擬顯示器部份對映過去。這裡選擇使用「x11vnc」。

    1. 安裝 「x11vnc」與相關程式(套件)
    2. 安裝完成後便可以啟動:
    3. x11vnc -nowf -listen 0.0.0.0 -nopw -forever -wait 1 -defer 1 -sb 0 -clip xinerama1

      參數解說:

      1. -nowf : 在移動窗口到虛擬屏幕時顯示內容,否則會顯示爲一個框。
      2. -listen : 可以指定 client 連接上的ip, 0.0.0.0 則表示任何機器都可以連上。
      3. -nopw: 不使用密碼
      4. -forever: 沒有這個參數的話,會在第一個使用者離線後,就停止 x11vnc程式
      5. -wait 1 : 是螢幕更新的時間間隔,預設值為 20毫秒,這樣視覺效果會比較頓,設置爲 1 的話,就會盡可能降低螢幕更新時間,以減少延遲。
      6. -defer 1 : vnc 向 client 端更新訊息的時間間隔,預設值為 20毫秒,設置爲 1 的話,就會盡可能縮短更新訊息時間,這樣比較會有即時感,但對網路頻寬要求會比較高。
      7. -sb 0 : 設定休眠時間,預設值爲 60秒。也就是螢幕若 60 秒內沒有活動的話,就會停止訊息封包的傳送,這樣會導致滑鼠游標從主要螢幕移動到延伸螢幕時有時會卡頓,設定爲 0 後,就不會休眠了。
      8. -clip xinerama1 :設定 x11vnc 對應螢幕的範圍。
      9. 可以使用 -clip WxH+X+Y 來手動設定對應範圍。

        也可以使用 -clip xinerama0 來自動對應顯示器,其中 xinerama0 爲從螢幕中從左往右數第一個顯示器,以此類推 xinerama1 爲第二個,所以主螢幕在左邊,虛擬延伸螢幕在右邊。

        那如果設定爲 xinerama0 就會將主螢幕的顯示內容複製到虛擬螢幕上,也就是兩個螢幕的內容會一樣。

    4. 平板(手機)等只要使用 vncviewer 來連接便可。
    5. 若平板(手機)為 android ,可以利用 adb 機制,透過 USB 線來進行連接
    6. 此原理為利用設定 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 。

 

參考資料

  1. 把平板、手機作爲電腦第二屏幕(Linux系統下)
  2. https://www.twblogs.net/a/5eea9bb2264079afec94ce37

  3. HDMI虛擬顯示器
  4. 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?is_from_signup=true

  5. adb命令-adb reverse的研究
  6. https://www.uj5u.com/qita/277742.html

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

*