SmartOSをVMware Playerで動かす

#SmartOSとは？

SmartOSとは、ZFS + DTrace + Zones そして、なんと **KVMが使える**Open **Solaris系**のOSです。Sun Microsystems(現在のOracle)がオープンソース化した Open Solarisから派生したillumosのカーネルを使ったOSです。そして、**仮想マシンを動かすためのOS**ともいえるものです。また、DTraceは、LinuxコミュニティにSystem Tapの開発を促すこととなった動的トレースの本家です。

Zonesは、OS仮想化機能、いわゆるコンテナです。Oracle(Sun)のSolaris10では、そのものずばりコンテナと呼ばれていました。Oracle Solaris 11.2には、さらに複数のOSカーネルが動作するKernel Zone機能が追加されました。kernel Zoneは、複数のSolaris Kernelを動作させることができるものですが、SmartOSは、KVMを実装することで他のOSを動作させることができるようになっています。つまり、SmartOSは仮想化テクノロジとして以下の機能を持っています。

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

そして、SmartOSでは、zfsのsnapshot(clone)機能を使って非常に高速に仮想環境をデプロイすることができます。

ここでは、VMware Playerで、SmarOSを起動してキーボード設定を（日本語に）変更し、シリアルコンソール、ビデオコンソールの設定、Global Zoneの永続的な設定（ホスト名の変更）までの手順をまとめました。
（シリアルコンソールの部分は他のOSの場合の参考にもなると思います。）

