Mac OS X Leopard上のRHEL5.1でiSCSI + GFSする

Red Hat

RHEL5.1にはTechnology Preview(本番環境ではサポートが提供されない)ながらも、NTTサイバーソリューション研究所の藤田さんという方がかなり貢献されているソフトウェアiSCSIターゲットが同梱されています。これを使うと仮想化環境でも色々出来るなぁということと、RHEL5.1だけでiSCSI + GFS(ClusterStorage)の環境が構築出来るので、やってみました。ただし、あくまでiSCSI+GFSの「感じ」をつかむための構築手順ですので、本番環境ではサポートされない構成である点にご注意ください。

前提条件としては、Parallels Desktop for MacもしくはVMware Fusionがインストールされた、Intel Mac + Leopard環境があることです。今回はParallels Desktopで説明しますが、VMware Fusionでも同様のことは出来るはずです。

仮想マシンは全部で3台。1台はiSCSIターゲットとし、残り2台はiSCSIイニシエータになります。

iSCSIターゲットとなるマシンから設定しましょう。

インストールするのはRHEL5.1ですが、Red Hat Linuxで大丈夫です。

名前は何でも良いですが、分かりやすい名称をつけておきましょう。

パフォーマンスの設定はデフォルトで構いません。

インストール用のisoファイルを指定します。RHEL5.1(及びRHEL4.6)からは、CD-ROMのisoファイルだけではなく、DVDのisoファイルがRHNからダウンロードできます。

Floppyなどは不要なので取り除き、ネットワークはHost-onlyにします。

仮想マシンの設定は以上です。

インストールでのポイントの1つ目はiSCSIターゲットで用いるボリュームを用意しておくことです。パーティションでも、LVMの論理ボリュームでも構いません。今回はLVMでレイアウトしています。

また、ParallelsのゲストとしてRHEL5を動かそうとするとカーネルパニックを起こすことがあるのでagpサポートをoffにし、IPv6を利用しないのでnoipv6パラメータも渡しておきます。

最低限のパッケージをインストールするので、Customizeを選択します。

Baseのみでインストールします。iSCSIのソフトウェアターゲットは、scsi-target-utilsによって提供されますので、もしRHEL5のAdvanced Platformのサブスクリプション契約があり、キーボードのレイアウト選択後にインストール番号を入力していれば、RHEL5.1のClusterStorageパッケージグループに含まれています。今回はOSのインストール後に追加インストールをします。

インストール終了後DVDのisoをマウントして、scsi-target-utilsパッケージをインストールします。また、iSCSIターゲット・イニシエータの名前を解決出来るように、/etc/hostsを設定します。

[root@localhost ~]# mount /dev/hdb /media/
mount: block device /dev/hdb is write-protected, mounting read-only
[root@localhost ~]# rpm -ivh /media/ClusterStorage/scsi-target-utils-0.0-0.20070620snap.el5.i386.rpm 
Preparing...                ########################################### [100%]
   1:scsi-target-utils      ########################################### [100%]
[root@localhost ~]# cat /etc/hosts
# Do not remove the following line, or various programs
# that require network functionality will fail.
127.0.0.1		localhost.localdomain localhost
::1		localhost6.localdomain6 localhost6
10.37.129.5	tgt.example.com
10.37.129.6	node1.example.com
10.37.129.7	node2.example.com

インストール時に作成したVolume Groupがあるか確認します。

[root@localhost ~]# vgdisplay VolGroup01
  --- Volume group ---
  VG Name               VolGroup01
  System ID             
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  1
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                0
  Open LV               0
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               3.97 GB
  PE Size               32.00 MB
  Total PE              127
  Alloc PE / Size       0 / 0   
  Free  PE / Size       127 / 3.97 GB
  VG UUID               JqyRut-pYWs-UcDU-u15k-O09d-XJts-K171XB

LVを作成します。

