TenForward

技術ブログ。はてなダイアリーから移転しました

lxd を使ったライブマイグレーション (1)

このエントリの情報はおそらく古いです

先月、LXD 0.3 のリリースでライブマイグレーションサポート、というアナウンスがあったので早速試しましたが失敗しました (> lxd を使ったライブマイグレーション(未完) - TenForwardの日記)。

これはバグがあったようで、その後の LXD と LXC の更新で修正され、0.6 でとりあえず動くようになったようなので試してみました。とりあえずネットワークの設定がされないシンプルなコンテナで試しました。

LXD はまだまだリリースのたびにかなり機能が変わっていますし、LXC の C/R 関連のパッチもガンガン投稿されている状況ですし、CRIU もバージョンアップのたびに新機能が追加されていますので、以下の例がいつまで有効かわかりません。(明日には動かないかも?)

準備

まずは準備です。OS は Ubuntu Trusty をインストールした環境を 2 つ準備しています。

lxd01
ライブマイグレーション元のホスト、lxcコマンドを実行するホスト
lxd02
ライブマイグレーション先のホスト

LXC/LXD のリポジトリは以下を登録します。

LXD
lxd-stable(最新のstableリリース)
LXC
lxc-git-stable-1.1(1.1系列の最新リリース)

以下の操作は両方のホストで行います。

$ sudo add-apt-repository ppa:ubuntu-lxc/lxd-stable
$ sudo add-apt-repository ppa:ubuntu-lxc/lxc-git-stable-1.1
$ sudo apt-get update

LXDをインストールします。その後、依存関係で入る lxcfs を削除します。これは、現時点では lxcfs が行う bind mount を CRIU でサポートしていないためのようです。

$ sudo apt-get install lxd
$ dpkg-query --show lxd
lxd	0.6-0ubuntu1~ubuntu14.04.1~ppa1
$ dpkg-query --show lxc
lxc	1.1.2+stable~20150415-0023-0ubuntu1~trusty
$ sudo apt-get remove lxcfs

LXD 0.6, LXC 1.1.2 がインストールされています。

ここで lxd インストール時に管理者アカウント (sudo グループに所属だっけ?) は lxd グループに属するように設定されますので、一度ログアウトするなどして lxd グループに属した状態にします。

$ id
uid=1000(ubuntu) gid=1000(ubuntu) groups=1000(ubuntu),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),110(lpadmin),111(sambashare),113(lxd)

各 LXD ホストのパスワードを設定しましょう。

$ lxc config set password hogehoge

LXD の設定

以下は lxc コマンドを実行するところで実行します。ここでは lxd01 で実行しています。

  1. イメージを準備します。linuxcontainers.org の Ubuntu イメージを使います。イメージのエイリアスとして "ubuntu" という名前を登録します。
    $ lxd-images import lxc ubuntu trusty amd64 --alias ubuntu
    Downloading the GPG key for https://images.linuxcontainers.org
    Downloading the image list for https://images.linuxcontainers.org
    Validating the GPG signature of /tmp/tmp5y_tj_h4/index.json.asc
    Downloading the image: https://images.linuxcontainers.org/images/ubuntu/trusty/amd64/default/20150415_03:49/lxd.tar.xz
    Validating the GPG signature of /tmp/tmp5y_tj_h4/ubuntu-trusty-amd64-default-20150415_03:49.tar.xz.asc
    Image imported as: 45cd14361df508652160a28f76d96360a68e6c354e39879671b8b600a788562c
    Setup alias: ubuntu
  2. リモートホストの登録。現時点では自ホストも登録しておく必要があります。
    $ lxc remote add lxd01 lxd01:8443
    $ lxc remote add lxd02 lxd02:8443
    $ lxc remote list
    local
    lxd01 https://lxd01:8443
    lxd02 https://lxd02:8443
  3. デフォルトで登録されているprofileの"default"を適当な名前のプロファイルにコピーします。ここでは"criu"にしました。
    $ lxc config profile copy default criu
  4. "criu"を編集します。
    $ lxc config profile edit criu
    • 内容はこんな風にします。
      name: criu
      config:
      raw.lxc: |
      lxc.tty = 0
      lxc.console = none
      lxc.cgroup.devices.deny = c 5:1 rwm
      security.privileged: "true"
      devices: {}
    • "raw.lxc"で設定されているものは、現時点でLXCでCRIUを使う場合に必須の設定です。
    • 現時点で、非特権コンテナの C/R はできませんので "security.privileged" を "true" にします。これで特権コンテナで起動します。
  5. マイグレーション元と先に同じ profile がなければマイグレーションできませんので lxd02 側にコピーします。
    $ lxc config profile copy lxd01:criu lxd02:criu
    $ lxc config profile list
    default
    criu
    $ lxc config profile list lxd02:
    default
    criu

