kazuitoitokazu’s diary

日本オラクルでインフラ周りの製品を触っています

NVMe を Oracle VM で柔軟に使う

PCI NVMe が4枚ささっている x86 Server を手に入れました。
これをチームで利用する Oracle VM for x86 の仮想化基盤に追加したい思います。
 
Oracle VM は以前オラクルが買収した ServerIron という Xen をベースにした製品をベースに改良が続けられています。
 
Oracle VM は最新 Ver が 3.4.4 で、少し前の 3.4.2 で NVMe デバイスの利用がサポートされました。
Oracle VM では VM の構成ファイルや VM に割り当てる Virtual Disk を Repository という概念で管理します。
今回は NVMe を Repository としては使わず、Physical Disk (Block Device)としてそのままVMに割当て使いたいと思います。
理由は、主に以下の2点です。
  • パフォーマンス
    • Repository とすると OCFS2 が使われ、その上に Virtual Disk が構築されるので、Physical Device と比較するとパフォーマンスは低下します
  • 別に Repository がある
    • すでに iSCSI ストレージで Repository を構成しているので、Repository が2つになると管理上ややこしいのが嫌です
    • Oracle VM の場合、VMの構成ファイルとVirtual Disk を別のRepositoryに配置することが可能です。オペミスで VM 構成ファイルは A-Repository で Virtual Disk が B-Repository にということをよくやってしまった。
 
NVMe x4 を Physical Disk で利用すると決まったのですが、4枚を単体で使うのは利用しづらいです。
できれば4枚を RAID で組んで、そこから必要な容量を切り出してVMに割り当てるのが理想です。
 
LVM であればそれが簡単にできます。
 
OracleVM 3.4.3 では Software RAID Devices がサポートされました。Software RAID で構築したデバイスOracle VM が認識できて、 Repository や Physical Device として利用できるというものです。
 
ただ、詳細を確認してみると Software RAID というのはどうやら mdadm を指すようです。
mdadm だと RAID は作れますが、そこから Volume を切り出すことはできません・・・。
 
やはり、LVM で試すしかないか、、、ということで、NVMe x4 に PV → VG を作成し、RAID5 の LV を切り出してみました。
残念ながら、Oracle VM はそれを認識してくれませんでした。。。
 
そこで、ダメ元で LV に対して mdadm で RAID0 を作成したところ、Oracle VM から認識できました!
mdadm on LVM なんてことをすることはあまりないと思いますが、とりあえずできました。
この方法はおそらくサポートされないと思われますので、もし同じようなことをしたい方は自己責任で!
 
参考までに手順を載せておきます。
 
# lsblk |grep nvme
nvme0n1     259:3    0  1.5T  0 disk                                                
nvme1n1     259:1    0  1.5T  0 disk                                                
nvme2n1     259:2    0  1.5T  0 disk                                                
nvme3n1     259:0    0  1.5T  0 disk     
 
# parted /dev/nvme0n1 mktable gpt mkpart primary 1M 100% set 1 lvm on
警告: いま存在している /dev/nvme0n1 のディスクラベルは破壊され、このディスクの全データが失われます。続行しますか?
parted: 不正なトークンです: mkpart
はい(Y)/Yes/いいえ(N)/No? y                                               
通知: 必要であれば /etc/fstab を更新するのを忘れないようにしてください。  
# parted /dev/nvme1n1 mktable gpt mkpart primary 1M 100% set 1 lvm on
通知: 必要であれば /etc/fstab を更新するのを忘れないようにしてください。  
# parted /dev/nvme2n1 mktable gpt mkpart primary 1M 100% set 1 lvm on
通知: 必要であれば /etc/fstab を更新するのを忘れないようにしてください。  
# parted /dev/nvme3n1 mktable gpt mkpart primary 1M 100% set 1 lvm on
通知: 必要であれば /etc/fstab を更新するのを忘れないようにしてください。  
 
  • デフォルトでは NVMe に LVM を構築できなかったので、LVM の設定を変更します。以下2行をコメントします
# vi /etc/lvm/lvm.conf
    #global_filter = [ "r|.*/|" ]
    #md_component_detection = 1
 
  • LVM を構築します
