SmartOSのLX Branded Zone（Linuxコンテナ）を動かす

SmartOSは仮想化テクノロジとして以下の機能を持っています。

* SmartOSによるOS仮想化（コンテナ）：
    * SmartOSのZone
    * LinuxのZone（LX Branded Zone）
* SmartOS組み込みのハイパーバイザベースの仮想化
    * KVM

ここでは、SmarOS上のLinuxコンテナである**LX Branded Zone**を動かしてみます。

SmartOSをVMware Playerで気軽に試してみるには、[SmartOSをVMware Playerで動かす](http://qiita.com/kutsushitaneko/items/de7b1dd62be8efeac618)を、SmartOSのKVM上でCentOSを動かしみるには、[SmartOSのKVMゲストとしてCentOS7.1を動かしてみる](http://qiita.com/kutsushitaneko/items/afd3ddbacfe2b7614c19)をみてみてください。

# image source を設定する
SmartOSでは、仮想マシンイメージを `imgadm import`コマンドでイメージソースから取得します。デフォルトのイメージソースは、images.joyent.comです。LX Branded Zoneのイメージは updates.joyent.comというイメージソースからも入手することができます。そこで、最初にこのイメージソースを追加します。
現在のイメージソースの確認は`imgadm sources`で、追加は`imgadm sources -a <URL>`です。

```lang:
# imgadm sources
https://images.joyent.com
# imgadm sources -a https://updates.joyent.com
Added "imgapi" image source "https://updates.joyent.com"
# imgadm sources
https://images.joyent.com
https://updates.joyent.com
```

`imgadm avail`コマンドで、イメージソースにあるLX Branded Zoneのイメージを確認します。

```lang:
# imgadm avail | grep lx-
f7c19252-c998-11e4-be95-3315493f3741  lx-centos-6             20150313                                          other    2015-03-13T15:52:35Z
818cc79e-ceb3-11e4-99ee-7bc8c674e754  lx-ubuntu-14.04         20150320                                          other    2015-03-20T03:45:09Z
116deb8c-cf03-11e4-9b2d-7b1066800a6a  lx-debian-7             20150320                                          other    2015-03-20T13:14:41Z
eb4128ec-cf12-11e4-960d-8780cec6463f  lx-centos-6             20150320                                          other    2015-03-20T15:08:09Z
```
ちなみに grep しないでリストすると膨大なリストが得られますがdockerが多数含まれていることがわかります。

# LX Branded Zoneのimageをimportする

今回は、Ubuntu 14.04 の LX Branded Zoneを作ることにします。
イメージをimportするコマンドは、`imgadm import`です。

```lang:
# imgadm import 818cc79e-ceb3-11e4-99ee-7bc8c674e754
Importing 818cc79e-ceb3-11e4-99ee-7bc8c674e754 (lx-ubuntu-14.04@20150320) from "https://images.joyent.com"
Gather image 818cc79e-ceb3-11e4-99ee-7bc8c674e754 ancestry
Must download and install 1 image (154.3 MiB)
Download 1 image                  [================================================================>] 100% 154.32MB 534.23KB/s  4m55s
Downloaded image 818cc79e-ceb3-11e4-99ee-7bc8c674e754 (154.3 MiB)
...9e-ceb3-11e4-99ee-7bc8c674e754 [================================================================>] 100% 154.32MB   1.62MB/s  1m35s
Imported image 818cc79e-ceb3-11e4-99ee-7bc8c674e754 (lx-ubuntu-14.04@20150320)
```

import されている image は、imgadm listで確認できます。

```lang:
# imgadm list
UUID                                  NAME             VERSION   OS     PUBLISHED
818cc79e-ceb3-11e4-99ee-7bc8c674e754  lx-ubuntu-14.04  20150320  other  2015-03-20T03:45:09Z
c41bf236-dc75-11e4-88e5-038814c07c11  centos-7         20150406  linux  2015-04-06T15:58:28Z
```
# Ubuntu 14.04のLX Branded Zoneを作成する

ZoneやKVM VMを作成するコマンドは、`vmadm create`です。LX Branded Zoneも、このコマンドで作成します。このコマンドは、zoneの属性を記述した json形式のデータを入力としますが、-fパラメータによりファイルで与えることができます。ここでは、ファイルを用意することとします。

```lang:/var/tmp/lx-ubuntu-14-04.json
{
  "alias": "lxubuntu 14.04",
  "brand": "lx",
  "kernel_version": "3.13.0",
  "max_physical_memory": 2048,
  "image_uuid": "b7493690-f019-4612-958b-bab5f844283e",
  "nics": [
    {
      "nic_tag": "admin",
      "ip": "dhcp",
      "primary": true
    }
  ],
  "qemu_extra_opts": "-k ja -usbdevice tablet"
}
```

nic_tag、ip等は、[SmartOSのKVMゲストとしてCentOS7.1を動かしてみる](http://qiita.com/kutsushitaneko/items/afd3ddbacfe2b7614c19)と同じです。"kernel_version"は、Ubuntu 14.04のカーネルバージョンです。

jsonファイルの用意ができたところで、いよいよ LX Branded Zoneをprovisionします。

```lang:
# vmadm create -f /var/tmp/lx-ubuntu-14-04.json
Successfully created VM 16b4155b-e996-41e1-bb87-25eb0f0934ff
```

`vmadm create`は瞬時に完了します。

`vmadm list`で、確認します。

```lang:
# vmadm list
UUID                                  TYPE  RAM      STATE             ALIAS
a90640f4-0596-451e-8d6c-ad001d71f834  KVM   512      stopped           CentOS 7.1(1503) KVM
16b4155b-e996-41e1-bb87-25eb0f0934ff  LX    1024     running           lxubuntu 14.04
```

LX Branded Zoneが作成されて、動作していることがわかります。

新しいLX Branded Zone(Ubuntu)用の zfs ファイルシステムが作成されていることを確認します。

```lang:
# df -h | grep -i zones
zones                   19G   599K       5.6G     1%    /zones
zones/archive           19G    19K       5.6G     1%    /zones/archive
zones/cores             10G    19K       5.6G     1%    /zones/global/cores
zones/var               19G   5.8M       5.6G     1%    /var
zones/config            19G    43K       5.6G     1%    /etc/zones
zones/opt               19G    22K       5.6G     1%    /opt
zones/usbkey            19G   115K       5.6G     1%    /usbkey
zones/a90640f4-0596-451e-8d6c-ad001d71f834    10G    40K       5.6G     1%    /zones/a90640f4-0596-451e-8d6c-ad001d71f834
zones/cores/a90640f4-0596-451e-8d6c-ad001d71f834    10G    19K       5.6G     1%    /zones/a90640f4-0596-451e-8d6c-ad001d71f834/cores
zones/818cc79e-ceb3-11e4-99ee-7bc8c674e754    19G   450M       5.6G     8%    /zones/818cc79e-ceb3-11e4-99ee-7bc8c674e754
zones/16b4155b-e996-41e1-bb87-25eb0f0934ff    10G   450M       5.6G     8%    /zones/16b4155b-e996-41e1-bb87-25eb0f0934ff
zones/cores/16b4155b-e996-41e1-bb87-25eb0f0934ff    10G    19K       5.6G     1%    /zones/16b4155b-e996-41e1-bb87-25eb0f0934ff/cores
```
ファイルシステムの名前"zones/16b4155b-e996-41e1-bb87-25eb0f0934ff"にLX Branded Zone のUUIDが入っていることから、今作成した Ubuntu のLX Branded Zoneであることがわかります。

# Ubuntu LX Branded Zoneにコンソール接続する(CLIコンソール編)
コンソールには、`zlogin -C` コマンドで接続しますが、zone作成時点では、rootパスワードが未設定のためログインできません。そこで、`zlogin`でログインしてパスワードを設定します。引数として、接続先zoneのUUIDが必要です。

UUIDを確認します。

```lang:
# vmadm list
UUID                                  TYPE  RAM      STATE             ALIAS
a90640f4-0596-451e-8d6c-ad001d71f834  KVM   512      stopped           CentOS 7.1(1503) KVM
16b4155b-e996-41e1-bb87-25eb0f0934ff  LX    1024     running           lxubuntu 14.04
```

もしくは、

```lang:
# zoneadm list
global
16b4155b-e996-41e1-bb87-25eb0f0934ff
```

zloginでコンソールへ接続します。

```lang:
# zlogin 16b4155b-e996-41e1-bb87-25eb0f0934ff
[Connected to zone '16b4155b-e996-41e1-bb87-25eb0f0934ff' pts/3]
Welcome to Ubuntu 14.04 LTS (GNU/Linux 3.13.0 x86_64)

 * Documentation:  https://help.ubuntu.com/

The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.

   __        .                   .
 _|  |_      | .-. .  . .-. :--. |-
|_    _|     ;|   ||  |(.-' |  | |
  |__|   `--'  `-' `;-| `-' '  ' `-'
                   /  ;  Instance (Ubuntu 14.04 LX Brand 20150320)
                   `-'   https://docs.joyent.com/images

root@16b4155b-e996-41e1-bb87-25eb0f0934ff:~#
```

本当に Ubuntuか確認します。

```lang:
~# cat /etc/os-release
NAME="Ubuntu"
VERSION="14.04, Trusty Tahr"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 14.04 LTS"
VERSION_ID="14.04"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
```

本当に64ビットなのか、bashのバイナリを見てみます。

```lang:
~# file /bin/bash
/bin/bash: ELF 64-bit LSB  executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=0aa3fddc66598b161d5b4407c9b61e021388fda0, stripped
```

Linuxコンテナか確認します。
```lang:
~# uname -a
Linux 16b4155b-e996-41e1-bb87-25eb0f0934ff 3.13.0 BrandZ virtual linux x86_64 x86_64 x86_64 GNU/Linux
~# ls -l /boot
total 0
```
確かに、Linuxカーネルがありません。

rootパスワードを設定します。

```lang:
~# passwd
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
```

コンソールへ接続します。

```lang:
# zlogin -C 16b4155b-e996-41e1-bb87-25eb0f0934ff
[Connected to zone '16b4155b-e996-41e1-bb87-25eb0f0934ff' console]


Ubuntu 14.04 LTS 16b4155b-e996-41e1-bb87-25eb0f0934ff console

16b4155b-e996-41e1-bb87-25eb0f0934ff login: root
Password:
Last login: Sun Apr 12 22:47:54 UTC 2015 from zone:global on pts/3
Welcome to Ubuntu 14.04 LTS (GNU/Linux 3.13.0 x86_64)

 * Documentation:  https://help.ubuntu.com/
   __        .                   .
 _|  |_      | .-. .  . .-. :--. |-
|_    _|     ;|   ||  |(.-' |  | |
  |__|   `--'  `-' `;-| `-' '  ' `-'
                   /  ;  Instance (Ubuntu 14.04 LX Brand 20150320)
                   `-'   https://docs.joyent.com/images

root@16b4155b-e996-41e1-bb87-25eb0f0934ff:~#
```

コンソール接続は、zoneをrebootしても継続します。

コンソールを抜けるのは~^D （'~'チルダに続けて [Ctrl] と [D] を同時に押します）を入力します。 

なお、rebootしてみると、さずがコンテナです一瞬といっても良いくらいの時間で reboot されます（カーネルをrebootするわけではないので、当たり前ですね）。