
https://www.clien.net/service/board/cm_app/17323600CLIEN 글을 쓴 뒤로 한동안 다른 일을 하느라 바빴는데, 최근에서야 시간이 조금씩 나게 되어서 진척 상황을 공유 드립니다.
동시 세션 지원


Windows Server의 터미널 서비스처럼 1대의 맥을 여러 사용자가 동시에 사용할 수 있도록 하는 방법을 찾아냈고,
이를 더욱 안정화 시켜서 Mac Pro같은 고성능 컴퓨터를 터미널 서버로써 활용할 수 있도록 하는 것을 목표로 하고 있습니다.
x86용 RemoteFX 코덱을 M1 (arm64)로 포팅
xrdp는 RemoteFX 인코더 라이브러리 (librfxcodec)가 동봉되어 있기 때문에 클라이언트가 지원하는 경우 대역폭을 절약하면서도 빠른 화면 갱신이 가능합니다.
하지만, librfxcodec의 주요 부분에서 x86 어셈블리를 사용한 SIMD 가속을 받도록 되어 있기 때문에, M1 계열 칩이 달린 Mac에서는 제 속도가 나오지 않는다는 문제가 있습니다.
이를 어떻게든 해결해 보고 싶었지만 어셈블리는 뭐 하는지 대충 읽을 줄이나 알지, 짤 줄은 하나도 몰랐기 때문에,

이런 x86 SSE 어셈블리 코드를...

ARMv8 (NEON)에서 최대한 똑같이 동작하는 인스트럭션을 찾아서..

