개념

VNC

Figure 1. VNC 출처

VNC

Figure 2. VNC Handshake 출처

  • In computing, Virtual Network Computing (VNC) is a graphical desktop-sharing system that uses the Remote Frame Buffer protocol (RFB) to remotely control another computer 위키
    • RFB 프로토콜을 이용하기때문에 VNC Client는 server와 다른 벤더의 제품을 써도 되었다.
    • RFB 프로토콜: By default, a viewer/client uses TCP port 5900 to connect to a server (or 5800 for browser access), but can also be set to use any other port. 위키
  • Virtual Network Computing(오리지널)

용도와 목적

  • 개발자의 DB query 용으로 mysql workbench를 vncserver로 구성
  • 개발자 개인별 VNC Desktop 을 제공
  • 보안 필수조건인 Query 결과 copy & paste 방지

구성

구성 필요사항

  • CentOS7
  • X 구성 (GUI GNONE Desktop)
  • tigervnc-server.x86_64
  • mysql workbench

Install

패키지 설치

  yum groupinstall -y "Server with GUI"
  yum groupinstall "GNOME Desktop"
  yum install tigervnc-server
  yum install dconf-editor
  yum erase libvirt-daemon (group install시 설치되는 libvirt 삭제 필요함.)

mysql workbench 설치 (참조)

  https://yoursyun.tistory.com/entry/centos-에서-mysql-workbench-설치하기
  https://www.linuxhelp.com/how-to-install-mysql-workbench-on-centos-7-new

tigervnc 설치 참조

  https://idchowto.com/?p=33953
  https://www.tecmint.com/install-and-configure-vnc-server-in-centos-7/

vncserver 설정

vnc Desktop 해상도 수정

  vi /usr/bin/vncserver
  $geometry = "1280x768"; (로 수정)

vncserver text copy&paste 방지설정

  • systemd로 등록하고 데몬 관리시, 하기 systemd 템플릿에서 start옵션을 변경 한다.
  vi /lib/systemd/system/vncserver@.service
  ExecStart=/usr/sbin/runuser -l <USER> -c "/usr/bin/vncserver -AcceptCutText=0 -SendCutText=0 -ClientWaitTimeMillis=300000 %i"

운영

1. vncserver login

  ssh -i stage-master.pem ec2-user@10.212.151.193

2. Linux 시스템 계정 생성 생성

  • 개발자 개인별 계정을 생성해야, 개인별 vnc Desktop이 생성된다.
  useradd username
  passwd username ( 패스워드는 아무거나 구성한다.)
  passwd -e usename ( 패스워드를 expire로 만들고 첫 로그인시 본인이 직접 변경하도록 한다.)

3. 개인별 vncserver 생성

  • 개인별 vncserver를 설정하고, systemd에 등록하는 운영 스크립트를 사용한다.
  cd /$HOME/vncserver
  
  usage : ./add_vncuser USERNAME
  > 계정별 systemd 스크립트를 자동으로 생성한다.
  > 계정별 vncserver 설정및 password설정을 자동으로 진행한다.
  
  systemctl start vncserver@:NUM.service 으로 각 유저별 데몬 실행.

4. vncuser 삭제시

* /home/USER/.vnc 폴더 삭제
* /tmp/X11-unix/USER 파일 삭제
* systemctl disable vncserver@:NUM.service systemd 서비스에서 제거

VNC Server X 세팅

Issue 1

증상

vnc client로 접속했던 사용자에게 오류가 발생하는 문제가 생김

  • 로그인 하려는데 아무것도 안 만지는데 자동으로 next 버튼이 클릭
  • vnc server를 재시작해도 문제가 발생
  • 확인해보니 GNOME을 기존에 사용했었는데 yum update로 systemd가 업데이트 되고 나서
  • PIDFILE을 각 계정별로 두고서 처리했는데 update로 인한 패치로 저 부분이 먹히질 않았던 것이 문제
$ cat /etc/systemd/system/vncserver@\:9.service 
[Unit]
Description=Remote desktop service (VNC)
After=syslog.target network.target

[Service]
Type=forking
User=amir.s

# Clean any existing files in /tmp/.X11-unix environment
ExecStartPre=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'

# Start vnc server
#ExecStart=/usr/sbin/runuser -l amir.s -c "/usr/bin/vncserver -rfbport 5909 -rfbwait 30000 -AcceptCutText=1 -SendCutText=0 -ClientWaitTimeMillis=300000 %i"
#PIDFile=/home/amir.s/.vnc/%H%i.pid
ExecStart=/usr/bin/vncserver -rfbport 5909 -rfbwait 30000 -AcceptCutText=1 -SendCutText=0 -ClientWaitTimeMillis=300000 %i

# Stop vnc server
ExecStop=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'

[Install]
WantedBy=multi-user.target

해결

GNOME에서 Cinnamon으로 가상데스트톱으로 교체

  • cinnamon 있는지 확인
    yum list cinnamon
    yum list cinnamon-settings\*
    
  • 각 User 별로 설정필요 ```sh $ cd /home/new_user/.vnc

$ cat config geometry=2048x1152


* 여기서 cinnamon을 사용하도록 설정 필요
```sh
$ cat xstartup
#!/bin/sh

unset SESSION_MANAGER
unset DBUS_SESSION_BUS_ADDRESS
OS=`uname -s`

