Skip to content

Ubuntuデスクトップ環境をLimaとNice DCVで構築する方法

はじめに

Mac で Ubuntu の仮想デスクトップを実現したい場合、通常は VNC が必要になりますが、VNC で表示したデスクトップの動作が重くストレスが溜まることがあります。さらに、Web ブラウザからアクセスしたい場合は noVNC の使用が必要であり、React に仮想デスクトップの機能を統合したい場合は、サードパーティーのライブラリである react-vnc を使用する必要があります。

今回は NICE DCV(以下: DCV)を使用したいと思います。DCV は、リモートデスクトップ接続を提供するソフトウェアであり、標準で Web ブラウザからのアクセスで仮想デスクトップを実現することができ、UI SDK も提供されています。

DCV サーバを起動するにはサーバが必要で、これを実現する1つの手段として AWS などのクラウドを利用することが考えられます。しかし、使用する EC2 インスタンスタイプによっては費用がかかるというデメリットが存在し、またサーバの起動に時間がかかるという問題もあります。これらの問題を解決するために、ローカル環境でサーバを立ち上げて手軽に動作確認したいと思います。

しかし、課題として NICE DCV サーバは Apple Silicon の Mac 上で実行できません。これに対する解決策として、Lima が内部で QEMU を使っているため、x86 のアーキテクチャをエミュレートできることを利用します。具体的には、Ubuntu イメージを使用して Lima で VM を立ち上げ、その上で DCV を起動します。これにより、Mac 上から Web ブラウザでアクセス可能な仮想環境を簡単に作成できます。

成果物

https://github.com/kntks/blog-code/tree/main/2024/01/vdi-lima-dcv

環境構築

環境構築にあたってツールのインストールは mise (旧rtx) を使います。

lima インストール

Terminal window
$ mise plugins install lima
$ mise ls-remote lima
# 最新をインストール
$ mise install lima 0.19.0
$ mise global lima 0.19.0

homebrew 用

Terminal window
$ brew install lima

Ansible インストール

Terminal window
$ mise plugins install ansible-base
$ mise install ansible-base 2.10.17
$ mise local ansible-base 2.10.17

VM 起動

qemu-ubuntu.yaml は以下の URL に置いています。

https://github.com/kntks/blog-code/blob/main/2024/01/vdi-lima-dcv/qemu-ubuntu.yaml

Terminal window
$ limactl start --name qemu-ubuntu --tty=false qemu-ubuntu.yaml

limactl lsコマンドで SSH のポートや cpu のアーキテクチャを調べることができます。shell を開始して、unameコマンドで確認もできます。
x86 をエミュレートできていそうです。

Terminal window
$ limactl ls qemu-ubuntu
NAME STATUS SSH VMTYPE ARCH CPUS MEMORY DISK DIR
qemu-ubuntu Running 127.0.0.1:50022 qemu x86_64 4 4GiB 20GiB ~/.lima/qemu-ubuntu
$ limactl shell qemu-ubuntu
$ uname -m
x86_64

lima で立ち上げた VM に Ansibleを実行してみる

Ansible で簡単な playbook を作成し、VM の情報が出力される確認してみます。

playbook.yaml
---
- hosts: all
become: true
gather_facts: false
tasks:
- name: shell
ansible.builtin.shell: uname -a
register: uname_result
- name: output result
ansible.builtin.debug:
var: uname_result.stdout

qemu-ubuntu.yaml ファイルで ssh.localPort を50022にしました。Ansible で playbook を実行するときにその port をオプションで指定します。

Terminal window
$ ansible-playbook playbook.yml -i localhost, --ssh-extra-args '-p 50022'
PLAY [all] ****************************************************************************************************************************
TASK [shell] **************************************************************************************************************************
changed: [localhost]
TASK [output result] ******************************************************************************************************************
ok: [localhost] => {
"uname_result.stdout": "Linux lima-qemu-ubuntu 5.15.0-57-generic #63-Ubuntu SMP Thu Nov 24 13:43:17 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux"
}
PLAY RECAP ****************************************************************************************************************************
localhost : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

出力結果に Linuxx86_64 と書かれているので、VM で Ansible を実行できていることが確認できました。

NICE DCV をインストールする

今回は DCV をインストールする playbook を以下のように role に切り出しています。

Terminal window
$ tree ansible
ansible
├── playbook.yml
└── roles
├── common
│   ├── tasks
│   │   └── main.yml
│   └── vars
│   └── main.yml
└── dcv
├── files
│   └── xorg.conf
├── tasks
│   └── main.yml
└── vars
└── main.yml

ファイルは以下の URL に置いています。 https://github.com/kntks/blog-code/tree/main/2024/01/vdi-lima-dcv/ansible

先ほどと同様に ansible コマンドを実行します。 (今回は ubuntu-desktop ではなく、ubuntu-desktop-minimal にしています。)

Terminal window
$ ansible-playbook playbook.yml -i localhost, --ssh-extra-args '-p 50022'

セッションを作成する

一度VMを止めて、再度起動します。

Terminal window
$ limactl stop qemu-ubuntu
$ limactl start qemu-ubuntu

DCV をインストールしたので、dcv コマンドが実行できるようになりました。セッションの一覧を確認してみましょう。

Terminal window
$ limactl shell qemu-ubuntu
$ dcv list-sessions
There are no sessions available.

セッションが存在しないので、dcv create-session コマンドで作成します。

Terminal window
$ sudo dcv create-session --type console --owner ubuntu console
$ dcv list-sessions
Session: 'console' (owner:ubuntu type:console)

Web ブラウザからアクセスする

1つ前の作業でセッションを作成しました。今度は、https://localhost:8443/#console にアクセスします。

error

Username = ubuntu、 Password = ubuntu でログインします。 dcv-login

こちらも同様に Password = ubuntu でログインします。 ubuntu-login

無事にデスクトップが表示されました! ubuntu-desktop

まとめ

Lima で作成した VM 上に NICE DCV をインストールして VDI を実現することができました。すべてローカル環境で実現することができたので、動作確認がしやすくなったと思います。

クラウドの利用料が存在しないためコスト削減にも貢献できると思います。

トラブルシュート

crypt.crypt not supported on Mac OS X/Darwin, install passlib python module

Terminal window
fatal: [localhost]: FAILED! => {"msg": "crypt.crypt not supported on Mac OS X/Darwin, install passlib python module"}

mise で ansible をインストールした場合、実行している python のパスから調べた方が良さそうです。
エラーを読むと path が書いてあると思うので、 pip list コマンドで passlib が入っているか確認してください

Terminal window
$ ~/.local/share/mise/installs/ansible-base/2.10.17/venv/bin/python3 -m pip list

存在しない場合は、以下のコマンドを実行して passlib をインストールしてください。

Terminal window
$ ~/.local/share/mise/installs/ansible-base/2.10.17/venv/bin/python3 -m pip install passlib