マイグレーション

  1. コンテナを作成します。イメージは "ubuntu" を使い、"ct01" という名前です。
    $ lxc init ubuntu ct01
  2. 作成したコンテナに、先ほど作成した profile である "criu" を適用します。
    $ lxc config profile apply ct01 criu
    Profile criu applied to ct01
  3. コンテナを起動します。このコンテナは veth の設定もされない独立したネットワークにいるコンテナです。
    $ lxc start ct01
    $ lxc list
    +------+---------+------+------+
    | NAME | STATE | IPV4 | IPV6 |
    +------+---------+------+------+
    | ct01 | RUNNING | | |
    +------+---------+------+------+
  4. マイグレーションします。
    $ lxc move lxd01:ct01 lxd02:ct01
    $ lxc list
    +------+-------+------+------+
    | NAME | STATE | IPV4 | IPV6 |
    +------+-------+------+------+
    +------+-------+------+------+
    $ lxc list lxd02:
    +------+---------+------+------+
    | NAME | STATE | IPV4 | IPV6 |
    +------+---------+------+------+
    | ct01 | RUNNING | | |
    +------+---------+------+------+

とりあえず lxd01 で動いていたコンテナが lxd02 に移動しました。

これだけではコンテナ上で動いているデーモン等がちゃんと移動したのかもわかりませんし、ダウンタイムも不明ですが、とりあえず移動したということで。

続編は こちら

lxd を使ったライブマイグレーション(未完)

(2015-04-15 追記) マイグレーションできたブログエントリを書きました > lxd を使ったライブマイグレーション (1) - TenForwardの日記
(2015-03-18 追記) lxd 0.4 が出たので試してますが、今度はマイグレーション先の lxd がこんなログを吐いてしまいます ^^;

panic: runtime error: invalid memory address or nil pointer dereference

(2015-03-18 追記ここまで)

前回、リリースされたばかりの lxd 0.3 を簡単に試してみました。本当に簡単なお試しで lxd である必要すらないお試しでした。もう少し lxd らしい使い方を、と思って試してますが、なかなかうまくいきませんね。

lxd 0.3 の目玉機能の一つはこれでしょう。

Initial support of live migration (requires particular container configuration)

https://linuxcontainers.org/lxd/news/

ライブマイグレーション!!

うまくいくか試してみました。ドキュメントがほとんどないので手探りです。

コンテナの特別な設定が必要とあります。これは lxd のバックエンドは liblxc を使っているので LXC 1.1 でも必要な設定と同じで以下の 3 つです。

lxc.tty=0
lxc.console=none
lxc.cgroup.devices.deny=c 5:1 rwm

お試し環境

以下の 3 台を使っています。

  • Ubuntu 14.04.2 LTS x 2 に lxd のデイリービルドパッケージをインストール (lxd ホスト、ここでは lxd01, lxd02 という名前)
  • Plamo 5.3.1 にソースからビルドしてインストール (lxc コマンド実行環境)

lxd のインストール

前回と同じです。Ubuntu 14.04.2 LTS を使いました。2 台にセットアップします。

ubuntu@lxd01:~$ sudo add-apt-repository ppa:ubuntu-lxc/lxd-daily
ubuntu@lxd01:~$ sudo apt-get update
ubuntu@lxd01:~$ sudo apt-get install lxd

これでインストールされた /etc/init/lxd.conf を書き換えて、リモートから接続できるようにします。lxd.conf の exec 行を書き換えて以下のようにします。

exec /usr/bin/lxd --group lxd --tcp 10.200.200.200:8443 --debug >> /var/log/lxd.log 2>&1

