古いCeleron MノートでLinuxコンテナ(LXD)を構築してみた
LXDマシンのスペック
今回使用するノートPCのスペックはざっとこんなものです。Windows Vista世代のマシンですね。
メーカー | SOTEC |
---|---|
型番 | WH3513KPB |
CPU | Intel 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 (システムメモリより割り当て) |
プリインストールOS | Microsoft 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
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日