iSCSIとは,TCP/IP上にSCSIプロトコルを流す,ネットワークストレージプロトコルの一種です。ストレージエリアネットワーク(SAN)といえばファイバーチャネルなどが連想されますが,iSCSIは一般的なイーサネット上に構築することが可能なため,非常に手軽かつ安価に導入できるというメリットがあります。
今週のレシピはUbuntuを使ってiSCSIターゲットを構築し,利用する方法を紹介します。
そもそもiSCSIとは?
iSCSIはSambaのような,サーバ側の共有空間を多数のクライアントで同時に使うタイプのサービスとは根本的に異なり,TCP/IPを経由してストレージそのものを提供する仕組みです。ネットワーク越しに接続されているUSBハードディスクのようなものをイメージすると理解しやすいかもしれません。ネットワーク上にあるストレージをiSCSIターゲット,ターゲットに接続するクライアントをiSCSIイニシエータと呼称します。USBハードディスクがPCと1対1で接続されるように,iSCSIターゲットもまた,複数のイニシエータから同時に接続することはできません(注1)。
- 注1
- 厳密に言えば接続することはできますが,他のホストとの競合を解消することが困難なため,データ破損などの危険があります。この問題を解決するにはクラスタ対応のファイルシステムを使うなどの対策を行う必要があります。
iSCSIターゲットの構築
それではUbuntuを使ってiSCSIターゲットを構築しましょう。Ubuntuで利用できるiSCSIターゲットソフトウェアには「iSCSI Enterprise Target」というものがあり,パッケージ名「iscsitarget」で提供されています。iSCSIターゲットには,サーバに接続されているハードディスクやファイルを設定することができます。今回は例としてホームディレクトリにddでイメージファイルを作成し,ターゲットに設定しました。
$ sudo apt-get install iscsitarget <- iscsitargetのインストール $ dd if=/dev/zero of=iscsi.img count=0 bs=1 seek=10G <- 10GBのファイルの作成
iSCSIターゲットの設定は,/etc/ietd.conf(注2)に記述します。まずTargetセクションを記述して1つのターゲットを定義し,Targetセクション内に論理ユニット番号(LUN)を定義します。LUNにはターゲットとするファイルやブロックデバイスと,タイプを指定してください。タイプにはfileioの他にblockioが指定できます。詳しくは man 5 ietd.conf が参考になるでしょう。TargetセクションのiqnはiSCSIのターゲットの識別子になりますので,重複しないユニークな名前をつけてください。これはiqnの命名規則より「iqn.年-月.ドメイン名:任意の名前」となります(注3)。これが,ターゲットに最低限必要な設定となります。設定が完了したら,iscsitargetを再起動しましょう。
$ sudo vi /etc/ietd.conf <- ietd.confファイルの編集 (末尾に追記) Target iqn.2010-06.org.rikunet:lucid64.disk Lun 0 Path=/home/mizuno/iscsi.img,Type=fileio $ sudo service iscsitarget restart <- サービスの再起動
- 注2
- ietdはiSCSI Enterprise Target Daemonの略のようです。
- 注3
- iqnの命名規則はRFC3720を参照してください。
iSCSIイニシエータの設定
次にイニシエータ側の設定を行いましょう。Ubuntuで使えるiSCSIイニシエータには「Open-iSCSI」があり,パッケージ名はopen-iscsiです。open-iscsiをインストールすると,/sbin/iscsidがデーモンとして動作します。iSCSIデバイスの検出や設定を行うには,iscsidの動作が必要不可欠となっています。
まずはiSCSIターゲットの検出を行ないましょう。iscsiadmコマンドのモード(-mオプション)にdiscoveryを指定し,指定したIPアドレスのマシンで動作しているiSCSIターゲットを検出します。なお一度検出したターゲットは,/etc/iscsi/nodes以下に設定が作成されます。ターゲットの検出に成功してiqnが得られたら,iscsiadmコマンドの--loginオプションを実行してください。loginを行うことで,アクセスに必要なブロックデバイスが作成されます。この状態でdmesgを見ると,/dev/sd*としてブロックデバイスが見えるようになっているのがわかるでしょう(注4)。これでローカルなストレージと同じように,デバイスをマウントして扱うことができるようになりました。
最後に,使い終わったターゲットを切り離す場合はlogoutを行う必要があります。これらオプションの詳細は,iscsiadmのマニュアルを参照してください。
- 注4
- システム上のSCSIデバイスを得るには,lsscsiパッケージに含まれているlsscsiコマンドも有効です。
$ sudo apt-get install open-iscsi <- open-iscsiのインストール $ sudo iscsiadm -m discovery -t sendtargets -p 192.168.1.101 <- 192.168.1.101で動作しているiSCSIターゲットを調べる 192.168.1.101:3260,1 iqn.2010-06.org.rikunet:lucid64.disk $ sudo iscsiadm -m node --targetname iqn.2010-06.org.rikunet:lucid64.disk --login <- ターゲットにログイン Logging in to [iface: default, target: iqn.2010-06.org.rikunet:lucid64.disk, portal: 192.168.1.101,3260] Login to [iface: default, target: iqn.2010-06.org.rikunet:lucid64.disk, portal: 192.168.1.101,3260]: successful $ sudo iscsiadm -m session <- ログイン済みのセッションを確認 tcp: [1] 192.168.1.101:3260,1 iqn.2010-06.org.rikunet:lucid64.disk $ sudo iscsiadm -m node --targetname iqn.2010-06.org.rikunet:lucid64.disk --logout <- 使用後はログアウト
$ dmesg <- ターゲットへのログイン後にdmesgを確認 (...略...) [64138.651423] Loading iSCSI transport class v2.0-870. [64138.680752] iscsi: registered transport (tcp) [64138.778495] iscsi: registered transport (iser) [64257.961268] scsi2 : iSCSI Initiator over TCP/IP [64258.268368] scsi 2:0:0:0: Direct-Access IET VIRTUAL-DISK 0 PQ: 0 ANSI: 4 [64258.271769] sd 2:0:0:0: Attached scsi generic sg1 type 0 [64258.282679] sd 2:0:0:0: [sda] 20971520 512-byte logical blocks: (10.7 GB/10.0 GiB) [64258.285488] sd 2:0:0:0: [sda] Write Protect is off [64258.285493] sd 2:0:0:0: [sda] Mode Sense: 77 00 00 08 [64258.288386] sd 2:0:0:0: [sda] Write cache: disabled, read cache: enabled, doesn't support DPO or FUA [64258.293266] sda: sda1 sda2 < sda5 > [64258.301948] sd 2:0:0:0: [sda] Attached SCSI disk $ sudo apt-get install lsscsi <- lsscsiパッケージのインストール $ lsscsi <- lsscsiでシステム上のSCSIデバイスをリスト化 [0:0:0:0] cd/dvd HL-DT-ST RW/DVD GCC-4247N 1.02 /dev/sr0 [2:0:0:0] disk IET VIRTUAL-DISK 0 /dev/sda <- VIRTUAL-DISKが追加されている

