🖥️

DockerもいいけどLXDもね 1 〜LXDEデスクトップ環境の構築〜

2021/03/30に公開

コンテナっていえばDockerみたいな風潮あるけど
LXDも便利ですよって話。

コンテナ界隈は小難しい話が多くてさっぱり付いていけませんが

軽量なVMが欲しい=LXD
ホストOSから隔離した環境でアプリ動かしたい=Docker

っていう感じで使ってます。

Dockerだとサービス起動とか難しいけどLXDは普通に最初から起動してて便利だね!
ってノリです

実行環境に関してはこっち見て下さい

https://zenn.dev/tantan_tanuki/articles/d74280a9209fc1

インストールしてみる

snapモジュールで提供されています。

Linux Mintの人はsnapdを有効化するのにちょっと工夫が必要ですが。。。

snap install lxd
sudo lxd init --auto

でインストール完了です。
init時の--autoを外すと初期値の設定を色々自分でいじれます。
私はここ弄ったこと無いのでautoにしてます。

lxcとかlxdコマンドはlxdグループのメンバなら弄れますので
sudo面倒な場合は作業ユーザをlxdグループに所属させればOKです。
私はもう所属させちゃってますのでsudo省いてますが
所属させてない人はsudo付けてやってくださいね。

使えるイメージを探す

とりあえず使えるイメージの一覧はこれで取得出来ます。

# Ubuntuイメージサーバ上のイメージリスト
lxc image list ubuntu: amd64

# その他イメージサーバ上のイメージリスト
lxc image list images: amd64

一杯あるので自分の使ってるCPUのamd64アーキテクチャで絞っています。
興味がアレばamd64を消してどんなのがあるか確認してもいいですね。

とりあえずUbuntu21.04を使ってみる

lxc launch images:ubuntu/21.04 containername

images:ubuntu/21.04のimagesがイメージサーバの名前で:の後ろがイメージ名です
containernameがhost名になりますが省略するとランダムに割り当てられます。

イメージをダウンロードし終えたら起動するので確認してみましょう。

$ lxc list
+---------------+---------+----------------------+----------------------------------------------+-----------+-----------+
|     NAME      |  STATE  |         IPV4         |                     IPV6                     |   TYPE    | SNAPSHOTS |
+---------------+---------+----------------------+----------------------------------------------+-----------+-----------+
| containername | RUNNING | 10.116.214.82 (eth0) | fd42:d878:2ae:7d9e:216:3eff:fee5:7f32 (eth0) | CONTAINER | 0         |
+---------------+---------+----------------------+----------------------------------------------+-----------+-----------+

RUNNINGになってますね。

コンテナの中に入って何が動いているか見てみましょう

$ lxc shell containername
root@containername:~# ps -ef
UID          PID    PPID  C STIME TTY          TIME CMD
root           1       0  0 01:14 ?        00:00:00 /sbin/init
root          43       1  0 01:14 ?        00:00:00 /lib/systemd/systemd-journald
root          78       1  0 01:14 ?        00:00:00 /lib/systemd/systemd-udevd
systemd+      91       1  0 01:14 ?        00:00:00 /lib/systemd/systemd-networkd
root         107       1  0 01:14 ?        00:00:00 /usr/sbin/cron -f -P
message+     108       1  0 01:14 ?        00:00:00 @dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only
root         111       1  0 01:14 ?        00:00:00 /usr/bin/python3 /usr/bin/networkd-dispatcher --run-startup-triggers
syslog       112       1  0 01:14 ?        00:00:00 /usr/sbin/rsyslogd -n -iNONE
root         113       1  0 01:14 ?        00:00:00 /lib/systemd/systemd-logind
systemd+     114       1  0 01:14 ?        00:00:00 /lib/systemd/systemd-resolved
root         123       1  0 01:14 pts/0    00:00:00 /sbin/agetty -o -p -- \u --noclear --keep-baud console 115200,38400,9600 linux
root         230       0  0 01:17 pts/0    00:00:00 bash
root         241     230  0 01:18 pts/0    00:00:00 ps -ef

なんということでしょう最低限のデーモンが稼働してます!
私みたいにDockerでやるべき事じゃないのにこれと同じようなこと実現しようとして涙ぐましい努力した人達なら血の悔し涙を流すレベルですね🙀

そしておもむろにGUIを構築

こんな豪華な環境なのにCUIでカチャカチャやるのってDockerやってるのと変わらなくてつまらないですよね?
とりあえずコンテナにGUI環境とVNCサーバをインストールしましょう

途中gdmかlightdmか聞かれたりしますがどっちでもいいです。

apt update -y
apt install -y lxde tightvncserver

ここで私は生粋の日本人なので日本語環境を入れます。
時間かかるので英語に自信ありな方々には不要ですので読み飛ばしてOKです。

