|
はじめにマルチパスの目的は、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のマルチパスサポートのアーキテクチャ
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において各ターゲットデバイスについて ブート後に追加されたターゲットをHBAが動的に検出する必要がない場合(つまり、 リスト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を取得し、プロパティディクショナリのメンバとして リスト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 Darwinソースコード、特にIOSCSIArchitectureModelFamilyおよびIOSCSIParallelFamilyのソース http://developer.apple.com/darwin/ ドキュメント改訂履歴
掲載日: 2007-03-23 | ||||||||||||
|