'--debug' を付けて、デバッグ出力を /var/log/lxd.log に保存するようにしてみました。

クライアントの設定

lxc コマンドを実行するクライアントで remote の設定をします。

plamo@client:~$ export GOPATH=~/go
plamo@client:~$ export PATH=$PATH:$GOPATH/bin
plamo@client:~$ lxc remote add lxd01 10.200.200.200:8443
plamo@client:~$ lxc remote add lxd02 10.200.200.208:8443
plamo@client:~$ lxc remote list
lxd01 <10.200.200.200:8443>
lxd02 <10.200.200.208:8443>

イメージの登録

lxd ホスト上で以下のようにします。

ubuntu@lxd01:~$ lxd-images import lxc ubuntu trusty amd64 --alias ubuntu --alias ubuntu/trusty --alias ubuntu/trusty/amd64

クライアントから確認してみます。

plamo@client:~$ lxc image list lxd01:
+--------+----------+--------+-------------+
| ALIAS  |   HASH   | PUBLIC | DESCRIPTION |
+--------+----------+--------+-------------+
| ubuntu | 47cd2f39 | no     |             |
+--------+----------+--------+-------------+

コンテナ作成

片方のlxdホスト上でコンテナを作成します。

plamo@client:~$ lxc init ubuntu lxd01:trusty01

デフォルトでは作成したコンテナには "default" というプロファイルが割りあたっています。プロファイルはコンテナに対する設定をまとめたものです。"default" をコピーして "criu" という名前のプロファイルにします。

plamo@client:~$ lxc config profile copy lxd01:default lxd01:criu

"criu" プロファイルを編集します。以下のように edit コマンドを実行するとエディタが起動します。

plamo@client:~$ lxc config profile edit lxd01:criu  (プロファイルの編集)

こんな感じにします(yaml形式)。config の所の raw.lxc を追加しました。

name: criu
config:
  raw.lxc: |-
    lxc.tty=0
    lxc.console=none
    lxc.cgroup.devices.deny=c 5:1 rwm
devices:
  eth0:
    nictype: bridged
    parent: lxcbr0
    type: nic

ちゃんと編集できたか確認します。

plamo@client:~$ lxc config profile show lxd01:criu  (プロファイルの確認)
raw.lxc = lxc.tty = 0
lxc.console = none
lxc.cgroup.devices.deny = c 5:1 rwm
eth0: nic

"criu" プロファイルをコンテナに割り当てます。

plamo@client:~$ lxc config profile apply lxd01:trusty01 criu
Profile criu applied to trusty01

もう一台の lxd ホストにもプロファイルをコピーします。

plamo@client:~$ lxc config profile copy lxd01:criu lxd02:criu

プロファイルの確認

plamo@client:~$ lxc config profile list lxd01:
default
criu
plamo@client:~$ lxc config profile list lxd02:
default
criu

コンテナの起動とマイグレーション

コンテナを起動します。

plamo@client:~$ lxc start lxd01:trusty01
plamo@client:~$ lxc list lxd01:
+----------+---------+---------------------+------+
|   NAME   |  STATE  |        IPV4         | IPV6 |
+----------+---------+---------------------+------+
| trusty01 | RUNNING | 10.0.3.7, 127.0.0.1 | ::1  |
+----------+---------+---------------------+------+

ライブマイグレーションを実行します。

$ lxc move lxd01:trusty01 lxd02:trusty01
error: restore failed

がーん。

コンテナの送り側 (lxd01) のログはこんな

