2014年5月6日火曜日

SoftLayer の iSCSI Storage を利用する

2014/06/28 追記
スナップショットを取得し、スナップショットをEnableにすると正常に動きませんでした。
以下の修正を加えました。
TGT=$(iscsiadm -m discoverydb -t st -p $PCS_TARGET -D | awk '{print $2}' | sed 's/^iscsid: //')
  ↓
TGT=$(iscsiadm -m discoverydb -t st -p $PCS_TARGET -D | awk '{print $2}' | sed 's/^iscsid: //' | grep -i $PCS_USER\$)


SoftLayer の iSCSI Storage を 1LUN 利用するのは難しくありません。
以下のナレッジを参照し、その通りに設定すればいいです。

Connect to an iSCSI LUN in Linux with Open-iSCSI
http://knowledgelayer.softlayer.com/procedure/connect-iscsi-lun-linux-open-iscsi

私がぶつかった問題は、2LUN 以上の複数 LUN を利用する場合です。
iSCSI Target にログインするときにユーザ名とパスワードが要求されるだけでなく、
iSCSI Target を登録するときにもユーザ名とパスワードが要求されます。
そして、同じ iSCSI ポータルにアクセスし、ユーザ名が異なると、前回登録した iSCSI Target の情報が上書きされてしまいます。SoftLayer の iSCSI Storage では、LUN 毎にターゲット名、ユーザ名とパスワードが異なっているにもかかわらず、ポータル名が同一なので、この点をクリアする必要があります。Google 先生に聞いてもマッチする回答がうまく見つかりませんでした。

2014/06/28 追記
香港DCだと、CHAP認証情報なしで、全員(他人のアカウント分も含む)のTargetが見えました。
これはバグだと思うので、問合せ中です。
問合せ後、1時間ほどで修正されました。

ログインするときに異なるユーザ名とパスワードが要求される場合の対処はすぐにわかりました。
以下を繰り返し実行していけばよいです。



sudo iscsiadm -m node -T <iSCSI Target Name> -o update -n node.session.auth.authmethod -v CHAP
sudo iscsiadm -m node -T <iSCSI Target Name> -o update -n node.session.auth.username -v <User Name>
sudo iscsiadm -m node -T <iSCSI Target Name> -o update -n node.session.auth.password -v <password>



問題は、iSCSI Target を登録するときの方法です。
/etc/iscsi/iscsid.conf に以下のように登録すればよい、という情報しか見つかりませんでした。
これでは、LUN 毎に /etc/iscsi/iscsid.conf を書き換えて iSCSI Target を登録後ログインし、という繰り返しとなってしまいます。



discovery.sendtargets.auth.username = <User Name>
discovery.sendtargets.auth.password = <password>



最終的にたどり着いた方法は以下の通りです。3LUN の場合を記載します。キモは、discovery モードではなく、discoverydb モードで操作することです。/etc/iscsi/iscsid.conf には、ユーザ名・パスワードを一切記載しません。



sudo touch /etc/iscsi/loginall.sh
sudo chmod 700 /etc/iscsi/loginall.sh
cat << 'EOF' | sudo tee /etc/iscsi/loginall.sh
/etc/init.d/iscsid start

PCS_TARGET=10.***.***.***
iscsiadm -m discovery -t st -p $PCS_TARGET

PCS_USER=SLI******-1
PCS_PW=************
iscsiadm -m discoverydb -t st -p $PCS_TARGET -o update -n discovery.sendtargets.auth.username -v $PCS_USER
iscsiadm -m discoverydb -t st -p $PCS_TARGET -o update -n discovery.sendtargets.auth.password -v $PCS_PW
TGT=$(iscsiadm -m discoverydb -t st -p $PCS_TARGET -D | awk '{print $2}' | sed 's/^iscsid: //' | grep -i $PCS_USER\$)
iscsiadm -m node -T $TGT -o update -n node.session.auth.authmethod -v CHAP
iscsiadm -m node -T $TGT -o update -n node.session.auth.username -v $PCS_USER
iscsiadm -m node -T $TGT -o update -n node.session.auth.password -v $PCS_PW
iscsiadm -m node -T $TGT -l

PCS_USER=SLI******-2
PCS_PW=************
iscsiadm -m discoverydb -t st -p $PCS_TARGET -o update -n discovery.sendtargets.auth.username -v $PCS_USER
iscsiadm -m discoverydb -t st -p $PCS_TARGET -o update -n discovery.sendtargets.auth.password -v $PCS_PW
TGT=$(iscsiadm -m discoverydb -t st -p $PCS_TARGET -D | awk '{print $2}' | sed 's/^iscsid: //' | grep -i $PCS_USER\$)
iscsiadm -m node -T $TGT -o update -n node.session.auth.authmethod -v CHAP
iscsiadm -m node -T $TGT -o update -n node.session.auth.username -v $PCS_USER
iscsiadm -m node -T $TGT -o update -n node.session.auth.password -v $PCS_PW
iscsiadm -m node -T $TGT -l

PCS_USER=SLI******-3
PCS_PW=************
iscsiadm -m discoverydb -t st -p $PCS_TARGET -o update -n discovery.sendtargets.auth.username -v $PCS_USER
iscsiadm -m discoverydb -t st -p $PCS_TARGET -o update -n discovery.sendtargets.auth.password -v $PCS_PW
TGT=$(iscsiadm -m discoverydb -t st -p $PCS_TARGET -D | awk '{print $2}' | sed 's/^iscsid: //' | grep -i $PCS_USER\$)
iscsiadm -m node -T $TGT -o update -n node.session.auth.authmethod -v CHAP
iscsiadm -m node -T $TGT -o update -n node.session.auth.username -v $PCS_USER
iscsiadm -m node -T $TGT -o update -n node.session.auth.password -v $PCS_PW
iscsiadm -m node -T $TGT -l
EOF



ログイン用のスクリプトを作ったので、ログアウト用も以下のように作ります。



cat << 'EOF' | sudo tee /etc/iscsi/logoutall.sh
iscsiadm -m node -U all
iscsiadm -m node -o delete
rm -rf /var/lib/iscsi/send_targets/* /var/lib/iscsi/nodes/*
/etc/init.d/iscsid stop
EOF
sudo chmod 755 /etc/iscsi/logoutall.sh



あとは、/etc/rc.local あたりで、/etc/iscsi/loginall.sh を実行するように追加すればよいです。

0 件のコメント:

コメントを投稿