LoginSignup
7
8

More than 5 years have passed since last update.

既存Linux環境をLXCに移す。

Last updated at Posted at 2013-08-14

自己流です。

本来のやりかたというのがどっかにあるならそちらを参照願います。

LXCの導入

LXC(LinuX Containers)というのは、chrootの高級品です。(あれ?)
---つまり、仮想マシンを使わない、Linux on Linuxのことです。

ホスト側はubuntu13.04を使用します。(きっぱり)
ゲスト側もubuntuを仮定します。

# apt-get install lxc lxctl
# lxc-create -t ubuntu -n raring
# lxc-start -d -n raring

ゲスト側として、ubuntu13.04よりも古いubuntuを生成したいなら、下の2行を
# lxc-create -t ubuntu -n oneiric -- -r oneiric
# lxc-start -d -n oneiric
のようにします。

移行させたい元のLinuxと同じかそれに近いバージョンのテンプレートを使用してコンテナを作成するのが吉です。

たったのこれだけで、ゲストOSが走るのですが、これに既存のLinuxを上書きして環境移行
しようというものです。

既存Linuxのバックアップを取る。

/ (root)パーティション以下の /etcや/usrなどを個別にtarで固めます。
/devやら/procやら/mntは要りません。

ゲストOSに上書きする。

ゲストOSを一回止めます。
# lxc-stop -n oneiric
既存Linuxからバックアップして持ってきたtarを開きます。
# cd /var/lib/lxc/oneiric/rootfs/
# tar xpfz /path/to/src/etc.tgz
# tar xpfz /path/to/src/usr.tgz
・・・

fstabを空にしておきます。
# vi /var/lib/lxc/oneiric/rootfs/etc/fstab

ゲストOSとして動かす場合に明らかに不要なハードウェアサービスがあれば、起動しないようにしておきます。
# vi /var/lib/lxc/oneiric/rootfs/etc/init.d/ ...
or.
# vi /var/lib/lxc/oneiric/rootfs/etc/init/ ...

IPアドレスを変更する場合
# vi /var/lib/lxc/oneiric/rootfs/etc/network/interfaces

そしてゲストOSを起動。
# lxc-start -d -n oneiric

コンソールで繋いで見る。
# lxc-console -n oneiric

コンソール脱出はCtrl-A , Q です。

動かないとき

とりあえず、テンプレートで作ったほうの(動く)コンテナを保存しておいて、etcを差し替えたり
etc以下の違いをしらべて、やばそうなデーモンは動かさないようにします。

コンテナ側のvar/log/が丸見えで見えるので、そこを調べます。
lxc-startするときに -d オプションを付けずに起動させて、dmesgを見ればどこで止まるか分かります。(止まる直前までしかprintされませんけれど)

それから、コンテナを起動するときの環境変数LANGがja_JP.UTF-8でないとうまくいかないことがあります。

動かない原因の大半は、Plymouth にあるようです。

/etc/init/plymouth.conf あたりの start on と書かれた行をコメントアウトして、プリマスが起動しないようにしておきます。

プリマス以外にも、コンテナにはおおよそ不要なハードウェアドライバーの起動が実行されていたら、全部offにして構いません。

コンテナの弱点

ホストOSがubuntu12.04の場合、ゲストをshutdownさせると何をとち狂ったかホスト側の電源まで落ちます。
(2016-08追記:ホストU16.04 ゲストU14.04以上ならそんなことは起きなくなりましたが、古いゲストU10.10で試したら、落とせる場合があることがわかりました。原因は調べてませんが、もうU10.10を触ることはないです。)

あくまでもカーネルは1個しかないので、 iptablesを複数持つとか無理です。NICが複数枚あってゲストOSごとに
ルーティング変えたいとかも無理です。

それと、ゲスト側でdhcpdがうまく動きませんでした。

(2016-08追記:ホストU16.04で、ホスト側ではほぼ何も設定せず、LAN側NIC以外にはIPアドレスも与えない(iptablesを不要にするため)ようにして、ゲスト側にそれぞれiptablesやdhcpdを動かして運用できるようになりました。)

iptablesはホスト側とゲスト側の論理積で動くっぽいので、極力ホスト側では何もしないようにするのが吉です。

仮想ドライブイメージ作らないでいい点と、起動、終了が一瞬なのと、インスタンスをたくさん動かしても軽いという点でXenよりGoodです。
クローン作ったりも楽なので、Linuxお試し環境としていろいろ役立ちます。

(XenやKVM上で動いているレンタルLinux上に入れることだって出来ます。)

7
8
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
8