2019年2月3日 星期日

使用 xrdp 遠端登入 Linux (Gentoo)

想要遠端登入 Linux 的圖形界面,雖然可以使用 XDMCP 使用來,但是若想連到 firewall 後面的 Linux,則必須透過 Guacamole,然而 Guacamole 只支援 vnc 和 rdp 的圖形界面。依過去的使用經驗,vnc 的圖形界面用起來,不是很順暢。網路上有人開發 xrdp,可透過 rdp 的 protocol 來連線 Linux 的圖形界面,雖然它還是要借助於 vnc 的功能,但用起來比較方便。

使用摘要

要使用 xrdp,首先找到及下載 overlay,安裝 xrdp 及 xorgxrdp,啟動 service 後,再修改 home 目錄下的 .xinitrc,即可透過 rdp 連線,啟動自己想用的視窗環境。

安裝與討論

接下來討論自己安裝、使用、和測試所碰到的問題,以及解決的辦法,並且在確認後,反應給 overlay 的維護者。這主要是留作供自己參考,各位有興再看,沒空就跳過。

要安裝 xrdp,必須透過 overlay,我是自己建立自己用的 overlay。安裝後的提示,必須再裝 net-misc/tigervnc (要加上 use flag: server, xorgmodule ) 或 net-misc/x11rdp。不過,x11rdp 已不維護,請改裝 xorgxrdp。關於 xorgxrdp,於後討論。
 * Messages for package net-misc/xrdp-0.9.8:

 * Various session types require different backend implementations:
 * - sesman-Xvnc requires net-misc/tigervnc[server,xorgmodule]
 * - sesman-X11rdp requires net-misc/x11rdp 
在重新安裝系統時,安裝 xrdp 會自動拉進相關的 package。安裝 xorgxrdp 則必須先安裝  x11-base/xorg-server。

安裝以後,啟動 service。
# systemctl enable xrdp
# systemctl enable xrdp-sesman
# systemctl start xrdp
# systemctl start xrdp-sesman 
然後,可以下指令測試一下。
$ rdesktop -g 1024x768 localhost 
連線後,顯示登入的畫面

Session,選擇 Xvnc,登入後,會經由 /etc/xrdp/startwm.sh 啟動視窗,預設呼叫 /etc/X11/xinit/xinitrc,假若沒有設定環境變數 XSESSION,則會啟動 twm。
因此必須安裝 twm 才能測試。注意,至少要安裝 xterm,twm 才能成功啟動。

假若把 startwm.sh 改成直接執行  /usr/bin/startxfce4,則會出現下面的錯誤。
若是執行 openbox 或 icewm,則可以啟動。

本以為在 xrdp 中,無法使用 Xfce4,後來才察覺是因為在本機測試,本機的環境已是 Xfce4-session,導致無法再次啟動 一個 Xfce4-session,才出現上述錯誤。因為錯誤資訊找不到,在這上面轉了好多時間。

注意,使用 Xfce4,只能登入一次,不能本機和遠端同時登入。

後來,用遠端機器測試,就可以正常啟動 Xfce4 了。下圖是透過 Guacamole 登入 Linux 的畫面。


關於啟動 window manager 的判斷,測試 startx,確認 .xsession 及 .xsessionrc 沒有作用,.xinitrc 優先於 XSESSION。
根據此測試結果,針對 /etc/xrdp/startwm.sh 做了一些修正,修正後如下。
#!/bin/sh

# try hard to respect Gentoo's wm choice
. /etc/profile
[ -f /etc/rc.conf ] && . /etc/rc.conf
export XSESSION

userinitrc=$HOME/.xinitrc
if [ -f $userinitrc ]; then
    . $userinitrc
else
    . /etc/X11/xinit/xinitrc
fi

exit 1
這樣可以在自己的 .xinitrc 設定要啟動的 Desktop Enviroment,例如
#!/bin/sh

export LANG=zh_TW.UTF-8
export LC_ALL=zh_TW.UTF-8

fbpanel &
# 注意 openbox 的後面不能接 & 
/usr/bin/openbox 

啟動 IceWM
#!/bin/sh

/usr/bin/icewm-session

或是呼叫 /usr/bin/startxfce4 啟動 Xfce4。這個修正和 overlay 的作者反應,已併入其中,自己以後就不用再修改了。

