Apple Developer Connection
高度な検索
Member Login ログイン | ご入会 ADC連絡先

Mac OS XにおけるFibreChannelによるマルチパス

Mac OS Xにおいてマルチパスを利用するために、FibreChannelのターゲットハードウェアおよびホストバスアダプタのドライバに要求される事項を説明します。





はじめに

マルチパスの目的は、1つのデバイスを複数のパスを経由してホストコンピュータに接続できるようにすることです。それにより、冗長性およびロードバランシングが提供され、パフォーマンスが向上します。このテクニカルノートでは、Mac OS Xでホストバスアダプタ(HBA)ドライバおよびFibreChannelのターゲットデバイスがマルチパスサポートとの互換性を実現するために必要なことを説明します。

最初のマルチパスのサポートは、Mac OS X 10.3.5から装備されました。ここで注目しなければならないのは、Appleによるマルチパスの実装がほかのストレージベンダのマルチパスの実装と大きく異なる点です。多数のベンダは、論理ユニットレベルでマルチパスのサポートを実装していますが、Mac OS Xではターゲットデバイスのレベルでマルチパスを実装しています。その結果、Mac OS Xでは現在、サードパーティの多数のストレージソリューションのマルチパスは機能しません。

先頭に戻る

Mac OS Xで使用されるマルチパスの実装

Mac OS Xは、ターゲットデバイスレベルでマルチパスをサポートしています。LUNレベルのマルチパスについては、現在サポートしていません。マルチパスは、IOSCSIArchitectureModelFamily KEXTを通じてサポートされており、必要な特性がファームウェアに実装されていれば、当該デバイスに対して自動的に有効になります。

図1:Mac OS Xのマルチパスサポートのアーキテクチャ

図1 Mac OS Xのマルチパスサポートのアーキテクチャ

IOSCSIArchitectureModelFamilyでは、マルチパスサポートを使用するすべてのターゲットが同じLUN設定を示すことが必要です。複数のターゲットインターフェイスに対して同じWWNN(World-Wide Node Name)をブロードキャストしても、LUNを対称的に発行しないRAIDコントローラおよびそのほかのハードウェアは、このマルチパス方式に対応せず、望ましくない特性や動作を示します。

デバイスへの利用可能なパスに対するロードバランシングは、圧力ベースのアルゴリズムを使用して実現されます。このアルゴリズムは、未処理のI/Oが最も少ないポートに新しいI/O要求を割り当てることで、デバイスへのすべての接続のI/O量を均一に保とうとします。

その主な機能は、FibreChannelにおいてマルチパスをサポートすることですが、Mac OS XのSCSIサポートの一部として同じ技術が実装されており、ほかのSCSIの実装にも利用できる可能性があります。異なるインターフェイスをサポートするには、接続するターゲットごとにWWNNを取り出すか、合成する必要があります。FibreChannelでは、WWNNはファブリックにアタッチされているすべてのノードが利用できる情報の一部です。

重要:現在、マルチパスサポートは、コントローラのプロトコル特性ディクショナリの「物理相互接続(Physical Interconnect)」キーを「Fibre Channel Interface」に設定する必要があります。ほかの値に設定すると、すべてのデータが単独のインターフェイスを経由して送られることになります。マルチパスを追加した当時、FibreChannelは、マルチパスをサポートできた唯一の実装されたインターフェイスでした。そして、既存のドライバに関する互換性の問題を防止するために、プロトコル特性ディクショナリを照合するチェック機能が追加されました。

先頭に戻る

HBAドライバにおけるマルチパスのサポート

ホストバスアダプタ(HBA)を実装する場合、HBAにおいて各ターゲットデバイスについてkIOPropertyFibreChannelNodeWorldWideNameKeyプロパティを設定するようにします。このプロパティは、FibreChannelコントローラの場合は必須で、ほかのほとんどのインターフェイスでは任意です。

ブート後に追加されたターゲットをHBAが動的に検出する必要がない場合(つまり、DoesHBAPerformDeviceManagementからfalseが返され、HBAがアクティブになったときにターゲットを検出するのにIOSCSIParallelFamilyを使用する場合)、InitializeTargetForID内からSetTargetPropertyを呼び出し、kIOPropertyFibreChannelNodeWorldWideNameKeyプロパティを新しいターゲットに追加できます。

