お手軽XenServer + iSCSIターゲットを作ってみる
すいません。軽い嘘です。XenServer6がリリースされたのでお手軽なことをしようと思ったのですが、結果あまりお手軽じゃなくなってしまいました。
iSCSIターゲットとESXiとXenServerのPC3台を稼働していたので、今年の夏は本気で暑かった。節電期間終了と同時に電気代の明細をみたところ、本気でシャレにならないことに気がつきました。長考した結果「XenServerはLinuxなんだから自身がiSCSIターゲットになれるはず」ということで XenServerにiSCSIターゲットをインストールして1台のサーバにまとめる暴挙をやってみました。
XenServerインストール
まずは普通にXenServerをインストールしてください。ここでは XenServer 6を使用しました。BondingもGUIからできるので楽ですね。
必要なものをインストール
iSCSIターゲットの tgt(scsi-target-utils)だけでいいです。
# yum --enablerepo=base install scsi-target-utils ruby vim-enhanced screen
ローカルストレージリポジトリを解除
まずはいらないローカルストレージリポジトリを解除。
- xe sr-list でローカルストレージリポジトリ情報を取得
- xe pbd-list でPBDの情報を取得
- xe pbd-unplug でPBDを取り外す
- 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で使用するために再構築をします。
- pvscan, vgscan, lvscanして情報を取得
- lvremove, vgremove でLVMを削除
- vgcreate で新しいVGを作成
- lvcreate でiSCSIターゲットで公開するLVを作成
- 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) です。
- 公開するターゲットの設定
- tgtを自動起動するように設定
公開するターゲットの設定はiqnを決めたりするのが面倒なので、自動生成するスクリプトを作成しています。ここではセキュリティなどの設定は無視しています。必要に応じてinitiator-addressやCHAPの設定をしてください。
iqnのルールはNovellのSUSEサイトに詳しく載っていたので興味のある人は参照してください。
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を参照してください。
- /boot/extlinux.conf の dom0_mem=752M を変更
- リブートして反映
- 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したあと登録し直すとう方法で逃げました。
- VirtualBox4.1.2 に XenServer6をインストール
- VirtualBox on XenServer を XenCenterに追加
- VirtualBox on XenServer で Software iSCSI SR を登録
- VirtualBox on XenServer の Software iSCSI SR をforget
- Software iSCSI SR を Reattach
VirtualBoxにXenServer6をインストールします。OSタイプはRedHat(64bit)にしました。
VirtualBox on XenServer で Software iSCSI SRを登録して forget します。
あとは forgetしたターゲットを自分自身のXenServerでリアタッチします。
これで完成です。結構疲れました。