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