はじめに
lxdではバージョン4.0から仮想マシン(VM)も扱えるようになった。
コンテナと異なり、CPUやメモリはホストから一部割り当てて使用するためにパフォーマンス的には不利になるが、 カーネル層の機能を使用したい場合など、コンテナでは足りないケースでコンテナと同じコマンド体系で使用できる。
ただし初期ログイン時など少し癖があるのでメモしておく
Running virtual machines with LXD 4.0を参考に作業する。
VMの作成
ubuntu20.04の作成。マシン名は環境変数CONTAINEREに設定しておく。コンテナを作成する場合とほぼ同じ。オプションに--vmを指定する。
$ lxc init ubuntu:20.04 --vm ${CONTAINER}
初期ユーザー設定
LXDがオフィシャルで提供しているOSのイメージではデフォルトユーザーのパスワードなどが未設定であるため、そのままではログインできない。
cloud-initを使用して、OSの初回起動時にのみ実行されるコンフィグレーションを設定しておく必要がある。
$ (
cat << EOF
#cloud-config
apt_mirror: http://us.archive.ubuntu.com/ubuntu/
ssh_pwauth: yes
users:
- name: ubuntu
passwd: "\$6\$s.wXDkoGmU5md\$d.vxMQSvtcs1I7wUG4SLgUhmarY7BR.5lusJq1D9U9EnHK2LJx18x90ipsg0g3Jcomfp0EoGAZYfgvT22qGFl/"
lock_passwd: false
groups: lxd
shell: /bin/bash
sudo: ALL=(ALL) NOPASSWD:ALL
EOF
) | lxc config set ${CONTAINER} user.user-data -
$ lxc config device add ${CONTAINER} config disk source=cloud-init:config
lxd-agentの起動
VMを起動する。
$ lxc start ${CONTAINER}
このままではlxd-agentが動いていないためlxc execは失敗する。
$ lxc exec ${CONTAINER} -- /bin/bash
Error: Failed to connect to lxd-agent
初回起動時はlxc consoleでVMに直接ログインして初期化スクリプトを実行する必要がある。
$ lxc console ${CONTAINER}
何も表示されない場合はEnterキーを押すとログイン画面が表示される。下記の情報でログインできる。
| ユーザー名 | パスワード |
|---|---|
| ubuntu | ubuntu |
VMにログインしたらlxd-agentをインストールするのだが、ubuntu 20.04とubuntu 18.04のVMイメージで起動方法が異なっている。
ubuntu 20.04の場合
$ sudo su - $ cd /run/lxd_config/9p $ ./install.sh $ reboot
ubuntu 18.04
$ sudo su - $ mount -t 9p config /mnt $ cd /mnt $ ./install.sh $ reboot
コンテナの起動
lxd-agentが起動できれば従来どおりlxc execでログインできる。ただしコンテナの開始からlxd-agentが使用可能になるまでは若干のタイムラグがある。
$ lxc exec ${CONTAINER} -- su --login ${USER}
初期パスワードを任意のものに変更する
Running virtual machines with LXD 4.0の手順で紹介されているclaud-initのコンフィグを使用するとパスワードはubuntuになるが、下記のpasswdのハッシュ値を変更することで別のパスワードを設定することができる。
$ (
cat << EOF
#cloud-config
apt_mirror: http://us.archive.ubuntu.com/ubuntu/
ssh_pwauth: yes
users:
- name: ubuntu
passwd: "\$6\$s.wXDkoGmU5md\$d.vxMQSvtcs1I7wUG4SLgUhmarY7BR.5lusJq1D9U9EnHK2LJx18x90ipsg0g3Jcomfp0EoGAZYfgvT22qGFl/"
lock_passwd: false
groups: lxd
shell: /bin/bash
sudo: ALL=(ALL) NOPASSWD:ALL
EOF
) | lxc config set ${CONTAINER} user.user-data -
$ lxc config device add ${CONTAINER} config disk source=cloud-init:config
ハッシュの作成
パスワードからハッシュ値を生成するにはopensslコマンドを使用する。
$ openssl passwd -6 <パスワード>
例えばsampleをパスワードにする場合は下記のようにする。
$ openssl passwd -6 sample $6$ePQ6Km2XVOh7iM9b$zWu/hGbOCa2kxEk7XMNBu6HV63L42lE3mmh8558RWdxsDym8KoklKDNMWM.S8Bj4fdj288sQksmaPnQcTlbEy.
lxc configにこのハッシュ値を渡す場合、$はエスケープする必要がある ので注意が必要。
下記のハッシュ値の場合は
$6$ePQ6Km2XVOh7iM9b$zWu/hGbOCa2kxEk7XMNBu6HV63L42lE3mmh8558RWdxsDym8KoklKDNMWM.S8Bj4fdj288sQksmaPnQcTlbEy.
この様にする必要がある。
\$6\$ePQ6Km2XVOh7iM9b\$zWu/hGbOCa2kxEk7XMNBu6HV63L42lE3mmh8558RWdxsDym8KoklKDNMWM.S8Bj4fdj288sQksmaPnQcTlbEy.
生成したハッシュ値を登録する
$ (
cat << EOF
#cloud-config
apt_mirror: http://us.archive.ubuntu.com/ubuntu/
ssh_pwauth: yes
users:
- name: ubuntu
passwd: "\$6\$ePQ6Km2XVOh7iM9b\$zWu/hGbOCa2kxEk7XMNBu6HV63L42lE3mmh8558RWdxsDym8KoklKDNMWM.S8Bj4fdj288sQksmaPnQcTlbEy."
lock_passwd: false
groups: lxd
shell: /bin/bash
sudo: ALL=(ALL) NOPASSWD:ALL
EOF
) | lxc config set ${CONTAINER} user.user-data -
$ lxc config device add ${CONTAINER} config disk source=cloud-init:config
正しく登録されているかは下記のコマンドで確認できる。
$ lxc config show ${CONTAINER}
architecture: x86_64
config:
image.architecture: amd64
image.description: ubuntu 18.04 LTS amd64 (release) (20210129)
image.label: release
image.os: ubuntu
image.release: bionic
image.serial: "20210129"
image.type: disk1.img
image.version: "18.04"
user.user-data: |
#cloud-config
apt_mirror: http://us.archive.ubuntu.com/ubuntu/
ssh_pwauth: yes
users:
- name: ubuntu
passwd: "$6$ePQ6Km2XVOh7iM9b$zWu/hGbOCa2kxEk7XMNBu6HV63L42lE3mmh8558RWdxsDym8KoklKDNMWM.S8Bj4fdj288sQksmaPnQcTlbEy."
lock_passwd: false
groups: lxd
shell: /bin/bash
sudo: ALL=(ALL) NOPASSWD:ALL
volatile.apply_template: create
volatile.base_image: dc0a7d127e63e27063638e413cf6f2b83094e60924190f07a12b13a1bbd93a2a
volatile.eth0.hwaddr: 00:16:3e:bd:de:28
devices: {}
ephemeral: false
profiles:
- default
stateful: false
description: ""
ハッシュが正しく登録されていることが確認できた。
初期パスワードの確認
lxc consoleでログインしてみる。
$ lxc start ${CONTAINER}
$ lxc console ${CONTAINER}
下記でログインすることができる。
| ユーザー名 | パスワード |
|---|---|
| ubuntu | sample |
まとめ
lxdでVMを使用することができる。
下記の2点、あらかじめ知っていないと面を食らう。
- 初期パスワードの設定
- lxd-agentのインストール