FreeBSD 11.3R/i386 でxrdp 0.9.13を動かす

とりあえず走り書き程度に。

FreeBSD xrdpサーバ、何年か前にOSCでセミナーがあった時に家でもやってみようかなと思っていたのだが、その当時は接続まで至らなかったので諦めていた。今年に限っては外出しにくい大型連休ということで、とりあえずチャレンジしてみたらあっさり接続できました的ななにか。


・注意
xrdp 0.9系以前を使用しているシステムで0.9系を適用する場合、startwm.sh/sesman.ini/xrdp.iniの記法が大きく変わっているため、先んじてxrdpの削除とともに、/usr/local/etc/xrdp の設定ファイルはすべて削除したほうが身のためです。



・サーバ側OSバージョン等の情報
# freebsd-version -k
11.3-RELEASE-p7
# freebsd-version -u
11.3-RELEASE-p8
# sysctl -n hw.machine_arch
i386
11.3R/12.1R以降であれば、amd64でも問題ないと思います。

・xrdpサーバの動作に必要なソフトウェアのインストール等
# pkg info -a | cut -f1 -d' ' | grep xrdp
pulseaudio-module-xrdp-0.4_1
xorgxrdp-0.2.13_2
xrdp-0.9.13,1
基本的に、pkg install xrdpで上記がインストールできます。

・xrdpサーバで動作させるデスクトップ環境のインストール等
# pkg info -a | cut -f1 -d' ' | grep -e openbox -e xterm -e setxkbmap
openbox-3.6_6
openbox-arc-theme-20170104
setxkbmap-1.3.2
xterm-353_1

・サーバ側の/etc/rc.confの設定
# cat /etc/rc.conf | grep xrdp_
xrdp_enable="YES"
xrdp_sesman_enable="YES"

・ログイン後の設定(特に行ごとの解説はしないが、日本語ロケールで日本語キーボードで、openboxがあればopenboxを起動し、なければxtermの起動をチャレンジする)
# cat ~/startwm.sh
#!/bin/sh

export LANG=ja_JP.UTF-8

( sleep 3; setxkbmap jp; xterm & )
exec openbox || xterm
[EOF]


・Xの設定ファイル各種をstartwm.shのシンボリックリンクに設定し、実行可能にする。
# ln -s startwm.sh .xinitrc
# ln -s startwm.sh .xprofile
# ln -s startwm.sh .xsession
# chmod 744 startwm.sh .xinitrc .xprofile .xsession
残念ながら、現時点では上記4ファイルについて下記の流れ(これも推定・・・)のどこで実行されるかは不明。
  1. xrdpのログイン
  2. ログインユーザによるXセッションの立ち上げ(もしくは再接続)
  3. Display Manager(SLiM、lightdm、Xdmなど)による
  4. デスクトップ立ち上げ
  5. デスクトップ起動完了

・.Xauthorityの存在が必要らしいので、touchで作っておく。
# touch .Xauthority
上記のファイルがある場合は放置。特に追記する必要もなかった。


・とりあえずxrdp、xrdp-sesmanデーモンの起動
# service xrdp restart
# service xrdp-sesman restart
xrdp-sesmanについては、実行コマンドがxrdp_sesmanだったりするのでちょっとややこしい。


・ポイント1:service xrdp restartだけではxrdp-sesmanデーモンをフックしない。
xrdp-sesmanをちゃんと立ち上げておかないと、xrdpのログインまではたどり着けても、Window Managerの実行画面までたどり着けない。下記のようなメッセージはそうした場合に確認できる。
  xrdp_wm_log_msg: connection problem, giving up
  Closed socket 17 (AF_UNIX)
参考: http://junf.hatenablog.com/entry/2018/04/25/232923


★サーバ側は以上、次はクライアント側環境。

・OSのバージョン等(特にこだわる必要もないでしょう)
% freebsd-version -k
12.1-RELEASE-p3
% freebsd-version -u
12.1-RELEASE-p4
% sysctl -n hw.machine_arch
amd64

