🐅

Debian12 で LXD をもう少し試す

2025/01/19に公開

概要

デフォルトで作成される lxdbr0 ではなくて、自分で作成した Linux ブリッジ、OVS スイッチを利用してみる。

環境

https://zenn.dev/mnod/articles/fdf71c1f4ad82c の続き。

Linux ブリッジを利用する

Linuxブリッジの作成

下記ファイルを用意したうえで、 sudo netplan try --timeout 30 を実行するなどして反映する。

/etc/netplan/99-linux-bridge.yaml
network:
    ethernets:
        enp1s0:
            dhcp4: false
            match:
                macaddress: 52:54:00:87:c8:69
            set-name: enp1s0
    bridges:
        br0:
            interfaces:
              - enp1s0
            dhcp4: false
            addresses:
              - 192.168.11.44/24
            routes:
              - to: default
                via: 192.168.11.254
            nameservers:
                addresses:
                  - 192.168.11.249
                  - 192.168.11.254
    version: 2

確認する。

$ ip a show br0
12: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether ca:0a:f1:70:4a:ba brd ff:ff:ff:ff:ff:ff
    inet 192.168.11.44/24 brd 192.168.11.255 scope global br0
       valid_lft forever preferred_lft forever
    inet6 2405:6580:d400:2900:c80a:f1ff:fe70:4aba/64 scope global dynamic mngtmpaddr noprefixroute
       valid_lft 86371sec preferred_lft 14371sec
    inet6 fe80::c80a:f1ff:fe70:4aba/64 scope link
       valid_lft forever preferred_lft forever

$ sudo brctl show
bridge name     bridge id               STP enabled     interfaces
br0             8000.ca0af1704aba       no              enp1s0
lxdbr0          8000.00163eb70784       no

$ sudo lxc network list
+--------+----------+---------+----------------+---------------------------+-------------+---------+---------+
|  NAME  |   TYPE   | MANAGED |      IPV4      |           IPV6            | DESCRIPTION | USED BY |  STATE  |
+--------+----------+---------+----------------+---------------------------+-------------+---------+---------+
| br0    | bridge   | NO      |                |                           |             | 0       |         |
+--------+----------+---------+----------------+---------------------------+-------------+---------+---------+
| enp1s0 | physical | NO      |                |                           |             | 0       |         |
+--------+----------+---------+----------------+---------------------------+-------------+---------+---------+
| lxdbr0 | bridge   | YES     | 10.82.242.1/24 | fd42:410c:cec4:c79b::1/64 |             | 1       | CREATED |
+--------+----------+---------+----------------+---------------------------+-------------+---------+---------+

プロファイルを作成する

新しくプロファイルを作成する

$ sudo lxc profile create linuxbridge
Profile linuxbridge created

$ sudo lxc profile list
+-------------+---------------------+---------+
|    NAME     |     DESCRIPTION     | USED BY |
+-------------+---------------------+---------+
| default     | Default LXD profile | 0       |
+-------------+---------------------+---------+
| linuxbridge |                     | 0       |
+-------------+---------------------+---------+

$ sudo lxc profile show linuxbridge
config: {}
description: ""
devices: {}
name: linuxbridge
used_by: []

上で作成した br0 を利用するように設定

$ sudo lxc network attach-profile br0 linuxbridge eth0

$ sudo lxc profile show linuxbridge
config: {}
description: ""
devices:
  eth0:
    nictype: bridged
    parent: br0
    type: nic
name: linuxbridge
used_by: []

ストレージプール default を利用するように登録

$ sudo sudo lxc profile device add linuxbridge root disk path=/ pool=default
Device root added to linuxbridge


$ sudo lxc profile show linuxbridge
config: {}
description: ""
devices:
  eth0:
    nictype: bridged
    parent: br0
    type: nic
  root:
    path: /
    pool: default
    type: disk
name: linuxbridge
used_by: []

コンテナ作成

前回コンテナを削除した後、消さずにローカルに残していた debian-test1 イメージを再利用する