# pvcreate --dataalignment 4k /dev/nvme0n1 /dev/nvme1n1 /dev/nvme2n1 /dev/nvme3n1
  Physical volume "/dev/nvme0n1" successfully created
  Physical volume "/dev/nvme1n1" successfully created
  Physical volume "/dev/nvme2n1" successfully created
  Physical volume "/dev/nvme3n1" successfully created
# vgcreate VolNVMe /dev/nvme0n1 /dev/nvme1n1 /dev/nvme2n1 /dev/nvme3n1
  Volume group "VolNVMe" successfully created
 
  • RAID5 の LV を VG から切り出す
# lvcreate --type raid5 -i 3 -L 1400G -n vol01 VolNVMe
  Using default stripesize 64.00 KiB.
  Rounding size 1.37 TiB (358400 extents) up to stripe boundary size 1.37 TiB (358401 extents).
  Logical volume "vol01" created.
 
  • この LV にさらに mdadm で RAID0 Volume を作成する
# mdadm -C /dev/md01 -l 0 --force -n 1 /dev/VolNVMe/vol01
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md01 started.

 

  • これで認識してくれるはずである
Before(warning になっているのは NVMe に作成したパーティションの部分なので無視します)

f:id:kazuitoitokazu:20180123001944p:plain

  • Refresh を実行し、無事に認識されました!
After

f:id:kazuitoitokazu:20180123001907p:plain

  • これをVMに割り当てます

f:id:kazuitoitokazu:20180123001857p:plain

 

f:id:kazuitoitokazu:20180123001845p:plain

 
  • VM を起動させて確認したところ。xvdb として認識しています

f:id:kazuitoitokazu:20180123001830p:plain

 
  • mdadm の以下も忘れずに
# vi /etc/mdadm.conf
DEVICE /dev/VolNVMe/vol01 ← 追加する
 
# sudo mdadm --detail --scan >> /etc/mdadm.conf
 
以上、めでたしめでたし!
 

VirtualBox 5.2 Beta1: export Oracle Public Cloud

VirtualBox 5.2 Beta1 がリリースされました

注目した機能が "VM export to Oracle Public Cloud" です。
VirtualBoxVMOracle Public Cloud 形式で Export できる機能で、Beta1 ですがどういうものか確認してみたいと思います。
 
まず、この Oracle Public Cloud の IaaS ですが、VMware ESXi などで動いている VM を移行したい場合の手順についてざっくりとご説明すると、
  1. VM の OS が Linux なら Xen Driver をインストール、Windows なら Oracle VM PV Driver をインストール
  2. OVA 形式で VM を Export または、VMDK をデータストアから抽出
  3. VMDK を raw ファイル形式に変換
  4. 変換した raw ファイルを tar.gz にする(複数Diskを持つVMの場合、Disk 単位で tar.gz を作成)
  5. アップロード
となります。
 
想像するに、このVirtualBox 上の VM を 2, 3, 4 を実施してアップロードしやすくしてくれるものだと思われます。
 
それでは確認していきます。
 

VM の Export

VirtualBox5.2 Beta1 をインストールし、OracleLinux6.9 のVMを作成しインストールしました。

 
 
ファイル→仮想アプライアンスのエクスポートを選択します。

 
続いて、エクスポートする仮想マシンを選択します。

 
 
ここで例の Oracle Public Cloud Format 1.0 を選択します。
やはりファイル名が tar.gz になっています。

 
最後にエクスポートをクリックします。

 
 
これでファイルが生成されるので、完了まで待ちます。

 
この間のリソース使用率を見てみると、CPU はそんなに使っていません。

 
ディスクも 4.8MB/s 程度です。

 
詳しくは調べておりませんが、tar.gz 圧縮はシングルスレッドで動いているようです。
今回は 12GB の仮想ディスクに Oracle Linux 6.9 の Basic Server をインストールしただけなので、実使用量は2GB程度です。
なので、ディスク容量、実使用量が大きい場合、この処理にはかなり時間がかかることになります。
 
作成されたファイルがこちらです。

 

Oracle Public Cloud へアップロードとインスタンスの作成

