LXDを試す

LXDはLinux用のシステムコンテナおよび仮想マシンマネージャになります。

要約すると、コンテナという仕組みを利用して、普段使っているパソコンの中に別のOSを動かす事が出来るようになります。


今回はRaspberry Pi OS(ラズベリーパイOS)で動いているパソコンで、Ubuntu(ウブントゥ)という別のOSを動かせるようにしながら、LXDの操作に慣れていくことにします。

Linux Containers


環境

マシン : Raspberry Pi 5 8G

OS : Raspberry Pi OS(64-bit)

$ lsb_release -a
No LSB modules are available.
Distributor ID:	Debian
Description:	Debian GNU/Linux 12 (bookworm)
Release:	12
Codename:	bookworm

LXD : 5.0.2

Raspberry Pi 5 / 8GB — スイッチサイエンス




最初に下記のコマンドでラズベリーパイの方にLXDを入れます。

$ sudo apt update
$ sudo apt install lxd

# 下記のコマンドでLXDがインストールされたか?を確認する
$ lxd --version
5.0.2

LXDのバージョンが出力されましたので、LXDがインストールされました。


$ sudo gpasswd -a ${USER} lxd

を実行しておくことで、これから使用しますldcやlxcコマンドをsudoなしで実行する事ができるようになります。




次に、LXDの初期化を行います。

初期化には対話型等の方法がありますが、最初はシンプルにすべてを標準設定(default)にするために下記のコマンドで初期化します。

$ lxd init --minimal

LXDを初期化するには - LXD ドキュメント




次に、LXDの初期化後の設定内容を確認します。

設定内容の確認項目はprofilenetworkstorageになります。


標準のprofileの設定内容の確認は下記のコマンドになります。

$ 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: []

lxdbr0はLXDのネットワーク(network)の標準設定で作成されるデバイスになります。

以後、頻繁に出現しますので覚えておいてください。


lxdbr0の設定を下記のコマンドで確認します。

$ lxc network show lxdbr0
config:
  ipv4.address: 10.198.186.1/24
  ipv4.nat: "true"
  ipv6.address: fd42:c8d4:ad5d:e9bd::1/64
  ipv6.nat: "true"
description: ""
name: lxdbr0
type: bridge
used_by:
- /1.0/profiles/default
managed: true
status: Created
locations:
- none

詳細は端折りますが、lxdbr0はbridgeというタイプのネットワークで、これから作成するコンテナに10.198.186.1〜10.198.186.255のどれからのIPアドレスを振り分ける事がわかります。

ブリッジネットワーク - LXD ドキュメント


しばらくは意識しなくて良いですが、ストレージ(storage)の標準設定も確認しておきます。

$ lxc storage show default
config:
  source: /var/lib/lxd/storage-pools/default
description: ""
name: default
driver: dir
used_by:
- /1.0/profiles/default
status: Created
locations:
- none

ストレージプール、ボリューム、バケットについて - LXD ドキュメント


ネットワークとストレージのどちらのused_byの値に/1.0/profiles/defaultがあるので、どちらもdefaultのプロフィールで参照されていることがわかります。




インスタンスを作成してみます。

LXDで作成した個々のコンテナはインスタンスと呼ばれ、インスタンスを作成する際に任意のインスタンス名を用います。


今回はインスタンス名を c1 にして話を進めます。

インスタンスの作成は下記のコマンドを入力することになっています。

lxc launch|init <image_server>:<image_name> <instance_name> [flags]

インスタンスを作成するには - LXD ドキュメント


今回はインスタンス名を c1 にし、イメージ(コンテナ内で使用したいOS)をUbuntu 24.04にするので、コマンドは下記のようになります。

$ lxc launch ubuntu:24.04 c1 --profile default

ubuntu 24.04のイメージをダウンロードした後にインスタンス名を c1 にし、defaultプロフィールの設定を用いてインスタンスを作成します。

この時、defaultプロフィールを用いるのであれば、--profile defaultのフラグは不要です。


Creating c1
Starting c1

が出力されたら、

$ lxc list

のコマンドを実行して、

+------+---------+----------------------+-----------------------------------------------+-----------+-----------+
| NAME |  STATE  |         IPV4         |                     IPV6                      |   TYPE    | SNAPSHOTS |
+------+---------+----------------------+-----------------------------------------------+-----------+-----------+
| c1   | RUNNING | 10.198.186.17 (eth0) | fd42:c8d4:ad5d:e9bd:216:3eff:fed0:5308 (eth0) | CONTAINER | 0         |
+------+---------+----------------------+-----------------------------------------------+-----------+-----------+

インスタンスが生成されていることを確認します。

ここで再び、defaultプロフィールの内容を確認してみると、

$ 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/c1

used_byの値に先程作成しましたc1インスタンスの記述が追加されています。




作成したインスタンスを操作してみます。

今回は下記のコマンドを実行して、インスタンスにbashログインをしてみます。

$ lxc exec c1 bash

lxc execの後にインスタンス名とインスタンス内で実行したいコマンドを追加します。


このコマンドを実行すると、

root@c1:~# 

になり、インスタンス内にログイン出来たことになります。


動作確認の為に下記のコマンドを実行してみます。

# cat /etc/lsb-release

※# はコメントではなく、rootアカウントで操作している意味になります

DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=24.04
DISTRIB_CODENAME=noble
DISTRIB_DESCRIPTION="Ubuntu 24.04 LTS"

Ubuntu 24.04に切り替わっている事がわかります。

※上記の操作はインスタンス(コンテナ)内に入らずにlxcコマンドから実行する方法がありますが、当サイトでは丁寧に都度インスタンス内に入って操作することにしています。




最後にインスタンスの削除を見ていきます。

インスタンス内に入っているのであれば、

# exit

で抜けた後に、

$ lxc stop c1
$ lxc delete c1

を実行します。


$ lxc list

を実行し、c1インスタンスが削除されたことを確認しましょう。

マインクラフト用ビジュアルエディタを開発しています。
詳しくはinunosinsi/mcws_blockly - githubをご覧ください。