LXC/LXDをUbuntu Server 24.04で使う

投稿者: | 2月 27, 2025

爺さんの家は、都内某所の駅前の内科医院だったのだが、爺さんの病院のあるエリアは、両隣を線路に挟まれていて(ここでほぼ場所は特定できてしまいそう)、俗にいう鉄分過多のロケーション、子供の頃は、犬も歩けば電車、電気機関車に当たるくらい電車の見放題。大抵のブルートレインは見たような。しかし、そういう車両だけではなく、朝は、貨車が走るというか、起きる。毎朝、コンテナ貨車に電気機関車がガッシャーンと連結。コンテナ車のジャジャジャーンという連結の衝撃音で目が覚める。まだ朝4時でっせ。子供のころは、そんなコンテナライフだった。

 

閑話休題

 

コンテナの話だが、今回は、LXCの話。LXCといえば、QNAPやProxmoxで動く。しかし、これ気をつけなきゃいけないのが仮想マシンではなく、仮想環境といって、足回りは実は、足元のOSだったりする。

ちなみに、これに似たソフトウェアがあって、ホスター/レンタルサーバ屋さんで使っているVirtuozzoというのもあるが、Linuxだけではなく、Windows版もあって、これも同じで、足元のWindowsカーネルがゲストのカーネルと共用だったりする。足元が一緒なので、扱い方間違えるとデータが全損することも。(過去に全損した事件を知っている。)

 

事前準備

物理NICをBridgeにしたものも作成する。理由は、パブリックIPv6を使いたいから。ちなみに、この環境は、パブリックIPv6が割り振られている環境。ens33は、各自の環境に書き換える。

cat << EOF > /etc/netplan/90-bridge.yaml
network:
version: 2
ethernets:
  ens33:
    dhcp4: no
bridges:
  br0:
    interfaces:
      - ens33
    dhcp-identifier: "Mac"
    dhcp4: yes
    parameters:
      forward-delay: 0
      stp: no
EOF
chmod 0600 /etc/netplan/90-bridge.yaml
reboot

 

Lxdのインストール

lxdを初期化して使う必要があるが、初めて、lxd/lxcコマンドを使うとsnap経由でLXD一式のインストールが始まる。LXDがサーバプロセスで、LXCはクライアントとして使う。

lxd init

Installing LXD snap, please be patient.

LXDがサーバプロセスで、LXCはクライアントとして使う。

 

以下が設定。ストレージバックエンドをdirにした。わざわざブロックデバイスにする必要はないと思った次第。ただ、コンテナのファイルとベースOSのファイルシステムが同一なので、何かあった場合にはリスクがあるかもしれない。それを防ぐには、zfsとかbtrfsの方がいいかもしれない。

Would you like to use LXD clustering? (yes/no) [default=no]:

Do you want to configure a new storage pool? (yes/no) [default=yes]:

Name of the new storage pool [default=default]:

Name of the storage backend to use (powerflex, zfs, btrfs, ceph, dir, lvm) [default=zfs]: dir

Would you like to connect to a MAAS server? (yes/no) [default=no]:

Would you like to create a new local network bridge? (yes/no) [default=yes]:

What should the new bridge be called? [default=lxdbr0]:

What IPv4 address should be used? (CIDR subnet notation, “auto” or “none”) [default=auto]:

What IPv6 address should be used? (CIDR subnet notation, “auto” or “none”) [default=auto]:

Would you like the LXD server to be available over the network? (yes/no) [default=no]:

Would you like stale cached images to be updated automatically? (yes/no) [default=yes]:

Would you like a YAML “lxd init” preseed to be printed? (yes/no) [default=no]:

 

ちなみにsnapにlxdがインストールされている。

snap list

 

ストレージの確認

lxc infoと叩くと、いろいろデバイスの設定ができるらしいが、とりあえずdirドライバを使う。

lxc storage list

+———+——–+————————————————+————-+———+———+

| NAME | DRIVER | SOURCE | DESCRIPTION | USED BY | STATE |

+———+——–+————————————————+————-+———+———+

| default | dir | /var/snap/lxd/common/lxd/storage-pools/default | | 1 | CREATED |

+———+——–+————————————————+————-+———+———+

 

ネットワークの確認

事前に作成したbr0も表示されている。

lxc network list

+——–+———-+———+—————-+—————————+————-+———+———+