$ sudo lxc image list
+--------------+--------------+--------+---------------------------------------+--------------+-----------+----------+------------------------------+
|    ALIAS     | FINGERPRINT  | PUBLIC |              DESCRIPTION              | ARCHITECTURE |   TYPE    |   SIZE   |         UPLOAD DATE          |
+--------------+--------------+--------+---------------------------------------+--------------+-----------+----------+------------------------------+
| debian-test1 | 9ec484eba6b6 | no     | Debian bookworm arm64 (20250106_0004) | aarch64      | CONTAINER | 157.23MB | Jan 10, 2025 at 8:19pm (UTC) |
+--------------+--------------+--------+---------------------------------------+--------------+-----------+----------+------------------------------+

$ sudo lxc list
+------+-------+------+------+------+-----------+
| NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS |
+------+-------+------+------+------+-----------+

作成したプロファイルを指定してコンテナを作成する。

$ sudo lxc launch debian-test1 debian-test-linuxbridge --profile linuxbridge
Creating debian-test-linuxbridge
Starting debian-test-linuxbridge

$ sudo lxc list
+-------------------------+---------+----------------------+-----------------------------------------------+-----------+-----------+
|          NAME           |  STATE  |         IPV4         |                     IPV6                      |   TYPE    | SNAPSHOTS |
+-------------------------+---------+----------------------+-----------------------------------------------+-----------+-----------+
| debian-test-linuxbridge | RUNNING | 192.168.11.77 (eth0) | 2405:6580:d400:2900:216:3eff:feda:59ff (eth0) | CONTAINER | 0         |
+-------------------------+---------+----------------------+-----------------------------------------------+-----------+-----------+

もろもろ確認

外部から疎通確認

$ curl -I 192.168.11.77
HTTP/1.1 200 OK
Server: nginx/1.22.1
Date: Sat, 11 Jan 2025 01:24:21 GMT
Content-Type: text/html
Content-Length: 615
Last-Modified: Fri, 10 Jan 2025 09:31:14 GMT
Connection: keep-alive
ETag: "6780e8e2-267"
Accept-Ranges: bytes

プロファイル確認

$ sudo lxc profile show linuxbridge
config: {}
description: ""
devices:
  eth0:
    nictype: bridged
    parent: br0
    type: nic
  root:
    path: /
    pool: default
    type: disk
name: linuxbridge
used_by:
- /1.0/instances/debian-test-linuxbridge

ネットワーク確認

$ sudo lxc network list
+--------+----------+---------+----------------+---------------------------+-------------+---------+---------+
|  NAME  |   TYPE   | MANAGED |      IPV4      |           IPV6            | DESCRIPTION | USED BY |  STATE  |
+--------+----------+---------+----------------+---------------------------+-------------+---------+---------+
| br0    | bridge   | NO      |                |                           |             | 2       |         |
+--------+----------+---------+----------------+---------------------------+-------------+---------+---------+
| enp1s0 | physical | NO      |                |                           |             | 0       |         |
+--------+----------+---------+----------------+---------------------------+-------------+---------+---------+
| lxdbr0 | bridge   | YES     | 10.82.242.1/24 | fd42:410c:cec4:c79b::1/64 |             | 1       | CREATED |
+--------+----------+---------+----------------+---------------------------+-------------+---------+---------+

$ sudo lxc network info br0
Name: br0
MAC address: ca:0a:f1:70:4a:ba
MTU: 1500
State: up
Type: broadcast

IP addresses:
  inet  192.168.11.44/24 (global)
  inet6 2405:6580:d400:2900:c80a:f1ff:fe70:4aba/64 (global)
  inet6 fe80::c80a:f1ff:fe70:4aba/64 (link)

Network usage:
  Bytes received: 2.68MB
  Bytes sent: 233.41kB
  Packets received: 23415
  Packets sent: 1746

Bridge:
  ID: 8000.ca0af1704aba
  STP: false
  Forward delay: 1500
  Default VLAN ID: 1
  VLAN filtering: false
  Upper devices: enp1s0, vethf26b850a

$ sudo brctl show
bridge name     bridge id               STP enabled     interfaces
br0             8000.ca0af1704aba       no              enp1s0
                                                        vethf26b850a
lxdbr0          8000.00163eb70784       no

Open vSwitch を利用する

OVSブリッジの作成

必要なパッケージをインストールする

$ sudo apt install --no-install-recommends openvswitch-switch

$ sudo systemctl status ovsdb-server.service

