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
 
以上、めでたしめでたし!