FXボーグ | テクニカル実験室

テクニカル分析を使った自動売買プログラムの開発に挑戦!

スポンサーリンク

LXCの導入から非特権コンテナ用の設定とIPの固定化まで

VPS上のMT4がCPUを圧迫していたので対処法を調べたところ、LXCというパッケージを使うことでリソースの制御ができるようです。LXCについては以下のページが参考になりました。

Lxc で始めるケチケチ仮想化生活?!
LinuxコンテナとLXC入門 (2015-09-13) / 1st kistudy 
15分で分かるLXC(Linux Containers)の仕組みと基本的な使い方 - さくらのナレッジ

リソースさえあれば1つのサーバーにたくさんのコンテナを作れるのですが、デフォルトだと起動するたびにIPアドレスが変わってしまうので、IPを固定する方法についても調べてみました。 

f:id:fxborg:20170710000148p:plain
ソースはこちらの記事
おっさんエンジニアの実験室: lxcのdnsmasqでコンテナのIPアドレス管理 

インストールした環境

lxc自体が Ubuntu上で開発されているので、利用する場合もUbuntu使った方がよいとのことです。Ubuntuのバージョンは Trusty(14.04) 、Xerus(16.04)、Yakkety(16.10) を試しましたが、lxc2.0だと非特権コンテナの起動に失敗するのでlxc1.0.xが使えるTrusty(14.04)を選択しました。(XenServer が原因か・・)

ちなみに特権コンテナはセキュリティ上の問題があって、非推奨となっています。 
(特権コンテナと非特権コンテナについては「Linux Containers - LXC - セキュリティ 」を参照。)

 v2.0だとコンテナに最新のOSが選べるのでちょっと悩みましたが、やはりセキュリティを考慮してv1.0を選択しました。非特権コンテナだと万一コンテナが乗っ取られてもホストOSへの影響は限定的です。

# lsb_release -r
Release: 14.04
# uname -ir
3.13.0-37-generic x86_64

LXCのインストールと初期設定 

▼インストール

・・・これだけです。

apt-get update
apt-get install lxc

非特権コンテナ用の設定

▼ /etc/subuidと/etcsubgidの設定

# cat /etc/subuid
root:100000:65536
# cat /etc/subgid
root:100000:65536

root が作るコンテナ内のUIDとGIDの範囲を設定します。

▼ /etc/lxc/default.confの設定

# cat /etc/lxc/default.conf
lxc.network.type = veth
lxc.network.link = lxcbr0
lxc.network.flags = up
lxc.network.hwaddr = 00:16:3e:xx:xx:xx
# 以下を追記
lxc.id_map = u 0 100000 65536
lxc.id_map = g 0 100000 65536

UIDとGIDの範囲設定を追記します。

非特権コンテナの作成

基本的な設定が終わったので非特権コンテナを作成します。次のように指定します。

# lxc-create -n ubu01 -t download 

「-n ubu01」はコンテナ名の指定で「-t download 」で非特権用のテンプレートを指定したことになります。これを実行すると以下のような一覧が表示されます。

Setting up the GPG keyring
Downloading the image index

---
DIST    RELEASE ARCH    VARIANT BUILD
---
centos  6       amd64   default 20170504_02:16
centos  6       i386    default 20170504_02:16
debian  wheezy  amd64   default 20170505_09:10
debian  wheezy  armel   default 20170504_22:42
debian  wheezy  armhf   default 20170504_22:42
debian  wheezy  i386    default 20170504_22:42
debian  wheezy  powerpc default 20170504_22:42
debian  wheezy  s390x   default 20170504_22:42
fedora  22      amd64   default 20170216_01:27
fedora  22      i386    default 20170216_02:15
fedora  23      amd64   default 20170215_03:33
fedora  23      i386    default 20170215_01:27
fedora  24      amd64   default 20170505_01:59
fedora  24      i386    default 20170505_01:27
fedora  25      amd64   default 20170505_02:42
fedora  25      i386    default 20170504_01:27
gentoo  current amd64   default 20170503_14:12
gentoo  current i386    default 20170504_14:12
oracle  6       amd64   default 20170505_11:40
oracle  6       i386    default 20170505_12:47
oracle  7       amd64   default 20170505_12:47
plamo   5.x     amd64   default 20170504_23:23
plamo   5.x     i386    default 20170429_21:36
plamo   6.x     amd64   default 20170504_22:05
plamo   6.x     i386    default 20170504_22:05
ubuntu  precise amd64   default 20170504_03:49
ubuntu  precise armel   default 20170504_03:49
ubuntu  precise armhf   default 20170504_03:49
ubuntu  precise i386    default 20170504_03:49
ubuntu  precise powerpc default 20170505_03:49
ubuntu  trusty  amd64   default 20170504_03:49
ubuntu  trusty  arm64   default 20170505_10:25
ubuntu  trusty  armhf   default 20170504_03:49
ubuntu  trusty  i386    default 20170504_03:49
ubuntu  trusty  powerpc default 20170505_03:49
ubuntu  trusty  ppc64el default 20170429_10:37
---

