• 締切済み

Shellのパターンマッチについて

Linux初心者で正規表現やパターンマッチの方法にあまり詳しくない者です。 以下はWeb上で公開されているiscsiの設定を行うシェルのサンプルです。 # -- ここから #!/bin/sh #iscsidev.sh BUS=${1} HOST=${BUS%%:*} LUN=`echo ${BUS} | cut -d":" -f4` file="/sys/class/scsi_host/host${HOST}/device/session*/iscsi_session*/targetname" target_name=`echo $(cat ${file}) | cut -d":" -f2` if [ -z "${target_name}" ]; then exit 1 fi echo "${target_name} ${LUN}" # --ここまで サンプルをコピペしてそのまま動かしたのですが、きちんと動作していないようだったので、 1行ずつ端末上で実行し、確認したところ、 file="/sys/class/scsi_host/host${HOST}/device/session*/iscsi_session*/targetname" で指定している部分で該当するファイル・ディレクトリがないエラーになっていました。 実際のディレクトリは/sys/class/scsi_host/host0~9のようになっているのに対し、 この設定では${HOST}の部分がうまくいってないようで /sys/class/scsi_host/host/device~と、「~hostの後が任意の数字」のように意図 しているにもかかわらず、そのようになっていないようです。 このような場合、 BUS=${1} HOST=${BUS%%:*} LUN=`echo ${BUS} | cut -d":" -f4` の部分はどのように修正したらよいでしょうか?

みんなの回答

  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.2

>1行ずつ端末上で実行し、確認したところ、 って、もしかして、iscsidev.sh のファイルに書いていることを1行ずつ、シェル端末からキーインorコピペして実行したと言うことですか? /etc/udev/rules.d/55-openiscsi.rules を読み取っているプログラムが、そのファイル中にある%bをどのように置換してコマンドを起動しているのかを調べて、それを BUS= にセットしてください。 もっと楽に確認するのは、iscsidev.sh の BUS=${1} の行の後に、 echo "$BUS" > /tmp/value-of-BUS とでも入れて実行させてみて、内容を確認する。

cypher00
質問者

補足

>って、もしかして、iscsidev.sh のファイルに書いていることを1行ずつ、シェル端末からキーインorコピペして実行したと言うことですか? そのとおりです。 >echo "$BUS" > /tmp/value-of-BUS >とでも入れて実行させてみて、内容を確認する。 BUS,HOST,LUNのそれぞれについて仕込んでみました。 # iscsiadm -m node -L all Login session [iface: default, target: iqn.2006-01.com.openfiler:racdata1.voting1, portal: XX.XX.XX.XX,3260] Login session [iface: default, target: iqn.2006-01.com.openfiler:racdata1.voting2, portal: XX.XX.XX.XX,3260] Login session [iface: default, target: iqn.2006-01.com.openfiler:racdata1.voting3, portal: XX.XX.XX.XX,3260] Login session [iface: default, target: iqn.2006-01.com.openfiler:racdata1.asmdata1, portal: XX.XX.XX.XX,3260] Login session [iface: default, target: iqn.2006-01.com.openfiler:racdata1.ocr, portal: XX.XX.XX.XX,3260] として、iscsiにログインし、そこで作成されている各ファイルの内容を確認すると、 [root@XXX tmp]# cat value-of-BUS 4:0:0:0 [root@XXX tmp]# cat value-of-HOST 4 [root@XXX tmp]# cat value-of-LUN 0 これだと、最終的にHOSTには"4"が入ることになると思うのですが、iscsiの領域は5つあります。 この値は本当にこのままセットしてしまってよいものでしょうか?

回答No.1

起動時にデバイスファイル名を引数として要求している気がしますが きちんと指定していますか?

cypher00
質問者

補足

シェルそのものは、以下のルールファイル(?)の中から呼び出されるようです。 # -- ここから # /etc/udev/rules.d/55-openiscsi.rules KERNEL=="sd*", BUS=="scsi", PROGRAM="/etc/udev/scripts/iscsidev.sh %b", SYMLINK+="iscsi/%c{1}/lun%c{2}/part%n", OWNER="XXXX", MODE="0640", GROUP="disk" # -- ここまで ※OWNERはダミーです。ユーザ名が入っています。 PROGRAM=で指定された末尾の%bが引数なのだと思いますが、 これでデバイスファイル名が渡るのかどうか? この/etc/udev/rules.d/55-openiscsi.rulesを作成するときの指定が cat > /etc/udev/rules.d/55-openiscsi.rules なので、それ以前の記述はないはずだと思いますが……。

関連するQ&A