harry’s memorandum

おれおれメモ

お手軽XenServer + iSCSIターゲットを作ってみる

すいません。軽い嘘です。XenServer6がリリースされたのでお手軽なことをしようと思ったのですが、結果あまりお手軽じゃなくなってしまいました。

iSCSIターゲットとESXiとXenServerのPC3台を稼働していたので、今年の夏は本気で暑かった。節電期間終了と同時に電気代の明細をみたところ、本気でシャレにならないことに気がつきました。長考した結果「XenServerはLinuxなんだから自身がiSCSIターゲットになれるはず」ということで XenServerにiSCSIターゲットをインストールして1台のサーバにまとめる暴挙をやってみました。

構成

構成はこんな感じ。vmwareで使えるdatastoreも兼ねています。
f:id:dharry:20111001181237p:image

ハードウェア構成

結構増設しています。サーバ本体の値段なんて吹っ飛んでいますね。

やったこと

こんな感じ。

  1. XenServerインストール
  2. ローカルストレージはいらないので削除
  3. 増設した2.5HDDx4でRAID1+0
  4. ストレージをiSCSIターゲットに再構築
  5. 起動時にLVがACTIVEになるようにする
  6. XenServerがiSCSIターゲットになるようにする
  7. Domain0の使用するメモリを多めになるようにする
  8. XenCenterで Software iSCSI SR を登録
    1. でもXenServer6だと失敗。自身がiSCSIターゲットの場合失敗?
    2. 姑息な方法でSoftware iSCSI SR を登録

XenServerインストール

まずは普通にXenServerをインストールしてください。ここでは XenServer 6を使用しました。BondingもGUIからできるので楽ですね。

必要なものをインストール

iSCSIターゲットの tgt(scsi-target-utils)だけでいいです。

# yum --enablerepo=base install scsi-target-utils ruby vim-enhanced screen

ローカルストレージリポジトリを解除

まずはいらないローカルストレージリポジトリを解除。

  1. xe sr-list でローカルストレージリポジトリ情報を取得
  2. xe pbd-list でPBDの情報を取得
  3. xe pbd-unplug でPBDを取り外す
  4. xe sr-forget(sr-destroy) でPBDを解除

ローカルストレージリポジトリのタイプのtypeを指定します。lvm / ext どちらかだと思います。

# xe sr-list type=ext
uuid ( RO)                : da5d3a66-6623-e388-084f-af5a21c1f03a (★)
          name-label ( RW): Local storage
    name-description ( RW):
                host ( RO): chevy
                type ( RO): ext
        content-type ( RO): user

ローカルストレージリポジトリのuuidからPBDの情報を調べます。

# xe pbd-list sr-uuid=da5d3a66-6623-e388-084f-af5a21c1f03a
uuid ( RO)                  : e3936e43-7c5d-3cd8-3e24-00f5e9b130e5 (★)
             host-uuid ( RO): 02f9aade-c849-44bb-83c6-38177940df3d
               sr-uuid ( RO): da5d3a66-6623-e388-084f-af5a21c1f03a
         device-config (MRO): device: /dev/disk/by-id/scsi-SATA_WDC_WD10EADS-00_WD-WCAU44892129-part3,/dev/disk/by-id/scsi-SATA_WDC_WD10EADS-00_WD-WCAU44979639
    currently-attached ( RO): true

PBDをアンプラグ(取り外し)します。

# xe pbd-unplug uuid=e3936e43-7c5d-3cd8-3e24-00f5e9b130e5

アンプラグするとローカルストレージに☓が付きます。

ローカルストレージリポジトリを削除します。(xe sr-destroyかもしれない)

# xe sr-forget uuid=da5d3a66-6623-e388-084f-af5a21c1f03a

これでXenCenterからローカルストレージリポジトリが消えます。

LVMをiSCSIターゲット用に再構築。

XenServerのローカルディスクをiSCSIで使用するために再構築をします。

  1. pvscan, vgscan, lvscanして情報を取得
  2. lvremove, vgremove でLVMを削除
  3. vgcreate で新しいVGを作成
  4. lvcreate でiSCSIターゲットで公開するLVを作成
  5. lvm.conf, rc.sysinitを修正して起動時にLVがACTIVEになるように設定

pvscan, vgscan, lvscanして情報を取得します。

# pvscan
  PV /dev/sda3   VG XSLocalEXT-da5d3a66-6623-e388-084f-af5a21c1f03a   lvm2 [923.50 GB / 0    free]
  Total: 2 [1.81 TB] / in use: 2 [1.81 TB] / in no VG: 0 [0   ]
# vgscan
  Reading all physical volumes.  This may take a while...
  Found volume group "XSLocalEXT-da5d3a66-6623-e388-084f-af5a21c1f03a" using metadata type lvm2
