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