$ sudo ovs-vsctl show
38d33bcc-e2cc-4613-a7e0-fd1f3eb16551
    ovs_version: "3.1.0"

下記ファイルを用意したうえで、 sudo netplan try --timeout 30 を実行するなどして反映する。

/etc/netplan/99-linux-bridge.yaml
network:
    version: 2
    ethernets:
        enp1s0:
            dhcp4: false
            match:
                macaddress: 52:54:00:87:c8:69
            set-name: enp1s0
    bridges:
        ovsbr0:
            openvswitch: {}
            interfaces:
              - enp1s0
            dhcp4: false
            addresses:
              - 192.168.11.44/24
            routes:
              - to: default
                via: 192.168.11.254
            nameservers:
                addresses:
                  - 192.168.11.249
                  - 192.168.11.254

確認する。

$ sudo ovs-vsctl show
38d33bcc-e2cc-4613-a7e0-fd1f3eb16551
    Bridge ovsbr0
        fail_mode: standalone
        Port ovsbr0
            Interface ovsbr0
                type: internal
        Port enp1s0
            Interface enp1s0
    ovs_version: "3.1.0"

$ ip a show ovsbr0
16: ovsbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1000
    link/ether de:00:14:7f:b1:4e brd ff:ff:ff:ff:ff:ff
    inet 192.168.11.44/24 brd 192.168.11.255 scope global ovsbr0
       valid_lft forever preferred_lft forever
    inet6 2405:6580:d400:2900:dc00:14ff:fe7f:b14e/64 scope global dynamic mngtmpaddr noprefixroute
       valid_lft 86373sec preferred_lft 14373sec
    inet6 fe80::dc00:14ff:fe7f:b14e/64 scope link
       valid_lft forever preferred_lft forever

$ sudo lxc network list
+--------+----------+---------+----------------+---------------------------+-------------+---------+---------+
|  NAME  |   TYPE   | MANAGED |      IPV4      |           IPV6            | DESCRIPTION | USED BY |  STATE  |
+--------+----------+---------+----------------+---------------------------+-------------+---------+---------+
| br0    | bridge   | NO      |                |                           |             | 1       |         |
+--------+----------+---------+----------------+---------------------------+-------------+---------+---------+
| enp1s0 | physical | NO      |                |                           |             | 0       |         |
+--------+----------+---------+----------------+---------------------------+-------------+---------+---------+
| lxdbr0 | bridge   | YES     | 10.82.242.1/24 | fd42:410c:cec4:c79b::1/64 |             | 1       | CREATED |
+--------+----------+---------+----------------+---------------------------+-------------+---------+---------+
| ovsbr0 | bridge   | NO      |                |                           |             | 0       |         |
+--------+----------+---------+----------------+---------------------------+-------------+---------+---------+

$ sudo lxc network info ovsbr0
Name: ovsbr0
MAC address: de:00:14:7f:b1:4e
MTU: 1500
State: up
Type: broadcast

IP addresses:
  inet  192.168.11.44/24 (global)
  inet6 2405:6580:d400:2900:dc00:14ff:fe7f:b14e/64 (global)
  inet6 fe80::dc00:14ff:fe7f:b14e/64 (link)

Network usage:
  Bytes received: 109.10kB
  Bytes sent: 17.90kB
  Packets received: 872
  Packets sent: 14

プロファイルを作成する

新しくプロファイルを作成する

$ sudo lxc profile create ovsbridge
Profile ovsbridge created

$ sudo lxc profile list
+-------------+---------------------+---------+
|    NAME     |     DESCRIPTION     | USED BY |
+-------------+---------------------+---------+
| default     | Default LXD profile | 0       |
+-------------+---------------------+---------+
| linuxbridge |                     | 0       |
+-------------+---------------------+---------+
| ovsbridge   |                     | 0       |
+-------------+---------------------+---------+

$ sudo lxc profile show ovsbridge
config: {}
description: ""
devices: {}
name: ovsbridge
used_by: []

上で作成した ovsbr0 を利用するように設定

$ sudo lxc network attach-profile ovsbr0 ovsbridge eth0 

$ sudo lxc profile show ovsbridge
config: {}
description: ""
devices:
  eth0:
    nictype: bridged
    parent: ovsbr0
    type: nic
name: ovsbridge
used_by: []

ストレージプール default を利用するように登録