# lvscan
  inactive          '/dev/XSLocalEXT-da5d3a66-6623-e388-084f-af5a21c1f03a/da5d3a66-6623-e388-084f-af5a21c1f03a' [1.80 TB] inherit

ここでは いきなり VG(VolumGroup)を削除します。

# vgremove XSLocalEXT-da5d3a66-6623-e388-084f-af5a21c1f03a
Do you really want to remove volume group "XSLocalEXT-da5d3a66-6623-e388-084f-af5a21c1f03a" containing 1 logical volumes? [y/n]: y
  Logical volume "da5d3a66-6623-e388-084f-af5a21c1f03a" successfully removed
  Volume group "XSLocalEXT-da5d3a66-6623-e388-084f-af5a21c1f03a" successfully removed
# vgscan
  Reading all physical volumes.  This may take a while...

新しいVGを作成します。ここでは "vg00" という VGを新規作成します。

# pvscan
  PV /dev/sda3                      lvm2 [923.51 GB]
  Total: 2 [1.81 TB] / in use: 0 [0   ] / in no VG: 2 [1.81 TB]
# vgcreate vg00 /dev/sda3 /dev/sdb
  Volume group "vg00" successfully created
# vgscan
  Reading all physical volumes.  This may take a while...
  Found volume group "vg00" using metadata type lvm2

iSCSIターゲット用のLVを作成します。

# lvcreate --size 500G --name  iscsi00 vg00
  Logical volume "iscsi00" created
# lvscan
  ACTIVE            '/dev/vg00/iscsi00' [500.00 GB] inherit

増設したHDDでRAID1+0を作成

重要なデータ用にRAID1+0を作成します。mdadm でRAID1+0 の /dev/md0デバイスを作成。

#  mdadm --create /dev/md0  --level=10 --raid-devices=4 /dev/sdb /dev/sdc /dev/sdd /dev/sde
mdadm: array /dev/md0 started.

リビルドに2時間以上かかるのでコンビニでも行って時間を潰します。

# cat /proc/mdstat
Personalities : [raid10]
md0 : active raid10 sde[3] sdd[2] sdc[1] sdb[0]
      1465148928 blocks 64K chunks 2 near-copies [4/4] [UUUU]
      [>....................]  resync =  0.8% (13032064/1465148928) finish=122.9min speed=196778K/sec

unused devices: <none>

mdadm.confを作成

# echo "MAILADDR root" > /etc/mdadm.conf
# echo "DEVICE partitions " >> /etc/mdadm.conf
# mdadm -D --scan >> /etc/mdadm.conf
# cat /etc/mdadm.conf
MAILADDR root
DEVICE partitions
ARRAY /dev/md0 level=raid10 num-devices=4 metadata=0.90 UUID=4b851f3e:11a5bf2d:8efac547:903a29e6

VGは "vg01" という名前で作成します。

# mke2fs  /dev/md0
# vgcreate vg01 /dev/md0 
  Physical volume "/dev/md0" successfully created
  Volume group "vg01" successfully created
# pvscan
  PV /dev/sda3   VG vg00   lvm2 [923.50 GB / 923.50 GB free]
  PV /dev/md0    VG vg01   lvm2 [1.36 TB / 1.36 TB free]
  Total: 2 [2.27 TB] / in use: 2 [2.27 TB] / in no VG: 0 [0   ]

iSCSIターゲット用のLVを作成します。

# lvcreate --size 500G --name  iscsird10-00 vg01
  Logical volume "iscsird10-00" created
# lvscan
  ACTIVE            '/dev/vg00/iscsi-00' [500.00 GB] inherit
  ACTIVE            '/dev/vg01/iscsird10-00' [500.00 GB] inherit

起動時にLVがACTIVEになるように設定

/etc/lvm/lvm.conf の filter を 修正します。

# grep -1 -n "^\s*filter =" /etc/lvm/lvm.conf
53-    # dom0-attached LVHD VDIs
54:    filter = [ "a|^/dev/vg00/lv[0-9]+|", "r|/dev/xvd.|", "r|/dev/VG_Xen.*/*|"]
55-

起動時に lvm.conf を参照するように /etc/rc.sysinit を修正します。

# grep -2 -n vgchange /etc/rc.sysinit
481-
482-    if [ -x /sbin/lvm.static ]; then
483:            action $"Setting up Logical Volume Management:" /sbin/lvm.static vgchange -a y --ignorelockingfailure
484-    fi
485-fi

iSCSIターゲット(tgt)の設定

RHEL(CentOS)のiSCSIターゲットは tgt(Linux SCSI target framework) です。

  1. 公開するターゲットの設定
  2. tgtを自動起動するように設定

