古いCeleron MノートでLinuxコンテナ(LXD)を構築してみた

LXDマシンのスペック

今回使用するノートPCのスペックはざっとこんなものです。Windows Vista世代のマシンですね。

メーカーSOTEC
型番WH3513KPB
CPUIntel Celeron M 430
チップセットVIA VN896 (VN896+VIA 8237A)
システムメモリ2GB (PC2-5300/667MHz DDR2 SDRAM 200pin SO-DIMM)
ハードディスクドライブ100GB (Serial ATA 1.5Gb/s,5,400rpm)
グラフィックシステムVIA Chrome9 HC チップセット内蔵 VRAM 256MB (システムメモリより割り当て)
プリインストールOSMicrosoft Windows Vista Home Premium

CPUはCeleron M 430であり、インテル64には対応はしておらず、仮想化支援機能であるIntel VTには対応していません。 そのため、このPCではVMWareなどの仮想マシンは動作しません。

そこで今回は、仮想マシンではなく、Linuxコンテナ仮想化用マシンとして構築することにしました。 コンテナはカーネルを共有する仕組みであり、仮想マシンを動作させるわけではないため、Intel VTは必要ありません。しかもメモリ使用量も少なく軽量です。

カーネルを共有するというとは、同じカーネルバージョンで動作するLinuxディストリビューションであれば、CentOSでもUbuntuでもDebianでもLinux Mintでも動作することになります。

ただし32bitのCPUであり、当然ながら32bitカーネルしか動作しないため、構築できるコンテナも32bit版Linux(i386、i686)に限られます。 しかし、32bit版LinuxはCentOSであれば6まで、Ubuntu系であれば18までリリース(18が最後の32bit対応)されており、サポート的にはまだしばらくは使えそうです。

ホストOS

ホストOSとして選んだのは軽量Ubuntu系ディストリビューションであるXubuntu 18.04です。 Xubuntu 14.04のメディアがあったので、まずXubuntu 14.04をインストールし、do-release-upgrade コマンドで18.04までアップグレードしました。

なお、Chrome9 HCの対応グラフィックドライバが無く、標準グラフィックドライバが当たっているため表示はVGA(640x480)表示となってしまっていますが、LXDサーバーとしては全く問題ありません。(CLIさえ使えれば良い)

標準グラフィックドライバでの動作となりますが、それでも軽いです。さすがXfceです。

LXDのインストール

まず、lxdのパッケージをインストールします。 ※最近はsnapでインストールするのが主流になりつつありますが、今回はできるだけシンプルに作業を行いたいのでaptを使用します。

$ sudo apt install lxd
インストールが完了する直前に、丁寧にlxd initを実行するように促してくれます。
Created symlink /etc/systemd/system/sockets.target.wants/lxd.socket → /lib/systemd/system/lxd.socket.
Setting up lxd dnsmasq configuration.

To go through the initial LXD configuration, run: lxd init

早速lxd initを実行します。これを実行することでLXDの仮想ブリッジなども自動で作成してくれます。 基本すべてデフォルトでいいのですが、IPv6に関しては使用しないのでnoneにしておきました。

$ sudo lxd init
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]:
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]: none
Would you like LXD 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]:

LXDの仮想ブリッジlxdbr0も正常に作成され接続済みであることが確認できますね。このブリッジを介してコンテナはネットワークに接続することになります。

$ nmcli device
DEVICE  TYPE      STATE     CONNECTION
ens33   ethernet  接続済み  有線接続 1
lxdbr0  bridge    接続済み  lxdbr0
lo      loopback  管理無し  --

lxdbr0にはデフォルトで10.72.240.1/24のIPが設定されています。コンテナ側ではこの10.72.240.1/24がゲートウェイとなりDHCPでIPアドレスが自動で割り振られることになるようです。