啟動 xfce4,.xinitrc 的內容如下

#!/bin/sh

exec dbus-launch --sh-syntax startxfce4

前面提到,xrdp 可以透過 xorgxrdp 來連線。經測試,使用 xorgxrdp,假如直接斷線而未登出,再連線會進入原來的連線狀態。或者,已經有一個連線,再以同一個 ID 進入建立新連線時,會關掉原來的連線。這就像在 Windows XP 之類的個人 OS 使用一樣。


不過這個透過 xorgxrdp 連線,折騰了好久才成功。

使用 xorgxrdp 無法登入的問題,可參考這個討論 [BUG/MITIGATION] XRDP/Xorg not starting correctly。意思為 /etc/xrdp/sesman.ini 中關於 [Xorg] 的設定,會呼叫 Xorg 指令,即 /usr/bin/Xorg,而其會呼叫 /usr/libexec/Xorg.wrap,而後者只允許 console users 執行。
$ setpriv --no-new-privs Xorg :10 -auth .Xauthority -config xrdp/xorg.conf -noreset -nolisten tcp -logfile .xorgxrdp.%s.log
/usr/libexec/Xorg.wrap: Only console users are allowed to run the X server

$ Xorg :10 -auth .Xauthority -config xrdp/xorg.conf -noreset -nolisten tcp -logfile .xorgxrdp.%s.log
/usr/libexec/Xorg.wrap: Only console users are allowed to run the X server

$ cat /usr/bin/Xorg
#!/bin/sh
#
# Execute Xorg.wrap if it exists otherwise execute Xorg directly.
# This allows distros to put the suid wrapper in a separate package.

basedir=/usr/libexec
if [ -x "$basedir"/Xorg.wrap ]; then
 exec "$basedir"/Xorg.wrap "$@"
else
 exec "$basedir"/Xorg "$@"
fi

$ ls -l /usr/libexec/Xorg*
-rwxr-xr-x 1 root root 2361128 12月 17 15:32 /usr/libexec/Xorg
-rws--x--x 1 root root   10296 12月 17 15:32 /usr/libexec/Xorg.wrap

修正,將 /etc/xrdp/sesman.ini 的 Xorg 改成  /usr/libexec/Xorg 即可順利啟動。
此項修正亦反應給原 overlay 的維護者,加入其 ebuild 中。

還有,使用 xrdp 從遠端連線,不需要啟動 gdm 或 kdm。

無法解除 Screen Saver 

當太久沒有動作時,進入螢幕保護時,會無法解除,不知如何是好。後來找到方法,從遠端登入,把 xscreensaver 殺掉即可。
$ ps -ax | grep save
17209 ?        S      0:00 xscreensaver -no-splash
19226 pts/1    S+     0:00 grep --colour=auto save
ajax@gentoo-tst ~ $ kill 17209


CentOS 設定

CentOS 的設定相對簡單,只要安裝,啟動後即可。但它的 Xrdp 只開 XVnc,必須修改 /etc/xrdp/xrdp.ini。

;   
; Session types
;   

; Some session types such as Xorg, X11rdp and Xvnc start a display server.
; Startup command-line parameters for the display server are configured
; in sesman.ini. See and configure also sesman.ini.
[Xorg]
name=Xorg
lib=libxup.so
username=ask
password=ask
ip=127.0.0.1
port=-1
code=20

[Xvnc]
name=Xvnc
lib=libvnc.so
username=ask
password=ask
ip=127.0.0.1
port=-1
#xserverbpp=24
#delay_ms=2000
; Disable requested encodings to support buggy VNC servers
; (1 = ExtendedDesktopSize)
#disabled_encodings_mask=0
; Use this to connect to a chansrv instance created outside of sesman
; (e.g. as part of an x11vnc console session). Replace '0' with the
; display number of the session
#chansrvport=DISPLAY(0)

修改後,重新啟動 xrdp 即可。


在 Ubuntu 使用

Ubuntu 20.04 LTS,直接下指令 apt-get install xrdp 即可。但 login 後,/etc/xrdp/startwm.sh 是呼叫 /etc/X11/Xsession 決定要啟動何者視窗。

因此下指令 echo "xfce4-session" > ~/.xsession,再用遠端桌面登入即可。


沒有留言:

張貼留言

網誌存檔