어셈블리 코드를 그대로 C언어로 변환(?)한 뒤 xrdp측에 PR을 날렸습니다.
사실 이런 정신나간 코드를 받아줄지는 잘 모르겠습니다만, SIMD 가속이 없는 것 보다는 CPU 사용량도 확연히 줄고, 속도도 엄청나게 빨라짐을 확인할 수 있었습니다.
추후 해야 할 일
제가 권한을 가지고 있는지 잘 모르겠어요..
녹화 권한을 가지고 있지 않으면, 이를 시스템 설정에서 부여할 수 있도록 안내하는 다이얼로그를 만들고 싶은데, 제 프로그램이 macOS에서 특정 권한을 가지고 있는지 체크하는 방법을 잘 모르겠습니다.
Android처럼 여러 권한 체크를 한가지 function을 호출해서 확인할 수 있는게 아닌 것 같더라구요..
사람들에게 배포는 했다고 쳐, 그런데 제거는?
인스톨러는 어떻게 만드는지 감을 잡았는데, 언인스톨러를 어떻게 제공해야 할지 모르겠습니다.
보통 macOS용 프로그램들은 언인스톨러가 어떤 식으로 제공되나요?
한가지 질문이 있습니다.
Windows RDP는 여타 원격제어 프로그램에 비해 월등한 속도와 품질을 자랑하는데요.
그 원리가 비트맵을 보내는(압축이든 아니든) 것이 아니라 (가능한 경우, Windows 구성요소)컨트롤만 주고받고 렌더링을 Client 측에서 하기 때문인것으로 알고 있습니다.
(뭘 제대로 알고 있는 것은 아니고요, 대충 그렇다더라 라고 알고 있습니다)
그런데 맥에 입문하고 보니 맥용은 그런 방식이 아니라 비트맵을 압축해서 보내는 것 같더라고요.
(맞나요?)
1. 맞다면 왜 그런것인지?
2. 그리고 님께서 만들고 계신 것을 왜 다른 개발자들은 안 만든것인지?
다른 개발자들이 실력과 기술이 없어서는 아닐것 같은데요.
궁금합니다.
1. RDP도, macOS 내장 VNC도 비트맵을 압축해서 보내는 것은 똑같습니다. 하지만, RDP의 경우 한정된 대역폭 안에서 효율적인 멀티미디어 전송을 위해 RemoteFX나 H.264 코덱을 사용해서 손실 압축을 하고 있는 것으로 알고 있습니다.
추가적으로 Windows의 경우 원격 접속 시 배경화면을 보여주지 않거나, 애니메이션을 줄이거나, 창 드래그 시 내용은 보여주지 않거나.. 하는 식으로 추가적인 최적화가 되어 있습니다.
2. 이미 macOS 내장 VNC 말고도 TeamViewer나 Chrome Remote Desktop같은 훌륭한 대체재가 있습니다. 하지만, 전자는 개인 사용 목적이 아니면 도입 비용이 만만치 않고, 후자는 컴퓨터가 구글 계정과 묶이는 것이 조금 찝찝하다는 문제가 있어서, 이걸 해결해보고자 취미삼아 만들게 되었습니다.
아~ 그렇군요.. RDP 실망인걸요 ^^
좋은 시도 감사합니다.
출시되면 사용자가 되겠습니다~
설치가 간단해지면 완전한 인스톨러를 들고 그때 다시 찾아오도록 하겠습니다!
알려주신 사이트들 참고하여 app들 빌드하고 설치까지 완료하였는데요. 접속이 여전히 안되어 제가 놓친 부분이 있을가 하여 문의드립니다.
m1pro MacBook이고, iPad 에서 RDClient로 접속하려고 했는데 에러가 납니다.
사용자 계정은 ssh 접속할때 사용하는 계정으로 했는데 이게 아닐까요?
느낌으로 봤을땐 xrdp가 제대로 시작이 안된거같은데 한번 같이 봐주시면 감사하겠습니다
❯ ls /opt/xrdp/bin
xrdp-dis xrdp-genkeymap xrdp-keygen xrdp-sesadmin xrdp-sesrun
❯ sudo launchctl print org.xrdp.xrdp
\Unrecognized target specifier.
Usage: launchctl print <domain-target> | <service-target>
<service-target> takes a form of <domain-target>/<service-id>.
Please refer to `man launchctl` for explanation of the <domain-target> specifiers.
안녕하세요!
우선, 액티비티 모니터(한국어로는 뭐라고 되어 있는지 모르겠네요 ㅠㅠ)에서 xrdp가 켜져있는지 확인하거나, 터미널에서 `ps aux | grep xrdp` 를 입력하면 xrdp가 켜져있는지 확인하실 수 있습니다.
launchd 서비스로 xrdp를 등록하신 경우 `sudo launchctl print system/org.xrdp.xrdp` 명령이 아마 동작할 것 같습니다.
수동으로 xrdp를 실행해 보시려면 터미널에서 `sudo /opt/xrdp/sbin/xrdp -n`을 입력하시면 됩니다. (Ctrl + C로 종료가 가능할 것입니다)
추가적으로, iPadOS / iOS의 Microsoft Remote Desktop 앱으로 접속하시는 경우, https://github.com/neutrinolabs/xrdp/wiki/%5BWIP%5D-xrdp-on-macOS-(with-ulalaca) 에서 'with VideoToolbox Support' 가 붙어있는 방법으로 설치하시는 것을 권해드립니다. 기본 상태로 설치되는 xrdp에서는 아직 iOS 버전에서 사용하는 NSCodec나 GFX 파이프라인 (H.264) 지원이 붙지 않아서, 무압축으로 데이터가 오가기 때문에 엄청나게 느리면서 많은 대역폭을 사용할 수 있습니다.
현재는 github wiki에 있는/etc/xrdp/xrdp.ini만 내용 추가한게 전부인데, 뭔가 빠진것같아서요 ㅎㅎ..
그리고 중요한 문제는.. 접속 시도를 하면 이와같은 에러가 나네요.. 혹시 이런 경험하신적있으신가요?
[20230218-20:44:17] [WARN ] Ignoring obsolete SCP port value '3350'
[20230218-20:44:20] [ERROR] xrdp_wm_log_msg: Error connecting to sesman on sesman.socket
[20230218-20:44:20] [INFO ] Error connecting to sesman on sesman.socket
[20230218-20:44:21] [INFO ] dynamic_monitor_data:
[20230218-20:44:21] [INFO ] dynamic_monitor_data: msg_type 2 msg_length 56
[20230218-20:44:21] [WARN ] libxrdp_process_monitor_stream: physical_width is not within valid range. Setting physical_width to 0mm, Setting physical_height to 0mm, physical_width was: 0
[20230218-20:44:21] [WARN ] libxrdp_process_monitor_stream: physical_height is not within valid range. Setting physical_width to 0mm, Setting physical_height to 0mm, physical_height was: 0
[Ulalaca]
name=Ulalaca
lib=libulalaca.dylib
username=ask
password=ask
위와 같은 세션 타입 엔트리가 설정 파일에 추가되어 있는지 확인해 주세요! (가급적이면 세션 타입 맨 위에 추가해 주세요.)
session type 위로 올리니 연결은 되는 것 같습니다!
다만.. 화면이 하늘색인것과, 바로 segfault로 죽는점이 문제이네요 ㅠㅠ
### terminal 내용 ###
# fork=true일때 session 연결된 후 시간이 조금 지난 후 생긴 에러
❯ sudo /opt/xrdp/sbin/xrdp -n
libc++abi: terminating with uncaught exception of type std::bad_alloc: std::bad_alloc
# fork=false로 했을때 session 연결하자마자 바로 죽는 상황
❯ sudo /opt/xrdp/sbin/xrdp -n
Assertion failed: (size != 0), function read, file IPCConnection.hpp, line 55.
[1] 80910 abort sudo /opt/xrdp/sbin/xrdp -n
### xrdp.ini 원문 ###
[Globals]
ini_version=1
fork=false
port=3389
use_vsock=false
tcp_nodelay=true
tcp_keepalive=true
security_layer=negotiate
crypt_level=high
certificate=
key_file=
ssl_protocols=TLSv1.2, TLSv1.3
autorun=
allow_channels=true
allow_multimon=true
bitmap_cache=true
bitmap_compression=true
bulk_compression=true
max_bpp=32
new_cursors=true
use_fastpath=both
blue=009cb5
grey=dedede
ls_top_window_bg_color=009cb5
ls_width=350
ls_height=430
ls_bg_color=dedede
ls_logo_filename=
ls_logo_x_pos=55
ls_logo_y_pos=50
ls_label_x_pos=30
ls_label_width=65
ls_input_x_pos=110
ls_input_width=210
ls_input_y_pos=220
ls_btn_ok_x_pos=142
ls_btn_ok_y_pos=370
ls_btn_ok_width=85
ls_btn_ok_height=30
ls_btn_cancel_x_pos=237
ls_btn_cancel_y_pos=370
ls_btn_cancel_width=85
ls_btn_cancel_height=30
[Logging]
LogFile=xrdp.log
LogLevel=INFO
EnableSyslog=true
[LoggingPerLogger]
[Ulalaca]
name=Ulalaca
lib=libulalaca.dylib
username=ask
password=ask
#pamsessionmng=127.0.0.1
[Channels]
rdpdr=true
rdpsnd=true
drdynvc=true
cliprdr=true
rail=true
xrdpvr=true
tcutils=true
[Xorg]
name=Xorg
lib=libxup.dylib
username=ask
password=ask
port=-1
code=20
[Xvnc]
name=Xvnc
lib=libvnc.dylib
username=ask
password=ask
ip=127.0.0.1
port=-1
[vnc-any]
name=vnc-any
lib=libvnc.dylib
ip=ask
port=ask5900
username=na
password=ask
[neutrinordp-any]
name=neutrinordp-any
lib=libxrdpneutrinordp.dylib
ip=ask
port=ask3389
username=ask
password=ask
##### log 내용 ####
0230218-21:12:13] [INFO ] loaded module 'libulalaca.dylib' ok, interface size 1648, version 1
[20230218-21:12:13] [WARN ] POLLHUP bit set
[20230218-21:12:13] [WARN ] POLLHUP bit set
[20230218-21:12:13] [WARN ] POLLHUP bit set; closing connection
[20230218-21:12:15] [INFO ] dynamic_monitor_data:
[20230218-21:12:15] [INFO ] dynamic_monitor_data: msg_type 2 msg_length 56
[20230218-21:12:15] [WARN ] libxrdp_process_monitor_stream: physical_width is not within valid range. Setting physical_width to 0mm, Setting physical_height to 0mm, physical_width was: 0
[20230218-21:12:15] [WARN ] libxrdp_process_monitor_stream: physical_height is not within valid range. Setting physical_width to 0mm, Setting physical_height to 0mm, physical_height was: 0
[20230218-21:12:15] [INFO ] process_dynamic_monitor_description: Not allowing resize due to invalid dimensions (w: 0 x h: 0)
[20230218-21:12:15] [INFO ] dynamic_monitor_process_queue: Clearing failed request to resize to: (w: 0 x h: 0)
[20230218-21:12:15] [INFO ] process_dynamic_monitor_description: Not resizing. Already this size. (w: 1552 x h: 1026)
[20230218-21:12:15] [INFO ] dynamic_monitor_process_queue: Clearing completed resize (w: 1552 x h: 1026). It took 0 milliseconds.
이렇게 설정하면 속도는 어떤가용? ㅇㅇ