iSCSIでLUNを切り離す

oktCentOS,iscsi,linux,lun,multipath,scsi,volume,ボリューム,マルチパス,調べてみた

oktです。

今回はiSCSIネタで書いていたのですが、単にSCSIの(OS上での取扱いについての)お話になってしまいました。常識的な事かもしれませんがお付き合いくださいませ。

iSCSIを使った実験で不要になったLUNを始末する時に

  1. ターゲットからイニシエータに対してのLUNのアクセス権を削除(LUN masking)
  2. イニシエータからiscsiadmコマンドで再スキャン

で削除できるだろうなんて思いこみでやってみたら見事にハマったので、恥ずかしながらネタにしてみました。

再スキャンじゃダメなのかと、改めてドキュメントを見たら書いてありました。

http://www.open-iscsi.org/docs/README 抜粋

– Perform a SCSI scan on a session

./iscsiadm -m session -r 1 –rescan

This function also works in node mode. instead of the “-r $sid"
argument, you would pass in the node info like targetname and/or portal,
and/or interface.

Note: Rescanning does not delete old LUNs. It will only pick up new
ones.

Rescanning does not delete old LUNs

じゃ、どうするんだ?ということで使用しなくなったLUNを、ターゲットからログアウトせずに削除する方法を調べてみました。

尚、説明の為に簡略化していますが、環境はCentOS5でiscsi-initiator-utilsとdevice-mapper-multipathを使い、切り離したいデバイスを /dev/sda , /dev/sdb としています。

まず、マルチパス構成で利用している場合は先に設定を解除しておきます。

例えば、aliasの設定があれば削除かコメントアウトした上で、以下のように設定してマルチパスの対象として除外します。

# /etc/multipath.conf
--省略--
blacklist {
wwid 3600c0ff000d5d88d7fcaf14901000000
}
--省略--

ここで、wwidの指定ではなく

blacklist {
devnode "^sd[ab][0-9]*"
}

とかでもいいかもしれませんがwwidでサクっと除外してしまう方が好みです。
reloadと反映の確認を忘れずに。

次にLUNの削除ですがhttp://www.linux.or.jp/JF/JFdocs/SCSI-Programming-HOWTO-4.htmlに書いてありました。

# echo "scsi remove-single-device a b c d" > /proc/scsi/scsi

ここで a b c d は以下のようになるようです。(これも書いてありますが念のため)

aには ホストアダプタの番号
bには ホストアダプタ上のSCSIチャネル
cには ID
dには LUN

# echo "scsi remove-single-device 0 0 0 2" > /proc/scsi/scsi
# echo "scsi remove-single-device 1 0 0 2" > /proc/scsi/scsi

上記の場合、複数のパスの同じボリュームに対する切離し操作になります。

マルチパス構成をとっている場合、ホストアダプタは2つ以上あると思いますのでa は 0 とか 1 とかの値をとります。
これはiSCSIの場合ターゲットへログインするとSCSIチャネルが開かれますが、同時に仮想的にホストアダプタが増えるように扱われているようですので常に0になると思います。
cはbと同様に基本的には 0 になるのだと思います。
パスによってLUNが違う場合はdもそれぞれ違う値になるかもしれません。
これらの値はLUNの認識時にdmesgとかで確認できますのでそれほど迷うことはないと思います。

また、もっと簡単な方法として以下の方法があります。

# echo 1 > /sys/block/${DEVNODE}/device/delete

DEVNODEは削除したいデバイス名(/dev/sdaを削除する場合はsda)を指定します。

# echo 1 > /sys/block/sda/device/delete
# echo 1 > /sys/block/sdb/device/delete

この状態で再スキャンしてしまうとまたLUNを認識してしまうのでその前にターゲット側でLUN Maskingを実施します。その後、再スキャンして認識しないことを確認します。

こんな感じで不要なLUNの削除ができますので、実験が手軽になりました。
今のところ、こんな感じでうまくいってますが参考にされる場合はくれぐれも自己責任でお願いします。
誤りがあれば教えて頂けると幸いです。