・RDPクライアントソフト(コマンドベース。おそらく何でも良いと思う)
# pkg info  -a | cut -f1 -d' ' | grep freerdp
freerdp-2.0.0.r4_7
他、Xの環境が整っていることが必須条件。


・RDPサーバに接続する
# xfreerdp /v:SERVER-IP-ADDR +glyph-cache /bpp:16
freerdpコマンドではなく、xfreerdpコマンド。
最小限度、/vオプションと+glyph-cacheオプションが必要。
色は16bitのほうが具合が良いらしい。(前回セッションが生きていれば指定不要かもしれないが)

・ポイント2:下記のエラーに対応するには +glyph-cache が必要。
[17:25:41:498] [75726:0265b500] [ERROR][com.freerdp.core.update] - [0x03] Cache Glyph - SERVER BUG: The support for this feature was not announced! Use /relax-order-checks to ignore
参考: https://bgstack15.wordpress.com/2019/09/21/xfreerdp-client-cannot-connect-to-xrdp-session/


・ここまでを行って、''サーバ側を再起動''してxrdp/xrdp_sesmanが起動するか確認する。
# reboot



★追加:rdpサーバ側のデスクトップ環境で出力されている音をクライアントへ転送する
・xrdpでは物理的なサウンドデバイスがないことも想定されることからpulseaudioで音声出力を受け付けて、それをrdpで中継し、クライアントで音声を出力する仕組みを持っている。そこでチャレンジしてみる。ここではpulseaudioに関する設定は特にないし、クライアント側はpulseaudioのインストールは不要で、/soundオプションの追加だけで良い。

・クライアント側から下記コマンドにて接続する。
% xfreerdp /v:SERVER-IP-ADDR +glyph-cache /bpp:16 /sound

・サーバ側でpavucontrolを使用して出力装置を確認する。
# pavucontrol
※pavucontrolコマンドがない場合は下記コマンドでインストールする。
# pkg install pavucontrol

・mpg123コマンドを使用してmp3ファイルを再生してみる。
# padsp mpg123 /path/to/sound.mp3

・もし再生されないようだったら、pulseaudioとxrdpのrestartを行い、クライアントから再接続する。
# pulseaudio -k && sleep 1 && pulseaudio -D
# service xrdp restart
% xfreerdp /v:SERVER-IP-ADDR +glyph-cache /bpp:16 /sound

参考: http://w.vmeta.jp/tdiary/20161019.html


追記
 ・2020/05/20時点でpkgコマンドからインストールできるmultimedia/vlcはpulseaudioオプションが有効ではないので、Ports Collectionからビルドするか、padspでwrapする必要がある。



一応所感など。
・UbuntuやCentOSなどで同様の問題が発生する場合、gnome-sessionを入れるとうまく動くとかmate-sessionを使うと動く場合があるそう。おそらくDesktop Environmentの方で調整してるんだろうと考えた。残念ながら今回のrdpサーバはメインメモリ512Mのi386環境なので、リッチなDesktop Environmentに頼らないよう、頑張りました。




おまけ1:xfreerdpでデバッグレベルのログを出す、ビットカラーを16bitで使用する、など。
# env WLOG_LEVEL=DEBUG xfreerdp /u:USERNAME /v:SERVER-IP-ADDR /relax-order-checks +glyph-cache /bpp:16

おまけ2:メインメモリ512Mしかなく、XenServer上のマシンであっても、導入できればxrdpは軽快です。もしかしたらX描画負荷が別マシンになるので、ある程度の性能なら物理マシンより描画が速いかも・・・
# cat /var/run/dmesg.boot
Copyright (c) 1992-2019 The FreeBSD Project.
Copyright (c) 1979, 1980, 1983, 1986, 1988, 1989, 1991, 1992, 1993, 1994
    The Regents of the University of California. All rights reserved.
FreeBSD is a registered trademark of The FreeBSD Foundation.
FreeBSD 11.3-RELEASE-p7 #0: Tue Mar 17 08:12:57 UTC 2020
    root@amd64-builder.daemonology.net:/usr/obj/usr/src/sys/GENERIC i386
