Linux에서 VNC 설치, 설정 및 사용 방법

VNC 개요

VNC(Virtual Network Computing)은 원격 네트워크 제어를 위한 소프트웨어 세트입니다. 네트워크 제어 기술은 한 컴퓨터(컨트롤러)가 다른 컴퓨터(피어)를 제어하는 것을 의미하며, 컨트롤러가 작업할 때 마치 피어 앞에서 직접 작업하는 것처럼 피어의 애플리케이션을 실행하고 시스템 자원을 사용할 수 있습니다.

VNC 소프트웨어는 두 가지 주요 구성 요소로 구성됩니다: VNC 서버와 VNC 뷰어 클라이언트.

  • 피어 컴퓨터에 VNC 서버를 설치한 후 컨트롤러에서 VNC 뷰어 클라이언트로 피어를 제어할 수 있습니다.
  • VNC 서버와 VNC 뷰어 클라이언트는 Unix 계열, Windows 및 macOS와 같은 다양한 운영 체제를 지원하므로, 서로 다른 운영 체제에 VNC 서버와 뷰어를 설치하여 제어할 수 있습니다.
  • 현재 컨트롤러 컴퓨터에 VNC 뷰어가 설치되지 않은 경우, 일반적인 웹 브라우저를 통해 접근하여 피어를 제어할 수 있습니다.

전체 VNC 작동 프로세스

  1. VNC 클라이언트는 브라우저나 VNC 뷰어 클라이언트를 통해 VNC 서버에 연결합니다.
  2. VNC 서버는 연결 암호와 VNC 서버 디스플레이 장치를 요청하는 대화 상자를 전송합니다.
  3. 클라이언트가 연결 암호를 입력하면 VNC 서버는 클라이언트가 액세스 권한을 가지고 있는지 확인합니다.
  4. VNC 서버의 인증을 통과한 후, 클라이언트는 즉시 VNC 서버의 데스크탑 환경을 요청합니다.
  5. VNC 서버는 얻은 데스크탑 환경을 VNC 통신 프로토콜을 통해 클라이언트에 전송하고, 클라이언트가 VNC 서버의 데스크탑 환경과 입력 장치를 제어할 수 있도록 합니다.

무료 VNC 도구

TigerVNC

TightVNC

RealVNC의 VNC 뷰어 클라이언트

예시 - CentOS 7.5에 VNC 서버 설치 및 설정

1- 시스템 환경 확인

[root@localhost ~]# uname -a
Linux localhost.localdomain 3.10.0-957.el7.x86_64 #1 SMP Thu Nov 8 23:39:32 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
[root@localhost ~]# cat /etc/system-release
CentOS Linux release 7.5.1804 (Core) 

2- VNC 서버 설치

VNC 서버가 설치되어 있는지 확인하고, 설치되지 않은 경우 해당 rpm 패키지를 찾아 설치합니다.

yum -y install tigervnc-server tigervnc  # VNC 서버 및 뷰어 설치

설치 완료:

[root@localhost ~]# rpm -qa |grep vnc
tigervnc-license-1.8.0-5.el7.noarch
tigervnc-1.8.0-13.el7.x86_64
tigervnc-icons-1.8.0-13.el7.noarch
tigervnc-server-minimal-1.8.0-5.el7.x86_64
gtk-vnc2-0.7.0-3.el7.x86_64
tigervnc-server-1.8.0-13.el7.x86_64
gvnc-0.7.0-3.el7.x86_64
[root@localhost ~]# 

3- VNC 서버 설정

VNC 서버는 다양한 설정을 지원합니다:

  • 단일 사용자 단일 인터페이스 설정(한 사용자가 접근, 하나의 인터페이스 사용)
  • 다중 사용자 단일 인터페이스 설정(여러 사용자가 접근, 동일한 인터페이스 사용)
  • 다중 사용자 다중 인터페이스 설정(여러 사용자가 접근, 각각의 인터페이스 사용)