#/etc/X11/xinit/xinitrc <--- 1차 실패
#vncserver -kill $DISPLAY <- 1차에 이것이 안먹힘

#exec cinnamon-session  <--- 2차 실패

exec cinnamon-session-cinnamon2d  # <--- 정상
  • 특이점: Gnome일때는 memory를 많이 썼는데 Cinnamon은 CPU를 많이 쓴다.

Issue 2

증상

  • 아직 해결되지 않음
  • 예를 들어서 20명의 사용자가 등록되어 있다. 각각의 서비스를 기동해둔 경우

    • 7번을 배정받은 사용자인 경우
      /usr/bin/Xvnc :7 -geometry 2048x1152 -auth /home/user7/.Xauthority -desktop prod3-mgmt-vnc:7 (user7) -fp catalogue:/etc/X11/fontpath.d -pn -rfbauth /home/user7/.vnc/passwd -rfbport 5907 -rfbwait 30000 -rfbport 5907 -rfbwait 30000 -AcceptCutText=1 -SendCutText=0 -ClientWaitTimeMillis=300000 :7
      
    • 이런식으로 1 ~ 20까지 존재한다.

확인

  • 문제는 중간에 퇴사자가 발생해서 12번이 빠지게 되면 저 숫자들이 꼬이면서 오동작한다.
  • 저 숫자 :7은 7번 사용자에게 할당되서 올라가도록 유의해야한다. (원인은 아직 못찾음)

    • 중간에 퇴사자 user3이 발생해서 삭제하고 7번 사용자의 vnc 서비스를 재시작한 경우
    • 이런식으로 7번 사용자가 3번으로 뜨게 되면 실제 가상 desktop을 실행했을때 오동작했었다.
      /usr/bin/Xvnc :3 -geometry 2048x1152 -auth /home/user7/.Xauthority -desktop prod3-mgmt-vnc:3 (user7) -fp catalogue:/etc/X11/fontpath.d -pn -rfbauth /home/user7/.vnc/passwd -rfbport 5907 -rfbwait 30000 -rfbport 5907 -rfbwait 30000 -AcceptCutText=1 -SendCutText=0 -ClientWaitTimeMillis=300000 :3
      

관리 자동화 script

vnc user (계정 추가)

#!/bin/bash
if [ -z "$1" ]; then
  echo "usage : ./add_vnc_user USERNAME "
  exit 1
fi

useradd $1
echo "VNCUSER!@#asdf" |passwd --stdin $1
passwd -e $1

rm -rf /home/$1/.vnc

#CUR_SVR=`ls /etc/systemd/system |grep vncserver |cut -d: -f2 |cut -d"." -f1 |sort -n |tail -n 1`
#NEXT_SVR=$((CUR_SVR+1))
#NEXT_PORT=$((CUR_SVR+5901))
NEXT_SVR="2"
NEXT_PORT="5902"

echo "next port is $NEXT_PORT"

cp -arp /home/vncserver/vncserver@.service /etc/systemd/system/vncserver@:$NEXT_SVR.service
sed -i s/\<USER\>/"$1"/g /etc/systemd/system/vncserver@:$NEXT_SVR.service
sed -i s/rfbport/"rfbport $NEXT_PORT"/g /etc/systemd/system/vncserver@:$NEXT_SVR.service

systemctl daemon-reload
systemctl enable vncserver@:$NEXT_SVR.service

echo ""
echo "Added systemd : vncserver@:$NEXT_SVR.service"
echo ""
echo "Need to set $1's VNC Desktop password >> "

sudo -u $1 "vncpasswd" << CMD
VNCUSER!@#asdf
VNCUSER!@#asdf

CMD

sleep 2
kill -9 `ps -ef |grep Xvnc |grep $1 |awk '{print $2}'`

echo "$1's vncserver config set."
echo "Run : systemctl start vncserver@:$NEXT_SVR.service"
echo ""

vnc service 매니징

  • 생성했었던 전체 서비스들 “start, stop, status, disable, enable”
#!/bin/bash
# USAGE: all_vncserver [start | stop | status | disable |enable]

if [ -z "$1" ]; then
  echo "usage : ./all_vncserver [start | stop | status | disable |enable]"
  exit 1
fi

VNC_SERVERS=`ls /etc/systemd/system |grep vncserver |sort -t $':' -k2 -g`

for VNC_SERVER in $VNC_SERVERS; do 
  systemctl $1 $VNC_SERVER
  sleep 3
done

echo "done. "

vnc service file sample

  • 사용자마다 vnc service 등록해줄 때 사용할 기본 파일
[Unit]
Description=Remote desktop service (VNC)
After=syslog.target network.target

[Service]
Type=forking
User=byung-u

# Clean any existing files in /tmp/.X11-unix environment
ExecStartPre=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'
ExecStart=/usr/bin/vncserver -rfbport 5901 -rfbwait 30000 -AcceptCutText=1 -SendCutText=0 -ClientWaitTimeMillis=300000 %i
ExecStop=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'

[Install]
WantedBy=multi-user.target

vnc service restart

#!/bin/bash

/home/vncserver/all_vncserver stop
sleep 10
# 여기에 임시로 사용자가 현재 사용중이던 파일이 남아있어서 신경써서 삭제 필요
rm -rf /tmp/.X11-unix/*
/home/vncserver/all_vncserver start

echo "done"