[root@localhost ~]# lvcreate -l 127 -n LogVolISCSI00 VolGroup01
  Logical volume "LogVolISCSI00" created

tgtdを起動します。

[root@localhost ~]# service tgtd start
Starting SCSI target daemon:                               [  OK  ]

以下の内容のスクリプトを作成し、実行します。詳細は/usr/share/doc/scsi-target-utils-version/README.iscsiを参照してください。

#!/bin/bash
tgtadm --lld iscsi --op new --mode target --tid 1 -T iqn.2007-12.com.example:storage.LogVolISCSI00
tgtadm --lld iscsi --op new --mode logicalunit --tid 1 --lun 1 -b /dev/VolGroupI01/LogVolISCSI00
tgtadm --lld iscsi --op new --mode account --user rio --password password
tgtadm --lld iscsi --op bind --mode account --tid 1 --user rio
tgtadm --lld iscsi --op bind --mode target --tid 1 -I ALL

以上でiSCSIターゲットとなるマシンの設定は終了です。tgtdを終了するには、killall -9 tgtdします。service tgtd stopはまだきちんと実装されていないようです。また、iptablesやSELinuxなどの設定に注意してください。

iSCSIイニシエータになるマシンを準備します。Parallelsの設定はターゲットとなるマシンと同じですので割愛します。
iSCSIイニシエータとなるRHEL5.1の設定はターゲットとなるマシンと少々異なります。パーティションはデフォルトのままで構いません。またパッケージグループとして、X WindowとGNOMEデスクトップが必要です。ただし、GFS(ClusterStorage)の設定終了後はランレベル3で構いません。仮想化環境でのテストですので、出来るだけリソースを節約するため不必要なパッケージをインストールしないように、また不必要なサービスは極力停止しましょう。

インストール終了後DVDのisoをマウントして、以下のパッケージを追加インストールします。GFS(ClusterStorage)とiSCSIのイニシエータのパッケージ群です。

  • ClusterStorage/gfs-utils-0.1.12-1.el5.i386.rpm
  • ClusterStorage/kmod-gfs-0.1.19-7.el5.i686.rpm
  • ClusterStorage/kmod-gfs2-1.52-1.16.el5.i686.rpm
  • ClusterStorage/lvm2-cluster-2.02.26-1.el5.i386.rpm
  • Cluster/rgmanager-2.0.31-1.el5.i386.rpm
  • Cluster/system-config-cluster-1.0.50-1.3.noarch.rpm
  • Server/cman-2.0.73-1.el5.i386.rpm
  • Server/gfs2-utils-0.1.38-1.el5.i386.rpm
  • Server/openais-0.80.3-7.el5.i386.rpm
  • Server/perl-Net-Telnet-3.03-5.noarch.rpm
  • Server/iscsi-initiator-utils-6.2.0.865-0.8.el5.i386.rpm

lvmがクラスタ環境で利用可能になるように、lvmconfコマンドを実行します。GFS(ClusterStorage)を利用する全てのマシンでこのコマンドを実行しておく必要があります。

[root@localhost ~]# lvmconf --enable-cluster

X Window上でsystem-config-clusterを実行します。初回の設定なので、設定ファイルが存在しない旨のダイアログが表示されますので、”Create New Configuration”ボタンをクリックします。

クラスタの名称を入力します。マルチキャストとクォーラムディスクの設定は今回は行いませんが、必要に応じて設定してください。

クラスタのノードを追加します。”Add a Cluster Node”ボタンをクリックします。

ノードの名前を入力します。

フェンスデバイスを追加します。フェンスデバイスは、ノードのフェイル時にクラスタのドメインから強制的に切り離すためのデバイスです。”Add a Fence Device”ボタンをクリックします。

フェンスの種類を選択します。本番環境ではサポートされませんが、ここではManual Fencingを選択します。無停電電源装置やブレードシャーシの管理モジュール、リモート管理カードなどを本来指定します。