$ sudo ip addr show lxdbr0
3: lxdbr0:  mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1000
    link/ether 46:e4:39:0e:95:84 brd ff:ff:ff:ff:ff:ff
    inet 10.72.240.1/24 scope global lxdbr0
       valid_lft forever preferred_lft forever
    inet6 fe80::44e4:39ff:fe0e:9584/64 scope link
       valid_lft forever preferred_lft forever

LXDを起動します。

$ systemctl start lxd

なお、LXDの自動起動は既に設定されているようです。 is-enabledの結果で表示されているindirect他のユニットにより開始されるユニットである事を表し、まずlxd.socketが自動起動し、lxd.socketがlxd.serviceを起動させる動作になるようです。

$ systemctl is-enabled lxd.socket
enabled
$ systemctl is-enabled lxd.service
indirect

コンテナの作成

コンテナを作成するにはまずOSイメージをダウンロードする必要があります。 イメージサーバーは lxc remote list コマンドで確認できます。

$ lxc remote list
初めてこのマシンで LXD を使う場合、lxd init と実行する必要があります
初めてコンテナを起動するには、"lxc launch ubuntu:18.04" と実行してみてください

+-----------------+------------------------------------------+---------------+-----------+--------+--------+
|      NAME       |                   URL                    |   PROTOCOL    | AUTH TYPE | PUBLIC | STATIC |
+-----------------+------------------------------------------+---------------+-----------+--------+--------+
| images          | https://images.linuxcontainers.org       | simplestreams |           | YES    | NO     |
+-----------------+------------------------------------------+---------------+-----------+--------+--------+
| local (default) | unix://                                  | lxd           | tls       | NO     | YES    |
+-----------------+------------------------------------------+---------------+-----------+--------+--------+
| ubuntu          | https://cloud-images.ubuntu.com/releases | simplestreams |           | YES    | YES    |
+-----------------+------------------------------------------+---------------+-----------+--------+--------+
| ubuntu-daily    | https://cloud-images.ubuntu.com/daily    | simplestreams |           | YES    | YES    |
+-----------------+------------------------------------------+---------------+-----------+--------+--------+

ダウンロード可能なイメージを調べるには lxc image list の後に イメージサーバー名:ディストリビューション バージョン アーキテクチャ を指定するようです。 Ubuntu 18.04 の 32bit 版(i386)を検索してみます。

$ lxc image list images: ubuntu 18.04 i386
+----------------------------+--------------+--------+-------------------------------------+------+----------+-------------------------------+
|           ALIAS            | FINGERPRINT  | PUBLIC |             DESCRIPTION             | ARCH |   SIZE   |          UPLOAD DATE          |
+----------------------------+--------------+--------+-------------------------------------+------+----------+-------------------------------+
| ubuntu/18.04 (他7個)       | 0d31d5e915c9 | yes    | Ubuntu bionic i386 (20200918_07:42) | i686 | 95.72MB  | Sep 18, 2020 at 12:00am (UTC) |
+----------------------------+--------------+--------+-------------------------------------+------+----------+-------------------------------+
| ubuntu/18.04/cloud (他3個) | f45961f51e77 | yes    | Ubuntu bionic i386 (20200918_07:42) | i686 | 106.52MB | Sep 18, 2020 at 12:00am (UTC) |
+----------------------------+--------------+--------+-------------------------------------+------+----------+-------------------------------+

イメージをダウンロードしてインスタンスを作成するには lxc launch の後に イメージサーバー名:イメージ名 インスタンス名 を指定するようです。 早速 Ubuntu 18.04 のインスタンスを作成してみます。イメージをダウンロードするので少し時間がかかりますのでお茶でも飲んでいましょう。

$ sudo lxc launch images:ubuntu/18.04 ubuntu18

ダウンロードしたイメージは lxc image list コマンドで確認できます。

