2016年11月7日月曜日

LIO Cluster [LIO, DRBD, Pacemaker による冗長化 iSCSI Target] (その4)LVM


LVM の設定を行います。rhel6 と rhel7 で初期値が異なっていたり、仕様変更(バグ?)があったりで、少し手間取りました。

管理者用一般ユーザにて、ssh でログインします。


ssh admin@10.110.88.57
admin@10.110.88.57's password: ********


rhel6 と rhel7 で初期値が異なる部分について、diff の出力結果のように整理すると、以下のようになります。


<obtain_device_list_from_udev = 0
---
>obtain_device_list_from_udev = 1

<use_blkid_wiping = 0
---
>use_blkid_wiping = 1

<locking_dir = "/var/lock/lvm"
---
>locking_dir = "/run/lock/lvm"

<mirror_segtype_default = "mirror"
---
>mirror_segtype_default = "raid1"

<raid10_segtype_default = "mirror"
---
>raid10_segtype_default = "raid10"

<sparse_segtype_default = "snapshot"
---
>sparse_segtype_default = "thin"

<use_lvmetad = 0
---
>use_lvmetad = 1

<use_lvmpolld = 0
---
>use_lvmpolld = 1


赤字の4行については、rhel6 の初期値に戻します。


sudo sed -i -e 's/obtain_device_list_from_udev =.*$/obtain_device_list_from_udev = 0/' /etc/lvm/lvm.conf
sudo sed -i -e 's/use_blkid_wiping =.*$/use_blkid_wiping = 0/' /etc/lvm/lvm.conf
sudo sed -i -e 's/use_lvmetad =.*$/use_lvmetad = 0/' /etc/lvm/lvm.conf
sudo sed -i -e 's/use_lvmpolld =.*$/use_lvmpolld = 0/' /etc/lvm/lvm.conf


これに伴い、rhel7 で新設されたサービスを停止、無効化します。


sudo systemctl stop lvm2-lvmetad.socket
sudo systemctl stop lvm2-lvmpolld.socket
sudo systemctl disable lvm2-lvmetad.socket
sudo systemctl disable lvm2-lvmpolld.socket


DRBD のマニュアルの記載に従って、キャッシュを無効化します。


sudo sed -i -e 's/write_cache_state =.*$/write_cache_state = 0/' /etc/lvm/lvm.conf
sudo rm -f /etc/lvm/cache/.cache


DRBD のマニュアルの記載に従って、フィルタ設定を変更します。ただし、マニュアル通りだと動かないので、以下のように変更します。ボリュームグループ名は常に「vg」で始まるように命名する前提です。


