VirtualBoxをLXCにインストールして、実行する
今回の記事で、確認に用いたマシン環境は次のとおりです。
ホストCPU | Intel(R) Core(TM) i7 CPU 860 @ 2.80GHz |
ホストOS | Ubuntu 17.04 |
ゲストOS | Ubuntu 17.04 |
VirtualBox | 5.1 (AMD64) |
次節以降で具体的な手順を示しますが、今回の構成上のポイントは、次のようになるかと思います。
- ホストOSとゲストOSを同じにする
- 上記は、ゲスト上でビルドしたカーネルドライバをホストでロードできるようにするため
- LXCコンテナのconfigファイル設定で、ロードしたカーネルドライバをコンテナ上で使用できるようにする
コンテナの作成と起動
ホストマシン上で、次のコマンドを実行します。以下の例では、コンテナのマシン名はmacaroonです。
# lxc-create -t ubuntu -n macaroon
次のコマンドでコンテナを起動します。lxc-attachでコンテナのシェルが利用できます。
# lxc-start -n macaroon
# lxc-attach -n macaroon
root@macaroon:/#
コンテナ上でのVirtualBoxのインストール
公式サイトかドキュメントを参照しならがら、コンテナ上でインストールを進めていきます。
/etc/apt/sources.listに以下の行を追加します。Ubuntuの異なるバージョンを用いる場合、水色で記載したzestyの部分を対応するコードネームに変更してください。
deb http://download.virtualbox.org/virtualbox/debian zesty contrib
その後、次のコマンドを入力します。
root@macaroon:/# apt install wget
root@macaroon:/# wget -q http://www.virtualbox.org/download/oracle_vbox_2016.asc -O- | sudo apt-key add -
root@macaroon:/# wget -q http://www.virtualbox.org/download/oracle_vbox.asc -O- | sudo apt-key add -
root@macaroon:/# apt-get update
root@macaroon:/# apt-get install virtualbox-5.1
カーネルドライバのビルド
コンテナ上で次のコマンドを入力します。
root@macaroon:/# make -C /usr/share/virtualbox/src/vboxhost
なお、コンテナ上にインストールされているカーネルヘッダのバージョンとホストOSのバージョンが同一でなければなりません。以下のようにそれぞれのバージョンを確認できます。異なる場合、ホスト・コンテナとも最新のものにアップデートします。
root@macaroon:/# dpkg -l | grep header
ii linux-headers-4.10.0-24 4.10.0-24.28 all Header files related to Linux kernel version 4.10.0
ii linux-headers-4.10.0-24-generic 4.10.0-24.28 amd64 Linux kernel headers for version 4.10.0 on 64 bit x86 SMP
ii linux-headers-generic 4.10.0.24.26 amd64 Generic Linux kernel headers
root@macaroon:/# cat /proc/version
Linux version 4.10.0-24-generic (buildd@lcy01-09) (gcc version 6.3.0 20170406 (Ubuntu 6.3.0-12ubuntu2) ) #28-Ubuntu SMP Wed Jun 14 08:14:34 UTC 2017
ドライバのインストール
ホストOS上で、カーネルドライバのインストールを行います。
# cd /var/lib/lxc/macaroon/rootfs/usr/share/virtualbox/src/vboxhost/
# for i in vboxdrv vboxnetflt vboxnetadp vboxpci; do insmod $i.ko; done;
ドライバがロードされると、次のようにホスト上にデバイスファイルが作成されています。この時、デバイスのメジャー番号とマイナー番号を覚えておきます。
# ls -l /dev/vbox*
crw------- 1 root root 10, 55 6月 26 15:22 /dev/vboxdrv
crw------- 1 root root 10, 54 6月 26 15:22 /dev/vboxdrvu
crw------- 1 root root 10, 53 6月 26 15:26 /dev/vboxnetctl
コンテナでのデバイス利用の許可
一旦、コンテナをシャットダウンします。コンテナ上で次のコマンドを入力します。
# shutdown -h now
/var/lib/lxc/macaroon/configに次の行を追加します。デバイスのメジャー番号とマイナー番号は、さきほど確認したものを入力します。この例では、それぞれを水色で示しています。
lxc.cgroup.devices.allow = c 10:53 rwm
lxc.cgroup.devices.allow = c 10:54 rwm
lxc.cgroup.devices.allow = c 10:55 rwm
再度、コンテナを起動します。
# lxc-start -n macaroon
# lxc-attach macaroon
コンテナが起動したら、次のようにデバイスファイルを作成します。
root@macaroon:/# mknod /dev/vboxnetctl c 10 53
root@macaroon:/# mknod /dev/vboxdrvu c 10 54
root@macaroon:/# mknod /dev/vboxdrv c 10 55
VirtualBoxの起動
VirtualBoxのUIは、GUIです。マシン環境によってはiptablesなどが設定されているので、sshでXフォーワーディングを利用してコンテナにログインし、GUIをデスクトップマシンで表示するのが、比較的やりやすい方法です。そのためには、コンテナのIPを調べます。
root@macaroon:/# ip addr
(省略)
19: eth0@if20: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 00:16:3e:b0:ff:b7 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 10.0.3.242/24 brd 10.0.3.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::216:3eff:feb0:ffb7/64 scope lin
また、xauthをインストールしておきます。
root@macaroon:/# apt install xauth
筆者の環境ではすでにSSHデーモンが起動されていましたが、念のために確認するには次のようにします。sshdが存在すればOKです。
root@macaroon:/# ps ax | grep sshd
246 ? Ss 0:00 /usr/sbin/sshd -D
335 ? S+ 0:00 grep --color=auto sshd
では、リモートからログインしてみます。ユーザーubuntuは、デフォルトのユーザー名で、初期パスワードもubuntuです。
$ ssh -X 10.0.3.24 -lubuntu
ログインして、次のコマンドで起動できます。LANGをenに設定しているのは、日本語のフォントがインストールされていない場合の文字化けを防ぐためです。
ubuntu@macaroon:~$ LANG=en virtualbox
筆者の環境では起動に成功して、次の画面がリモートマシンに表示されました。