みつきんのメモ

組み込みエンジニアです。Interface誌で「Yocto Projectではじめる 組み込みLinux開発入門」連載中

lxd入門 VM編

はじめに

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 consoleVMに直接ログインして初期化スクリプトを実行する必要がある。

$ 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点、あらかじめ知っていないと面を食らう。

  1. 初期パスワードの設定
  2. lxd-agentのインストール