Virtual Network Computing یا VNC یک سیستم اتصال است که این امکان را می‌دهد که از موس و صفحه کلید برای ارتباط برقرار کردن با یک محیط دسکتاپ گرافیکی روی یک سیستم از راه دور استفاده نماییم. این امر باعث می‌شود که مدیریت فایل‌ها، نرم‌افزارها و تنظیمات بر روی یک سرور از راه دور برای کاربرانی که با خط فرمان (Command Line) آشنایی ندارند، آسان‌تر شود.

در این آموزش، VNC را بر روی یک سرور اوبونتو Ubuntu نسخه 18.04 نصب و کانفیگ خواهیم کرد و از طریق تونل SSH به آن متصل خواهیم شد. بدین منظور از بسته TightVNC که یک بسته کنترلی سبک و سریع جهت کنترل از راه دور می‌باشد، استفاده می‌کنیم.

پیش نیازها

جهت استفاده از این آموزش به موارد زیر نیاز داریم.

  • یک سرور Ubuntu 18.04 به همراه یک کاربر با دسترسی sudo
  • در ویندوز Windows می‌توانیم از نرم‌افزار TightVNC یا RealVNC یا UltraVNC استفاده کنیم.
  • در مک MacOS می‌توانیم از نرم‌افزار Screen Sharing یا RealVNC استفاده کنیم.
  • در لینوکس Linux می‌توانیم از ابزارهایی نظیر vinagre، krdc، RealVNC یا TightVNC استفاده کنیم.

مرحله 1 – نصب محیط دسکتاپ و VNC Server

بصورت پیش‌فرض در Ubuntu 18.04 نسخه سرور، محیط دسکتاپ گرافیکی یا VNC Server نصب نشده است. با استفاده از آموزش زیر، آخرین نسخه بسته‌های محیط دسکتاپ Xfce و بسته TightVNC که در مخزن رسمی اوبونتو وجود دارد را نصب خواهیم کرد.

ابتدا با استفاده از دستور زیر، لیست بسته‌ها (Packages) را بروز می‌کنیم.

sudo apt update

محیط دسکتاپ را با دستور زیر نصب می‌کنیم.

sudo apt install xfce4 xfce4-goodies

پس از نصب محیط دسکتاپ Xfce، بسته TightVNC Server را نصب می‌کنیم.

sudo apt install tightvncserver

برای تکمیل پیکربندی یا کانفیگ اولیه VNC Server از دستور vncserver برای تنظیم رمز عبور امن و ایجاد فایل‌های کانفیگ اولیه استفاده می‌کنیم.

vncserver

در محیط ترمینال، رمز عبور برای دسترسی از راه دور (Remote) را وارد و تایید می‌کنیم.

خروجی:

You will require a password to access your desktops.

Password:
Verify:

رمز عبور می‌بایست بین 6 تا 8 کاراکتر باشد. رمز عبور بیشتر از 8 کاراکتر بصورت خودکار کوتاه و به 8 کاراکتر شکسته خواهد شد.

در صورت دریافت خطای زیر:

Couldn't start Xtightvnc; trying default font path.
Please set correct fontPath in the vncserver script.
Couldn't start Xtightvnc process.

17/02/20 06:29:03 Xvnc version TightVNC-1.3.10
17/02/20 06:29:03 Copyright (C) 2000-2009 TightVNC Group
17/02/20 06:29:03 Copyright (C) 1999 AT&T Laboratories Cambridge
17/02/20 06:29:03 All Rights Reserved.
17/02/20 06:29:03 See http://www.tightvnc.com/ for information on TightVNC
17/02/20 06:29:03 Desktop name 'X' (ubuntu-2gb-hel1-1:1)
17/02/20 06:29:03 Protocol versions supported: 3.3, 3.7, 3.8, 3.7t, 3.8t
17/02/20 06:29:03 Listening for VNC connections on TCP port 5901
Font directory '/usr/share/fonts/X11/misc/' not found - ignoring
Font directory '/usr/share/fonts/X11/Type1/' not found - ignoring
Font directory '/usr/share/fonts/X11/75dpi/' not found - ignoring
Font directory '/usr/share/fonts/X11/100dpi/' not found - ignoring

Fatal server error:
could not open default font 'fixed'

می‌بایست بسته xfonts-base را با دستور زیر نصب نماییم.

sudo apt install xfonts-base

در صورت روبرو شدن با خطای زیر هنگام ورود به محیط VNC:

Unable to load a failsafe session
Unable to determine failsafe session name. Possible causes xconfd isn't running (D-Bus setup problem);
environment variable $XDG_CONFIG_DIRS is set incorrectly (must include "/etc") or xfce4-session is installed incorrectly.

دستورات زیر را اجرا نمایید، سپس مجدداً به VNC متصل شوید.

unset SESSION_MANAGER
unset DBUS_SESSION_BUS_ADDRESS

 

مرحله 2 – کانفیگ VNC Server

VNC Server هنگام راه‌اندازی و شروع به کار باید بداند چه دستوراتی را اجرا کند و همچنین باید بداند که به کدام محیط دسکتاپ گرافیکی متصل شود.

این تنظیمات در یک فایل به نام xstartup و پوشه .vnc در زیر شاخه home قرار دارد. اسکریپت استارتاپ در مرحله قبل زمان اجرای vncserver ایجاد شده است، ولی برای راه‌اندازی دسکتاپ Xfce باید خودمان آن را ایجاد کنیم.

زمان اجرای VNC برای اولین بار، یک نمونه سرور پیش‌فرض را بر روی پورت 5901 راه‌اندازی می‌کند. این پورت به عنوان پورت نمایشگر نامیده می‌شود و توسط VNC به بصورت :1 می‌باشد. VNC می‌توانید چندین بار بر روی پورت‌های نمایشگر دیگر نظیر :2 و :3 راه‌اندازی شود.

