2015年9月8日 星期二

修改「VNC 服務」預設的 xstartup 腳本

之前發過一篇〝設定「VNC 伺服器」使啟動後即為「MATE 桌面環境」〞,提及如何修改自己的「VNC 服務」設定,使其開啟「MATE 桌面環境」。這個方法需得在每個使用者的家目錄下,個別設定很是麻煩,故從上一篇發文後就一直有個想法,是否有系統層級的設定,讓每個新使用者在第一次啟動「VNC 服務」時,就自動產生一個已修改好的『啟動設定』。
  先以 Fedora 22 為例詳細說明整個設定過程,假設系統只安裝「MATE 桌面」環境,完全沒有安裝「GNOME 桌面」的情形。在文章最後,再貼上在 Fedora 20、21 系統中的修改設定,以供參考。

一、啟動 VNC 服務

除非是架設多人使用的伺服器,並需提供每個人以 VNC 連線登入,不然由使用者透過 SSH 連線,再自行啟動自己用的「VNC 服務」,是較簡單、不佔資源的作法。(參考〝開啟個人化的 VNC 服務,供「遠端桌面」連線〞)
[SiB@Core-i7 ~]$ vncserver :1888
上例是在連線後,於「SSH 終端機」開啟「VNC 服務」,並設定連接埠為 7788。

:7788 - 5900 = 1888。這是最容易被設錯的數字,可以參考這篇〝用較短的命令,加快建立由 SSH 重導之 VNC 連線〞的做法避免錯誤。

二、xstartup 的修改

由之前的發文已知,開啟個人「VNC 服務」的腳本為檔案 ~/.vnc/xstartup,第一次啟動「VNC 服務」時,系統會產生一個預設腳本,其內容如下:
#!/bin/sh

unset SESSION_MANAGER
unset DBUS_SESSION_BUS_ADDRESS
exec /etc/X11/xinit/xinitrc
要修改為
#!/bin/sh

unset SESSION_MANAGER
unset DBUS_SESSION_BUS_ADDRESS
mate-session &
exit
exec /etc/X11/xinit/xinitrc
上例中紅色是新加上的命令,『mate-session &』用以啟動「MATE 桌面」環境用的命令,並置於背景執行,而『exit』是提早結束腳本的執行。

:若同時安裝數個「桌面」環境,預設的腳本內容可能不同。

三、預設的 xstartup 腳本在哪 ?

每個使用者都要個別設定是很麻煩,最好是有個預設腳本,讓一般使用者都可立即成功開啟「VNC 服務」,有特別需求再個別設定。網路上有很多人回答過這各問題,不過都不能適用 Fedora 中的「VNC 服務」,可能是在導入的過程中有些修改所致,也不想去考證它了。
  既然網路上的回答沒有用只好自己解決,就從啟動「VNC 服務」的命令著手。啟動「VNC 服務」是執行一個名為 vncserver 的程式,先查一下它在哪裏?
[root@Core-i7 ~]# locate vncserver
/etc/sysconfig/vncservers
/usr/bin/vncserver
/usr/bin/x0vncserver
/usr/lib/systemd/system/vncserver@.service
 . . . . .
由結果可以看到是位於 /usr/bin/ 這個目錄,用熟悉的「文字編輯器」開啟它。

四、預設 xstartup 腳本的修改過程

將修改處整理在後,因為檔案前端的修改若加入文字,會影響之後的列數,故由程式後端開始修改。
第 211 列,原文
if ($opt{'-name'}) {
    $desktopName = $opt{'-name'};
} else {
    $desktopName = "$host:$displayNumber ($ENV{USER})";
}
修改為
if ($opt{'-name'}) {
    $desktopName = $opt{'-name'};
} else {
    $desktopName = "$host:$vncPort ($ENV{USER})";
}
使開啟的「VNC 服務」在連線後,所出現的視窗標題由原來的『Core-i7:1888 (SiB)』,改為『Core-i7:7788 (SiB)』,所顯示的「埠號」會是正確的「埠號」。其中的『Core-i7』是「主機名稱」,『7788』是連線的埠號,『SiB』是使用者名稱。

第 58 列
,原文
$defaultXStartup
    = ("#!/bin/sh\n\n".
       "unset SESSION_MANAGER\n".
       "unset DBUS_SESSION_BUS_ADDRESS\n".
       "exec /etc/X11/xinit/xinitrc\n");
修改為
$defaultXStartup
    = ("#!/bin/sh\n\n".
       "unset SESSION_MANAGER\n".
       "unset DBUS_SESSION_BUS_ADDRESS\n".
       "mate-session &\n".
       "exit\n".
       "exec /etc/X11/xinit/xinitrc\n");