公開するターゲットの設定はiqnを決めたりするのが面倒なので、自動生成するスクリプトを作成しています。ここではセキュリティなどの設定は無視しています。必要に応じてinitiator-addressやCHAPの設定をしてください。
iqnのルールはNovellSUSEサイトに詳しく載っていたので興味のある人は参照してください。

def usage
  puts "#{__FILE__} [/dev/vg/lv]"; exit 1
end
def rnd(n)
  Array.new(n){ format("%02x",rand(255)).to_s }.join
end
class String
  def rev_dom
    self.split(".").reverse.join(".")
  end
end

usage unless ARGV.size == 1
dev = ARGV[0]
domain = "dharry.local" # your domain
day = Time.now.strftime("%Y-%m")
uuid =  [4, 2, 2, 2, 6].map {|n| rnd(n) }.join
iqn = ["iqn", day, domain.rev_dom].join(".") + ":" + File.basename(dev) + "-" + uuid

puts <<EOF
<target #{iqn}>
   backing-store #{dev}
   lun 1
</target>
EOF

作成したスクリプトで ターゲットの設定を /etc/tgt/target.conf に追加。

# ruby foo.rb /dev/vg00/iscsi-00
<target iqn.2011-10.local.dharry:iscsi-00-eac091293270f3713f8da7e5b537ee15>
   backing-store /dev/vg00/iscsi-00
   lun 1
</target>
# ruby foo.rb /dev/vg00/iscsi-00 >> /etc/tgt/target.conf

# ruby foo.rb /dev/vg01/iscsird10-00
<target iqn.2011-10.local.dharry:iscsird10-00-2ebbc19c0cc046e45076e01f6fde5033>
   backing-store /dev/vg01/iscsird10-00
   lun 1
</target>
# ruby foo.rb /dev/vg01/iscsird10-00 >> /etc/tgt/target.conf

tgtを自動起動するように設定をします。

# chkconfig --level 345 tgtd on
# chkconfig --list | grep tgt
  tgtd            0:off   1:off   2:off   3:on    4:on    5:on    6:off

targetを確認

# tgtadm --lld iscsi --op show --mode target

Domain0が使用するメモリの上限を拡張

XenServerのDomain0はデフォルト752Mになっています。Domain0をiSCSIターゲットとしても快適に動いてもらうために多少多めにメモリを割り当てます。詳細はhttp://support.citrix.com/article/CTX124766を参照してください。

  1. /boot/extlinux.conf の dom0_mem=752M を変更
  2. リブートして反映
  3. xe vm-param-set と xe vm-memory-target-set で値を変更

/boot/extlinux.conf の dom0_mem=752M を変更します。 ここでは2048Mにしています。

# vim /boot/extlinux.conf 
label xe
  # XenServer
  kernel mboot.c32
  append /boot/xen.gz dom0_mem=2048M lowmem_emergency_pool=1M crashkernel=64M@32M console= vga=mode-0x0311 --- /boot/vmlinuz-2.6-xen root=LABEL=root-kwmzbsgb ro xencons=hvc console=hvc0 console=tty0 quiet vga=785 splash --- /boot/initrd-2.6-xen.img

リブートして反映します。

# sync;sync;sync; reboot

割り当てたすべてのメモリがdom0で使用されるように設定します。詳しいことはhttp://support.citrix.com/article/CTX124766に載っています。

# . /etc/xensource-inventory
# staticmax=`xe vm-param-get uuid=$CONTROL_DOMAIN_UUID param-name=memory-static-max`
# echo staticmax=$staticmax
staticmax=2148794368
# xe vm-param-set uuid=$CONTROL_DOMAIN_UUID memory-dynamic-max=$staticmax
# xe vm-memory-target-set uuid=$CONTROL_DOMAIN_UUID target=$staticmax
# free -m
             total       used       free     shared    buffers     cached
Mem:          2049        291       1758          0          5        116
-/+ buffers/cache:        169       1879
Swap:          511          0        511

XenCenter で Software iSCSI SR を登録

何故か自分自身がiSCSIターゲットの場合、SRの登録がうまくできません。ストレージがLVMoISCSIでフォーマットされていればアタッチできるので、姑息ですが別のXenServer6で一度 Software iSCSI SR を登録してforgetしたあと登録し直すとう方法で逃げました。

  1. VirtualBox4.1.2 に XenServer6をインストール
  2. VirtualBox on XenServer を XenCenterに追加
  3. VirtualBox on XenServer で Software iSCSI SR を登録
  4. VirtualBox on XenServer の Software iSCSI SR をforget
  5. Software iSCSI SR を Reattach

VirtualBoxにXenServer6をインストールします。OSタイプはRedHat(64bit)にしました。
VirtualBox on XenServer で Software iSCSI SRを登録して forget します。
f:id:dharry:20111004060318p:image
あとは forgetしたターゲットを自分自身のXenServerでリアタッチします。

これで完成です。結構疲れました。