FreeBSD clang version 8.0.0 (tags/RELEASE_800/final 356365) (based on LLVM 8.0.0)
VT(vga): text 80x25
XEN: Hypervisor version 4.6 detected.
CPU: Intel(R) Core(TM) i7-4770T CPU @ 2.50GHz (2499.32-MHz 686-class CPU)
  Origin="GenuineIntel"  Id=0x306c3  Family=0x6  Model=0x3c  Stepping=3
  Features=0x7c3fbff<FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,ACPI,MMX,FXSR,SSE,SSE2>
  Features2=0xfffa3203<SSE3,PCLMULQDQ,SSSE3,FMA,CX16,PCID,SSE4.1,SSE4.2,x2APIC,MOVBE,POPCNT,TSCDLT,AESNI,XSAVE,OSXSAVE,AVX,F16C,RDRAND,HV>
  AMD Features=0x2c100000<NX,Page1GB,RDTSCP,LM>
  AMD Features2=0x21<LAHF,ABM>
  Structured Extended Features=0x27ab<FSGSBASE,TSCADJ,BMI1,AVX2,SMEP,BMI2,ERMS,INVPCID,NFPUSG>
  XSAVE Features=0x1<XSAVEOPT>
Hypervisor: Origin = "Microsoft Hv"
real memory  = 532676608 (508 MB)
avail memory = 490160128 (467 MB)
Event timer "LAPIC" quality 100
ACPI APIC Table: <Xen HVM>
ioapic0: Changing APIC ID to 1
MADT: Forcing active-low polarity and level trigger for SCI
ioapic0 <Version 1.1> irqs 0-47 on motherboard
Timecounter "TSC-low" frequency 1249660129 Hz quality 800
random: entropy device external interface
kbd1 at kbdmux0
module_register_init: MOD_LOAD (vesa, 0xc1022fd0, 0) error 19
random: registering fast source Intel Secure Key RNG
random: fast provider: "Intel Secure Key RNG"
nexus0
vtvga0: <VT VGA driver> on motherboard
cryptosoft0: <software crypto> on motherboard
acpi0: <Xen> on motherboard
acpi0: Power Button (fixed)
acpi0: Sleep Button (fixed)
cpu0: <ACPI CPU> on acpi0
hpet0: <High Precision Event Timer> iomem 0xfed00000-0xfed003ff on acpi0
Timecounter "HPET" frequency 62500000 Hz quality 950
attimer0: <AT timer> port 0x40-0x43 irq 0 on acpi0
Timecounter "i8254" frequency 1193182 Hz quality 0
Event timer "i8254" frequency 1193182 Hz quality 100
atrtc0: <AT realtime clock> port 0x70-0x71 irq 8 on acpi0
atrtc0: registered as a time-of-day clock, resolution 1.000000s
Event timer "RTC" frequency 32768 Hz quality 0
Timecounter "ACPI-fast" frequency 3579545 Hz quality 900
acpi_timer0: <32-bit timer at 3.579545MHz> port 0xb008-0xb00b on acpi0
pcib0: <ACPI Host-PCI bridge> port 0xcf8-0xcff on acpi0
pci0: <ACPI PCI bus> on pcib0
isab0: <PCI-ISA bridge> at device 1.0 on pci0
isa0: <ISA bus> on isab0
atapci0: <Intel PIIX3 WDMA2 controller> port 0x1f0-0x1f7,0x3f6,0x170-0x177,0x376,0xc220-0xc22f at device 1.1 on pci0
ata0: <ATA channel> at channel 0 on atapci0
ata1: <ATA channel> at channel 1 on atapci0
uhci0: <Intel 82371SB (PIIX3) USB controller> port 0xc200-0xc21f irq 23 at device 1.2 on pci0
usbus0: controller did not stop
usbus0 on uhci0
pci0: <bridge> at device 1.3 (no driver attached)
vgapci0: <VGA-compatible display> mem 0xf0000000-0xf1ffffff,0xf3000000-0xf3000fff irq 24 at device 2.0 on pci0
vgapci0: Boot video device
xenpci0: <Xen Platform Device> port 0xc000-0xc0ff mem 0xf2000000-0xf2ffffff irq 30 at device 3.0 on pci0
atkbdc0: <Keyboard controller (i8042)> port 0x60,0x64 irq 1 on acpi0
atkbd0: <AT Keyboard> irq 1 on atkbdc0
kbd0 at atkbd0
atkbd0: [GIANT-LOCKED]
psm0: <PS/2 Mouse> irq 12 on atkbdc0
psm0: [GIANT-LOCKED]
psm0: model IntelliMouse Explorer, device ID 4
fdc0: <floppy drive controller> port 0x3f0-0x3f5,0x3f7 irq 6 drq 2 on acpi0
fdc0: does not respond
device_attach: fdc0 attach returned 6
uart0: <16550 or compatible> port 0x3f8-0x3ff irq 4 flags 0x10 on acpi0
ppc0: <Parallel port> port 0x378-0x37f irq 7 on acpi0
ppc0: Generic chipset (NIBBLE-only) in COMPATIBLE mode
ppbus0: <Parallel port bus> on ppc0
lpt0: <Printer> on ppbus0
lpt0: Interrupt-driven port
ppi0: <Parallel I/O> on ppbus0
xenpv0: <Xen PV bus> on motherboard
granttable0: <Xen Grant-table Device> on xenpv0
xen_et0: <Xen PV Clock> on xenpv0
Event timer "XENTIMER" frequency 1000000000 Hz quality 950
Timecounter "XENTIMER" frequency 1000000000 Hz quality 950
xen_et0: registered as a time-of-day clock, resolution 0.000001s
xenstore0: <XenStore> on xenpv0
evtchn0: <Xen event channel user-space device> on xenpv0
privcmd0: <Xen privileged interface user-space device> on xenpv0
debug0: <Xen debug handler> on xenpv0
pmtimer0 on isa0
vga0: <Generic ISA VGA> at port 0x3c0-0x3df iomem 0xa0000-0xbffff on isa0
fdc0: No FDOUT register!
Timecounters tick every 10.000 msec
xenballoon0: <Xen Balloon Device> on xenstore0
usbus0: 12Mbps Full Speed USB v1.0
ugen0.1: <Intel UHCI root HUB> at usbus0
uhub0: <Intel UHCI root HUB, class 9/0, rev 1.00/1.00, addr 1> on usbus0
xctrl0: <Xen Control Device> on xenstore0
xs_dev0: <Xenstore user-space device> on xenstore0
xenbusb_front0: <Xen Frontend Devices> on xenstore0
xn0: <Virtual Network Interface> at device/vif/0 on xenbusb_front0
xn0: Ethernet address: XX:XX:XX:12:34:56
xenbusb_back0: <Xen Backend Devices> on xenstore0
xn0: backend features: feature-sg feature-gso-tcp4
xbd0: 204800MB <Virtual Block Device> at device/vbd/832 on xenbusb_front0
xbd0: attaching as ada1
xbd0: features: write_barrier
xbd0: synchronize cache commands enabled.
xbd1: 10240MB <Virtual Block Device> at device/vbd/768 on xenbusb_front0
xbd1: attaching as ada0
xbd1: features: write_barrier
xbd1: synchronize cache commands enabled.
Trying to mount root from ufs:/dev/ada0s1a [rw]...
uhub0: 2 ports with 2 removable, self powered
ugen0.2: <QEMU 0.10.2 QEMU USB Tablet> at usbus0
random: unblocking device.
lo0: link state changed to UP
xn0: link state changed to DOWN
xn0: link state changed to UP
ums0 on uhub0
ums0: <Endpoint1 Interrupt Pipe> on usbus0
ums0: 3 buttons and [Z] coordinates ID=0

コメント