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 インストール
$ mise plugins install lima$ mise ls-remote lima# 最新をインストール$ mise install lima 0.19.0$ mise global lima 0.19.0
homebrew 用
$ brew install lima
Ansible インストール
$ 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
$ limactl start --name qemu-ubuntu --tty=false qemu-ubuntu.yaml
limactl 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_64
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.stdout
qemu-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 をインストールする
今回は 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'
セッションを作成する
一度VMを止めて、再度起動します。
$ limactl stop qemu-ubuntu$ limactl start qemu-ubuntu
DCV をインストールしたので、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 ブラウザからアクセスする
1つ前の作業でセッションを作成しました。今度は、https://localhost:8443/#console にアクセスします。
Username = ubuntu、 Password = ubuntu でログインします。
こちらも同様に Password = ubuntu でログインします。
無事にデスクトップが表示されました!
まとめ
Lima で作成した VM 上に NICE DCV をインストールして VDI を実現することができました。すべてローカル環境で実現することができたので、動作確認がしやすくなったと思います。
クラウドの利用料が存在しないためコスト削減にも貢献できると思います。
トラブルシュート
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