最近、仮想化で遊んでます。Docker 前から気になってるんだけど………LXC(LinuX Containers)です。
調べてみたら Raspberry Pi でも使えるので早速トライ。
lxc
と Debian 系の Ubuntu を入れるので debootstrap
をインストール。Arch Linux の場合は arch-install-scripts
が必要。
pacman -S lxc debootstrap
/usr/share/lxc/templates
以下はこんな感じ。
- lxc-alpine
- lxc-altlinux
- lxc-archlinux
- lxc-busybox
- lxc-centos
- lxc-cirros
- lxc-debian
- lxc-download
- lxc-fedora
- lxc-gentoo
- lxc-openmandriva
- lxc-opensuse
- lxc-oracle
- lxc-plamo
- lxc-slackware
- lxc-sparclinux
- lxc-sshd
- lxc-ubuntu
- lxc-ubuntu-cloud
コンテナを作ってみる。
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 にも余力がまだある。
lxc-copy -n ubuntu01 -N ubuntu0X
でコンテナを複製してみた。ご丁寧に rootfs/etc/hostname
と rootfs/etc/hosts
も書き換えてくれるらしい。(ただし、config
の lxc.network.ipv4
は変わらない)
Ubuntu のコンテナを複製して4台同時起動してみた。
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