自主的20%るぅる

各々が自主的に好き勝手書くゆるふわ会社ブログ

Raspberry Pi 3 Model BにインストールしたCentOS7にLXCをインストールしてみる

社内Labなら独立した環境が欲しいよね

社内Labだといいつつ、単一の環境しかないと不便ですよね。

理想でいえば、社員ひとりひとりに専用の環境を作りたいところですが、そんな金もなければ時間もないわけで……。

そのあたりをなんとかしようとおもったら、仮想化技術を使うのがいい感じですよね。

様々な仮想化技術がある中で、Raspberry Piという比較的低スペックなコンピュータで使えるモノといえば……。コンテナ系のブツでしょう。

今回はそのなかでLXC(Linux Container)を使えるようにしましたよ!……ってお話です。

とはいえ……

しかしながらですね……。Raspberry PiでLXCを使えるようにするのはちょっと大変です。

パッケージがなかったりとか……。いろいろと手動で作ったりしなきゃいけないとか……。ソースからビルドしなきゃいけないとか……。

このエントリは、その試行錯誤の記録です。

実際にやった流れをそのまま書いているわけではなく、試行錯誤のログを元に再構成している部分が多々あります。ので、細かい所で「これはちがうよ!」ってところが出てくるかもしれません。

そのあたりはメンゴメンゴ(´・ω・`)

必要なパッケージをインストールする

まずLXCをソースからビルドするために、必要なパッケージをインストールします。

具体的にコマンドは下記の通り。依存関係上、ほかにもいくつかインストールされます。

[user1@centos-rpi3 ~]$ sudo yum install gcc make openssl openssl-libs openssl-devel rsync libcap libcap-dev

lxcのtarballをダウンロードしてインストール

ビルドできるようになったので、LXCのソースを取得して展開します。

具体的には下記のようなコマンドで入手できます。ダウンロード用のURLはLinux Containersのダウンロードページを参照して、最新版のものに置き換えると吉です。

[user1@centos-rpi3 ~]$ curl -O 'https://linuxcontainers.org/downloads/lxc/lxc-2.0.3.tar.gz'
(略)
[user1@centos-rpi3 ~]$ tar xzf ./lxc-2.0.3.tar.gz
[user1@centos-rpi3 ~]$ ls
lxc-2.0.3  lxc-2.0.3.tar.gz
[user1@centos-rpi3 ~]$ cd ./lxc-2.0.3
[user1@centos-rpi3 lxc-2.0.3]$ ls
AUTHORS       COPYING    INSTALL      Makefile.am  NEWS    aclocal.m4  config     configure.ac  hooks      lxc.spec     src
CONTRIBUTING  ChangeLog  MAINTAINERS  Makefile.in  README  autogen.sh  configure  doc           lxc.pc.in  lxc.spec.in  templates

展開したらビルドします。

[user1@centos-rpi3 lxc-2.0.3]$ ./configure --prefix=/usr/local/lxc
(略)
[user1@centos-rpi3 lxc-2.0.3]$ make && sudo make install
(略)

これで「/usr/local/lxc」配下に必要なファイル一式が格納されます。

共有ライブラリの参照パス設定

たった今インストールしたLXCですが、生成された共有ライブラリをシステムに認識させてあげないといけません。

具体的には下記のようなコマンドを順番にタイプしていけばOK。

[user1@centos-rpi3 lxc-2.0.3]$ sudo su -c 'echo "/usr/local/lxc/lib/" > /etc/ld.so.conf.d/lxc.conf'
[user1@centos-rpi3 lxc-2.0.3]$ cat /etc/ld.so.conf.d/lxc.conf
/usr/local/lxc/lib/
[user1@centos-rpi3 lxc-2.0.3]$ sudo ldconfig

ラズパイ用のテンプレートを設定

このままだとまだ動かないので……。必要な作業はまだあります。

まずはコンテナのテンプレートにラズパイ用のものがないので、そいつを作る必要があります。

といってもゼロからではなく、既存のテンプレートをちょこっと変更するだけでOKっぽいです。

具体的にはこんな感じ。

[user1@centos-rpi3 lxc-2.0.3]$ ls /usr/local/lxc/share/lxc/templates/
lxc-alpine    lxc-archlinux  lxc-centos  lxc-debian    lxc-fedora  lxc-openmandriva  lxc-oracle  lxc-slackware   lxc-sshd    lxc-ubuntu-cloud
lxc-altlinux  lxc-busybox    lxc-cirros  lxc-download  lxc-gentoo  lxc-opensuse      lxc-plamo   lxc-sparclinux  lxc-ubuntu
[user1@centos-rpi3 lxc-2.0.3]$ sudo cp -p /usr/local/lxc/share/lxc/templates/lxc-centos /usr/local/lxc/share/lxc/templates/lxc-centos-rpi
[user1@centos-rpi3 lxc-2.0.3]$ diff /usr/local/lxc/share/lxc/templates/lxc-centos /usr/local/lxc/share/lxc/templates/lxc-centos-rpi
439c439,440
< mirrorlist=http://mirrorlist.centos.org/?release=$release&arch=$basearch&repo=os
---
> #mirrorlist=http://mirrorlist.centos.org/?release=$release&arch=$basearch&repo=os
> baseurl=http://mirror.centos.org/altarch/$release/os/$basearch/
443c444,445
< mirrorlist=http://mirrorlist.centos.org/?release=$release&arch=$basearch&repo=updates
---
> #mirrorlist=http://mirrorlist.centos.org/?release=$release&arch=$basearch&repo=updates
> baseurl=http://mirror.centos.org/altarch/$release/updates/$basearch/

同梱されているCentOS用のテンプレートファイルを別名でコピーし、URLをラズパイのものに書き換える……ってイメージですね。

ブリッジネットワークデバイスの作成

続いて、LXCが使うブリッジネットワーク用デバイスを作ります。

[user1@centos-rpi3 lxc-2.0.3]$ sudo nmcli connection add type bridge ifname lxcbr0
接続 'bridge-lxcbr0' (略) が正常に追加されました。
[user1@centos-rpi3 lxc-2.0.3]$ sudo nmcli connection modify bridge-lxcbr0 bridge.stp no
[user1@centos-rpi3 lxc-2.0.3]$ sudo nmcli connection modify bridge-lxcbr0 ipv4.method manual ipv4.address "192.0.2.100/24" ipv4.gateway 192.0.2.1 ipv4.dns 192.0.2.1
[user1@centos-rpi3 lxc-2.0.3]$ sudo nmcli connection add type bridge-slave ifname eth0 master bridge-lxcbr0
[user1@centos-rpi3 lxc-2.0.3]$ sudo nmcli connection del eth0 && sudo shutdown -r now
Connection 'eth0' (略) successfully deleted.

これでブリッジデバイスを作成し、IPアドレス等々を設定し、既存のいらなくなった「eth0」デバイスを削除するって流れです。

最後のコマンドをタイプするとネット接続が切れるので、再度繋ぎなおします。

[user1@centos-rpi3 lxc-2.0.3]$ sudo nmcli connection
名前               UUID                                  タイプ          デバイス
bridge-slave-eth0  (略)                                  802-3-ethernet  eth0
bridge-lxcbr0      (略)                                  bridge          lxcbr0
[user1@centos-rpi3 lxc-2.0.3]$ ip addr
(略)
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master lxcbr0 state UP qlen 1000
    link/ether (略) brd ff:ff:ff:ff:ff:ff
7: lxcbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP qlen 1000
(略)
    inet 192.0.2.100/24 brd 255.255.255.0 scope global lxcbr0
       valid_lft forever preferred_lft forever
(略)

こんな感じでブリッジネットワーク用デバイスが出来上がりました。

コンテナの作成と削除

ここまでやったら後は起動可能な状態になっているはず!

まずはテンプレートを元に、ベースとなるコンテナイメージを作ります。

[user1@centos-rpi3 lxc-2.0.3]$ sudo /usr/local/lxc/bin/lxc-create -t centos -n test
(略)

ベースとなるコンテナイメージを削除するときはこちら。

[user1@centos-rpi3  lxc-2.0.3]$ sudo /usr/local/lxc/bin/lxc-destroy -n test
(略)

「-n」オプションの後ろには、任意の名称を指定できます。わかりやすいのを付けておくと良いですね。

コンテナの起動と接続

コンテナイメージができたら、そのイメージを使って個別の仮想環境を起動しましょう。

具体的には下記のようなコマンドで起動できます。

[user1@centos-rpi3  lxc-2.0.3]$ sudo /usr/local/lxc/bin/lxc-start -n test
(略)

起動したコンテナイメージへは、下記のコマンドを使って接続できます。

[user1@centos-rpi3 lxc-2.0.3]$ sudo /usr/local/lxc/bin/lxc-console -n test

Connected to tty 1
                  Type <Ctrl+a q> to exit the console, <Ctrl+a Ctrl+a> to enter Ctrl+a itself

CentOS Linux 7 (Core)
Kernel 4.4.16-v7+ on an armv7l

test login: root
Password:
You are required to change your password immediately (root enforced)
Changing password for root.
(current) UNIX password:
New password:
Retype new password:
[root@test ~]# ping agent-grow.com
PING agent-grow.com (163.44.168.161) 56(84) bytes of data.
64 bytes from v163-44-168-161.a065.g.tyo1.static.cnode.io (163.44.168.161): icmp_seq=1 ttl=47 time=16.9 ms
64 bytes from v163-44-168-161.a065.g.tyo1.static.cnode.io (163.44.168.161): icmp_seq=2 ttl=47 time=14.4 ms
64 bytes from v163-44-168-161.a065.g.tyo1.static.cnode.io (163.44.168.161): icmp_seq=3 ttl=47 time=14.4 ms
64 bytes from v163-44-168-161.a065.g.tyo1.static.cnode.io (163.44.168.161): icmp_seq=4 ttl=47 time=14.2 ms
64 bytes from v163-44-168-161.a065.g.tyo1.static.cnode.io (163.44.168.161): icmp_seq=5 ttl=47 time=14.3 ms
^C
--- agent-grow.com ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4005ms
rtt min/avg/max/mdev = 14.255/14.904/16.938/1.028 ms
[root@test ~]#

接続すると、rootのパスワードを求められますね。

ちゃんと正しいパスワードを入力するとパスワードの変更を求められます。

その後は独立したLinux Boxとしてつかえます。

ネットワークもDHCPで勝手にアドレス取ってくれるので、普通に使えますね。

これで社内Labの完成です!

ってことで、こんな感じで仮想環境も準備できたので。

長らく連載してきた社内Labを作ろうシリーズも一段落といった感じです。

細かい部分を調整して、社内に周知して、希望者毎に仮想環境作って……。いよいよ全社に公開できそうです。

やったね!(o゜▽゜)o

Let’s share this article!

{ 関連記事 }

{ この記事を書いた人 }

Yuta Hayakawa
Yuta Hayakawa

2016年6月入社。執行役員。社内システムチーム統括。

普段は東京本社で管理職のお仕事したり、広報的役割としてテキスト書いたり動画作ったりするのが最近のお仕事。

自称「社内システムチーム統括」として、社内システムチームの面々を見守りつつ毎日を過ごしています。

プライベート面では、音楽やコンピュータ関連、ゴルハム&ジャンハム関係、ゲーム関係が興味あるポイント。

記事一覧