社内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