フェンスデバイスをクラスタのノードに追加します。”Manage Fencing For This Node”ボタンをクリックします。

フェンスは複数のレベルを設定できます。例えば、リモート管理カードでノードの強制停止が出来なかった場合、PDUやUPSなどで電源を落としてしまう構成などです。ここではフェンスのレベルは1のみとします。

先ほど追加したManual Fencingのフェンスデバイスを各ノードに追加します。

フェイルオーバードメイン=クラスタドメインを設定します。

フェイルオーバードメインの名称を設定します。このドメインの名称は、後ほどgfs_mkfsコマンドでファイルシステムを作成する際に、-tオプションで用います。

ドメインのノードを追加します。

以上でGFS(ClusterStorage)のドメインの設定は終了です。

設定を保存するディレクトリを選択しますが、ディレクトリ、ファイル名共にデフォルトのままにしておきます。クラスタが正常に動作すれば、system-config-clusterによって設定ファイルをクラスタドメインに配布することが可能ですが、初回はscp等で/etc/cluster/cluster.confを配布する必要があります。

ここまでの作業でGFS(ClusterStorage)を利用するための準備は終了です。

クラスタを構成する全ノードでcmanサービスを起動し、クラスタの状態を確認します。問題がなければ、chkconfig cman onでサービスが起動するように設定します。

[root@node1 ~]# service cman start
Starting cluster: 
   Loading modules... done
   Mounting configfs... done
   Starting ccsd... done
   Starting cman... done
   Starting daemons... done
   Starting fencing... done
                                                           [  OK  ]
[root@node1 ~]# clustat 
msg_open: No such file or directory
Member Status: Quorate

  Member Name                        ID   Status
  ------ ----                        ---- ------
  node1.example.com                     1 Online, Local
  node2.example.com                     2 Online

同様に、全ノードでclvmdサービスを起動します。

[root@node1 ~]# service clvmd start
Starting clvmd:                                            [  OK  ]
Activating VGs:   2 logical volume(s) in volume group "VolGroup00" now active
                                                           [  OK  ]

先に作成したiSCSIターゲットを利用できるように設定します。iSCSIの設定は/etc/iscsi/iscsid.confで行います。今回は特に複雑な設定をしていませんので、CHAPの設定のみ変更します。

# *************
# CHAP Settings
# *************

# To enable CHAP authentication set node.session.auth.authmethod
# to CHAP. The default is None.
node.session.auth.authmethod = CHAP

# To set a CHAP username and password for initiator
# authentication by the target(s), uncomment the following lines:
node.session.auth.username = rio
node.session.auth.password = password

iscsiを起動します。

[root@localhost ~]# service iscsi start
iscsid is stopped
Turning off network shutdown. Starting iSCSI daemon:       [  OK  ]
                                                           [  OK  ]
Setting up iSCSI targets: iscsiadm: No records found!
                                                           [  OK  ]

iSCSIターゲットを探します。

[root@localhost ~]# iscsiadm -m discovery -t sendtargets -p 10.37.129.5
10.37.129.5:3260,1 iqn.2007-12.com.example:storage.LogVolISCSI00

ログインします。

[root@localhost ~]# iscsiadm -m node -T iqn.2007-12.com.example:storage.LogVolISCSI00 -p 10.37.129.5 --login
Login session [iface: default, target: iqn.2007-12.com.example:storage.LogVolISCSI00, portal: 10.37.129.5,3260]

デバイスが見えていることを確認します。iSCSIターゲットが提供しているデバイスは、/dev/sdaとして見えています。

[root@localhost ~]# dmesg | tail | grep dev
SCSI device sda: drive cache: write back
SCSI device sda: 8323072 512-byte hdwr sectors (4261 MB)
SCSI device sda: drive cache: write back
[root@localhost ~]# fdisk -l