SmartOSのKVMを使った仮想サーバのデプロイについては、[SmartOSのKVMゲストとしてCentOS7.1を動かしてみる](http://qiita.com/kutsushitaneko/items/afd3ddbacfe2b7614c19)にまとめています。また、LX Branded Zoneは、[SmartOSのLX Branded Zone（Linuxコンテナ）を動かす](http://qiita.com/kutsushitaneko/items/7216237d5929e0f715db)をみてみてください。

それでは、まずVMware Player上でSmartOS本体を動かしてみます。

#VMイメージのダウンロード
[wiki.smartos.orgのDownload SmartOSページ](https://wiki.smartos.org/display/DOC/Download+SmartOS)からVMware VMイメージ（Download SmartOS (VMWare VM)）をダウンロードします。ダウンロードするファイルは、smartos-latest.vmwarevm.tar.bz2です。

#ダウンロードファイルの解凍
下記の例ではCygwinのtarで解凍しています。

```lang:解凍
$ tar -jxvf smartos-latest.vmwarevm.tar.bz2
SmartOS.vmwarevm/
SmartOS.vmwarevm/Virtual Disk.vmdk
SmartOS.vmwarevm/SmartOS.vmsd
SmartOS.vmwarevm/SmartOS.vmdk
SmartOS.vmwarevm/SmartOS.nvram
SmartOS.vmwarevm/SmartOS.vmx
SmartOS.vmwarevm/smartos.img
```
```lang:
$ tree
.
|-- SmartOS.vmwarevm
|   |-- smartos.img
|   |-- SmartOS.nvram
|   |-- SmartOS.vmdk
|   |-- SmartOS.vmsd
|   |-- SmartOS.vmx
|   `-- Virtual Disk.vmdk
`-- smartos-latest.vmwarevm.tar.bz2

1 directory, 7 files
```

#VMware Playerで仮想マシンを開く
VMware Playerを起動します。

![image](https://qiita-image-store.s3.amazonaws.com/0/74534/44a83da3-9979-53eb-873d-967f04a49859.png)

「仮想マシンを開く（O）」をクリックします。
![image](https://qiita-image-store.s3.amazonaws.com/0/74534/dfb2853c-f914-90c0-8b42-fd17af01e6f1.png)



「SmartOS.vmwarevm」フォルダを開きます。

![image](https://qiita-image-store.s3.amazonaws.com/0/74534/61983463-0c14-c19c-6818-b9cf1cef7bd7.png)

「SmartOS.vmx」を開きます。


![image](https://qiita-image-store.s3.amazonaws.com/0/74534/666e0a03-7e6c-0210-d1e9-72ffdd284be9.png)


#仮想マシンを実行
「仮想マシンを再生（L）」をクリックします。

![image](https://qiita-image-store.s3.amazonaws.com/0/74534/5ff239e2-94c2-c4b3-4fea-77b747bac39d.png)

「コピーしました」をクリックします。ここで、上のダイアログのしたに「socket.serial0」に関してエラーが表示されています。

![image](https://qiita-image-store.s3.amazonaws.com/0/74534/6ceb812e-50de-f1f0-99ce-dc87c44b0f65.png)


「OK」をクリックします。

![image](https://qiita-image-store.s3.amazonaws.com/0/74534/7b789933-7663-d80b-7b2f-eeab591a0483.png)

VMware Tools Solaris版をダウンロードするか聞いてきます。
SmartOSでは使用できないのですが、「後で通知する」にすると今後、起動する度に聞いてきますので、ここでダウンロードしてしまっても良いですが、仮に「後で通知する（R）」をクリックすることとします。

![image](https://qiita-image-store.s3.amazonaws.com/0/74534/8f6853e2-e0fd-c574-3336-984e1f332aaf.png)

ウィンドウ下段の「通知しない」もクリックしておきます。

![image](https://qiita-image-store.s3.amazonaws.com/0/74534/b7fa5ead-9338-3291-2aca-de4a5efd016a.png)

ウィンドウの中（黒い部分）をクリックして、「Y」を入力して「Enter」を押します。「Enter」を押すと次の画面に変わります。なお、一旦、ウィンドウの中をクリックするとカーソルがウィンドウから出られなくなります。マウスカーソルを外に出すためには、Ctrl + Altを押します。

![image](https://qiita-image-store.s3.amazonaws.com/0/74534/b701826b-9295-2a1e-cf4f-ccccc2d344a5.png)

IPアドレスの入力を求められます。固定IPを割り当てる場合はIPアドレスを入力します。DHCPを使用する場合は「dhcp」と入力します。ここでは、dhcpとします。「Enter」を押すと次の画面に変わります。

![image](https://qiita-image-store.s3.amazonaws.com/0/74534/4ed81a46-569f-1a88-46b0-47d86e1081c0.png)

データ領域として使用するZFSストレージプールを構成する（仮想）ディスクを指定します。「c0t1d0」を入力します。「c0t0d0」を選んではいけません。これは、読み込んだOSイメージが入った（仮想）ディスクそのものですので、これを上書きしてしまうとSmartOSを起動できなくなります。
「Enter」を押すと次の画面に変わります。

![image](https://qiita-image-store.s3.amazonaws.com/0/74534/364f186d-5f5c-eb23-6df8-e58ff6ec2624.png)

rootアカウントのパスワード入力を入力します。「Enter」を押すと次の画面に変わります。

![image](https://qiita-image-store.s3.amazonaws.com/0/74534/86c3aa58-544e-48e2-50ff-690f1d416402.png)

パスワードの確認です。同じパスワードをもう一度入力します。「Enter」を押すと次の画面に変わります。

![image](https://qiita-image-store.s3.amazonaws.com/0/74534/e15604ea-1cd4-c839-0e2f-213a91d7dbad.png)

入力内容の確認です。「y」を入力します。「Enter」を押すと次の画面に変わります。

![image](https://qiita-image-store.s3.amazonaws.com/0/74534/b2aa1c50-a6c8-0661-908b-7f288c37349c.png)

これまでに入力した内容が入った構成ファイルを編集するかどうかの確認です。「n」を入力して構成情報の入力を終了します。ちなみに、「y」とすると構成情報を編集する画面に変わりますが、この画面でviの編集コマンド（"i"等）は使用できて編集できるのですが、編集の終了の仕方がわかりませんでした。":","wq"等では抜けることができず、仮想マシンをから削除してやり直しとなってしまいましたのでご注意ください。
「n」、「Enter」を押すと次の画面に変わります。

![image](https://qiita-image-store.s3.amazonaws.com/0/74534/d8ca12fd-ebd0-18d4-eeaa-340551aa82d0.png)

選択した（仮想）ディスクの内容が消去されるが良いかと聞いてきますので、「y」と入力します。「Enter」を押すと次の画面に変わります。

![image](https://qiita-image-store.s3.amazonaws.com/0/74534/bfb9fcbe-c723-00ac-547b-8b9b04455b49.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/74534/d51010ff-06fa-af68-330c-9bdeacf5d861.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/74534/a5be531f-2133-9f93-8a6a-b7db1947b0a1.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/74534/2caf0696-5d72-5150-4c2d-4cd0dac4fdc8.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/74534/a7792dae-b854-84ec-c566-92979d29635d.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/74534/39a2f502-5143-17fc-15b7-ef71907fe853.png)

無事、SmartOSが起動しました。
rootでログインしてみましょう。

![image](https://qiita-image-store.s3.amazonaws.com/0/74534/f36a3fdb-1829-f5d0-f092-5652de466f81.png)

ログインできました。
`uname -a`でシステム情報を取ってみます。

![image](https://qiita-image-store.s3.amazonaws.com/0/74534/4cf0b4d3-e71c-1fb1-a0b8-ffe3249ed6ba.png)

**SunOS**ってでるんですね！ 

#キーボードレイアウトを変更する
デフォルトではキーボードレイアウトは英語になっています。
日本語キーボードをお使いの場合は変更する必要がありますが、Solarisとは設定方法が異なります。SmartOSでは、Global Zoneの "/" は、Ramdiskとなっていて、Global Zoneの設定ファイルを書き換えても reboot すると消えてしまいます。SmartOSでは、Global Zoneに関する設定は、/usbkey ファイルシステムを使用します。

```lang:キーボードレイアウト変更（日本語へ）
echo "default_keymap=uk" >>/usbkey/config
reboot
```
ここで、日本語キーボードでダブルクォーテーション「"」を入力するには、「*」を入力します。つまり、Shiftを押しながら「:」です。「_」は、「-」(ハイフン、ダッシュ)、つまり「0(ゼロ)」の右隣です。
"="を入力するには、"^"を押します。

再起動されると、キーボードレイアウトが日本語になっているはずです。
他のキーボードレイアウトが必要な場合は、`/usr/share/lib/keytables/type_6`を`ls`してみてください。

#シリアルポートに関するエラーを修正して、シリアルコンソールを使えるように設定

SmartOSの初回起動時、パワーオフ後のパワーオン時に以下のメッセージが表示されます。
![image](https://qiita-image-store.s3.amazonaws.com/0/74534/c71a3823-d8f9-d1f8-082c-5b51c6690e03.png)

この問題を修正します。
[パワーオンのままの場合]
VMware Playerの上部の「Player(p)」をクリックして、「管理(M)」、「仮想マシン設定(S)...」を選びます。

![image](https://qiita-image-store.s3.amazonaws.com/0/74534/79982604-0694-2e55-26b5-4e441576e06c.png)

[パワーオフしている場合]
VMware Playerの左側「ホーム」の下の「SmartOS」を右クリックして、仮想マシン設定画面を開きます。

![image](https://qiita-image-store.s3.amazonaws.com/0/74534/c51a543e-53dd-690f-87df-5b54db9e0412.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/74534/a627bf90-a5ad-7689-327b-0d143064bf44.png)

「シリアルポート」を選択します。

![image](https://qiita-image-store.s3.amazonaws.com/0/74534/8f737eaf-989b-4e7f-1510-269d354c8634.png)


名前付きパイプの名前を以下のように変更し、「接続先はアプリケーションです」を選択して、デバイスのステータスの「接続済み(C)」をチェックして「OK」をクリックします。


![image](https://qiita-image-store.s3.amazonaws.com/0/74534/f34feff6-eee2-9129-01b0-3d1506ee2667.png)

## Named Pipe TCP Proxyをインストールします。
[Named Pipe TCP Proxy Utility](http://shvechkov.tripod.com/nptp.html)から"nptp_setup.zip"をダウンロードして解凍するとインストーラ "ntpt.exe"が現れますので、これを起動してインストールします。特にインストール時の設定はありません。

## Named Pipe TCP Proxyを設定します。
Named Pipe TCP Proxyを起動し、「Edit」、「New」を選択し、ダイアログで下記のように入力して、「Save」をクリックします。

![image](https://qiita-image-store.s3.amazonaws.com/0/74534/da4fe51d-0590-1cba-d707-3d12fc007893.png)

「Save」をクリックすると下記のような画面となります。

![image](https://qiita-image-store.s3.amazonaws.com/0/74534/23509cfc-ba06-a7a1-6264-0b9cefc0ea01.png)



##TeraTerm（等のtelnet端末）からアクセスしてみます。

Tera Termを起動して、下記のように設定します。
「ホスト(T)」は、ローカルホストですので"127.0.0.1"。
サービスは、"Telnet"を選択します。
TCPポートは、Named Pipe TCP Proxyで設定したポートです。
ここでは、"1001"です。

![image](https://qiita-image-store.s3.amazonaws.com/0/74534/c1d0119f-0898-d1a3-a3cd-9a45263adc26.png)



SmartOSのコンソールに接続されます。

![image](https://qiita-image-store.s3.amazonaws.com/0/74534/cc29cd3d-0f0a-44e8-ec0f-bcc234d3d80d.png)

#Global Zone（大域ゾーン）の設定変更
##Global Zone（大域ゾーン）とは？
SmartOSは、仮想マシンを動かすためのOSです。Zone（SmartOSのコンテナ：SmartMachineとも呼ばれる）やLX Branded Zone（Linux コンテナ）といったコンテナが動作するプラットフォームであると同時にKVMによるハードウェア仮想化を実現するハイパーバイザでもあります。この仮想化プラットフォームとしてのSmartOSをGlobal Zone（大域ゾーン）と呼びます。汎用のオペレーティングシステムと異なり、このGlobal Zone上にアプリケーションをインストールしたり、ユーザーデータを保持することは想定されていません。アプリケーションは、Zone 上で稼働させます。

##Global Zone（大域ゾーン）の永続的な設定
Global Zoneは、「Global Zone（大域ゾーン）とは？」にあるような位置づけであるため、ごく一部の設定情報を除いてramdisk上で稼働し、shutdownすると、それまでの変更は消えてしまいます（そのため、ブートメディアは、完全にRead Onlyなメディアでも大丈夫です）。このようなデザインとなっているため、たとえば、Global Zoneのホスト名を `hostname`コマンドで変更しても、`/etc/nodename`等の設定ファイルを変更しても再起動すると元に戻ってしまいます。一方で、仮想マシンのイメージのようなシステムのshutdown後も保持する必要のあるデータは、zfs の zones pool下のファイルシステムに保存されます。そこで、Global Zoneの設定の中でも永続させたいものは、この zones pool に保存し、Global Zoneが再起動されるたびに稼働中のシステムに反映すればよいことになります。SmartOSでは、SMF(Service Management Facility)が、/opt/custome/smf ディレクトリ下の manifestsファイル に記述されたサービスを boot 時に起動するようになっていますので、このSMFを使って起動のたびに必要な設定を行うことができます。なお、/opt は、zones pool 下の zones/opt ファイルシステムになっていて、ブートメディア以外のディスク上にあります。

##Global Zone のホスト名の設定
Global Zone（大域ゾーン）の永続的な設定の例として、ホスト名を設定してみます。

### SMF manifestsファイルの保存ディレクトリを作成
```lang:
#mkdir -p /opt/custom/smf
```

### SMF manifestsファイルの作成
/opt/custom/smf に下記のファイルを置きます。

```lang:smartos_setup.xml
<?xml version='1.0'?>
<!DOCTYPE service_bundle SYSTEM '/usr/share/lib/xml/dtd/service_bundle.dtd.1'>
<service_bundle type='manifest' name='export'>
  <service name='smartos/setup' type='service' version='0'>
    <create_default_instance enabled='true'/>
    <single_instance/>
    <dependency name='net-physical' grouping='require_all' restart_on='none' type='service'>
      <service_fmri value='svc:/network/physical'/>
    </dependency>
    <dependency name='filesystem' grouping='require_all' restart_on='none' type='service'>
      <service_fmri value='svc:/system/filesystem/local'/>
    </dependency>
    <exec_method name='start' type='method' exec='/opt/custom/share/svc/smartos_setup.sh %m' timeout_seconds='0'/>
    <exec_method name='stop' type='method' exec='/opt/custom/share/svc/smartos_setup.sh %m' timeout_seconds='60'/>
    <property_group name='startd' type='framework'>
      <propval name='duration' type='astring' value='transient'/>
    </property_group>
    <stability value='Unstable'/>
    <template>
      <common_name>
        <loctext xml:lang='C'>SmartOS Ad Hoc Setup Script</loctext>
      </common_name>
    </template>
  </service>
</service_bundle>
```
本ファイルの出典：[Administering the Global Zone:Global Zone Persistence](https://wiki.smartos.org/display/DOC/Administering+the+Global+Zone)

### 初期設定スクリプト
上のmanifestsファイルの中でブート時（とシャットダウン時）に起動するように指定した`/opt/custom/share/svc/smartos_setup.sh`を作成します。ここでは、ホスト名を"smartos01"に設定しています。

```lang:
mkdir -p /opt/custom/share/svc
```

```lang:smartos_setup.xml
#!/bin/bash
# Simple Ad Hoc SmartOS Setup Service

set -o xtrace

. /lib/svc/share/smf_include.sh

cd /
PATH=/usr/sbin:/usr/bin:/opt/custom/bin:/opt/custom/sbin; export PATH

case "$1" in
'start')
    #### Insert code to execute on startup here.

    hostname "smartos01" && hostname > /etc/nodename

    ;;

'stop')
    ### Insert code to execute on shutdown here.
    ;;

*)
    echo "Usage: $0 { start | stop }"
    exit $SMF_EXIT_ERR_FATAL
    ;;
esac
exit $SMF_EXIT_OK
```

スクリプトに実行権限を付与します。

```lang:
chmod 700 /opt/custom/share/svc/smartos_setup.sh
```

### 再起動します
`reboot`

以下のように SMF が、manifests を読み込んでいます。

![image](https://qiita-image-store.s3.amazonaws.com/0/74534/c0a8db1c-be22-289d-f8e6-870255f1fabc.png)

再起動が完了すると下記のようにホスト名が smartos01 に変わっています。

![image](https://qiita-image-store.s3.amazonaws.com/0/74534/8f8194b9-535f-c062-46be-159032b32e8b.png)

### ホスト名の確認
```lang:
# hostname
smartos01
```

続けて、SmartOSのKVM上でCentOSを動かしみるには、[SmartOSのKVMゲストとしてCentOS7.1を動かしてみる](http://qiita.com/kutsushitaneko/items/afd3ddbacfe2b7614c19)をみてみてください。また、LX Branded Zone（Linuxコンテナ）としてUbuntu 14.04を動かしてみるには、[SmartOSのLX Branded Zone（Linuxコンテナ）を動かす](http://qiita.com/kutsushitaneko/items/7216237d5929e0f715db)をみてみてください。