$ sudo sudo lxc profile device add ovsbridge root disk path=/ pool=default
Device root added to ovsbridge

$ sudo lxc profile show ovsbridge
config: {}
description: ""
devices:
  eth0:
    nictype: bridged
    parent: ovsbr0
    type: nic
  root:
    path: /
    pool: default
    type: disk
name: ovsbridge
used_by: []

コンテナ作成

$ sudo lxc list
+------+-------+------+------+------+-----------+
| NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS |
+------+-------+------+------+------+-----------+

$ sudo lxc launch debian-test1 debian-test-linuxbridge --profile ovsbridge
Creating debian-test-linuxbridge
Starting debian-test-linuxbridge

$ sudo lxc list
+-------------------------+---------+----------------------+-----------------------------------------------+-----------+-----------+
|          NAME           |  STATE  |         IPV4         |                     IPV6                      |   TYPE    | SNAPSHOTS |
+-------------------------+---------+----------------------+-----------------------------------------------+-----------+-----------+
| debian-test-linuxbridge | RUNNING | 192.168.11.78 (eth0) | 2405:6580:d400:2900:216:3eff:fe29:297c (eth0) | CONTAINER | 0         |
+-------------------------+---------+----------------------+-----------------------------------------------+-----------+-----------+

もろもろ確認

外部から疎通確認

$ curl -I 192.168.11.78
HTTP/1.1 200 OK
Server: nginx/1.22.1
Date: Sat, 11 Jan 2025 08:12:24 GMT
Content-Type: text/html
Content-Length: 615
Last-Modified: Fri, 10 Jan 2025 09:31:14 GMT
Connection: keep-alive
ETag: "6780e8e2-267"
Accept-Ranges: bytes

プロファイル確認

$ sudo lxc profile show ovsbridge
config: {}
description: ""
devices:
  eth0:
    nictype: bridged
    parent: ovsbr0
    type: nic
  root:
    path: /
    pool: default
    type: disk
name: ovsbridge
used_by:
- /1.0/instances/debian-test-linuxbridge

ネットワーク確認

$ sudo lxc network list
+--------+----------+---------+----------------+---------------------------+-------------+---------+---------+
|  NAME  |   TYPE   | MANAGED |      IPV4      |           IPV6            | DESCRIPTION | USED BY |  STATE  |
+--------+----------+---------+----------------+---------------------------+-------------+---------+---------+
| br0    | bridge   | NO      |                |                           |             | 1       |         |
+--------+----------+---------+----------------+---------------------------+-------------+---------+---------+
| enp1s0 | physical | NO      |                |                           |             | 0       |         |
+--------+----------+---------+----------------+---------------------------+-------------+---------+---------+
| lxdbr0 | bridge   | YES     | 10.82.242.1/24 | fd42:410c:cec4:c79b::1/64 |             | 1       | CREATED |
+--------+----------+---------+----------------+---------------------------+-------------+---------+---------+
| ovsbr0 | bridge   | NO      |                |                           |             | 2       |         |
+--------+----------+---------+----------------+---------------------------+-------------+---------+---------+

$ sudo lxc network info ovsbr0
Name: ovsbr0
MAC address: de:00:14:7f:b1:4e
MTU: 1500
State: up
Type: broadcast

IP addresses:
  inet  192.168.11.44/24 (global)
  inet6 2405:6580:d400:2900:dc00:14ff:fe7f:b14e/64 (global)
  inet6 fe80::dc00:14ff:fe7f:b14e/64 (link)

Network usage:
  Bytes received: 6.60MB
  Bytes sent: 502.98kB
  Packets received: 51983
  Packets sent: 4053

$ sudo lxc network show ovsbr0
config: {}
description: ""
name: ovsbr0
type: bridge
used_by:
- /1.0/instances/debian-test-linuxbridge
- /1.0/profiles/ovsbridge
managed: false
status: ""
locations: []


$ sudo ovs-vsctl show
38d33bcc-e2cc-4613-a7e0-fd1f3eb16551
    Bridge ovsbr0
        fail_mode: standalone
        Port ovsbr0
            Interface ovsbr0
                type: internal
        Port veth142b2a30
            Interface veth142b2a30
        Port enp1s0
            Interface enp1s0
    ovs_version: "3.1.0"

