見出し画像

開発日誌:LXD デスクトップVNC(完成)

ようやくKVM仮想化基盤のホスト上にLXDコンテナでVNCリモートデスクトップの仮想マシンマネージャー環境が完成しました。

感無量です。

LXD_VNC_仮想マシンマネージャー

今日の作業内容

昨日まででXRDP接続までできていたのですが、今日はリモート接続をVNCに変更してコンテナを再構築しました。

その後、dnsmasqの名前解決機能がうまく作動しないところをLXDの公式ドキュメントを元にリゾルバデーモンを設定

その後、コンテナないのユーザーIDなどを細かいところを調整して仮想マシンマネージャーのSSH接続設定を行いました。

VNC接続設定

VNC接続設定は、接続するユーザー事に実施するします。

昨日の参考サイトだとデーモンに登録していましたがうまく動かなかったので(デーモンのPIDの権限エラーになる:要調査)以前から次環境で設定が確立している方法にしました。

その際、インストールするVNCのパッケージは次のを使っています。

sudo apt -y install tigervnc-standalone-server 

接続を許可するユーザーでVNC用のパスワードを設定します。
view-only passwordの関する問い合わせには[n]と回答しておきます。

vncpasswd

# VNC接続パスワードを入力
Password:
Verify:
Would you like to enter a view-only password (y/n)? n


パスワードの設定が完了したらVNC設定ファイルを作成します。

まずはVNCスタートアップスクリプトの作成です。

vi ~/.vnc/xstartup

#### 記述する設定は次の通り