sudo patch --ignore-whitespace /etc/lvm/lvm.conf << 'EOF'
diff -upr /etc/lvm/lvm.conf /etc/lvm/lvm.conf.new
--- /etc/lvm/lvm.conf   2015-11-21 12:01:29.000000000 +0900
+++ /etc/lvm/lvm.conf.new       2016-09-21 07:52:14.164259555 +0900
@@ -139,6 +139,7 @@ devices {
        #
        # This configuration option has an automatic default value.
        # filter = [ "a|.*/|" ]
+filter = ["r|vg.*|", "a|sd.*|", "a|drbd.*|", "r|.*|"]

        # Configuration option devices/global_filter.
        # Limit the block devices that are used by LVM system components.
EOF


※ DRBD のマニュアルの記載によれば、「filter = ["a|sd.*|", "a|drbd.*|", "r|.*|"]」という設定で動くはずで、rhel6 ではその通りでしたが、rhel7 では挙動が異なるようです。意味するところは、①「/dev/sd」で始まるブロックデバイスが LVM 物理ボリュームかどうかをチェックする対象とし、②「/dev/drbd」で始まるブロックデバイスが LVM 物理ボリュームかどうかをチェックする対象とし、③それ以外は無視する、という設定なのですが、rhel7 では、異なる解釈となるようです。私が動作確認した範囲では、①「/dev/sd」で始まるブロックデバイスが LVM 物理ボリュームかどうかをチェックする対象とし、②その中に LVM 論理ボリュームが含まれていた場合にはその LVM 論理ボリュームが LVM 物理ボリュームかどうかチェックする対象とし、③「/dev/drbd」で始まるブロックデバイスが LVM 物理ボリュームかどうかをチェックする対象とし、④その中に LVM 論理ボリュームが含まれていた場合にはその LVM 論理ボリュームが LVM 物理ボリュームかどうかチェックする対象とし、⑤それ以外は無視する、という解釈になるようです。このような解釈はだれも望んでいないと思うので、バグだと判断しています。ソースコードを確認すればよいのですが、そこまでは調べていません。とりあえず、上記のように設定すれば、意図したとおりに動きます。このバグが修正されたとしても動きます。命名規則が決め打ちになる点が残念ですが已むをえません。

※ そもそも、何がしたくてこのような設定を行っているかについても説明します。
DRBD のリソースとして /dev/vg0/lv-drbd0 を利用します。
DRBD のリソース名は /dev/drbd0 となります。
後で出てきますが、以下のコマンドを実行して、DRBD デバイスを LVM 物理ボリュームにします。
sudo pvcreate /dev/drbd0
PV Scan (VG Scan 内で呼び出される) を実行した際に「/dev/drbd0」を検知してほしいのですが、デフォルト設定では、「/dev/vg0/lv-drbd0」が LVM 物理ボリュームとして検知されてしまいます。
もしくは、「/dev/vg0/lv-drbd0」が DRBD によりロックされているため、何も検知できません。ロックされていない「/dev/drbd0」が検知できないのはバグだと思いますが、上記のように設定することで回避できます。DRBD のメタデータがブロックデバイスの末尾(もしくは別のブロックデバイス)に配置されるので、DRBD のリソース用に割り当てたブロックデバイス /dev/vg0/lv-drbd0 の先頭部分は、/dev/drbd0 の先頭部分と同じ解釈が可能です。この誤検知を避けたいが故の設定です。


LVM の設定ファイルは、初期化 RAM ディスク内にも含まれているので、変更を反映しておきます。


for i in /boot/initramfs-*
do
  KVER=$(echo $i | sed -n 's%/boot/initramfs-\(.*\).img%\1%p')
  if echo $KVER | grep -q -v rescue; then
    if echo $KVER | grep -q -v kdump; then
      sudo dracut --force /boot/initramfs-$KVER.img $KVER;
    fi
  fi
done


LVM 物理ボリューム用パーティションを作成します。


echo Yes | sudo parted /dev/sdc mklabel gpt mkpart primary 1MiB 100% set 1 lvm on
echo Yes | sudo parted /dev/sdd mklabel gpt mkpart primary 1MiB 100% set 1 lvm on
echo Yes | sudo parted /dev/sde mklabel gpt mkpart primary 1MiB 100% set 1 lvm on
echo Yes | sudo parted /dev/sdf mklabel gpt mkpart primary 1MiB 100% set 1 lvm on
sudo parted -l
Disk /dev/sda: 8590MB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:

Number  Start   End     Size    Type     File system  Flags
 1      1049kB  525MB   524MB   primary  xfs          boot
 2      525MB   8590MB  8065MB  primary  xfs

Model: VMware Virtual disk (scsi)
Disk /dev/sdb: 1074MB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:

Number  Start   End     Size    Type     File system     Flags
 1      1049kB  1074MB  1073MB  primary  linux-swap(v1)

Model: VMware Virtual disk (scsi)
Disk /dev/sdc: 1074MB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number  Start   End     Size    File system  Name     Flags
 1      1049kB  1073MB  1072MB               primary  lvm

Model: VMware Virtual disk (scsi)
Disk /dev/sdd: 1074MB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number  Start   End     Size    File system  Name     Flags
 1      1049kB  1073MB  1072MB               primary  lvm

Model: VMware Virtual disk (scsi)
Disk /dev/sde: 1074MB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number  Start   End     Size    File system  Name     Flags
 1      1049kB  1073MB  1072MB               primary  lvm

Model: VMware Virtual disk (scsi)
Disk /dev/sdf: 1074MB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number  Start   End     Size    File system  Name     Flags
 1      1049kB  1073MB  1072MB               primary  lvm


LVM 物理ボリュームを作成します。


sudo pvcreate /dev/sdc1
  Physical volume "/dev/sdc1" successfully created

sudo pvcreate /dev/sdd1
  Physical volume "/dev/sdd1" successfully created

sudo pvcreate /dev/sde1
  Physical volume "/dev/sde1" successfully created

sudo pvcreate /dev/sdf1
  Physical volume "/dev/sdf1" successfully created


LVM ボリュームグループを作成します。


sudo vgcreate -s 4M vg0 /dev/sdc1 /dev/sdd1 /dev/sde1 /dev/sdf1
  Volume group "vg0" successfully created


LVM 論理ボリュームを作成します。


sudo lvcreate --name lv-drbd0 --extents 90%FREE vg0
  Logical volume "lv-drbd0" created.


LVM の状態を確認します。


sudo pvs
  /dev/sdc1  vg0  lvm2 a--  1020.00m      0
  /dev/sdd1  vg0  lvm2 a--  1020.00m      0
  /dev/sde1  vg0  lvm2 a--  1020.00m      0
  /dev/sdf1  vg0  lvm2 a--  1020.00m 408.00m

sudo vgs
  VG   #PV #LV #SN Attr   VSize VFree
  vg0    1   1   0 wz--n- 1.95t 200.00g

sudo lvs
  LV       VG   Attr       LSize Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  lv-drbd0 vg0  -wi-a----- 1.76t


続いて、DRBD デバイス上にも LVM 物理ボリュームを作成したいところですが、まだ DRBD デバイスを作成していないので、LVM 関連操作は一旦ここでお開きとなります。

0 件のコメント:

コメントを投稿