ストレージプール確認

$ sudo lxc storage info default
info:
  description: ""
  driver: dir
  name: default
  space used: 2.18GiB
  total space: 7.71GiB
used by:
  instances:
  - debian-test-linuxbridge
  profiles:
  - default
  - linuxbridge
  - ovsbridge

LVM ストレージプールの利用

ストレージプールの作成

必要なパッケージのインストール

$ sudo apt install --no-install-recommends lvm2

ストレージプール作成。
利用するPV、VG等を指定しないので、ループバックファイルが利用される。

$ sudo lxc storage create lvmstroage lvm
Storage pool lvmstroage created

$ sudo lxc storage list
+------------+--------+------------------------------------+-------------+---------+---------+
|    NAME    | DRIVER |               SOURCE               | DESCRIPTION | USED BY |  STATE  |
+------------+--------+------------------------------------+-------------+---------+---------+
| default    | dir    | /var/lib/lxd/storage-pools/default |             | 4       | CREATED |
+------------+--------+------------------------------------+-------------+---------+---------+
| lvmstroage | lvm    | /var/lib/lxd/disks/lvmstroage.img  |             | 0       | CREATED |
+------------+--------+------------------------------------+-------------+---------+---------+

確認

$ sudo ls -lhs /var/lib/lxd/disks/lvmstroage.img
17M -rw------- 1 root root 5.0G Jan 11 08:27 /var/lib/lxd/disks/lvmstroage.img


$ sudo lxc storage info lvmstroage
info:
  description: ""
  driver: lvm
  name: lvmstroage
  space used: 540.60MiB
  total space: 4.98GiB
used by: {}

$ sudo lxc storage show lvmstroage
config:
  lvm.thinpool_name: LXDThinPool
  lvm.vg_name: lvmstroage
  size: 5GiB
  source: /var/lib/lxd/disks/lvmstroage.img
description: ""
name: lvmstroage
driver: lvm
used_by: []
status: Created
locations:
- none

プロファイルに登録

先ほどの ovsbridge では、ストレージプール default を利用している。
これを、ストレージプール lvmstroage に入れ替えたい。

$ sudo lxc profile show ovsbridge
config: {}
description: ""
devices:
  eth0:
    nictype: bridged
    parent: ovsbr0
    type: nic
  root:
    path: /
    pool: default
    type: disk
name: ovsbridge
used_by: []

ストレージプール default の登録を解除する。

$ sudo sudo lxc profile device remove ovsbridge root
Device root removed from ovsbridge

$ sudo lxc profile show ovsbridge
config: {}
description: ""
devices:
  eth0:
    nictype: bridged
    parent: ovsbr0
    type: nic
name: ovsbridge
used_by: []

ストレージプール lvmstroage を登録する。

$ sudo lxc profile device add ovsbridge root disk path=/ pool=lvmstroage
Device root added to ovsbridge

$ sudo lxc profile show ovsbridge
config: {}
description: ""
devices:
  eth0:
    nictype: bridged
    parent: ovsbr0
    type: nic
  root:
    path: /
    pool: lvmstroage
    type: disk
name: ovsbridge
used_by: []

コンテナ起動

修正したプロファイル ovsbridge を指定してコンテナを起動する。

$ sudo lxc launch debian-test1 debian-test-linuxbridge --profile ovsbridge
Creating debian-test-linuxbridge
Starting debian-test-linuxbridge


$ sudo lxc list
+-------------------------+---------+----------------------+-----------------------------------------------+-----------+-----------+
|          NAME           |  STATE  |         IPV4         |                     IPV6                      |   TYPE    | SNAPSHOTS |
+-------------------------+---------+----------------------+-----------------------------------------------+-----------+-----------+
| debian-test-linuxbridge | RUNNING | 192.168.11.80 (eth0) | 2405:6580:d400:2900:216:3eff:febe:83ac (eth0) | CONTAINER | 0         |
+-------------------------+---------+----------------------+-----------------------------------------------+-----------+-----------+

プロファイルの確認

$ sudo lxc profile show ovsbridge
config: {}
description: ""
devices:
  eth0:
    nictype: bridged
    parent: ovsbr0
    type: nic
  root:
    path: /
    pool: lvmstroage
    type: disk