از آنجایی که قصد داریم نحوه کانفیگ و پیکربندی VNC Server را تغییر دهیم، در مرحله اول می‌بایست نمونه ایجاد شده VNC Server که بر روی پورت 5901 در حال اجرا می‌باشد را متوقف (Stop) کنیم.

vncserver -kill :1

خروجی می‌بایست به شکل زیر باشد. البته با توجه به هر سرور یک PID متفاوت را مشاهده خواهیم کرد.

Killing Xtightvnc process ID 7384

قبل از ایجاد تغییر در فایل xstartup. ابتدا از آن یک نسخه پشتیبان تهیه می‌کنیم.

mv ~/.vnc/xstartup ~/.vnc/xstartup.bak

سپس با ویرایشگر دلخواه، یک فایل جدید xstartup. ایجاد و آن را ویرایش می‌کنیم.

vi ~/.vnc/xstartup

دستورات موجود در فایل کانفیگ VNC Server پس از شروع (Start) یا راه اندازی مجدد (Restart) بطور خودکار اجرا می‌شوند. برای Start محیط گرافیکی در صورتی که از قبل Start نشده باشد، به VNC نیاز داریم.

دستورات زیر را به فایل اضافه می‌کنیم.

#!/bin/bash
xrdb $HOME/.Xresources
startxfce4 &

فایل را ذخیره و از آن خارج می‌شویم.

برای مطمئن شدن از اینکه VNC Server قادر به استفاده صحیح از این فایل جهت راه‌اندازی جدید خواهد بود، باید آن را بصورت Executable تغییر دهیم.

sudo chmod +x ~/.vnc/xstartup

سپس، VNC Server را Restart می‌کنیم.

vncserver

خروجی نظیر زیر را مشاهده خواهیم کرد.

New 'X' desktop is your_hostname:1

Starting applications specified in /home/sammy/.vnc/xstartup
Log file is /home/sammy/.vnc/your_hostname:1.log

با کانفیگ موجود، می‌توانیم از سیستم خانگی به سرور متصل شویم.

مرحله 3 – اتصال به دسکتاپ VNC

با استفاده یکی از نرم‌افزارهای ذکر شده در قسمت “پیش نیازها” می‌توانیم به محیط دسکتاپ Xfce متصل شویم.

پس از اتصال به محیط دسکتاپ سرور، دسکتاپ Xfce بصورت زیر قابل مشاهده می‌باشد.

مرحله 4 – اجرای VNC به عنوان یک System Service

در این مرحله، VNC Server را به عنوان یک سرویس systemd تنظیم خواهیم کرد و خواهیم توانست مانند هر سرویس دیگری در صورت نیاز آن را Start, Stop, Restart کرد. و همچنین انجام این کار باعث Start سرویس VNC Server پس از ریستارت سرور خواهد شد.

ابتدا با استفاده از یک ویرایشگر متن، فایل جدیدی را ایجاد خواهیم کرد.

sudo vi /etc/systemd/system/vncserver@.service

علامت @ در انتهای نام vncserver باعث می‌شود که بتوانیم به پورت دلخواه VNC متصل شویم.

خطوط زیر را به فایل اضافه می‌کنیم. می‌بایست بخش‌های User, Grou, WorkingDirectory و همچنین Username را بصورت صحیح وارد نماییم.

[Unit]
Description=Start TightVNC server at startup
After=syslog.target network.target

[Service]
Type=forking
User=sammy
Group=sammy
WorkingDirectory=/home/sammy

PIDFile=/home/sammy/.vnc/%H:%i.pid
ExecStartPre=-/usr/bin/vncserver -kill :%i > /dev/null 2>&1
ExecStart=/usr/bin/vncserver -depth 24 -geometry 1280x800 :%i
ExecStop=/usr/bin/vncserver -kill :%i

[Install]
WantedBy=multi-user.target

دستور ExecStartPre در صورتی که VNC از قبل از در حال اجرا باشد را متوقف می‌کند. دستور ExecStartPre، سرویس VNC را Start و رزولوشن را بر روی 1280×800 تنظیم می‌کند. در صورت نیاز می‌توانید تغییرات را بصورت دلخواه انجام دهید.

جهت آگاه سازی سیستم یا سرور از وجود فایل unit جدید، از دستور زیر استفاده می‌کنیم.

sudo systemctl daemon-reload

با استفاده از دستور زیر، سرویس را فعال می‌کنیم.

sudo systemctl enable vncserver@1.service

عدد 1 پس از علامت @ به این معنی می‌باشد که کدام شماره نمایش سرور باید اجرا شود.

با استفاده از دستور زیر، نمونه فعلی VNC Server را متوقف (Stop) می‌کنیم.

vncserver -kill :1

سپس با استفاده از دستور زیر آن را Start می‌کنیم.

sudo systemctl start vncserver@1

با استفاده از دستور status می‌توانیم وضعیت سرویس را بررسی نماییم.

sudo systemctl status vncserver@1

خروجی نمونه بصورت زیر می‌باشد.

● vncserver@1.service - Start TightVNC server at startup
   Loaded: loaded (/etc/systemd/system/vncserver@.service; enabled; vendor preset: enabled)
   Active: active (running) since Thu 2019-10-10 17:56:17 UTC; 5s ago
  Process: 935 ExecStartPre=/usr/bin/vncserver -kill :1 > /dev/null 2>&1 (code=exited, status=2)
  Process: 940 ExecStart=/usr/bin/vncserver -depth 24 -geometry 1280x800 :1 (code=exited, status=0/SUCCESS)
 Main PID: 948 (Xtightvnc)
. . .

VNC Server تا زمان ریستارت سرور، در دسترس خواهد بود.