iSCSI

SCSIコマンドをTCP/IPでカプセリングする事で、既存のIP網でSCSIを扱えるようにする技術。
SAN(StorageAreaNetwork)の形成に利用する技術で、従来はFC(FiberChannel)が使われていた。
既存設備を流用出来るがiSCSIのメリットだがSCSIコマンドをIP網に流す為、
TCP/IPの性質上、パケット送受信・L2/L3スイッチの負荷は注視する必要がある。
 
iSCSIは1対1のサーバ(iSCSIターゲット)・クライアント(iSCSIイニシエータ)方式が基本体系となる為、
一つのターゲットに複数のイニシエータを接続するのは非推奨動作となる。
それでも接続する場合は、ターゲットをクラスタリング構成にするか、
複数イニシエータからの同時操作を抑制(排他)制御する必要がある。
 
よく、iSCSI・NFS・CIFSで比較される事があるが、
用途がそれぞれ違うので、必要に応じて最適な物を選択する。


参考サイト


iSCSIイニシエータ

  • プログラムのインストール
    ターゲットに接続する為のアプリがインストールされていない場合インストールしておく。
    iscsiiscsidで間違えそうだが、イニシエータツールはiscsi、接続を行うデーモンはiscsidとなる。
    # yum install iscsi-initiator-utils
    # chkconfig iscsid on
     

 

  • 基本設定
    iSCSI利用環境では自動ログイン・マウントが基本になると思われるので、基本設定を変更する。
    設定内容は基本的にそのまま(デフォルト)となるが、「node.startup」「node.session.auth.*」は下記の様に変更する。
    # vi /etc/iscsi/iscsid.conf
    ---
    # iscsidの起動方法
    iscsid.startup = /etc/rc.d/init.d/iscsid force-start
    
    # 自動起動・自動接続を行う
    node.startup = automatic
    
    # ログイン時の読込みを禁止
    node.leading_login = No
    
    # デフォルトの認証方式をCHAPに変更
    node.session.auth.authmethod = CHAP
    
    # コネクションエラー発生から、I/Oエラー応答までの待ち時間(単位:秒)
    node.session.timeo.replacement_timeout = 120
    
    # ログイン時の待ち時間(単位:秒)
    node.conn[0].timeo.login_timeout = 15
    
    # ログアウト時の待ち時間(単位:秒)
    node.conn[0].timeo.logout_timeout = 15
    
    # ping死活監視間隔(単位:秒)
    node.conn[0].timeo.noop_out_interval = 5
    
    # ping死活監視がエラーと判断するまでの待ち時間(単位:秒)
    node.conn[0].timeo.noop_out_timeout = 5
    
    # デフォルトユーザ・パスワードをコメントアウト。CHAP認証情報は後で入力する
    #node.session.auth.username = iscsi_user
    #node.session.auth.password = iscsi_pass
    #node.session.auth.username_in = username_in
    #node.session.auth.password_in = password_in
     

 

  • ターゲットへの接続
    念の為、ターゲット一覧を確認した上で接続(ログイン)を行う。
    ターゲット指定で利用するIQN/EUIはターゲット側で生成した値を指定する。
     
    今回は下記条件で作成したiSCSIターゲットへのログイン方法をメモしておく
    認証方法CHAP
    iSCSIターゲット192.168.0.1
    ポート番号3260
    ポータルグループタグ1
    IQNiqn.2016-12.com.hoge:iscsi-target:iscsi.hostname.e12345
    ログインユーザ名USER
    ログインパスワードPASSWORD
     
    1. ターゲットが発見出来ているか確認
      # iscsiadm -m node
      ---
      192.168.0.1:3260,1 iqn.2016-12.com.hoge:iscsi-target:iscsi.hostname.e12345
       
    2. ターゲットが発見出来ない場合は、手動登録を行う
      # iscsiadm -m discovery -t sendtargets -p 192.168.0.1:3260
      ---
      192.168.0.1:3260,1 iqn.2016-12.com.hoge:iscsi-target:iscsi.hostname.e12345
       
    3. 認証方式・ユーザ・パスワードをイニシャルセットする
      # iscsiadm -m node -T iqn.2016-12.com.hoge:iscsi-target:iscsi.hostname.e12345 -p 192.168.0.1:3260,1 --op update -n node.session.auth.authmethod -v CHAP
      # iscsiadm -m node -T iqn.2016-12.com.hoge:iscsi-target:iscsi.hostname.e12345 -p 192.168.0.1:3260,1 --op update -n node.session.auth.username -v USER
      # iscsiadm -m node -T iqn.2016-12.com.hoge:iscsi-target:iscsi.hostname.e12345 -p 192.168.0.1:3260,1 --op update -n node.session.auth.password -v PASSWORD
       
    4. ターゲットへのログイン
      # iscsiadm -m node -T iqn.2016-12.com.hoge:iscsi-target:iscsi.hostname.e12345 -p 192.168.0.1:3260,1 --login
       
    5. ログイン情報の確認
      # cat /var/lib/iscsi/send_targets/{ターゲットIPアドレス,ポート番号}/{IQN,ポータルグループ,ポート番号}/default
       
    6. ターゲットからログアウト
      # iscsiadm -m node -T iqn.2016-12.com.hoge:iscsi-target:iscsi.hostname.e12345 -p 192.168.0.1:3260,1 --logout
       
    7. ターゲットの削除
      # iscsiadm -m node -o delete -T iqn.2016-12.com.hoge:iscsi-target:iscsi.hostname.e12345 -p 192.168.0.1:3260
       

 

  • デバイス名の固定化
    Linuxのデバイス名(/dev/sd*)は、デバイスIDの順序によって順番に割り当てられている。
    一度割り当てられたデバイス名が変更される事は基本的に無いのだが、
    デバイス起動順序によってはデバイス名が変わってしまう事がある。
    デバイス名の変更が発生すると、/etc/fstabのマウント指定に影響が出る為、
    udevを利用する事でマウントポイントを固定化させる。
     
    色々な固定方法が存在するのだが、設定が一番楽だった下記手法を記載しておく。
    ポイントはデバイス固定ルールで指定する「ENV{ID_SERIAL}」「NAME="sd*%n"」の二つとなる。
    メモは下記条件を元に作成。コマンド実行結果は長いので必要な部分のみ抜粋する。
    変更前デバイス名/dev/sdb
    変更前のマウントポイント1/dev/sdb1
    変更前のマウントポイント2/dev/sdb2
    固定後デバイス名/dev/sdc
    固定後のマウントポイント1/dev/sdc1
    固定後のマウントポイント2/dev/sdc2

 

  1. iSCSIターゲットのデバイスシリアル番号の確認
    # udevadm info --query=all --name=/dev/sdb | grep ID_SERIAL= | sed 's/.*=//g'
    ---
    abcdef111222333444555666777888999
     
  2. デバイス固定ルールの作成
    # vi /etc/udev/rules.d/80-scsi.rules
    ---
    SUBSYSTEM=="block", ENV{ID_BUS}=="scsi", ENV{ID_SERIAL}=="abcdef111222333444555666777888999", NAME="sdc%n", OWNER:="root", GROUP:="disk", MODE:="0660"
     
  3. デバイスの再認識
    # start_udev
     
  4. デバイス認識状況の再確認
    # ls -l /dev/disk/by-path
     
  5. デバイスのパーミッション確認
    # ls -l /dev/sdc*
    ---
    brw-rw---- 1 root disk 8, 30 12月  1 12:00 2016 /dev/sdc
    brw-rw---- 1 root disk 8, 31 12月  1 12:00 2016 /dev/sdc1
     

 

  • HDDのフォーマット
    ターゲットへの接続とデバイス番号の固定が完了したら、ローカルHDDと同様にパーティション設定・フォーマットを行う。
    この時、イニシエータでログインしたターゲットHDDが4Kバイトセクタ(AFT)モードで作成されていた場合、
    パーティションの開始セクタ位置を63から64(8の2倍)にずらした上で、フォーマットを行う必要がある。
     
    今回は一例として、500GBのiSCSIターゲットディスクを4Kバイトセクタモードで作成し、
    1パーティションのext4ファイルシステムでフォーマットする方法をメモしておく。
     
    ext4へのフォーマットは「-m 0」でroot予約ブロックを廃止、「-b 4096」でブロックサイズを4096に変更する。
    予約ブロックはディスクフルになった際、rootのみ書き込み出来る予備領域を確保するオプションだが、
    ディスクフル監視している時や、フルまで使わない運用ならば領域確保を廃止する事で、パフォーマンスが向上する。
     
    1. fdiskの呼び出し
      # fdisk /dev/sdc
       
    2. iSCSIターゲットのセクタサイズ確認 [p]
      コマンド (m でヘルプ): p
      ---
      ディスク /dev/sdc: 536.9 GB, 536870912000 バイト
      ヘッド 255, セクタ 63, シリンダ 8158
      Units = シリンダ数 of 16065 * 4096 = 65802240 バイト
      セクタサイズ (論理 / 物理): 4096 バイト / 4096 バイト
      I/O size (minimum/optimal): 1048576 bytes / 1048576 bytes
       
    3. 基本パーティションの作成 [n]→[p]
      コマンド (m でヘルプ): n
      ---
      コマンドアクション
         e   拡張
         p   基本パーティション (1-4)
      ---
      p
       
    4. パーティション情報の作成 [1]→[改行]→[改行]
      パーティション番号 (1-4): 1
      ---
      最初 シリンダ (1-8158, default 1): [改行]
      Using default value 1
      ---
      Last シリンダ, +シリンダ数 or +size{K,M,G} (1-8158, default 8158): [改行]
      Using default value 8158
       
    5. パーティションの確認 [p]
      コマンド (m でヘルプ): p
      ---
      デバイス ブート      始点        終点     ブロック   Id  システム
      /dev/sdc1               1        8158   524232828   83  Linux
       
    6. 上級者モードへの切替 [x]
      コマンド (m でヘルプ): x
       
    7. パーティションの確認 [p]
      上級者コマンド (m でヘルプ): p
      ---
      ディスク /dev/sdc: ヘッド 255, セクタ 63, シリンダ 8158
      
      Nr AF  Hd Sec  Cyl  Hd Sec  Cyl       開始      サイズ ID
       1 00   1   1    0 254  63 1023         63  131058207 83
      Partition 1 does not start on physical sector boundary.
       2 00   0   0    0   0   0    0          0          0 00
       3 00   0   0    0   0   0    0          0          0 00
       4 00   0   0    0   0   0    0          0          0 00
       
    8. 開始セクタの移動 [b]→[1]→[64]
      上級者コマンド (m でヘルプ): b
      パーティション番号 (1-4): 1
      新規データ開始位置 (1-131058269, default 63): 64
       
    9. パーティションの確認 [p]
      上級者コマンド (m でヘルプ): p
      ---
      ディスク /dev/sdc: ヘッド 255, セクタ 63, シリンダ 8158
      
      Nr AF  Hd Sec  Cyl  Hd Sec  Cyl       開始      サイズ ID
       1 00   1   1    0 254  63 1023         64  131058206 83
      Partition 1 does not start on physical sector boundary.
       2 00   0   0    0   0   0    0          0          0 00
       3 00   0   0    0   0   0    0          0          0 00
       4 00   0   0    0   0   0    0          0          0 00
       
    10. パーティション情報の書き込み [w]
      上級者コマンド (m でヘルプ): w
       
    11. iSCSIターゲットのフォーマット
      # mkfs.ext4 -m 0 -b 4096 /dev/sdc1
       

 

  • HDDのマウント
    フォーマットが終わった後はfstabにマウントポイントなどを設定するのだが、
    iSCSIを使っている事からネットワークマウントを行う為の設定である「_netdev」を追加する。
    例としてext4でフォーマットしたパーティションのコンフィグ作成内容をメモしておく
     
    1. パーティションUUIDの取得
      # blkid /dev/sdc1
      ---
      /dev/sdc1: UUID="f424f1fa-cd1f-4780-94d1-e686897f809e" TYPE="ext4"
       
    2. fstabルールの作成
      # vi /etc/fstab
      ---
      UUID=f424f1fa-cd1f-4780-94d1-e686897f809e    /mnt/sdc1    ext4    defaults,_netdev    1  2
       
    3. マウント
      # mkdir /mnt/sdc1
      # mount -a