2015/03/17 19:18:55 client cert != key for lxd01
2015/03/17 19:18:55 found cert for 10.200.200.200
2015/03/17 19:18:55 handling GET /1.0
2015/03/17 19:18:55 client cert != key for lxd01
2015/03/17 19:18:55 found cert for 10.200.200.200
2015/03/17 19:18:56 client cert != key for lxd01
2015/03/17 19:18:56 found cert for 10.200.200.200
2015/03/17 19:18:56 handling GET /1.0/containers/trusty01
2015/03/17 19:18:56 setting lxc.tty=0
2015/03/17 19:18:56 setting lxc.console=none
2015/03/17 19:18:56 setting lxc.cgroup.devices.deny=c 5:1 rwm
2015/03/17 19:18:56 Configured device eth0
2015/03/17 19:18:56 found cert for 10.200.200.200
2015/03/17 19:18:56 handling POST /1.0/containers/trusty01
2015/03/17 19:18:56 setting lxc.tty=0
2015/03/17 19:18:56 setting lxc.console=none
2015/03/17 19:18:56 setting lxc.cgroup.devices.deny=c 5:1 rwm
2015/03/17 19:18:56 Configured device eth0
2015/03/17 19:18:57 client cert != key for lxd01
2015/03/17 19:18:57 client cert != key for 10.200.200.200
2015/03/17 19:18:57 allowing untrusted GET to /1.0/operations/49bcae70-b968-4f14-886b-b5cb2280742c/websocket?secret=0h5i81aO9EXXfGHbTHm5eQXmB704mxX2%2BasWPYjEi0jL9Ykbdh1wzU635ylLE%2F3WbqJHplXBHlqM9tf8OrXIvpJBwRyhi4WrK2BCXwKJzwKRVt3hlqZNUPD02VHv%2B%2Bea4sgVDQ%3D%3D
2015/03/17 19:18:58 client cert != key for lxd01
2015/03/17 19:18:58 client cert != key for 10.200.200.200
2015/03/17 19:18:58 allowing untrusted GET to /1.0/operations/49bcae70-b968-4f14-886b-b5cb2280742c/websocket?secret=%2BAFr%2BL4Zt4mBciMWEciW0%2FOdHWSt14Ty13k%2Berz%2FC%2FKRF1LoGAZsnG7HBeuRgZMg8rEEG0oE2f5WfTrVKOZJnZd7cRtNaguiEYzwvwEly6fmplO9Nom37ti0v%2FSvNMbzZA3lDQ%3D%3D
2015/03/17 19:18:58 client cert != key for lxd01
2015/03/17 19:18:58 client cert != key for 10.200.200.200
2015/03/17 19:18:58 allowing untrusted GET to /1.0/operations/49bcae70-b968-4f14-886b-b5cb2280742c/websocket?secret=zOVPGshQorM8bm1IJk3Y9lVhXwz5oTkHSFbqH5yCZBSph2YOKEHpeqjrxj7BtESyq3iGabS993AHjzi8NG99A05z5OsL6EB2KGyx1%2Fb3sEDun%2B43TwzjGWYyiZbOcdYBvGxWaQ%3D%3D
2015/03/17 19:18:58 got error getting next reader websocket: close 1005 , &{{%!s(*net.netFD=&{{10 0 0} 16 1 1 false unix 0xc20811b300 0xc20811b320 {139997956048208}})}}
2015/03/17 19:19:15 got error getting next reader websocket: close 1005 , &{{%!s(*net.netFD=&{{10 0 0} 16 1 1 false unix 0xc20811a2a0 0xc20811a2e0 {139997956048384}})}}

受け側 (lxd02) のログはこんな

2015/03/17 19:18:56 client cert != key for lxd02
2015/03/17 19:18:56 found cert for 10.200.200.208
2015/03/17 19:18:56 handling GET /1.0
2015/03/17 19:18:56 client cert != key for lxd02
2015/03/17 19:18:56 found cert for 10.200.200.208
2015/03/17 19:18:56 found cert for 10.200.200.208
2015/03/17 19:18:56 handling GET /1.0/profiles
2015/03/17 19:18:56 responding to profiles get
2015/03/17 19:18:56 client cert != key for lxd02
2015/03/17 19:18:56 found cert for 10.200.200.208
2015/03/17 19:18:56 handling POST /1.0/containers
2015/03/17 19:18:56 responding to create
2015/03/17 19:18:57 setting lxc.tty=0
2015/03/17 19:18:57 setting lxc.console=none
2015/03/17 19:18:57 setting lxc.cgroup.devices.deny=c 5:1 rwm
2015/03/17 19:18:57 Configured device eth0
2015/03/17 19:18:57 client cert != key for lxd02
2015/03/17 19:18:57 found cert for 10.200.200.208
2015/03/17 19:18:57 handling GET /1.0/operations/4aabada3-030d-4d6e-96b4-2625b070a180/wait
2015/03/17 19:18:58 got error getting next reader read tcp 10.200.200.200:8443: use of closed network connection, &{%!s(*os.File=&{0xc2080b2a50}) {{%!s(int32=0) %!s(uint32=0)} %!s(uint32=0)} ?reflect.Value?}
2015/03/17 19:19:15 got error getting next reader read tcp 10.200.200.200:8443: use of closed network connection, &{%!s(*os.File=&{0xc2080b23f0}) {{%!s(int32=0) %!s(uint32=0)} %!s(uint32=0)} ?reflect.Value?}