apt install -y gnupg wget
wget -q https://www.ubuntulinux.jp/ubuntu-ja-archive-keyring.gpg -O- | apt-key add -
wget -q https://www.ubuntulinux.jp/ubuntu-jp-ppa-keyring.gpg -O- | apt-key add -
wget https://www.ubuntulinux.jp/sources.list.d/focal.list -O /etc/apt/sources.list.d/ubuntu-ja.list
apt update -y && apt upgrade -y && apt install -y ubuntu-defaults-ja
dpkg-reconfigure tzdata
update-locale LANG=ja_JP.UTF-8

デフォルトで存在するubuntuユーザでVNCサーバを起動します。

su ubuntu -c 'vncserver :1 -geometry 1920x1080 -depth 24'

geometryの引数がVNCの画面解像度になります。
フルスクリーンで使う場合は
xdpyinfo |grep dim
で現在の画面サイズを取得して同じものを設定すると良いと思います。

初回起動時だけVNC接続する時のPWを聞かれますので設定しましょう。

さてこれだけでもうデスクトップ環境は完成しています。
ホストOSに戻ってVNCで接続する為のクライアントをインストールしましょう。

すでに別のクライアント入ってるとか違うクライアントがいい人はそっち使って下さい。

apt install remmina remmina-plugin-vnc

そして起動したら

Imgur

こんな感じで保存して接続します。
パスワードはvnc起動時に設定したものを入れて下さい。

avahiが最初から動いてるから
host名.localで繋がるね素敵だね
DockerだとInspectしてIP拾ったりって面倒だもんね!

Imgur

Yahoo!😆

Dockerでこれやったことある人なら膝から崩れ落ちるレベルで簡単だったね!
自作を諦めて他人が作ったDockerfileさえ無い中身何されてるかわからないイメージをDockerhubから落として使ってる人もこれなら出来るよね!

ここからは普通にこの環境の上で好きに作業すると良いと思うよ!

で、一通り遊んだら止めようか

su ubuntu -c 'vncserver -kill :1'
exit

これでコンテナから抜けてホストOSに戻って

lxc stop containername

これで止まったよ!
また続きから始めたいと思ったら

lxc start containername

でコンテナが起動するのでvncを再度起動するんだけどコンテナ入るのも面倒だから直接打ち込んじゃおう

lxc exec containername -- su ubuntu -c 'vncserver :1 -geometry 1920x1080 -depth 24'

ほらRemminaからつないでご覧?
つながったでしょ😁
止める時も同じようにすればわざわざコンテナ入る必要もないよ便利だね!

。。。

まぁでももっと便利にしたいよね?

systemdあるんだからサービスに登録しちゃおう!

とりあえずコンテナに入ってサービスファイルを作ろう

lxc exec containername -- bash
vi /etc/systemd/system/vncserver@:1.service

viでに以下をコピペ

/etc/systemd/system/vncserver@
[Unit]
Description=Remote desktop service (VNC)
After=syslog.target network.target

[Service]
Type=forking
User=ubuntu
PAMName=login
PIDFile=/home/ubuntu/.vnc/%H%i.pid
ExecStartPre=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'
ExecStart=/usr/bin/vncserver %i -geometry 1920x1080 -depth 24
ExecStop=/usr/bin/vncserver -kill %i

[Install]
WantedBy=multi-user.target

保存したらサービスに登録して一旦コンテナを止めよう

systemctl enable vncserver@:1
exit
lxc stop containername

これでサービスに登録されたので今度からはコンテナのstartする時に自動で起動してくるよ
やってみよう

lxc start containername

でワクワクしながらremminaからつないでみると。。。

Imgur

つながったね😆

これでコンテナ起動するだけで使えるデスクトップの完成だ😎

ちなみにこれの使いどころだけど私みたいな低賃金傭兵の遊軍みたいな仕事の仕方してると
急に全然関係ない案件することになったりするのでこういう環境で開発したりしてるよ。

それでは最後にどれくらいの容量を使ってるか確認してみましょうホストOSで以下のコマンドを打つと出てきます。

lxc info containername

私の環境では

  Disk usage:
    root: 1.63GB

って出てましたDockerで同じような環境必死こいて作ってもそんなに変わらない容量取られるのでこんな簡単にデスクトップ環境構築できるなら断然こっち使ったほうがいいですね😻

それでは良いLinuxライフを!

昔こっぽり、てんぽろりん

P.S.

しかし職業的にはプログラマのはずなのに全然そっち方面の情報書いてないな。。。
書くとしたら

「低性能なオンプレサーバに全てEOL迎えたOS、ミドルウエア,言語を入れて開発する方法」

って内容になるよな。。。いらんなぁ。。。。
ゲームだったら

「スライムを呪いの装備で固めて戦わせるテイマーになる方法」

これとそんな変わらんよねこんな鬼畜ネタ職の情報誰もいらんわな。

まぁ私はリアルでそんなネタ職なんですけどね。

Discussion