はじめに
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のインストール