何か実行されてる風ですが、エラーが出てますね。(ホスト間で rsync は実行されてるっぽい)

識者の登場を待ちましょう :-p (続くかも)

10 分で試せる lxd 0.3

このエントリの情報は古いです

(2015/04/08 追記) ubuntu-lxc の PPA の構成が変わっていますので、以下の add-apt-repository コマンドの例はそのまま実行できません。PPA の詳細は公式ページでご確認ください。
前回 (その1その2) lxd を試したことを書いてからまだ 1 ヶ月も経ってませんが、使い方がかなりがらっと変わった lxd 0.3 がリリースされていますので試してみました。0.2 からこんな感じだったようですが。

インストール

面倒なので Ubuntu 14.04.2 に lxd の PPA を追加してパッケージインストールしました。

ubuntu@lxd01:~$ sudo add-apt-repository ppa:ubuntu-lxc/lxd-daily
ubuntu@lxd01:~$ sudo apt-get update
ubuntu@lxd01:~$ sudo apt-get install lxd
ubuntu@lxd01:~$ dpkg -l lxd
  :(snip)
||/ Name           Version      Architecture Description
+++-==============-============-============-=================================
ii  lxd            0.3-0ubuntu1 amd64        Container hypervisor based on LXC

必要な設定もされていますし lxd も起動しています。ここでは ubuntu ユーザで試してます。

  • lxd デーモンは起動済み。"lxd" グループに属するユーザが lxd デーモンに接続できます。
    ubuntu@lxd01:~$ ps ax | grep lxd
    1085 ? Ssl 0:01 /usr/bin/lxd --group lxd
    1179 ? Ss 0:00 /usr/bin/lxd --group lxd
  • "ubuntu" ユーザは手元では "sudo" グループに属しているので (という条件だったと思う)、自動的に "lxd" グループに所属してます
    ubuntu@lxd01:~$ id
    uid=1000(ubuntu) gid=1000(ubuntu) groups=1000(ubuntu),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),110(lpadmin),111(sambashare),113(lxd)
  • rootで非特権コンテナを動かすためにsubuid/subgidにrootが追加済み
    ubuntu@lxd01:~$ cat /etc/subuid /etc/subgid
    ubuntu:100000:65536
    lxd:100000:65536
    root:100000:65536
    ubuntu:100000:65536
    lxd:100000:65536
    root:100000:65536

イメージの登録

lxd は自身に登録されたイメージからコンテナを作ります。lxd にイメージを登録するには、今の所(?) lxc 用のイメージをダウンロードしてきて変換するようです。lxc 用のイメージは images.linuxcontainers.org にあります。(lxc-create の download テンプレートが使うイメージ)

では、イメージを作りましょう(取得&変換&登録)。今の所 lxd-images というスクリプトがインストールされているのでそれを使います。Plamo 5.x の 64bit 版コンテナを使いましょう。イメージにエイリアスが付与できるようです (plamo, plamo/5.3, plamo/5.3/x86_64 という3つのエイリアスを付けた)。

ubuntu@lxd01:~$ lxd-images import lxc plamo 5.x amd64 --alias plamo --alias plamo/5.3 --alias plamo/5.3/x86_64
Downloading the GPG key for https://images.linuxcontainers.org
Downloading the image list for https://images.linuxcontainers.org
Validating the GPG signature of /tmp/tmp1dkupz2k/index.json.asc
Downloading the image: https://images.linuxcontainers.org/images/plamo/5.x/amd64/default/20150310_21:36/lxd.tar.xz
Validating the GPG signature of /tmp/tmp1dkupz2k/plamo-5.x-amd64-default-20150310_21:36.tar.xz.asc
Image imported as: 58ea935fd2ce326279a97d711b6a7c50419a638db1423b5ba21c3496c55f0c04
Setup alias: plamo
Setup alias: plamo/5.3
Setup alias: plamo/5.3/x86_64