Disk /dev/hda: 33.5 GB, 33554497536 bytes
255 heads, 63 sectors/track, 4079 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/hda1   *           1          13      104391   83  Linux
/dev/hda2              14        4079    32660145   8e  Linux LVM

Disk /dev/sda: 4261 MB, 4261412864 bytes
132 heads, 62 sectors/track, 1016 cylinders
Units = cylinders of 8184 * 512 = 4190208 bytes

Disk /dev/sda doesn't contain a valid partition table

/dev/sdaにパーティション→pvを作成します。

[root@node1 ~]# fdisk /dev/sda
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel. Changes will remain in memory only,
until you decide to write them. After that, of course, the previous
content won't be recoverable.

Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-1016, default 1): 1
Last cylinder or +size or +sizeM or +sizeK (1-1016, default 1016): 1016

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.
[root@node1 ~]# partprobe /dev/sda
[root@node1 ~]# pvcreate /dev/sda1
  Physical volume "/dev/sda1" successfully created

作業をしているノード(node1)とは別のノード(node2)で、pvscanを実行します。

[root@node2 ~]# pvscan 
  PV /dev/hda2   VG VolGroup00   lvm2 [31.12 GB / 0    free]
  PV /dev/sda1                   lvm2 [3.96 GB]
  Total: 2 [35.09 GB] / in use: 1 [31.12 GB] / in no VG: 1 [3.96 GB]

引き続き、vgを作成します。

[root@node1 ~]# vgcreate -s 32M VolGroupGFS /dev/sda1
  Volume group "VolGroupGFS" successfully created
[root@node1 ~]# vgdisplay VolGroupGFS
  --- Volume group ---
  VG Name               VolGroupGFS
  System ID             
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  1
  VG Access             read/write
  VG Status             resizable
  Clustered             yes
  Shared                no
  MAX LV                0
  Cur LV                0
  Open LV               0
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               3.94 GB
  PE Size               32.00 MB
  Total PE              126
  Alloc PE / Size       0 / 0   
  Free  PE / Size       126 / 3.94 GB
  VG UUID               w262KE-i22q-UgXu-JyLc-LKUG-7txp-4X5Y1W

[root@node2 ~]# vgdisplay VolGroupGFS
  --- Volume group ---
  VG Name               VolGroupGFS
  System ID             
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  1
  VG Access             read/write
  VG Status             resizable
  Clustered             yes
  Shared                no
  MAX LV                0
  Cur LV                0
  Open LV               0
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               3.94 GB
  PE Size               32.00 MB
  Total PE              126
  Alloc PE / Size       0 / 0   
  Free  PE / Size       126 / 3.94 GB
  VG UUID               w262KE-i22q-UgXu-JyLc-LKUG-7txp-4X5Y1W

lvを作成します。

[root@node1 ~]# lvcreate -l 126 -n LogVolGFS00 VolGroupGFS
  Logical volume "LogVolGFS00" created

gfsでフォーマットします。-jはジャーナルの数、-pはここではlock_dlmを、-tにはsystem-config-clusterで設定した名称とユニークなファイルシステム名称を”:”で結合したものを指定します。

[root@node1 ~]# gfs_mkfs -j 8 -p lock_dlm -t gfs_dom:myfs /dev/mapper/VolGroupGFS-LogVolGFS00 
This will destroy any data on /dev/mapper/VolGroupGFS-LogVolGFS00.

Are you sure you want to proceed? [y/n] y

Device:                    /dev/mapper/VolGroupGFS-LogVolGFS00
Blocksize:                 4096
Filesystem Size:           769956
Journals:                  8
Resource Groups:           12
Locking Protocol:          lock_dlm
Lock Table:                gfs_dom:myfs

Syncing...
All Done

お疲れ様でした。以上でGFSが作成出来ましたので、複数のノードから同時にマウントして読み書きなどしてみてください。共有ファイルシステムのおもしろさが味わえるはずです。