mattintosh note

どこかのエンジニアモドキの備忘録

Arch Linux ARM on Raspberry Pi で LXC を使って Ubuntu を4台同時起動してみる

最近、仮想化で遊んでます。Docker 前から気になってるんだけど………LXC(LinuX Containers)です。

調べてみたら Raspberry Pi でも使えるので早速トライ。

lxcDebian 系の Ubuntu を入れるので debootstrap をインストール。Arch Linux の場合は arch-install-scripts が必要。

pacman -S lxc debootstrap 

/usr/share/lxc/templates 以下はこんな感じ。

コンテナを作ってみる。

sudo lxc-create -t ubuntu -n ubuntu01

暫く放置しておく。最期にデフォルトユーザとパスワードが出力されるので覚えておく。

##
# The default user is 'ubuntu' with password 'ubuntu'!
# Use the 'sudo' command to run tasks as root in the container.
##

ネットワークが使えるように /var/lib/lxc/ubntu01/config を編集する。ホストの Arch Linux ARM では systemd-networkd で既に br0 は作成してある。

# Template used to create this container: /usr/share/lxc/templates/lxc-ubuntu
# Parameters passed to the template:
# For additional config options, please look at lxc.container.conf(5)

# Uncomment the following line to support nesting containers:
#lxc.include = /usr/share/lxc/config/nesting.conf
# (Be aware this has security implications)


# Common configuration
lxc.include = /usr/share/lxc/config/ubuntu.common.conf

# Container specific configuration
lxc.rootfs = /var/lib/lxc/ubuntu01/rootfs
lxc.rootfs.backend = dir
lxc.utsname = ubuntu01
lxc.arch = armhf

# Network configuration
#lxc.network.type = empty
lxc.network.type = veth
lxc.network.link = br0
lxc.network.flags = up
lxc.network.ipv4 = 192.168.1.123/24
lxc.network.ipv4.gateway = 192.168.1.1
lxc.network.name = eth0

コンテナを起動する。

sudo lxc-start -n ubuntu01

ssh -X で直接コンテナに接続して glxgears を動かしてみたところ。30 fps 以上出るし母艦の Raspberry Pi にも余力がまだある。

f:id:mattintosh4:20160911163303p:plain

lxc-copy -n ubuntu01 -N ubuntu0X でコンテナを複製してみた。ご丁寧に rootfs/etc/hostnamerootfs/etc/hosts も書き換えてくれるらしい。(ただし、configlxc.network.ipv4 は変わらない)

Ubuntu のコンテナを複製して4台同時起動してみた。

f:id:mattintosh4:20160911191855p:plain

Raspberry Pi 3 一台で複数の OS が起動できるし、ネットワークインターフェイスも個別に設定が出来るから5〜6人ならそれぞれに仮想マシンを用意させてあげることができそう。lxc-create してから少し時間はかかるけど時間あるときに作っておいてあとは lxc-copy で複製すればいいかな。

なんか IP が2つ割り当たっていて NIC の設定を間違っているような気がするので追々調整する…。


DHCP が有効だとこれだけでいいっぽい。固定 IP にしようとすると IP が二つ割り当てられるんだけどどう設定するんだろ。

lxc.network.type = macvlan
lxc.network.link = br0

↑コンテナの中の /etc/network/interfaces 編集するだけだった…。

auto eth0
iface eth0 inet static
    address 192.168.1.123
    netmask 255.255.255.0
    gateway 192.168.1.1
    dns-nameservers 8.8.8.8 8.8.4.4 192.168.1.1

ホスト側から設定ファイル修正出来るのも簡単でいいなぁ…。

Arch Linux の場合はインターフェイスが起動しないので lxc.network.flags = up にしとく。

lxc.network.type = macvlan
lxc.network.link = br0
lxc.network.flags = up

んで ip コマンド。まだやってないけど /etc/systemd/network に設定ファイル置いておけば起動するだろう。

ip a add 192.168.1.234/24 dev eth0
ip r add default via 192.168.1.1