$ sudo lxc image list
+-------+--------------+--------+-------------------------------------+------+---------+------------------------------+
| ALIAS | FINGERPRINT  | PUBLIC |             DESCRIPTION             | ARCH |  SIZE   |         UPLOAD DATE          |
+-------+--------------+--------+-------------------------------------+------+---------+------------------------------+
|       | 0d31d5e915c9 | no     | Ubuntu bionic i386 (20200918_07:42) | i686 | 95.72MB | Sep 19, 2020 at 3:28am (UTC) |
+-------+--------------+--------+-------------------------------------+------+---------+------------------------------+

また、インスタンスは lxc list コマンドで確認できます。STATEを見るとRUNNINGなので既に起動していますね。IPアドレスも10.72.240.xxxのものが振られています。

$ sudo lxc list
+----------+---------+----------------------+------+------------+-----------+
|   NAME   |  STATE  |         IPV4         | IPV6 |    TYPE    | SNAPSHOTS |
+----------+---------+----------------------+------+------------+-----------+
| ubuntu18 | RUNNING | 10.72.240.206 (eth0) |      | PERSISTENT | 0         |
+----------+---------+----------------------+------+------------+-----------+

ちなみにコンテナの起動は、lxc start 、停止は lxd stop コマンドに続けてインスタンス名を指定して実行します。

$ sudo lxc start ubuntu18
$ sudo lxc stop ubuntu18

コンテナへの接続

コンテナに接続するには、lxc exec に続けて インスタンス名 -- シェル を指定するみたいです。

$ sudo lxc exec ubuntu18 -- bash

コンテナOSのホスト名には自動でインスタンス名が設定されているようで、コンソールに接続するとプロンプトにubuntu18が表示されます。

root@ubuntu18:~#

コンテナから抜けるには exit コマンドを実行します。なお単にコンテナから抜ける(デタッチ)するだけでコンテナは起動したままになります。

メモリ使用量

ちなみにコンテナを3つ(Centos 6、Debian 11、Ubuntu 18)起動時のメモリ使用量を見てみます。

# lxc list
+---------------+---------+-----------------------+------+------------+-----------+
|     NAME      |  STATE  |         IPV4          | IPV6 |    TYPE    | SNAPSHOTS |
+---------------+---------+-----------------------+------+------------+-----------+
| centos6       | RUNNING | 10.72.240.220 (eth0)  |      | PERSISTENT | 0         |
+---------------+---------+-----------------------+------+------------+-----------+
| debian11      | RUNNING | 10.72.240.180 (eth0)  |      | PERSISTENT | 0         |
+---------------+---------+-----------------------+------+------------+-----------+
| ubuntu18      | RUNNING | 10.72.240.206 (eth0)  |      | PERSISTENT | 0         |
+---------------+---------+-----------------------+------+------------+-----------+
| ubuntumacvlan | STOPPED |                       |      | PERSISTENT | 0         |
+---------------+---------+-----------------------+------+------------+-----------+

グラフィック(VRAM)で256MBが占有されるため、システムメモリの総容量は1.7GB程度ですが、使用量はわずか271MB、1.2GBが利用可能です。

# free -h
              total        used        free      shared  buff/cache   available
Mem:           1.7G        271M        745M        4.7M        737M        1.2G
Swap:          1.7G          0B        1.7G

さいごに

多数のLinuxディストリビューションで検証したりLPICなどの勉強をしたりするのであれば、古いPCでもLinuxコンテナであれば軽快に動作するため、仮想マシンよりも断然お勧めです。

もしろん最新のPCであれば、ネイティブで多くのLinuxディストリビューションやバージョンを動作させる事ができ、またVPSを始めとした サーバー用途にも、1台のVPSで各用途(Web、メール、データベース等)ごとにコンテナを構築し、コンテナベースの柔軟なサーバー運用が行えますね。

以上、古いCeleron MノートでLinuxコンテナ(LXD)を構築してみたでした。

公開日:2020年09月19日

記事 > コンテナ > 古いCeleron MノートでLinuxコンテナ(LXD)を構築してみた

コンテナの記事一覧

他の記事も見る

このページのトップに戻る