| NAME | TYPE | MANAGED | IPV4 | IPV6 | DESCRIPTION | USED BY | STATE |

+——–+———-+———+—————-+—————————+————-+———+———+

| br0 | bridge | NO | | | | 0 | |

+——–+———-+———+—————-+—————————+————-+———+———+

| ens33 | physical | NO | | | | 0 | |

+——–+———-+———+—————-+—————————+————-+———+———+

| lxdbr0 | bridge | YES | 10.67.233.1/24 | fd42:35e5:22a8:2ca7::1/64 | | 1 | CREATED |

+——–+———-+———+—————-+—————————+————-+———+———+

 

デフォルトプロファイルの確認

lxc profile list

+———+———————+———+

| NAME | DESCRIPTION | USED BY |

+———+———————+———+

| default | Default LXD profile | 0 |

+———+———————+———+

lxc profile show default

name: default

description: Default LXD profile

config: {}

devices:

  eth0:

    name: eth0

    network: lxdbr0

    type: nic

  root:

    path: /

    pool: default

    type: disk

used_by: []

 

ブリッジ接続のプロファイルの作成

lxc profile create bridge
lxc network list
lxc network attach-profile br0 bridge eth0
lxc profile device add bridge root disk path=/ pool=default
lxc profile list
lxc profile show bridge

+———+———————+———+

| NAME | DESCRIPTION | USED BY |

+———+———————+———+

| bridge | | 0 |

+———+———————+———+

| default | Default LXD profile | 0 |

+———+———————+———+

name: bridge

description: “”

config: {}

devices:

  eth0:

    nictype: bridged

    parent: br0

    type: nic

  root:

    path: /

    pool: default

    type: disk

used_by: []

これでインフラ周りの設定は終了

 

コンテナイメージ

lxc remote list

QNAPで参照しているイメージリストより多い。

lxc image list ubuntu:24.04

+——————–+————–+——–+———————————————–+————–+—————–+———–+——————————-+

| ALIAS | FINGERPRINT | PUBLIC | DESCRIPTION | ARCHITECTURE | TYPE | SIZE | UPLOAD DATE |

+——————–+————–+——–+———————————————–+————–+—————–+———–+——————————-+

| n (9 more) | 7a0b671dbca3 | yes | ubuntu 24.04 LTS amd64 (release) (20250226) | x86_64 | CONTAINER | 256.15MiB | Feb 26, 2025 at 12:00am (UTC) |

+——————–+————–+——–+———————————————–+————–+—————–+———–+——————————-+

| n (9 more) | c46e8cc99b84 | yes | ubuntu 24.04 LTS amd64 (release) (20250226) | x86_64 | VIRTUAL-MACHINE | 582.09MiB | Feb 26, 2025 at 12:00am (UTC) |

+——————–+————–+——–+———————————————–+————–+—————–+———–+——————————-+

| n/arm64 (4 more) | 7f59b39022c5 | yes | ubuntu 24.04 LTS arm64 (release) (20250226) | aarch64 | VIRTUAL-MACHINE | 574.82MiB | Feb 26, 2025 at 12:00am (UTC) |

+——————–+————–+——–+———————————————–+————–+—————–+———–+——————————-+

| n/arm64 (4 more) | 32f80f295a51 | yes | ubuntu 24.04 LTS arm64 (release) (20250226) | aarch64 | CONTAINER | 244.52MiB | Feb 26, 2025 at 12:00am (UTC) |

+——————–+————–+——–+———————————————–+————–+—————–+———–+——————————-+

| n/armhf (4 more) | 0770d7617e2f | yes | ubuntu 24.04 LTS armhf (release) (20250226) | armv7l | CONTAINER | 239.26MiB | Feb 26, 2025 at 12:00am (UTC) |

+——————–+————–+——–+———————————————–+————–+—————–+———–+——————————-+

| n/armhf (4 more) | c7fa2c3f8cf7 | yes | ubuntu 24.04 LTS armhf (release) (20250226) | armv7l | VIRTUAL-MACHINE | 612.80MiB | Feb 26, 2025 at 12:00am (UTC) |

+——————–+————–+——–+———————————————–+————–+—————–+———–+——————————-+

| n/ppc64el (4 more) | 5394c263db75 | yes | ubuntu 24.04 LTS ppc64el (release) (20250226) | ppc64le | CONTAINER | 264.30MiB | Feb 26, 2025 at 12:00am (UTC) |

