コンテンツにスキップ

Linux VDI環境の構築

Created: 2024/02/05

概要

Linux環境でVDIを実現する方法を調査する。

要素

  • VNC Server
  • TigerVNC ... Ubuntuではgnome-remote-desktopが初期装備としてあるが、VNC/RDPはあまり使いやすくない。一般的に使われていそうなTigerVNCを利用してみる
  • VDI
  • Apache Guacamole™ ... Apache「ワカモレ」と読む。ブラウザ経由で配下のサーバーにアクセスできる。

TigerVNC

Ubuntu DesktopでTigerVNCサーバーを使えるようにする。

インストール

sudo apt install tigervnc-standalone-server tigervnc-scraping-server

特定のユーザーでVNCサーバーを有効にする

VNCサーバーはユーザーごとにセッションを開く。一番ユースケースとしてありそうな「サーバーの特定のユーザー専用のVNC接続」を実現する。

ユーザーマッピングを定義

/etc/tigervnc/vncserver.usersにユーザーごとにディスプレイ&ポート番号への紐づけを書く。ここではshiba01ユーザーに:2を割り当てている。これはTCPポート5902(5900+2)をも意味する。

$ cat /etc/tigervnc/vncserver.users
# TigerVNC User assignment
#
# This file assigns users to specific VNC display numbers.
# The syntax is <display>=<username>. E.g.:
#
# :2=andrew
# :3=lisa

:2=shiba01

ユーザーごとのVNCパスワードを設定

VNCを利用したいユーザーにログインし、VNCのパスワードを設定します。これはOSのパスワードとは異なります。

shiba01@hostname:~$ vncpasswd
Password:
Verify:
Would you like to enter a view-only password (y/n)? n
A view-only password is not used

ユーザーごとにVNC設定を作成

~/.vnc/configにVNC設定を作成します。session=ubuntu/usr/share/xsessions/内の .desktopファイルで確認できます。また、localhost外から接続する場合はlocalhost=noの記述を忘れずに設定します。

shiba01@hostname:~$ cat ~/.vnc/config
session=ubuntu
localhost=no
alwaysshared

ディスプレイ番号ごとのsystemd unitファイルを作成

vncserverを自動起動するためにsystemd unitファイルを作成します。テンプレートがUbuntu Desktop 22.04の場合/lib/systemd/system/[email protected]にあるので次のように配置します。

sudo cp /lib/systemd/system/[email protected] /etc/systemd/system/tigervncserver@:2.service

その後、unitファイルを認識させた上でサービスを起動します。

$ sudo systemctl daemon-reload
$ sudo systemctl enable tigervncserver@:2
$ sudo systemctl restart tigervncserver@:2
$ systemctl status tigervncserver@:2
● tigervncserver@:2.service - Remote desktop service (VNC)
     Loaded: loaded (/etc/systemd/system/tigervncserver@:2.service; enabled; vendor preset: enabled)
     Active: active (running) since Tue 2024-02-06 01:22:18 JST; 2 days ago
   Main PID: 4777 (tigervncsession)
      Tasks: 0 (limit: 9430)
     Memory: 680.0K
        CPU: 11ms
     CGroup: /system.slice/system-tigervncserver.slice/tigervncserver@:2.service
              4777 /usr/sbin/tigervncsession shiba01 :2

 2月 06 01:22:18 vmtest2 systemd[1]: Starting Remote desktop service (VNC)...
 2月 06 01:22:18 vmtest2 tigervncsession[4777]: pam_unix(tigervnc:session): session opened for user shiba01(uid=1001) b>
 2月 06 01:22:18 vmtest2 systemd[1]: Started Remote desktop service (VNC).

VNCクライアントから接続する(Ultra VNC)

Ultra VNCから接続する。※IPアドレス192.168.10.116

alt

ポートが空いているか

$ nmap 0.0.0.0 -p 5900-5999
Starting Nmap 7.80 ( https://nmap.org ) at 2024-02-08 23:38 JST
Nmap scan report for 0.0.0.0
Host is up (0.00016s latency).
Not shown: 99 closed ports
PORT     STATE SERVICE
5902/tcp open  vnc-2

Nmap done: 1 IP address (1 host up) scanned in 0.03 seconds

参考

Apache Guacamole

結果

alt text

guacamole/
┣ pgdata/
┃ ┗ guacamole/
┣ pginit/
┃ ┗ initdb.sql
┗ docker-compose.yml

手順

sudo docker run --rm guacamole/guacamole /opt/guacamole/bin/initdb.sh --postgresql > ./pginit/initdb.sql
sudo docker compose up -d

docker compose

version: "3"
services:

  postgres:
    image: postgres:latest
    restart: unless-stopped
    environment:
      PGDATA: /var/lib/postgresql/data/guacamole
      POSTGRES_DB: guacamole_db
      POSTGRES_PASSWORD: guacamole_db_password
      POSTGRES_USER: guacamole_user
    volumes:
      - ./pginit:/docker-entrypoint-initdb.d
      - ./pgdata:/var/lib/postgresql/data

  guacd:
    image: guacamole/guacd:latest
    restart: unless-stopped
    # volumes:
    #   - ./guacd/guacamole:/var/lib/guacamole

  guacamole:
    image: guacamole/guacamole:latest
    restart: unless-stopped
    ports:
      - 8080:8080
    environment:
      GUACD_HOSTNAME: guacd
      POSTGRESQL_HOSTNAME: postgres
      POSTGRESQL_DATABASE: guacamole_db
      POSTGRESQL_PASSWORD: guacamole_db_password
      POSTGRESQL_USER: guacamole_user
    depends_on:
      - postgres
      - guacd
    # volumes:
    #   - ./guacamole/extensions:/etc/guacamole/extensions
    #   - ./guacamole/server.xml:/usr/local/tomcat/conf/server.xml
    #   - ./guacd/guacamole:/var/lib/guacamole

参考