name: ovsbridge
used_by:
- /1.0/instances/debian-test-linuxbridge

ストレージプールを確認

$ sudo lxc storage info lvmstroage
info:
  description: ""
  driver: lvm
  name: lvmstroage
  space used: 1.52GiB
  total space: 4.98GiB
used by:
  images:
  - 9ec484eba6b637d006364d2d2eb7c3a372f2934299c2a17837ca65619492fb4e
  instances:
  - debian-test-linuxbridge
  profiles:
  - ovsbridge


$ sudo lxc storage show lvmstroage
config:
  lvm.thinpool_name: LXDThinPool
  lvm.vg_name: lvmstroage
  size: 5GiB
  source: /var/lib/lxd/disks/lvmstroage.img
description: ""
name: lvmstroage
driver: lvm
used_by:
- /1.0/images/9ec484eba6b637d006364d2d2eb7c3a372f2934299c2a17837ca65619492fb4e
- /1.0/instances/debian-test-linuxbridge
- /1.0/profiles/ovsbridge
status: Created
locations:
- none

使われているファイルシステム、LVMを確認

$ df -h | grep lxd
tmpfs                                                 100K     0  100K   0% /var/lib/lxd/shmounts
tmpfs                                                 100K     0  100K   0% /var/lib/lxd/devlxd
/dev/lvmstroage/containers_debian--test--linuxbridge  9.8G  2.2G  7.1G  24% /var/lib/lxd/storage-pools/lvmstroage/containers/debian-test-linuxbridge

$ sudo pvs
  PV         VG         Fmt  Attr PSize  PFree
  /dev/loop0 lvmstroage lvm2 a--  <5.00g    0

$ sudo losetup
NAME       SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE                         DIO LOG-SEC
/dev/loop0         0      0         0  0 /var/lib/lxd/disks/lvmstroage.img   1     512

$ sudo vgs
  VG         #PV #LV #SN Attr   VSize  VFree
  lvmstroage   1   4   0 wz--n- <5.00g    0

$ sudo lvs
  LV                                                                      VG         Attr       LSize  Pool        Origin                                                                  Data%  Meta%  Move Log Cpy%Sync Convert
  LXDThinPool                                                             lvmstroage twi-aotz--  4.98g                                                                                     60.81  24.80
  containers_debian--test--linuxbridge                                    lvmstroage Vwi-aotz-k 10.00g LXDThinPool images_9ec484eba6b637d006364d2d2eb7c3a372f2934299c2a17837ca65619492fb4e 25.63
  custom_default_testvolume                                               lvmstroage Vwi---tz-k 10.00g LXDThinPool
  images_9ec484eba6b637d006364d2d2eb7c3a372f2934299c2a17837ca65619492fb4e lvmstroage Vwi---tz-k 10.00g LXDThinPool

ボリュームの利用

ボリュームを作成、アタッチしてみる

ボリューム作成

ストレージプール lvmstroage 内にボリュームを作成する

$ sudo lxc storage volume list lvmstroage
+-----------+------------------------------------------------------------------+-------------+--------------+---------+
|   TYPE    |                               NAME                               | DESCRIPTION | CONTENT-TYPE | USED BY |
+-----------+------------------------------------------------------------------+-------------+--------------+---------+
| container | debian-test-linuxbridge                                          |             | filesystem   | 1       |
+-----------+------------------------------------------------------------------+-------------+--------------+---------+
| image     | 9ec484eba6b637d006364d2d2eb7c3a372f2934299c2a17837ca65619492fb4e |             | filesystem   | 1       |
+-----------+------------------------------------------------------------------+-------------+--------------+---------+

$ sudo lxc storage volume create lvmstroage testvolume
Storage volume testvolume created

$ sudo lxc storage volume list lvmstroage
+-----------+------------------------------------------------------------------+-------------+--------------+---------+
|   TYPE    |                               NAME                               | DESCRIPTION | CONTENT-TYPE | USED BY |
+-----------+------------------------------------------------------------------+-------------+--------------+---------+
| container | debian-test-linuxbridge                                          |             | filesystem   | 1       |
+-----------+------------------------------------------------------------------+-------------+--------------+---------+
| custom    | testvolume                                                       |             | filesystem   | 0       |
+-----------+------------------------------------------------------------------+-------------+--------------+---------+
| image     | 9ec484eba6b637d006364d2d2eb7c3a372f2934299c2a17837ca65619492fb4e |             | filesystem   | 1       |
+-----------+------------------------------------------------------------------+-------------+--------------+---------+