続いてこれをOracle Public Cloud にアップロードしていきます。

 
先ほどの作成されたファイルを選択して Upload をクリックします。

 
 
 
アップロードが完了したら、Associate Image をクリックし、アップロードしたファイルに Name と Discription を記入します。

 
すると、以下のように登録されるので、これからインスタンスを作成していきます。
インスタンス作成の細かな設定については省略します。

 
イメージの右恥のバーガーアイコンをクリックし、Create Instance を選びます。

 
画面がインスタンス作成のウィザードになります。先ほどのイメージがリストされるので、選択します。

 
Shape(CPU, Memory) を選択します。

 
 
VM の名前を設定しますが、とりあえずデフォルトの値をそのまま使います。

 
 
VMのネットワーク周りの設定を行います。
Shared Network(インターネット側) のみに接続させます。
またSecurity Lists (インターネット側からの接続ルール)も設定します。

 
Storage の設定を行いますが、今回はデフォルトのままで進みます。

 
最後に、構成の確認をして Create をクリックします。

 
 
しばらくすると Instances タブに作成したインスタンスが表示されます。

 
インスタンスをクリックして、Screen Captures タブで画面出力のスクリーンショットを取得してインスタンスが起動しているか確認してみます。
ol69 login: と表示され、VirtualBox で作成した VM が無事 Oracle Public Cloud で動いたことが確認できました。

 

おまけ

 
Export した tar.gz の中身はこのようになってます。
$ tar tvf OL69.tar.gz
-rw-r----- vboxopc10/vbox_v5.2.VBOX_VERSION_PATCHr11 12884901888 2017-08-05 23:51 OL69-disk001.img
 
2つの仮想ディスクを持っているVM を Export すると tar.gz は仮想ディスクごとに作成されます。
-rwxrwxrwx 1 root root 443876265 Aug  6 22:33 OracleLinux69.tar.gz
-rwxrwxrwx 1 root root 641665357 Aug  6 22:35 OracleLinux69-disk002.tar.gz
 

まとめ

  • VirtualBox で作成した VMOracle Public Cloud のインスタンスとして無事に動かすことができました
  • このBeta1で追加された機能は想定通り、VM を tar.gz 形式で Export するという機能でした
  • Export ではなく、イメージの Upload もしてくれると良いですね。
  • 仮想ディスクのサイズ(実使用量)が大きい場合は、出力に時間がかかります。
  • その場合は、手数は必要ですが手動でイメージ変換と tarコマンド + pigz などを使ったほうが処理時間を短くできると思います。

Oracle ZFS Storage Appliance (ZFSSA) で Object Store を使う

はじめに

Oracle ZFS Storage Appliance は NFSiSCSI、FC などを利用できる Unified Storage です。 Firmware ver OS8.7 から新たに Object Storage としても利用できるようになりましたので、設定して使ってみたいと思います。

設定

オブジェクトストアにアクセスするユーザを作成する。 f:id:kazuitoitokazu:20170620122116p:plain

オブジェクトストアとして利用する Filesystem の HTTP のオブジェクトストアモードを”読み取り/書き込み" に設定する。 f:id:kazuitoitokazu:20170620122132p:plain

先ほど作成したユーザが書き込めるように設定する。 f:id:kazuitoitokazu:20170620122123p:plain

構成→サービス→HTTP にてサービスを有効にし、先ほど作成したオブジェクトストアのパスを指定する。 f:id:kazuitoitokazu:20170620122127p:plain

動作確認

curl で確認をしていきます。

まず Proxy が設定されている場合は外しておきましょう。

$ unset http_proxy
$ unset https_proxy

まず Token を取得します。この時、ユーザは一般ユーザで取得すること。root でもTokenは取得できるが、その後の操作はできないので一般ユーザで進めていきます。

$ curl -i -X GET -H 'X-Auth-User: demo01' -H 'X-Auth-Key: welcome1' http://cloud-zfs7320-vip.jp.osc.oracle.com/auth/v1.0
HTTP/1.1 200 OK
Date: Fri, 16 Jun 2017 06:37:26 GMT
Server: Apache
X-Storage-Url: http://cloud-zfs7320-vip.jp.osc.oracle.com:80/object/v1/export/object01
X-Storage-Token: ZFSSA_ba2629c6-5258-11e7-aed3-802128f06760
X-Auth-Token: ZFSSA_ba2629c6-5258-11e7-aed3-802128f06760
X-Trans-Id: tx9f6aab5dbe33495c8bba9-0059437ca6
Content-Length: 0
Content-Type: text/html; charset=utf-8