リスト1:管理していないターゲットについてkIOPropertyFibreChannelNodeWorldWideNameKeyキーを設定する

bool
com_foo_sampleAdapter::DoesHBAPerformDeviceManagement ( void )
{
  // デバイスを独自に*管理しない*ことを報告する。ターゲットの検出はOSを頼る
  return false;
}

bool
com_foo_sampleAdapter::InitializeTargetForID ( SCSITargetIdentifier targetID )
{
  bool retVal = false;
  OSData *targetWWNN = NULL;

  // [...]
  // ここで、ほかのターゲット固有の設定を行う

  // デモのために、WWNNをハードコードされた値に設定する
  // 実際には、FibreChannel HBAからターゲットノードごとに
  // WWNNを取得する
  targetWWNN = OSData::withBytes("12345678", 8); // 64ビットWWNN

  SetTargetProperty(targetID, kIOPropertyFibreChannelNodeWorldWideNameKey, targetWWNN);
  targetWWNN->release();
  retVal = true;

  return retVal;
}

または、HBAがターゲットの作成と破棄を処理している場合、ターゲットのWWNNを取得し、プロパティディクショナリのメンバとしてCreateTargetForIDに渡します。

リスト2:管理されているターゲットについてkIOPropertyFibreChannelNodeWorldWideNameKeyキーを設定する

bool
com_foo_sampleAdapter::DoesHBAPerformDeviceManagement ( void )
{
  // デバイスを独自に*管理している*ことを報告する。可能性のあるターゲットをすべて照会する
  return true;
}

bool
com_foo_sampleAdapter::addNewTarget ( SCSITargetIdentifier targetID )
{
  bool retVal = false;
  OSDictionary *targetDictionary = NULL;
  OSData *targetWWNN = NULL;

  targetDictionary = OSDictionary::withCapacity(2); // ごく小さなディクショナリ

  // [...]
  // ここで、ほかのターゲット固有の設定を行う

  // デモのために、WWNNをハードコードされた値に設定する
  // 実際には、FibreChannel HBAからターゲットノードごとに
  // WWNNを取得する
  targetWWNN = OSData::withBytes("12345678", 8); // 64ビットWWNN

  targetDictionary-> setObject(kIOPropertyFibreChannelNodeWorldWideNameKey, targetWWNN);
  targetWWNN->release();

  CreateTargetForID(targetID, targetDictionary);
  targetDictionary->release();

  retVal = true;

  return retVal;
}

重要:マルチパスのサポートでは、デバイスへの接続ごとに一意のSCSIドメイン識別子がなければなりません。一意でなければ、マルチパスのサブシステムはそれらが同じ接続であるとみなし、2つ目の接続を経由してデータを送信しません。これは、IOSCSIParallelInterfaceControllerをサブクラス化した場合には、自動的に処理されます。IOSCSIProtocolServicesまたはIOSCSIProtocolInterfaceなどの異なるソースからドライバをサブクラス化した場合には、この処理を自分で行う必要があるでしょう。

先頭に戻る

SCSIターゲットデバイスにおけるマルチパスのサポート

ターゲットデバイスを実装している場合、デバイスはINQUIRYページ83h、Device Identification Pageの結果をバイナリ形式で発行し、EUI-64またはFCNameIdentifierを提供する必要があります。

対称に構成されていないLUNは、Mac OS Xでは現在サポートしていません。すべてのLUNが対称であると報告されるよう、ユーザによるターゲットデバイスの設定が可能なメカニズムを提供することをお勧めします。

先頭に戻る

関連情報

Technical Committee T10, SCSI Storage Interfaces

http://www.t10.org

Darwinソースコード、特にIOSCSIArchitectureModelFamilyおよびIOSCSIParallelFamilyのソース

http://developer.apple.com/darwin/

先頭に戻る

ドキュメント改訂履歴

日付メモ
2007-03-23追加された重要事項:プロトコル特性の物理相互接続プロパティをFibre Channelに設定する必要性。各接続に対して一意のSCSIドメイン識別子の必要性。
2007-02-23Mac OS XにおいてFibreChannelのマルチパスが動作する仕組みの説明、およびその仕組みを利用するようにストレージハードウェアを設計する方法の説明。

掲載日: 2007-03-23




Did this document help you?
Yes: Tell us what works for you.

It’s good, but: Report typos, inaccuracies, and so forth.

It wasn’t helpful: Tell us what would have helped.