구성 파일 생성 및 수정(단일 사용자 단일 인터페이스)

[root@localhost ~]# cp /usr/lib/systemd/system/vncserver@.service /etc/systemd/system/vncserver@.service
[root@localhost ~]# ll /etc/systemd/system/vncserver@.service
-rw-r--r-- 1 root root 1828 Jun 21 11:08 /etc/systemd/system/vncserver@.service
[root@localhost ~]# 
[root@localhost ~]# vim /etc/systemd/system/vncserver@.service
[root@localhost ~]# cat /etc/systemd/system/vncserver@.service  |grep -v "#"


[Unit]
Description=Remote desktop service (VNC)
After=syslog.target network.target

[Service]
Type=forking
User=root

ExecStartPre=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'
ExecStart=/usr/sbin/runuser -l UserA -c "/usr/bin/vncserver %i -geometry 1920x1080"
PIDFile=/home/UserA/.vnc/%H%i.pid
ExecStop=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'

[Install]
WantedBy=multi-user.target
[root@localhost ~]# 
[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# 


참고

  • 서비스 시작 사용자를 root로 설정하면 VNC 클라이언트가 메뉴 바를 볼 수 있습니다.
  • 사용자는 UserA이며, 연결 시 UserA의 인터페이스에 로그인합니다.

이 예제에서는 단일 사용자 단일 인터페이스 설정만 설명합니다. 다중 사용자 단일 인터페이스 방식(다중 사용자가 동시에 접근)을 원하는 경우, 위의 "vncserver@:1.service"을 "vncserver@:2.service"로 변경하고 사용자 이름, 해상도 등의 매개변수를 구성한 후 다음 단계를 수행하면 됩니다. 다중 사용자 다중 인터페이스를 구성하려면 공식 정보를 참조하십시오: https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/system_administrators_guide/ch-tigervnc

암호 설정

사용자 암호를 설정합니다. 이 단계에서는 구성 파일에 정의된 사용자인 UserA를 사용합니다. 주의: 이 단계는 사용자를 전환해야 합니다.

[root@localhost ~]# su - UserA
Last login: Fri Jun 21 11:25:07 CST 2019 on pts/0
[UserA@localhost ~]$ vncpasswd
Password:
Verify:
Would you like to enter a view-only password (y/n)? n  
A view-only password is not used
[UserA@localhost ~]$ 

VNC 서비스 시작 및 자동 시작 설정

[root@localhost ~]# systemctl start vncserver@:1.service
[root@localhost ~]# systemctl enable vncserver@:1.service
Created symlink from /etc/systemd/system/multi-user.target.wants/vncserver@:1.service to /etc/systemd/system/vncserver@.service.
[root@localhost ~]# 

VNC 서비스 상태 확인

[root@localhost ~]# systemctl status vncserver@:1.service -l
● vncserver@:1.service - Remote desktop service (VNC)
   Loaded: loaded (/etc/systemd/system/vncserver@.service; enabled; vendor preset: disabled)
   Active: active (running) since Fri 2019-06-21 13:15:55 CST; 18min ago
 Main PID: 6556 (Xvnc)
   CGroup: /system.slice/system-vncserver.slice/vncserver@:1.service
           ‣ 6556 /usr/bin/Xvnc :1 -auth /home/UserA/.Xauthority -desktop localhost.localdomain:1 (UserA) -fp catalogue:/etc/X11/fontpath.d -geometry 1920x1080 -pn -rfbauth /home/UserA/.vnc/passwd -rfbport 5901 -rfbwait 30000

Jun 21 13:15:51 localhost.localdomain systemd[1]: Starting Remote desktop service (VNC)...
Jun 21 13:15:55 localhost.localdomain systemd[1]: Started Remote desktop service (VNC).
[root@localhost ~]# 

방화벽 설정

방법1: 방화벽 종료 및 부팅 시 자동 시작 해제

systemctl stop firewalld && systemctl disable firewalld

firewalld가 실행 중인지 확인:

[root@localhost ~]# firewall-cmd --state
not running

방법2: 방화벽에서 VNC 서비스 열기

$ firewall-cmd --permanent --add-service vnc-server
success
$ firewall-cmd --reload

5- 기타 정보

사용자 구성 파일

[UserA@localhost ~]$ ll -a .vnc
total 28
drwxrwxr-x   2 UserA UserA  120 Jun 21 13:15 .
drwx------. 20 UserA UserA 4096 Jun 21 13:44 ..
-rw-r--r--   1 UserA UserA  332 Jun 21 13:15 config
-rw-rw-r--   1 UserA UserA 4619 Jun 21 13:41 localhost.localdomain:1.log
-rw-rw-r--   1 UserA UserA    5 Jun 21 13:15 localhost.localdomain:1.pid
-rw-------   1 UserA UserA    8 Jun 21 11:26 passwd
-rwxr-xr-x   1 UserA UserA  112 Jun 21 13:15 xstartup
[UserA@localhost ~]$ 

일부 명령어

[UserA@localhost ~]$ vncserver -h

usage: vncserver [:<number>] [-name <desktop-name>] [-depth <depth>]
                 [-geometry <width>x<height>]
                 [-pixelformat rgbNNN|bgrNNN]
                 [-fp <font-path>]
                 [-cc <visual>]
                 [-fg]
                 [-autokill]
                 [-noxstartup]
                 [-xstartup <file>]
                 <Xvnc-options>...

       vncserver -kill <X-display>

       vncserver -list

[UserA@localhost ~]$ 
[UserA@localhost ~]$ vncpasswd -h
usage: vncpasswd [file]
       vncpasswd -f
[UserA@localhost ~]$ 

VNC 서비스 프로세스 중지

[UserA@localhost ~]$ vncserver -list

TigerVNC server sessions:

X DISPLAY #	PROCESS ID
:1		6556
[UserA@localhost ~]$ 
[UserA@localhost ~]$ vncserver -kill :1
Killing Xvnc process ID 6556
[UserA@localhost ~]$ 
[UserA@localhost ~]$ vncserver -list

TigerVNC server sessions:

X DISPLAY #	PROCESS ID
[UserA@localhost ~]$ 

VNC 뷰어 클라이언트를 사용하여 원격 연결

  • Linux에서 vncviewer 명령을 실행하면 됩니다. 서버 주소는 192.168.1.11:1과 같이 작성합니다.
  • Windows에서 Windows 버전의 vncviewer 클라이언트 프로그램을 실행하면 됩니다. Linux와 유사한 방법을 사용합니다.
  • 브라우저를 통해 원격 연결도 가능하지만, 구성이 다소 복잡하여 일반적으로 사용하지 않습니다.

vncserver가 실행 중인지 확인

[UserA@localhost ~]$ vncserver -list

TigerVNC server sessions:

X DISPLAY #	PROCESS ID
:1		1390
[UserA@localhost ~]$ 

Tiger VNC Viewer로 연결

다운로드 - Windows-64bit: https://bintray.com/tigervnc/stable/download_file?file_path=vncviewer64-1.9.0.exe

문제 해결

문제-1

문제 현상: vncserver 서비스 시작 시 오류 발생

[root@localhost ~]# systemctl start vncserver@:1.service
Job for vncserver@:1.service failed because the control process exited with error code. See "systemctl status vncserver@:1.service" and "journalctl -xe" for details.
[root@localhost ~]# 
[root@localhost ~]# systemctl status vncserver@:1.service
● vncserver@:1.service - Remote desktop service (VNC)
   Loaded: loaded (/etc/systemd/system/vncserver@.service; disabled; vendor preset: disabled)
   Active: failed (Result: exit-code) since Fri 2019-06-21 13:07:28 CST; 2min 14s ago
  Process: 6104 ExecStart=/usr/sbin/runuser -l UserA -c /usr/bin/vncserver %i -geomotry 1920x1080 (code=exited, status=255)
  Process: 6095 ExecStartPre=/bin/sh -c /usr/bin/vncserver -kill %i > /dev/null 2>&1 || : (code=exited, status=0/SUCCESS)

Jun 21 13:07:28 localhost.localdomain runuser[6104]: must supply to access the server (default=)
Jun 21 13:07:28 localhost.localdomain runuser[6104]: rfbauth        - Alias for PasswordFile
Jun 21 13:07:28 localhost.localdomain runuser[6104]: PasswordFile   - Password file for VNC authentication (default=)
Jun 21 13:07:28 localhost.localdomain runuser[6104]: SecurityTypes  - Specify which security scheme to use (None, VncAuth, Plain,
Jun 21 13:07:28 localhost.localdomain runuser[6104]: TLSNone, TLSVnc, TLSPlain, X509None, X509Vnc, X509Plain)
Jun 21 13:07:28 localhost.localdomain runuser[6104]: (default=TLSVnc,VncAuth)
Jun 21 13:07:28 localhost.localdomain runuser[6104]: (EE)
Jun 21 13:07:28 localhost.localdomain runuser[6104]: Fatal server error:
Jun 21 13:07:28 localhost.localdomain runuser[6104]: (EE) Unrecognized option: -geomotry
Jun 21 13:07:28 localhost.localdomain runuser[6104]: (EE)
[root@localhost ~]# 

문제 해결

오류 메시지 "Unrecognized option: -geomotry"를 보면 구성 매개변수가 잘못되었음을 확인하고, 올바른 구성 " -geometry"로 수정하면 됩니다. 관련 디렉토리 파일 삭제: rm -rf /tmp/.X11-unix/.

문제-2

문제 현상

Tiger VNC Viewer가 CentOS7.5 시스템의 VNC 서버에 연결할 때 다음 메시지가 표시됩니다:

Authentication Required
Authentication is required to create a color profile.

문제 해결

/etc/polkit-1/rules.d/에 해당 rules 파일을 추가합니다.

[UserA@localhost ~]$ su - root
Password: 
Last login: Mon Jun 24 10:36:25 CST 2019 on pts/0
[root@localhost ~]#
[root@localhost ~]# cd /etc/polkit-1/rules.d/
[root@localhost rules.d]# ll
total 12
-rw-r--r--. 1 root root 974 Jun 10  2014 49-polkit-pkla-compat.rules
-rw-r--r--. 1 root root 326 Apr 30  2013 50-default.rules
-rw-r--r--  1 root root 547 Jun 24 10:50 gnome-vnc.rules
[root@localhost rules.d]# cat gnome-vnc.rules 
polkit.addRule(function(action, subject) {
   if ((action.id == "org.freedesktop.color-manager.create-device" ||
        action.id == "org.freedesktop.color-manager.create-profile" ||
        action.id == "org.freedesktop.color-manager.delete-device" ||
        action.id == "org.freedesktop.color-manager.delete-profile" ||
        action.id == "org.freedesktop.color-manager.modify-device" ||
        action.id == "org.freedesktop.color-manager.modify-profile") &&
       subject.isInGroup("UserA")) {
      return polkit.Result.YES;
   }
});
[root@localhost rules.d]# 

참고 정보

예시: RedHat Linux 5 엔터프라이즈 버전에서 VNCSREVER 설정

VNCSERVER 확인 및 설치

서버에 VNCSERVER가 구성되어 있는지 확인합니다.

[root@localhost: ~]#rpm -qa |grep vnc 
vnc-4.1.2-14.el5
vnc-server-4.1.2-14.el5

VNCSERVER 서버 버전이 반환되어 VNCSERVER가 설치되었음을 나타냅니다. VNCSERVER가 설치되지 않은 경우, 설치 패키지를 찾아 설치합니다.

VNCSERVER 설정

첫 번째로 VNCSERVER를 시작할 때 암호를 입력하라는 메시지가 표시됩니다. 이는 관리자 계정과 일반 계정으로 나뉘며, 시작 방식은 약간 다릅니다. 관리자:

[root@localhost /]#   VNC Server 
You will require a password to access your desktops. 
Password: 123456            #VNC 연결 암호 입력 
Verify: 123456                 #VNC 암호 확인 
xauth: creating new authority file /root/.Xauthority 
New ‘localhost.localdomain:1 (root)’ desktop is localhost.localdomain:1 
Creating default startup script /root/.vnc/xstartup 
Starting applications specified in /root/.vnc/xstartup 
Log file is /root/.vnc/localhost.localdomain:1.log 

일반 사용자:

[root@localhost /]#su userB    #userB는 사용자 이름 
[userB@localhost /]$   VNC Server 
You will require a password to access your desktops. 
Password: 123456            #VNC 연결 암호 입력 
Verify: 123456                 #VNC 암호 확인 
xauth: creating new authority file /home/userB/.Xauthority 
New ‘localhost.localdomain:2 (userB)’ desktop is localhost.localdomain:2 
Creating default startup script /home/userB/.vnc/xstartup 
Starting applications specified in /home/userB/.vnc/xstartup 
Log file is /home/userB/.vnc/localhost.localdomain:2.log 

참고:

  • 각 사용자는 자신의 VNCSERVER 원격 데스크탑을 시작할 수 있으며, 각 사용자는 여러 개의 VNCSERVER 원격 데스크탑을 시작할 수 있습니다. 이들은 IP와 포트 번호: IP:1, IP:2, IP:3으로 구분되며, 동일한 포트 번호를 사용하면 다른 사용자가 자동으로 로그아웃됩니다.
  • VNCSERVER의 대부분의 구성 파일 및 로그 파일은 사용자의 홈 디렉토리 아래 .vnc 디렉토리에 있습니다.

사용자는 시작 번호를 자체적으로 설정할 수 있습니다:

[userB@localhost /]$   VNC Server :2        #주의:2 앞에는 공백이 있어야 합니다. 
A   VNC Server is already running as :2 

관련 데스크탑 설정

GNOME 데스크탑

RedHat Linux는 KDE 모드와 GNOME 모드의 두 가지 그래픽 모드를 지원합니다. ps -A 명령어로 현재 실행 중인 모든 프로그램을 목록화하고, KDE 또는 GNOME 필드로 판단합니다. GNOME 데스크탑인 경우 /root/.vnc/xstartup 구성 파일을 수정해야 합니다.

[root@localhost .vnc]# vi xstartup 
#!/bin/sh 
# 주석을 해제하여 일반 데스크탑을 시작합니다: 
# unset SESSION_MANAGER        #이 줄의 주석을 제거 
# exec /etc/X11/xinit/xinitrc        #이 줄의 주석을 제거 
[ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup 
[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources 
xsetroot -solid grey 
vncconfig -iconic & 
xterm -geometry 80×24+10+10 -ls -title "$VNCDESKTOP Desktop" & 
gnome-session gnome           #이 줄을 추가하여 GNOME 데스크탑 환경을 사용합니다 
twm & 

설정 수정 후 재시작이 필요합니다. 그렇지 않으면 설정이 적용되지 않습니다. 방법은 VNCSERVER 프로세스를 종료한 후 VNCSERVER를 다시 실행하는 것입니다.

[root@localhost .vnc]#  VNC Server -kill :1      #1은 VNCSERVER를 시작할 때의 포트 번호입니다 
[root@localhost .vnc]#  VNC Server :1           #재시작, 주의:1 앞에는 공백이 있어야 합니다.

사용자 정보 및 해상도 설정

/etc/sysconfig/VNC Servers 구성 파일을 수정합니다.

[root@localhost: ~]#vi /etc/sysconfig/VNC Servers 
# VNCSERVERS 변수는 디스플레이:사용자 쌍의 목록입니다. 
# 
# 다음 줄을 주석 해제하여 디스플레이 :2에서 VNCSERVER를 시작합니다. 
# ‘myusername’으로 변경하세요(자신의 이름으로 변경해야 합니다). 또한, 
# VNC 암호를 설정해야 하며, ‘man vncpasswd’를 실행하여 어떻게 하는지 확인할 수 있습니다. 
# 
# 로컬 영역 네트워크가 신뢰할 수 없는 경우 이 서비스를 실행하지 마세요. VNC를 안전하게 사용하는 방법은 
# <URL:http://www.uk.research.att.com/archive/vnc/sshvnc.html >를 참조하십시오. 
# "-nolisten tcp"를 사용하여 TCP를 통해 VNCSERVER에 X 연결을 방지합니다. 
# "-nohttpd"를 사용하여 웹 기반 VNC 클라이언트가 연결하는 것을 방지합니다. 
# "-localhost"를 사용하여 안전한 터널을 통해 연결하지 않는 한 원격 VNC 클라이언트가 연결하는 것을 방지합니다. `man vncviewer` 매뉴얼 페이지의 "-via" 옵션을 참조하십시오. 
VNCSERVERS="1:root 2:userB"           #여기서 root와 userB 두 사용자를 추가했습니다. 
VNCSERVERARGS[1]="-geometry 1024×768 -nolisten tcp -nohttpd -localhost"  VNCSERVERARGS[2]="-geometry 1920×1080 -nolisten tcp -nohttpd -localhost" 

참고: 위는 root와 userB 두 사용자의 해상도를 별도로 설정한 것입니다. 포트 번호로 구분됩니다. 명령줄을 통해 임시로 해상도 및 색 깊이를 수정할 수도 있으며, 이 방법은 재시작 후 손실됩니다. 명령어는 다음과 같습니다:

[root@localhost: ~]#  VNC Server -geometry 1024×768        #VNC Server의 해상도 설정    
[root@localhost: ~]#  VNC Server -depth 24           #VNC Server의 색 깊이 설정 

클라이언트 연결

접근 방법

  • Linux에서 vncviewer 명령을 실행하면 됩니다. 서버 주소는 192.168.1.11:1과 같이 작성합니다.
  • Windows에서 Windows 버전의 vncviewer 클라이언트 프로그램을 실행하면 됩니다. Linux와 유사한 방법을 사용합니다.
  • 브라우저를 통해 원격 연결도 가능하지만, 구성이 다소 복잡하여 일반적으로 사용하지 않습니다.

주요 운영

  • 암호 변경: vncpasswd 명령을 실행하면 됩니다.
  • VNC 서버 중지: 명령어는 VNC Server -kill :1과 같으며, VNC Server는 시작한 사용자만 종료할 수 있습니다.
  • 안정성 설정: 여러 클라이언트가 동일한 VNC Server 디스플레이 포트에 연결할 때, VNC Server는 기존 연결을 종료하고 새 연결을 위해 포트를 제공합니다. "-dontdisconnect"를 사용하여 새 연결 요청을 거부하고 기존 연결을 유지할 수 있습니다.
  • 동일한 디스플레이는 여러 클라이언트에 연결할 수 있습니다: VNC Server -alwaysshared
  • 서비스 재시작: service VNC Server restart
  • VNC 서버 자동 시작: VNC 연결로 RedHat Linux 그래픽 인터페이스에 로그인한 후, "시스템" → "관리" → "서버 설정" → "서비스"로 이동하여 "백그라운드 서비스"에서 VNC Server를 선택하고 저장하면 됩니다.

태그: VNC TigerVNC systemd linux remote desktop

7월 3일 19:58에 게시됨