コンテナを作成

$ curl -v -H 'X-Auth-Token: ZFSSA_ba2629c6-5258-11e7-aed3-802128f06760' -i http://cloud-zfs7320-vip.jp.osc.oracle.com:80/object/v1/export/object01/kazuito01 -X PUT
* About to connect() to cloud-zfs7320-vip.jp.osc.oracle.com port 80 (#0)
* Trying 10.122.12.35... connected
* Connected to cloud-zfs7320-vip.jp.osc.oracle.com (10.122.12.35) port 80 (#0)
> PUT /object/v1/export/object01/kazuito01 HTTP/1.1
> User-Agent: curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.27.1 zlib/1.2.3 libidn/1.18 libssh2/1.4.2
> Host: cloud-zfs7320-vip.jp.osc.oracle.com
> Accept: */*
> X-Auth-Token: ZFSSA_ba2629c6-5258-11e7-aed3-802128f06760
>
< HTTP/1.1 201 Created
HTTP/1.1 201 Created
< Date: Fri, 16 Jun 2017 08:13:26 GMT
Date: Fri, 16 Jun 2017 08:13:26 GMT
< Server: Apache
Server: Apache
< X-Timestamp: 1497600806.63
X-Timestamp: 1497600806.63
< X-Trans-Id: tx1aa8d891b97ee11aca1dd-0059439326
X-Trans-Id: tx1aa8d891b97ee11aca1dd-0059439326
< Content-Length: 0
Content-Length: 0
< Content-Type: application/json; charset=utf-8
Content-Type: application/json; charset=utf-8

<
* Connection #0 to host cloud-zfs7320-vip.jp.osc.oracle.com left intact
* Closing connection #0

ファイルをアップロード

$ curl -v -H 'X-Auth-Token: ZFSSA_ba2629c6-5258-11e7-aed3-802128f06760' http://cloud-zfs7320-vip.jp.osc.oracle.com:80/object/v1/export/object01/my_fio.sh -T my_fio.sh
* About to connect() to cloud-zfs7320-vip.jp.osc.oracle.com port 80 (#0)
* Trying 10.122.12.35... connected
* Connected to cloud-zfs7320-vip.jp.osc.oracle.com (10.122.12.35) port 80 (#0)
> PUT /object/v1/export/object01/my_fio.sh HTTP/1.1
> User-Agent: curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.27.1 zlib/1.2.3 libidn/1.18 libssh2/1.4.2
> Host: cloud-zfs7320-vip.jp.osc.oracle.com
> Accept: */*
> X-Auth-Token: ZFSSA_ba2629c6-5258-11e7-aed3-802128f06760
> Content-Length: 482
> Expect: 100-continue
>
* Done waiting for 100-continue
< HTTP/1.1 201 Created
< Date: Fri, 16 Jun 2017 08:06:41 GMT
< Server: Apache
< X-Timestamp: 1497600401.57
< X-Trans-Id: tx16480743f13e60469a26d-0059439191
< Content-Length: 0
< Content-Type: application/json; charset=utf-8
<
* Connection #0 to host cloud-zfs7320-vip.jp.osc.oracle.com left intact
* Closing connection #0

リストを取得

$ curl -i http://cloud-zfs7320-vip.jp.osc.oracle.com:80/object/v1/export/object01/ -X GET -H "Content-Length: 0" -H 'X-Auth-Token: ZFSSA_ba2629c6-5258-11e7-aed3-802128f06760'
HTTP/1.1 200 OK
Date: Fri, 16 Jun 2017 06:45:09 GMT
Server: Apache
X-Timestamp: 1497595509.63
X-Account-Object-Count: 2
X-Account-Container-Count: 2
X-Account-Bytes-Used: 1048576020
X-Trans-Id: tx2f1212afb1a7e442f31cf-0059437e75
Transfer-Encoding: chunked
Content-Type: text/plain; charset=utf-8

container
test.img

ファイルのダウンロード

$ curl -v -H 'X-Auth-Token: ZFSSA_ba2629c6-5258-11e7-aed3-802128f06760' -i http://cloud-zfs7320-vip.jp.osc.oracle.com:80/object/v1/export/object01/kazuito01/my_fio.sh -X GET -O
* About to connect() to cloud-zfs7320-vip.jp.osc.oracle.com port 80 (#0)
* Trying 10.122.12.35... connected
* Connected to cloud-zfs7320-vip.jp.osc.oracle.com (10.122.12.35) port 80 (#0)
> GET /object/v1/export/object01/kazuito01/my_fio.sh HTTP/1.1
> User-Agent: curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.27.1 zlib/1.2.3 libidn/1.18 libssh2/1.4.2
> Host: cloud-zfs7320-vip.jp.osc.oracle.com
> Accept: */*
> X-Auth-Token: ZFSSA_ba2629c6-5258-11e7-aed3-802128f06760
>
 % Total  % Received % Xferd Average Speed Time  Time  Time Current
                Dload Upload Total Spent  Left Speed
 0  0  0  0  0  0   0   0 --:--:-- --:--:-- --:--:--  0< HTTP/1.1 200 OK
< Date: Fri, 16 Jun 2017 08:28:33 GMT
< Server: Apache
< Content-Length: 482
< Accept-Ranges: bytes
< Last-Modified: 2017-06-16T08:26:09
< Etag: 6c70a22fdcd02f8f085ba5cb9fff5be3
< X-Timestamp: 1497601713.85
< X-Trans-Id: txdad3ff790cee6ecd9beac-00594396b1
<
{ [data not shown]
120 482 120 482  0  0 3526   0 --:--:-- --:--:-- --:--:-- 117k* Connection #0 to host cloud-zfs7320-vip.jp.osc.oracle.com left intact

* Closing connection #0

ファイルの削除

$ curl -v -H 'X-Auth-Token: ZFSSA_ba2629c6-5258-11e7-aed3-802128f06760' -i http://cloud-zfs7320-vip.jp.osc.oracle.com:80/object/v1/export/object01/kazuito01/test.tar -X DELETE
* About to connect() to cloud-zfs7320-vip.jp.osc.oracle.com port 80 (#0)
* Trying 10.122.12.35... connected
* Connected to cloud-zfs7320-vip.jp.osc.oracle.com (10.122.12.35) port 80 (#0)
> DELETE /object/v1/export/object01/kazuito01/test.tar HTTP/1.1
> User-Agent: curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.27.1 zlib/1.2.3 libidn/1.18 libssh2/1.4.2
> Host: cloud-zfs7320-vip.jp.osc.oracle.com
> Accept: */*
> X-Auth-Token: ZFSSA_ba2629c6-5258-11e7-aed3-802128f06760
>
< HTTP/1.1 204 No Content
HTTP/1.1 204 No Content
< Date: Fri, 16 Jun 2017 08:24:59 GMT
Date: Fri, 16 Jun 2017 08:24:59 GMT
< Server: Apache
Server: Apache
< X-Timestamp: 1497601499.44
X-Timestamp: 1497601499.44
< X-Trans-Id: tx5e5b0c36a1c66867d090f-00594395db
X-Trans-Id: tx5e5b0c36a1c66867d090f-00594395db
< Content-Length: 0
Content-Length: 0
< Content-Type: application/json; charset=utf-8
Content-Type: application/json; charset=utf-8

<
* Connection #0 to host cloud-zfs7320-vip.jp.osc.oracle.com left intact
* Closing connection #0

その他

CloudBerry でもアクセスしてみました。 登録は以下のように指定してください。 f:id:kazuitoitokazu:20170620122112p:plain

このように見えてきます。 f:id:kazuitoitokazu:20170620122109p:plain

まとめ

このように ZFSSA を Object Storage として簡単に利用することができるようになりました。

また、認証を Openstack の Keystone と連携させることも可能です。詳細はこちらをご確認ください。