$ sudo lxc storage volume show lvmstroage testvolume
config:
  block.filesystem: ext4
  block.mount_options: discard
description: ""
name: testvolume
type: custom
used_by: []
location: none
content_type: filesystem
project: default
created_at: 0001-01-01T00:00:00Z

アタッチ

コンテナにアタッチする。
停止しなくてもアタッチできる。

$ sudo lxc storage volume attach lvmstroage testvolume debian-test-linuxbridge /work

$ sudo lxc exec debian-test-linuxbridge -- df -h /work
Filesystem                                 Size  Used Avail Use% Mounted on
/dev/lvmstroage/custom_default_testvolume  9.8G   24K  9.3G   1% /work

$ sudo lxc exec debian-test-linuxbridge -- grep work /proc/mounts
/dev/lvmstroage/custom_default_testvolume /work ext4 rw,relatime,discard,stripe=16 0 0

デタッチ

$ sudo lxc storage volume detach lvmstroage testvolume debian-test-linuxbridge

ボリュームのコピー

ストレージプールを超えてコピーすることができる。

$ sudo lxc storage volume copy lvmstroage/testvolume default/testvolume
Storage volume copied successfully!

$ sudo lxc storage volume list default
+--------+------------+-------------+--------------+---------+
|  TYPE  |    NAME    | DESCRIPTION | CONTENT-TYPE | USED BY |
+--------+------------+-------------+--------------+---------+
| custom | testvolume |             | filesystem   | 0       |
+--------+------------+-------------+--------------+---------+

ボリュームの削除

$ sudo lxc storage volume delete default testvolume
Storage volume testvolume deleted

$ sudo lxc storage volume list default
+------+------+-------------+--------------+---------+
| TYPE | NAME | DESCRIPTION | CONTENT-TYPE | USED BY |
+------+------+-------------+--------------+---------+

cloud-init の利用

プロファイルに設定追加

default プロファイルにユーザデータを追加する。

$ sudo lxc profile show default
config: {}
description: Default LXD profile
devices:
  eth0:
    name: eth0
    network: lxdbr0
    type: nic
  root:
    path: /
    pool: default
    type: disk
name: default
used_by:
- /1.0/instances/debian-test-remote
- /1.0/instances/debian-test-copy

追加する。

$ sudo lxc profile set default user.user-data "#cloud-config
package_upgrade: true
packages:
  - nginx
user:
  - name: debian
"

$ sudo lxc profile show default
config:
  user.user-data: |
    #cloud-config
    package_upgrade: true
    packages:
      - nginx
    user:
      - name: debian
description: Default LXD profile
devices:
  eth0:
    name: eth0
    network: lxdbr0
    type: nic
  root:
    path: /
    pool: default
    type: disk
name: default
used_by:
- /1.0/instances/debian-test-remote
- /1.0/instances/debian-test-copy

コンテナの起動

cloud の付いたイメージを利用する。