+——————–+————–+——–+———————————————–+————–+—————–+———–+——————————-+

| n/ppc64el (4 more) | a9f3ce6c2dd3 | yes | ubuntu 24.04 LTS ppc64el (release) (20250226) | ppc64le | VIRTUAL-MACHINE | 601.63MiB | Feb 26, 2025 at 12:00am (UTC) |

+——————–+————–+——–+———————————————–+————–+—————–+———–+——————————-+

| n/riscv64 (4 more) | a4e3597c8f23 | yes | ubuntu 24.04 LTS riscv64 (release) (20250226) | riscv64 | VIRTUAL-MACHINE | 597.63MiB | Feb 26, 2025 at 12:00am (UTC) |

+——————–+————–+——–+———————————————–+————–+—————–+———–+——————————-+

| n/riscv64 (4 more) | cbfd49dc2287 | yes | ubuntu 24.04 LTS riscv64 (release) (20250226) | riscv64 | CONTAINER | 255.91MiB | Feb 26, 2025 at 12:00am (UTC) |

+——————–+————–+——–+———————————————–+————–+—————–+———–+——————————-+

| n/s390x (4 more) | 3ea9c3220f3f | yes | ubuntu 24.04 LTS s390x (release) (20250226) | s390x | VIRTUAL-MACHINE | 553.13MiB | Feb 26, 2025 at 12:00am (UTC) |

+——————–+————–+——–+———————————————–+————–+—————–+———–+——————————-+

| n/s390x (4 more) | 8cfa9f768150 | yes | ubuntu 24.04 LTS s390x (release) (20250226) | s390x | CONTAINER | 250.19MiB | Feb 26, 2025 at 12:00am (UTC) |

+——————–+————–+——–+———————————————–+————–+—————–+———–+——————————-+

 

lxc image alias list ubuntu:noble

+—————+————–+—————–+————-+

| ALIAS | FINGERPRINT | TYPE | DESCRIPTION |

+—————+————–+—————–+————-+

| noble | 7a0b671dbca3 | CONTAINER | |

+—————+————–+—————–+————-+

| noble | c46e8cc99b84 | VIRTUAL-MACHINE | |

+—————+————–+—————–+————-+

| noble/amd64 | 7a0b671dbca3 | CONTAINER | |

+—————+————–+—————–+————-+

| noble/amd64 | c46e8cc99b84 | VIRTUAL-MACHINE | |

+—————+————–+—————–+————-+

| noble/arm64 | 7f59b39022c5 | VIRTUAL-MACHINE | |

+—————+————–+—————–+————-+

| noble/arm64 | 32f80f295a51 | CONTAINER | |

+—————+————–+—————–+————-+

| noble/armhf | 0770d7617e2f | CONTAINER | |

+—————+————–+—————–+————-+

| noble/armhf | c7fa2c3f8cf7 | VIRTUAL-MACHINE | |

+—————+————–+—————–+————-+

| noble/ppc64el | 5394c263db75 | CONTAINER | |

+—————+————–+—————–+————-+

| noble/ppc64el | a9f3ce6c2dd3 | VIRTUAL-MACHINE | |

+—————+————–+—————–+————-+

| noble/riscv64 | a4e3597c8f23 | VIRTUAL-MACHINE | |

+—————+————–+—————–+————-+

| noble/riscv64 | cbfd49dc2287 | CONTAINER | |

+—————+————–+—————–+————-+

| noble/s390x | 3ea9c3220f3f | VIRTUAL-MACHINE | |

+—————+————–+—————–+————-+

| noble/s390x | 8cfa9f768150 | CONTAINER | |

+—————+————–+—————–+————-+

 

イメージのプル

lxc image copy ubuntu:24.04 local: --alias noble

Image copied successfully!

lxc image list

+——-+————–+——–+———————————————+————–+———–+———–+——————————+

| ALIAS | FINGERPRINT | PUBLIC | DESCRIPTION | ARCHITECTURE | TYPE | SIZE | UPLOAD DATE |

+——-+————–+——–+———————————————+————–+———–+———–+——————————+

| noble | 7a0b671dbca3 | no | ubuntu 24.04 LTS amd64 (release) (20250226) | x86_64 | CONTAINER | 256.15MiB | Feb 27, 2025 at 2:19am (UTC) |