イメージの確認

ubuntu@lxd01:~$ lxc image list
+-------+----------+--------+-------------+
| ALIAS |   HASH   | PUBLIC | DESCRIPTION |
+-------+----------+--------+-------------+
| plamo | 58ea935f | no     |             |
+-------+----------+--------+-------------+

コンテナの作成と起動

イメージからコンテナを作成して起動します。"plamo" イメージから "plamo01" コンテナを作成して起動。

ubuntu@lxd01:~$ lxc launch plamo plamo01
Creating container...done
Starting container...done

起動の確認。

ubuntu@lxd01:~$ lxc list
+---------+---------+----------------------+------+
|  NAME   |  STATE  |         IPV4         | IPV6 |
+---------+---------+----------------------+------+
| plamo01 | RUNNING | 10.0.3.70, 127.0.0.1 | ::1  |
+---------+---------+----------------------+------+

ubuntu@lxd01:~$ lxc info plamo01
Name: plamo01
Status: RUNNING
Init: 1191
Ips:
  eth0:	 IPV4	10.0.3.70
  lo:	 IPV4	127.0.0.1
  lo:	 IPV6	::1

コンテナ内でコマンドを実行してみましょう。これは前のエントリと同じです。

ubuntu@lxd01:~$ lxc exec plamo01 -- uname -a
Linux LXC_NAME 3.13.0-46-generic #77-Ubuntu SMP Mon Mar 2 18:23:39 UTC 2015 x86_64 GNU/Linux
ubuntu@lxd01:~$ lxc exec plamo01 -- lsb_release -a
LSB Version:	n/a
Distributor ID:	Plamo
Description:	Plamo Linux release 5.3.1
Release:	5.3.1
Codename:	n/a

UbuntuカーネルPlamo が動いてますな。

Google Chrome の Namespace 利用のメモ

(2016-05-16 Chromium の参考ページが移動していたので更新)

過去に勉強会なんかで「Linux 版の Chrome は Namespace を使ってる」という話をしたことあるけど、そういえば確認したことはなかったので確認したメモ。

参考はこの辺り。

pidns と netns を使ってそうです。

まず Google Chrome を起動します。最近 Linux 版は重くて使ってないけど。