$ sudo lxc image list canonical:debian/12
+--------------------------------+--------------+--------+---------------------------------------+--------------+-----------------+----------+-------------------------------+
|             ALIAS              | FINGERPRINT  | PUBLIC |              DESCRIPTION              | ARCHITECTURE |      TYPE       |   SIZE   |          UPLOAD DATE          |
+--------------------------------+--------------+--------+---------------------------------------+--------------+-----------------+----------+-------------------------------+
| debian/12 (7 more)             | fe62f9b06ff8 | yes    | Debian bookworm arm64 (20250113_0004) | aarch64      | CONTAINER       | 93.15MB  | Jan 13, 2025 at 12:00am (UTC) |
+--------------------------------+--------------+--------+---------------------------------------+--------------+-----------------+----------+-------------------------------+
| debian/12/amd64 (3 more)       | 2cef5dcb4c3d | yes    | Debian bookworm amd64 (20250118_0002) | x86_64       | CONTAINER       | 88.95MB  | Jan 18, 2025 at 12:00am (UTC) |
+--------------------------------+--------------+--------+---------------------------------------+--------------+-----------------+----------+-------------------------------+
| debian/12/amd64 (3 more)       | dc335255477e | yes    | Debian bookworm amd64 (20250118_0002) | x86_64       | VIRTUAL-MACHINE | 338.38MB | Jan 18, 2025 at 12:00am (UTC) |
+--------------------------------+--------------+--------+---------------------------------------+--------------+-----------------+----------+-------------------------------+
| debian/12/cloud (3 more)       | 5935e01145ad | yes    | Debian bookworm arm64 (20250113_0004) | aarch64      | CONTAINER       | 118.65MB | Jan 13, 2025 at 12:00am (UTC) |
+--------------------------------+--------------+--------+---------------------------------------+--------------+-----------------+----------+-------------------------------+
| debian/12/cloud/amd64 (1 more) | 03e7693dbb1d | yes    | Debian bookworm amd64 (20250118_0002) | x86_64       | CONTAINER       | 115.27MB | Jan 18, 2025 at 12:00am (UTC) |
+--------------------------------+--------------+--------+---------------------------------------+--------------+-----------------+----------+-------------------------------+
| debian/12/cloud/amd64 (1 more) | c8adb196909b | yes    | Debian bookworm amd64 (20250118_0002) | x86_64       | VIRTUAL-MACHINE | 381.83MB | Jan 18, 2025 at 12:00am (UTC) |
+--------------------------------+--------------+--------+---------------------------------------+--------------+-----------------+----------+-------------------------------+

邪魔者がいるので消しておく

$ sudo lxc delete debian-test-remote
$ sudo lxc delete debian-test-copy
$ sudo lxc image delete 9ec484eba6b6
$ sudo lxc launch canonical:debian/12/cloud debian-cloudimage-test --profile default
Creating debian-cloudimage-test
Starting debian-cloudimage-test

$ sudo lxc list
+------------------------+---------+---------------------+-----------------------------------------------+-----------+-----------+
|          NAME          |  STATE  |        IPV4         |                     IPV6                      |   TYPE    | SNAPSHOTS |
+------------------------+---------+---------------------+-----------------------------------------------+-----------+-----------+
| debian-cloudimage-test | RUNNING | 10.34.31.194 (eth0) | fd42:11a1:a94e:39e9:216:3eff:fe1f:9e77 (eth0) | CONTAINER | 0         |
+------------------------+---------+---------------------+-----------------------------------------------+-----------+-----------+

確認

$ sudo lxc exec debian-cloudimage-test -- cloud-init status
status: running

$ sudo lxc exec debian-cloudimage-test -- tail -f /var/log/cloud-init-output.log
Unpacking nginx-common (1.22.1-9) ...
Selecting previously unselected package nginx.
Preparing to unpack .../nginx_1.22.1-9_arm64.deb ...
Unpacking nginx (1.22.1-9) ...
Setting up nginx-common (1.22.1-9) ...
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service _ /lib/systemd/system/nginx.service.
Setting up nginx (1.22.1-9) ...
Upgrading binary: nginx.
2025-01-18 08:09:28,318 - ug_util.py[WARNING]: Format for 'user' key must be a string or dictionary and not list
Cloud-init v. 22.4.2 finished at Sat, 18 Jan 2025 08:09:28 +0000. Datasource DataSourceNoCloud [seed=/var/lib/cloud/seed/nocloud-net][dsmode=net].  Up 32.30 seconds

$ sudo lxc exec debian-cloudimage-test -- cloud-init status
status: done

ホストOSから疎通確認

$ curl -I 10.34.31.194
HTTP/1.1 200 OK
Server: nginx/1.22.1
Date: Sat, 18 Jan 2025 08:11:29 GMT
Content-Type: text/html
Content-Length: 615
Last-Modified: Sat, 18 Jan 2025 08:09:23 GMT
Connection: keep-alive
ETag: "678b61b3-267"
Accept-Ranges: bytes

プロファイルから削除

$ sudo lxc profile unset default user.user-data

$ sudo lxc profile show default
config: {}
description: Default LXD profile
devices:
  eth0:
    name: eth0
    network: lxdbr0
    type: nic
  root:
    path: /
    pool: default
    type: disk
name: default
used_by:
- /1.0/instances/debian-cloudimage-test
GitHubで編集を提案

Discussion