この中から任意のOSを指定します。

Distribution: ubuntu
Release: trusty
Architecture: i386

正しいOSを指定すると以下のメッセージが表示されます。

The cached copy has expired, re-downloading...
Downloading the image index
The cache is already up to date.
Using image from local cache
Unpacking the rootfs

---
You just created an Ubuntu container (release=trusty, arch=i386, variant=default)

To enable sshd, run: apt-get install openssh-server

For security reason, container images ship without user accounts
and without a root password.

Use lxc-attach or chroot directly into the rootfs to set a root password
or create user accounts.

「lxc-ls -f」で作成済みのコンテナが表示されます。

lxc-ls -f
NAME   STATE    IPV4       IPV6  AUTOSTART
------------------------------------------
mt4os  RUNNING  10.0.3.11  -     NO
ubu01  STOPPED  -          -     NO

IPアドレスの指定

一応このままでも使えなくはないのですが、IPアドレスを固定化したほうが何かと都合がよいので以下の設定を行います。

「/etc/default/lxc-net」の以下のコメントを外します。 #LXC_DHCP_CONFILE=/etc/lxc/dnsmasq.conf
#LXC_DOMAIN="lxc"

#cat /etc/default/lxc-net
# This file is auto-generated by lxc.postinst if it does not
# exist.  Customizations will not be overridden.
# Leave USE_LXC_BRIDGE as "true" if you want to use lxcbr0 for your
# containers.  Set to "false" if you'll use virbr0 or another existing
# bridge, or mavlan to your host's NIC.
USE_LXC_BRIDGE="true"
    
# Uncomment the next line if you'd like to use a conf-file for the lxcbr0
# dnsmasq.  For instance, you can use 'dhcp-host=mail1,10.0.3.100' to have
# container 'mail1' always get ip address 10.0.3.100.
LXC_DHCP_CONFILE=/etc/lxc/dnsmasq.conf 

# Uncomment the next line if you want lxcbr0's dnsmasq to resolve the .lxc
# domain.  You can then add "server=/lxc/10.0.3.1' (or your actual )
# to /etc/dnsmasq.conf, after which 'container1.lxc' will resolve on your
# host.
LXC_DOMAIN="lxc"

/etc/lxc/dnsmasq.confにコンテナ名とIPアドレスを指定します。

#cat /etc/lxc/dnsmasq.conf
dhcp-host=mt4os,10.0.3.11
dhcp-host=ubu01,10.0.3.12

この設定をした後にホストOSを再起動します。(他の方法があるかも・・・)

コンテナの起動

lxc-start コマンドでコンテナを起動します。何もエラーがなければ起動成功です。
lxc-ls で確認するとステータスがRUNNINGとなり、IPアドレスも正しく設定されています。

#lxc-start -n ubu01 -d
# lxc-ls -f
NAME   STATE    IPV4       IPV6  AUTOSTART
------------------------------------------
mt4os  RUNNING  10.0.3.11  -     NO
ubu01  RUNNING  10.0.3.12  -     NO

参考リンク

導入及び設定方法は以下の記事などを参考にしました。

最後に

ここに辿りつくまでにOSの再インストールを30回くらい行いました。MT4の導入でここまで時間をかける気は無かったのですが、最新の仮想化技術について学べたのは良かったかも。
(はやくシステムまわりに着手したいのだけど・・・)