$ pstree -p
    :(snip)
        |-chrome(29616)-+-chrome-sandbox(29618)---chrome(29620)-+-chrome(29630)-+-chrome(29701)-+-{chrome}(29702)
        |               |                                       |               |               |-{chrome}(29720)
    :(snip)
        |               |                                       `-chrome-sandbox(29624)---nacl_helper(29625)
    :(snip)

chrome-sandbox ってのがこの辺り作りそうですね。

まずはinitの名前空間を確認します。

# ls -l /proc/1/ns
合計 0
lrwxrwxrwx 1 root root 0  3月  9日  19:02 ipc -> ipc:[4026531839]
lrwxrwxrwx 1 root root 0  3月  9日  19:02 mnt -> mnt:[4026531840]
lrwxrwxrwx 1 root root 0  3月  9日  19:02 net -> net:[4026531956]
lrwxrwxrwx 1 root root 0  3月  9日  19:02 pid -> pid:[4026531836]
lrwxrwxrwx 1 root root 0  3月  9日  19:02 user -> user:[4026531837]
lrwxrwxrwx 1 root root 0  3月  9日  19:02 uts -> uts:[4026531838]

次に chrome-sandbox の子プロセスの chrome の ns を確認。

# ls -l /proc/29620/ns
合計 0
lrwxrwxrwx 1 karma users 0  3月  9日  20:06 ipc -> ipc:[4026531839]
lrwxrwxrwx 1 karma users 0  3月  9日  20:06 mnt -> mnt:[4026531840]
lrwxrwxrwx 1 karma users 0  3月  9日  20:06 net -> net:[4026532408]
lrwxrwxrwx 1 karma users 0  3月  9日  20:06 pid -> pid:[4026532406]
lrwxrwxrwx 1 karma users 0  3月  9日  20:06 user -> user:[4026531837]
lrwxrwxrwx 1 karma users 0  3月  9日  20:06 uts -> uts:[4026531838]

net と pid が異なるのが、上記の特殊なシンボリックリンク先でわかりますね (数字が違う)。他は同じです (数字が同じ)。

実際この Namespace 内に入ってみましょう。

# nsenter -t 29620 -n -p

まずは netns の確認。

# ip a
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

新たに netns を作ったので、インターフェースはループバックしかありません。

次に pidns の確認。ps とかのこの辺り確認するコマンドは /proc を見ますので、このままだと親 ns の結果が出ますので使えません (うっかりしててハマった ^^;)。新たに procfs をマウントしてみます。

# mount -t proc proc /mnt
# ls /mnt
1/   acpi/      dma          key-users   mtrr          sysrq-trigger
11/  asound/    driver/      keys        net@          sysvipc/
21/  buddyinfo  execdomains  kmsg        pagetypeinfo  thread-self@
28/  bus/       fb           kpagecount  partitions    timer_list
3/   cgroups    filesystems  kpageflags  sched_debug   tty/
4/   cmdline    fs/          loadavg     scsi/         uptime
58/  config.gz  interrupts   locks       self@         version
6/   consoles   iomem        meminfo     slabinfo      vmallocinfo
82/  cpuinfo    ioports      misc        softirqs      vmstat
9/   crypto     irq/         modules     stat          zoneinfo
93/  devices    kallsyms     mounts@     swaps
97/  diskstats  kcore        mpt/        sys/

pidns 内の PID=1 はこんなです。

# cat /mnt/1/cmdline ; echo
/opt/google/chrome/chrome --type=zygote

LXD でリモートの LXD ホストのコンテナを操作してみる

LXD 0.1 がリリースされたのでLXD を試してみた続きです。

LXD の特徴は複数の LXD ホストをリモートから管理できることです。というわけでリモートの LXD ホストの操作を試してみました。とりあえず動くのを確かめただけです。

  • テスト用の LXD ホストは Ubuntu 14.04.1 LTS です。README通りに設定してあります
  • lxc コマンドを実行するホストは前回のエントリ]で使った Plamo 5.3 ホストです

LXD サーバ

lxd をオプションなしで起動すると、Unix ドメインソケットのみのローカルからの接続のみを受け付けるモードで起動します。リモートから受け付ける場合は "--tcp" オプションを使います。

$ cd ~/go/bin
$ ./lxd --tcp=10.200.200.200:8443 & (10.200.200.200のアドレスのホストの8443番ポートで待ち受け)

リモートから受け付ける際のパスワードを設定します。

$ ./lxc config set pasword hogehoge (パスワードをhogehogeに設定)

クライアント側

クライアントからリモートの LXD ホストを操作する場合は、まずリモートホストを登録します。これでリモートホストの証明書がダウンロードされ、クライアントの証明書が LXD ホストにも登録されます (たぶん)。

$ ./lxc remote add lxdhost 10.200.200.200:8443 (10.200.200.200 のホストを "lxdhost" という名前で登録)
Certificate fingerprint: 8c ea 8b a3 a0 64 dd 9f 5e fb 28 dd f6 89 c6 58 7c 8b e0 ab 62 c1 14 f5 50 dc 44 16 06 83 fa 85
ok (y/n)? y
Admin password for lxdhost: ("lxdhost" で設定したパスワードを入れる)
Client certificate stored at server:  lxdhost

これで準備 OK です。あとはローカルとほぼ同じです。コンテナを指定するときに登録したホスト名の後にコロンをつけて、コンテナ名を指定します。

$ ./lxc init ubuntu lxdhost:test01 ("test01" コンテナを "lxdhost" に作成)
$ ./lxc list lxdhost: ("lxdhost" のコンテナ一覧)
test01
$ ./lxc start lxdhost:test01 ("lxdhost"上の"test01"コンテナの起動)
$ ./lxc exec lxdhost:test01 -- /bin/uname -a ("lxdhost"上の"test01"コンテナでunameコマンド実行)
Linux test01 3.13.0-32-generic #57-Ubuntu SMP Tue Jul 15 03:51:08 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux