2013年6月11日火曜日

tips:Redhat6のiscsiでディスクを再認識させる方法

お仕事でやったのでtipsに記録。

状況は、iSCSI環境で、ディスクの削除・追加を実施した際に、同じデバイスファイルが使われる
ことがあるかと思いますが、その際に古いディスクの情報が残ってしまいます。
ということで、古いディスクの情報を削除し、再度あたらしくなった情報を読み込みます。

以下の例では、/dev/sdcデバイスファイルを1GBから10GBに変更したい際の例。

1.該当LUNのディスク情報の確認

# ls -l /dev/disk/by-path/ip-*lun-0

lrwxrwxrwx 1 root root 10  6月 10 06:33 2013 /dev/disk/by-path/ip-192.168.x.x:3260-iscsi-iqn.xxxxxxxxxx-lun-0 -> ../../sdc

# fdisk -l /dev/sdc

ディスク /dev/sdc: 1073 MB, 1073741824 バイト
ヘッド 34, セクタ 61, シリンダ 1011
Units = シリンダ数 of 2074 * 512 = 1061888 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O size (minimum/optimal): 512 bytes / 512 bytes
ディスク識別子: 0x00000000

2.該当ディスクの削除

# echo 1 > /sys/block/sdc/device/delete

# ls -l /dev/disk/by-path/ip-*lun-0

ls: cannot access /dev/disk/by-path/ip-*lun-0: そのようなファイルやディレクトリはありません

何も表示されない。成功。

3.ディスクの再認識

まずはiSCSIのセッションを確認する(本当はすでに知っているはずですが・・)

# iscsiadm -m session

tcp: [1] 192.168.x.x:3260,7 iqn.1992-04.com.xxx:xx.xxxxxx.xx

これでセッション5であることがわかる。

# ls -ld /sys/class/iscsi_host/host*/device/session1

drwxr-xr-x 6 root root 0  3月 26 19:47 2013 /sys/class/iscsi_host/host5/device/session1

ここのhost5を記録。これを使ってスキャンするパスを確認する。

# find /sys/class/iscsi_host/host5/device/scsi_host/host*/scan

/sys/class/iscsi_host/host5/device/scsi_host/host5/scan

このパス情報を使って、デバイスをスキャンする。

# echo "- - -" > /sys/class/iscsi_host/host5/device/scsi_host/host5/scan

そしてデバイスを確認してみると、、

# ls -l /dev/disk/by-path/ip-*lun-0

lrwxrwxrwx 1 root root 10  6月 11 06:33 2013 /dev/disk/by-path/ip-192.168.x.x:3260-iscsi-iqn.xxxxxxxxxx-lun-0 -> ../../sdc

できてました!日付も新しい。念のため

# fdisk -l /dev/sdc

ディスク /dev/sdc: 10.7 GB, 10737418240 バイト
ヘッド 64, セクタ 32, シリンダ 10240
Units = シリンダ数 of 2048 * 512 = 1048576 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O size (minimum/optimal): 512 bytes / 512 bytes
ディスク識別子: 0x00000000

ディスク /dev/sdc は正常なパーティションテーブルを含んでいません

おおおおっ。10GBになってた。終了。

-----おまけ-----
上記のようなディスクがいっぱいあった場合を想定してちょっと工夫してみた。
対象LUNがわかっている前提になるが、

1.対象LUNの現状を確認する(以下の例はLUNが13,14,15の場合)

# for i in 13 14 15;do ls -l /dev/disk/by-path/ip-*lun-$i; done|awk -F "/" '{print "fdisk -l /dev/"$NF""}'|sh

これで現在のデバイスが古い情報なのかどうか?が判断できる(容量から)。

2.対象LUNを削除する

# for i in 13 14 15;do ls -l /dev/disk/by-path/ip-*lun-$i; done|awk -F "/" '{print "echo 1 > /sys/block/"$NF"/device/delete"}'|sh

3.対象デバイスを再スキャンする

# find /sys/class/iscsi_host/host*/device/scsi_host/host*/scan|awk -F: '{print "echo \"- - -\" > "$0}'|sh

4.対象LUNを確認する

# for i in 13 14 15;do ls -l /dev/disk/by-path/ip-*lun-$i; done|awk -F "/" '{print "fdisk -l /dev/"$NF""}'|sh

これでちょっと楽になったかな(やり方が野暮ったい感じはするけども。。)。

0 件のコメント:

コメントを投稿