+——-+————–+——–+———————————————+————–+———–+———–+——————————+

 

ちなみに他のOSを入手したいならば、ubuntuではなくimagesから持ってくる

lxc image list images:
lxc image list images:almalinux/9
lxc image copy images:almalinux/9 local: --alias almalinux
lxc image list

 

CONTAINER=ubuntu-test0
lxc launch almalinux ${CONTAINER} --profile=default
lxc list
lxc exec ${CONTAINER} -- bash

 

デフォルト設定のコンテナを起動する例

ローカルのイメージで立ち上げるなら

lxc launch local:noble ${CONTAINER} --profile=default

直接Pullするならば

lxc launch ubuntu:24.04 ${CONTAINER} --profile=default

 

起動してみる

CONTAINER=ubuntu-test1
lxc launch local:noble ${CONTAINER} --profile=default
lxc list

+————–+———+———————-+———————————————–+———–+———–+

| NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS |

+————–+———+———————-+———————————————–+———–+———–+

| ubuntu-test1 | RUNNING | 10.67.233.199 (eth0) | fd42:35e5:22a8:2ca7:216:3eff:fee5:9942 (eth0) | CONTAINER | 0 |

+————–+———+———————-+———————————————–+———–+———–+

 

コンテナへのアクセス

コンソールへのアクセス(ログイン不要)

lxc console ${CONTAINER}

抜けるには、Ctrl-A + Q

このイメージのrootユーザやubuntuユーザのパスワードは不明

 

rootユーザでbashシェルに入る

lxc exec ${CONTAINER} -- bash

exitと入力すれば抜けられる。

 

Cloud-initの利用

lxdでは、Cloud-initが使えるので、Cloud-initで初期設定をして使うことをお勧めする。

lxdは、少なくともCloud-initで起動したほうが絶対便利だと思う。IPv4でもIPv6でもログインができる。この環境だと、ホストの物理NICが刺さっているネットワークと同じネットワークにコンテナが起動するので、ホストと同じDHCPサーバからIPアドレスが取れるし、ホストがIPv6のIPアドレスをもっているのであれば、コンテナにもIPv6アドレスが割当たる。(これがやりたかった。)

また、この起動形式は、Cloud-initのyamlファイルを作成しないでそのまま食わせている

CONTAINER=ubuntu-test3
lxc init local:noble ${CONTAINER} --profile=bridge
lxc list
cat << EOF > cloud-init-config.yml
#cloud-config

hostname: ${CONTAINER}
locale: en_US.utf-8

packages:
  - openssh-server

users:
- name: ubuntu
  shell: /bin/bash
  ssh-authorized-keys:
    - $(cat ~/.ssh/id_rsa.pub)
    sudo: ALL=(ALL) NOPASSWD:ALL

write_files:
- content: |
    alias diff='diff --color=auto'
    alias ip='ip -color=auto'
  path: /etc/profile.d/Z99-addedcolour.sh
EOF
lxc config set ${CONTAINER} user.user-data - < cloud-init-config.yml
lxc config show ${CONTAINER}
lxc start ${CONTAINER}
lxc list
export LXC_IPV4=$(lxc list ${CONTAINER} --format=json | jq -r '.[].state.network.eth0.addresses[] | select(.family == "inet") | .address')
ssh ubuntu@$LXC_IPV4

ちなみに、QNAPのLXDでもcloud-initが使えた。Container Stationから使えればいいのになぁ。

LXDの中でDockerを起動させたい

古いバージョンだとdockerのプロファイルがあったのだが、今はない。しかし、LXD上でDockerの利用は可能。-c security.nesting=true -c security.privileged=trueをつけてコンテナを使う必要がある。

 

こんな感じでlxdが使えるようになった。ただ、QNAPでもLXDが動かせてしまうので、QNAPを持っている自分としてはあまり出番はないかもしれない。ただ、仮想マシンが必要だというケースの場合、場合によっては、LXDのコンテナだけで事が済んでしまうのではないかと思う。Proxmoxでコンテナを使う場合でも、ここいらのベースの知識(LXD/LXCとCloud-initなど)くらいは知らないと使いこなすのは難しいかもしれない。vSphereが高嶺の花になってきて、急にCloud-initが必要になってきたような気がする

コメントを残す