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 インストール
Section titled “lima インストール”$ mise plugins install lima$ mise ls-remote lima# 最新をインストール$ mise install lima 0.19.0$ mise global lima 0.19.0homebrew 用
$ brew install limaAnsible インストール
Section titled “Ansible インストール”$ mise plugins install ansible-base$ mise install ansible-base 2.10.17$ mise local ansible-base 2.10.17qemu-ubuntu.yaml は以下の URL に置いています。
https://github.com/kntks/blog-code/blob/main/2024/01/vdi-lima-dcv/qemu-ubuntu.yaml
$ limactl start --name qemu-ubuntu --tty=false qemu-ubuntu.yamllimactl lsコマンドで SSH のポートや cpu のアーキテクチャを調べることができます。shell  を開始して、unameコマンドで確認もできます。
x86 をエミュレートできていそうです。
$ limactl ls qemu-ubuntuNAME           STATUS     SSH                VMTYPE    ARCH      CPUS    MEMORY    DISK     DIRqemu-ubuntu    Running    127.0.0.1:50022    qemu      x86_64    4       4GiB      20GiB    ~/.lima/qemu-ubuntu
$ limactl shell qemu-ubuntu$ uname -mx86_64lima で立ち上げた VM に Ansibleを実行してみる
Section titled “lima で立ち上げた VM に Ansibleを実行してみる”Ansible で簡単な playbook を作成し、VM の情報が出力される確認してみます。
---- 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.stdoutqemu-ubuntu.yaml ファイルで ssh.localPort を50022にしました。Ansible で playbook を実行するときにその port をオプションで指定します。
$ 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出力結果に Linux、x86_64 と書かれているので、VM で Ansible を実行できていることが確認できました。
NICE DCV をインストールする
Section titled “NICE DCV をインストールする”今回は DCV をインストールする playbook を以下のように role に切り出しています。
$ tree ansibleansible├── 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 にしています。)
$ ansible-playbook playbook.yml -i localhost, --ssh-extra-args '-p 50022'セッションを作成する
Section titled “セッションを作成する”一度VMを止めて、再度起動します。
$ limactl stop qemu-ubuntu$ limactl start qemu-ubuntuDCV をインストールしたので、dcv コマンドが実行できるようになりました。セッションの一覧を確認してみましょう。
$ limactl shell qemu-ubuntu$ dcv list-sessionsThere are no sessions available.セッションが存在しないので、dcv create-session コマンドで作成します。
$ sudo dcv create-session --type console --owner ubuntu console
$ dcv list-sessionsSession: 'console' (owner:ubuntu type:console)Web ブラウザからアクセスする
Section titled “Web ブラウザからアクセスする”1つ前の作業でセッションを作成しました。今度は、https://localhost:8443/#console にアクセスします。

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

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

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

Lima で作成した VM 上に NICE DCV をインストールして VDI を実現することができました。すべてローカル環境で実現することができたので、動作確認がしやすくなったと思います。
クラウドの利用料が存在しないためコスト削減にも貢献できると思います。
トラブルシュート
Section titled “トラブルシュート”crypt.crypt not supported on Mac OS X/Darwin, install passlib python module
Section titled “crypt.crypt not supported on Mac OS X/Darwin, install passlib python module”fatal: [localhost]: FAILED! => {"msg": "crypt.crypt not supported on Mac OS X/Darwin, install passlib python module"}mise で ansible をインストールした場合、実行している python のパスから調べた方が良さそうです。
エラーを読むと path が書いてあると思うので、 pip list コマンドで passlib が入っているか確認してください
$ ~/.local/share/mise/installs/ansible-base/2.10.17/venv/bin/python3 -m pip list存在しない場合は、以下のコマンドを実行して passlib をインストールしてください。
$ ~/.local/share/mise/installs/ansible-base/2.10.17/venv/bin/python3 -m pip install passlib