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
ポートが空いているか
$ 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
参考
- TigerVNC - ArchWiki
- 第13章 TigerVNC Red Hat Enterprise Linux 7 | Red Hat Customer Portal
- つまずかない!?TigerVNCでリモートデスクトップ #VNC - Qiita
Apache Guacamole
結果
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