#!/bin/sh
[ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup
[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
vncconfig -iconic &
dbus-launch --exit-with-session gnome-session &

設定が完了したのでVNCサーバーを起動します

vncserver :1 -localhost no -geometry 800x600 -depth 24

上記のコマンドの意味は、以下のようなもの

1. localhost:リモート接続のうち、セキュアトンネルを利用してないものを禁止 (noにする事でトンネル作らずアクセスできる)
2. geometry:画面のサイズ
3. depth:画面のビットカラー 8 (256色)、 16 (最大65536色)、 24 (最大約1600万色)のいずれかを指定

コマンドを実行すると次の様な標準出力が出てきます。

/usr/bin/xauth:  file /home/masahiro/.Xauthority does not exist

New 'speculum:1 (masahiro)' desktop at :1 on machine speculum

Starting applications specified in /home/masahiro/.vnc/xstartup
Log file is /home/masahiro/.vnc/speculum:1.log

Use xtigervncviewer -SecurityTypes VncAuth,TLSVnc -passwd /home/masahiro/.vnc/passwd speculum:1 to connect to the VNC server.

実際にきちんと起動しているかをVNCコマンドで確認します。

vncserver -list

VNCの仮想ディスプレイ番号とそれに接続するためのTCPポート番号そしてプロセスIDが出力されます。


TigerVNC server sessions:
X DISPLAY #     RFB PORT #      PROCESS ID
:1              5901            3290

ホスト側のポートの接続

まずは、昨日やったProxy設定

vncの接続ポートをProxyでホスト側へ転送

lxc config device add VMmana vnc proxy listen=tcp:192.168.111.94:5909 connect=tcp:127.0.0.1:5901 bind=host
192.168.111.94:5909がホスト側のIPとポート番号(実際にクライアントから接続を受け付ける側)
tcp:127.0.0.1:5901がコンテナ側にポートになります。

あとは、昨日の手順と同じでUFW設定を適用してポートを解放します。

途中割愛

ファイヤーウォールを許可する。

sudo ufw allow from 192.168.200.100 to any app "vnc"
sudo ufw reload
sudo ufw status

クライアントからVNC接続を試してみみる。

LXD dnsmasqに名前解決

LXDのネットワーク接続でホスト側でも名前解決できるように設定します。

まずはLXD用のブリッジネットワークを確認します。

ip a show lxdbr0
38: lxdbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
   link/ether 00:16:3e:93:5c:1f brd ff:ff:ff:ff:ff:ff
   inet 10.200.0.1/24 scope global lxdbr0
      valid_lft forever preferred_lft forever
   inet6 fd42:99db:6cd2:9ba9::1/64 scope global
      valid_lft forever preferred_lft forever
   inet6 fe80::216:3eff:fe93:5c1f/64 scope link
      valid_lft forever preferred_lft forever

LXDブリッジネットワークのIPアドレスを範囲を任意に設定しておく

LXD公式日本語ドキュメントを参考にしました。

https://lxd-ja.readthedocs.io/ja/latest/networks/

lxc network edit lxdbr0

ネットワークアドレスを変更します。今回は、[111.222.33.1/24]です。

config:
 ipv4.address: 111.222.33.1/24
 ipv4.nat: "true"

LXD用のブリッジネットワークの設定変更を確認

ip a show lxdbr0

20: lxdbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
   link/ether 00:16:3e:93:5c:1f brd ff:ff:ff:ff:ff:ff
   inet 10.200.41.1/24 scope global lxdbr0
      valid_lft forever preferred_lft forever
   inet6 fd42:99db:6cd2:9ba9::1/64 scope global
      valid_lft forever preferred_lft forever
   inet6 fe80::216:3eff:fe93:5c1f/64 scope link
      valid_lft forever preferred_lft forever

特に何もする必要はなく即時変更になります。ただ注意としてブリッジインターフェースは変更されますがすでに作成済みのコンテナ側はそのままになります。

LXD用のresolveデーモンサービスを作成

sudo vi /etc/systemd/system/lxd-dns-lxdbr0.service

サービス設定

[Unit]
Description=LXD per-link DNS configuration for lxdbr0
BindsTo=sys-subsystem-net-devices-lxdbr0.device
After=sys-subsystem-net-devices-lxdbr0.device

[Service]
Type=oneshot
ExecStart=/usr/bin/resolvectl dns lxdbr0 111.222.33.1
ExecStart=/usr/bin/resolvectl domain lxdbr0 '~lxd'

[Install]
WantedBy=sys-subsystem-net-devices-lxdbr0.device

ExecStart=/usr/bin/resolvectl dns lxdbr0の後のIPアドレスは、lxbr0の設定で指定した値です。

デーモンを再読み込みしてサービスを起動

sudo systemctl daemon-reload
sudo systemctl enable --now lxd-dns-lxdbr0

リゾルバ設定に追加されているかを確認

systemd-resolve --status | grep -A 10 "lxdbr0"

実行結果

Link 20 (lxdbr0)
     Current Scopes: DNS
DefaultRoute setting: no
      LLMNR setting: yes
MulticastDNS setting: no
 DNSOverTLS setting: no
     DNSSEC setting: no
   DNSSEC supported: no
 Current DNS Server: 111.222.33.1
        DNS Servers: 111.222.33.1
         DNS Domain: ~lxd

これで名前解決ができる様になります。コンテナのホスト名を任意で指定していなければ「コンテナ名.lxd」で名前解決できます。

あとは、仮想マシンマネージャーのパッケージをインストールしてSSH接続設定もろもろをコンテナからホストへできる様にすれば構築完了です。

私の環境だとホスト側がUFWとTCPワッパーで接続制限をかけているのでコンテナのネットワークアドレスを許可する様に設定することで接続を許可しました。

結構かかりましたが目的のコンテナが完成しました。あとは、+α機能を拡張してコンテナ構築のcloud-initをもう少し追加項目を行う予定です。

コンテナを本格的に使いだして1ヶ月ぐらいたってようやく3つ作れたました。

コンテナはとても便利でいいですね。ただこれだけで全て解決出来ない部分もあるのでVMと合わせて使いこなせる様にまだまだ使い込んでいこうと思います。

今日はこれくらいです。それではまた明日、お疲れ様でした。

この記事が気に入ったらサポートをしてみませんか?