這個修改與之前在個別使用者的 .vnc/xstartup 中的修改相同。
  修改完成後,存回原來檔案。在這之後第一次啟動「VNC 服務」時,在個別使用的「家目錄」下之 .vnc 中所產生的預設 xstartup 腳本,就會是修改後的新腳本了。

五、F21 的修改

與 Fedora 22 的修改內容相同,請參照上一段說明。

六、F20 的修改

同樣的原因,顧及檔案前端的修改可能會影響之後的列數,故仍由程式後端開始修改。
第 231 列,原文
if ($opt{'-name'}) {
    $desktopName = $opt{'-name'};
} else {
    $desktopName = "$host:$displayNumber ($ENV{USER})";
}
修改為
if ($opt{'-name'}) {
    $desktopName = $opt{'-name'};
} else {
    $desktopName = "$host:$vncPort ($ENV{USER})";
}
第 58 列,原文
$defaultXStartup
    = ("#!/bin/sh\n\n".
       "unset SESSION_MANAGER\n".
       "unset DBUS_SESSION_BUS_ADDRESS\n".
       "OS=`uname -s`\n".
       "if [ \$OS = 'Linux' ]; then\n".
       "  case \"\$WINDOWMANAGER\" in\n".
       "    \*gnome\*)\n".
       "      if [ -e /etc/SuSE-release ]; then\n".
       "        PATH=\$PATH:/opt/gnome/bin\n".
       "        export PATH\n".
       "      fi\n".
       "      ;;\n".
       "  esac\n".
       "fi\n".
       "if [ -x /etc/X11/xinit/xinitrc ]; then\n".
       "  exec /etc/X11/xinit/xinitrc\n".
       "fi\n".
       "if [ -f /etc/X11/xinit/xinitrc ]; then\n".
       "  exec sh /etc/X11/xinit/xinitrc\n".
       "fi\n".
       "[ -r \$HOME/.Xresources ] && xrdb \$HOME/.Xresources\n".
       "xsetroot -solid grey\n".
       "xterm -geometry 80x24+10+10 -ls -title \"\$VNCDESKTOP Desktop\" &\n".
       "twm &\n");
修改為
$defaultXStartup
    = ("#!/bin/sh\n\n".
       "unset SESSION_MANAGER\n".
       "unset DBUS_SESSION_BUS_ADDRESS\n".
       "mate-session &\n".
       "exit\n".
       "OS=`uname -s`\n".
       "if [ \$OS = 'Linux' ]; then\n".
       "  case \"\$WINDOWMANAGER\" in\n".
       "    \*gnome\*)\n".
       "      if [ -e /etc/SuSE-release ]; then\n".
       "        PATH=\$PATH:/opt/gnome/bin\n".
       "        export PATH\n".
       "      fi\n".
       "      ;;\n".
       "  esac\n".
       "fi\n".
       "if [ -x /etc/X11/xinit/xinitrc ]; then\n".
       "  exec /etc/X11/xinit/xinitrc\n".
       "fi\n".
       "if [ -f /etc/X11/xinit/xinitrc ]; then\n".
       "  exec sh /etc/X11/xinit/xinitrc\n".
       "fi\n".
       "[ -r \$HOME/.Xresources ] && xrdb \$HOME/.Xresources\n".
       "xsetroot -solid grey\n".
       "xterm -geometry 80x24+10+10 -ls -title \"\$VNCDESKTOP Desktop\" &\n".
       "twm &\n");
修改完成後,存回原來檔案。在這之後初次啟動「VNC 服務」時的預設 xstartup 腳本,就會是修改後的新腳本了。

後記:

  • 2016-2-6 : Fedora 23 的 TigerVNC 更新至 1.6.0,因為 /usr/bin/vncserver 此檔案也有些修改,所以該檔案需修改的內容相同,但是位置不同:第 211 列改為第 233 列、第 58 列改為第 64 列
  • 2016-7-16 : Fedora 24 的修改位置與 Fedora 23 相同。
  • 2017-8-4 : Fedora 26 的修改位置不同:第 211 列改為第 177 列、第 58 列改為第 62 列
  • 2018-10-16: Fedora 28 的修改位置不同:第 211 列改為第 180 列、第 58 列改為第 62 列

已測試版本:

  • Fedora: 20, 21, 22, 23

沒有留言:

張貼留言

感謝你耐心看完本文,歡迎留下任何指正、建議,筆者會儘快回應。(English is also welcome.)