SANネットワークでLinuxを使用します。 ちょっとしたトリック

すべての良い一日。
私が述べている状況はほとんどの人に典型的だとは思いませんが、それでも知っておくと役立つと思います。 SANネットワークを使用している場合の「愚か者からの」保護方法についての私の話は、特定のLUN(論理ユニット番号)およびLinuxベースのサーバーへのアクセスを制限する技術をサポートしないストレージシステム(ストレージシステム)がいくつかありますすべてのアクションがOS SLES 10SP1を使用して実行される場合。


背景


2008年、私は1人の顧客のコンピューティングインフラストラクチャを運用する必要がありました。 小規模のSANネットワークは、一定数の階(約10個の異なるクラス)で構築されました。 これらのストーリーのほとんどは、コンピューティングクラスターのファイルシステムを構築することを目的としていたため、最初は問題は明白ではなく、考えさえしませんでした。

そして問題は、特定のホストから特定のLUNへのアクセスを制限する方法を知らない100分の1がインフラストラクチャサブシステムに割り当てられたことです(各メーカーのポートマスキング、LUNマッピングなどと呼ばれます)。それを行いますが、追加購入が必要です。 ライセンスが、これは行われませんでした。 ここで問題が発生しました-このストーリーに接続するすべてのサーバーには、すべてのセクションが表示されます。 これは大したことではないようですが、他の誰かのパーティションをフォーマットする可能性から顧客を保護する必要があります。 各サブシステムのデータは非常に重要です。

合計:


ステップ1、入門


トピックに関する強力な知識をお持ちでない方は、すぐに予約してください。
SANネットワーク内の各デバイスには一意のWWN(World Wide Name)アドレスがあり、ネットワークアダプターのMACアドレスに類似していますが、イーサネットの場合のように、スイッチはスイッチに着信するパケットの内容を知らないため、スイッチ(ゾーニングに制限を加えます) )は不可能です。特定のノードのデータストレージシステムのスコープのみを制限できます。

ソリューション検索の範囲は、次のオプションに限定されていました。
  1. 特定のLUNのみを使用する機能のドライバー内の存在
  2. OSツールを使用して不要なLUNをブロックする


最初のオプション

彼はこのモジュールの情報を見た後、落ちました。 デバイスをスキャンし、LUNの最大数を決定するオプションのみが含まれています。 このオプションは消えます

2番目のオプション

このオプションは、すぐにudevサブシステムの方向で「土地の作業を実行する」ように指示します。 Linuxでデバイスの初期化、特殊な名前やその他のアクションの割り当てを担当するのは彼女です。 簡単に言えば、必要なデバイスのみを作成するudevのルールを正しく記述する必要があります。
今後、この決定によりスペシャルの作成のみが制限されると言います。 デバイス(/ dev / sdb、/ dev / sdcなど)がありますが、物理的にはホストは利用可能なすべてのLUNを確認します。

ステップ2、調査



トピックの詳細な調査に進みます。

ドキュメントとシステム内のルールを簡単に調べた後、興味のある次のブロックを分離できます。

  1. サブシステムを定義するブロック「SUBSYSTEM」。 サブシステムには、「ブロック」(ブロックデバイス)、「char」(キャラクターデバイス)、「パイプ」(FIFOデバイス)の3つのタイプがあります。
    man mknod
    「ブロック」サブシステムに興味があるのは、 ディスクはこのクラスに属します。

  2. udevはデバイス属性を表示できます。 通常、次のようなさまざまなデータが保存されます。
    • メーカーの種類
    • モデル名
    • さまざまなハードウェアデータ。


    パラメータを見つけるには、次のものが必要です。
    ユーティリティlssci-システムで使用可能なすべてのSCSIデバイスとspecialの名前を表示します。 このSCSIデバイスに接続されているデバイス
    ユーティリティudevinfo-要求されたデバイスで必要なすべてのデータを表示します。

    続行:

    まず、このサーバーで使用可能なすべてのデバイスのリストを表示する必要があります。

    # lssci
    SCSI ID TYPE VENDOR MODEL REV. device
    [5:0:0:10] disk XXX YYYYY 0619 /dev/sdr
    [5:0:0:20] disk XXX YYYYY 0619 /dev/sds
    [5:0:0:21] disk XXX YYYYY 0619 /dev/sdu
    ......
    [5:0:1:10] disk XXX YYYYY 0619 /dev/sdan
    [5:0:1:20] disk XXX YYYYY 0619 /dev/sdao
    [5:0:1:21] disk XXX YYYYY 0619 /dev/sdar


    このコマンドの出力は素晴らしいので、一部だけを紹介します。
    だから今私たちは知っています
    SCSI IDは、H:B:T:L(ホスト:バス:ターゲット:Lun)という形式の識別子です。ホストは、このデバイスを担当するアダプターのシリアル番号です。バス(チャネル)はアダプターのSCSIチャネル番号、ターゲットは番号ですストアのFCポート、LUN-ストアに割り当てられたセクションの識別子。
    VENDOR-メーカーの名前
    モデル-モデル名
    改訂 -100のファームウェアバージョン
    デバイス-仕様 ユーザーがアクセス可能なデバイス

    この操作では、「デバイス」フィールドと「SCSI ID」に興味がありました。 残りのフィールドは無視されます。

  3. 次のステップでは、必要なストレージ属性のリストを取得します。
    • ドライバー名
    • メーカー名
    • モデル名


    これには、udevinfoユーティリティとsysfsファイルシステム(カーネルバージョン2.6の場合)が必要です。 必要なすべての情報が保存されます。

    # udevinfo -a -p /sys/block/sds

    looking at device '/block/sds':
    KERNEL=="sds"
    SUBSYSTEM=="block"
    SYSFS{stat}==" 151707 2355 3422965 430068 436954 12273 18585533 1098588 0 651944 1528756"
    SYSFS{size}=="2129838080"
    SYSFS{removable}=="0"
    SYSFS{range}=="16"
    SYSFS{dev}=="65:32"

    looking at device '/devices/pci0000:00/0000:00:04.0/0000:08:00.0/host5/rport-5:0-0/target5:0:0/5:0:0:20':
    ID=="5:0:0:20"
    BUS=="scsi"
    DRIVER=="sd"
    SYSFS{ioerr_cnt}=="0x7"
    SYSFS{iodone_cnt}=="0xec62d"
    SYSFS{iorequest_cnt}=="0xec62d"
    SYSFS{iocounterbits}=="32"
    SYSFS{retries}=="5"
    SYSFS{timeout}=="60"
    SYSFS{state}=="running"
    SYSFS{rev}=="0619"
    SYSFS{model}=="YYYYY "
    SYSFS{vendor}=="XXX "
    SYSFS{scsi_level}=="6"
    SYSFS{type}=="0"
    SYSFS{queue_type}=="simple"
    SYSFS{queue_depth}=="64"
    SYSFS{device_blocked}=="0"
    ....
    looking at device '/devices/pci0000:00/0000:00:04.0/0000:08:00.0':
    ID=="0000:08:00.0"
    BUS=="pci"
    DRIVER=="mptfc"
    SYSFS{modalias}=="pci:v00001000d00000646sv00001000sd00001020bc0Csc04i00"
    SYSFS{local_cpus}=="00000000,00000000,00000000,0000000f"
    SYSFS{irq}=="169"
    SYSFS{class}=="0x0c0400"
    SYSFS{subsystem_device}=="0x1020"
    SYSFS{subsystem_vendor}=="0x1000"
    SYSFS{device}=="0x0646"
    SYSFS{vendor}=="0x1000"



    各デバイスの情報を要求する必要はありません。 lsscsi出力に重複エントリが含まれています。 これらは異なるデバイス(たとえば、ホスト上の1つのFCポートとストレージ上の3つのポート)を介した特定のLUNへのパスであり、同じストレージであるため、必要なパラメーターはすべて同じです。


短い要約:

  1. DRIVER ==「sd」は、このデバイスを識別するドライバーの名前です。 FC「mptfc」ドライバーではなく、正確に「sd」である理由-「sd」ドライバーがSCSI / FCアダプターから受信したディスクデバイスを決定する正確な理由。
  2. SYSFS {vendor} == "XXX"はリポジトリの製造元です。 注意を払えば、彼の名前は「XXX」だけでなく、いくつかのスペースでもあります。 このため、lsscsiの出力はそれほど有益ではなく、「XXX」のみを使用すると、ルールは機能しません。
  3. SYSFS {model} == "YYYYY"-モデルの名前。 上記の段落と同じ理由。
  4. ID ==“ 5:0:0:20​​”-H:B:T:Lの形式の識別子 覚えておく必要もあります さらに必要です。
  5. BUS == "scsi"-バスのタイプ。 デバイスをより正確に識別する必要があります


したがって、ルールを作成するために必要な情報はすべて揃っています。

ステップ3、オフィスが書き込みます!



次に、ルールの作成に直接進みます。 udevのドキュメントが必要になります。
最終規則とオプションの説明を示します。

# If not a block device (ex. tape) ignore this rule
SUBSYSTEM!="block", GOTO="go_ignore_end"
# Phisical device section
BUS=="scsi", DRIVER=="sd", SYSFS{vendor}=="XXX ", SYSFS{model}=="YYYYY ", ID=="*:*:*:20", GOTO="go_ignore_end"
BUS=="scsi", DRIVER=="sd", SYSFS{vendor}=="XXX ", SYSFS{model}=="YYYYY ", ID=="*:*:*:21", GOTO="go_ignore_end"
BUS=="scsi", DRIVER=="sd", SYSFS{vendor}=="XXX ", SYSFS{model}=="YYYYY ", OPTIONS+="ignore_device,last_rule"

LABEL="go_ignore_end"


そして今、何が何であるかの説明:

SUBSYSTEM!="block", GOTO="go_ignore_end"
このオプションは、サブシステムが非ブロックデバイスで動作する場合、このルールを適用しないことをudevに伝えます。

BUS=="scsi", DRIVER=="sd", SYSFS{vendor}=="XXX ", SYSFS{model}=="YYYYY ", ID=="*:*:*:20", GOTO="go_ignore_end"
BUS=="scsi", DRIVER=="sd", SYSFS{vendor}=="XXX ", SYSFS{model}=="YYYYY ", ID=="*:*:*:21", GOTO="go_ignore_end"


これが最も重要な部分です。実際、この部分のために、この記事は書かれています。 ルールは動作を定義します。デバイスがBUS ==“ scsi”バスを通過し、DRIVER ==“ sd”ドライバーを使用する場合、製造元SYSFS {vendor} ==“ XXX”があり、モデル名はSYSFS {model} ==“ YYYYY」およびこのデバイスのLUNはID == "*:*:*:20"に対応します。このデバイスは他のすべてのルールに従って特別なものを作成する必要があります。 / devディレクトリのデバイス。

レコードID == "*:*:*:20"は、H:B:T:Lの形式のレコードであり、LUN識別子のみを記述します。残りのフィールドは任意です。 これにより、特定のLUNを持つストレージからすべてのデバイスをスキップできます。 LUNのリストを展開する必要がある場合、レコードが追加されるだけで、必要な識別子が最後のフィールドに書き込まれます。 主なことは、次のルールの前に配置されることです。

BUS=="scsi", DRIVER=="sd", SYSFS{vendor}=="XXX ", SYSFS{model}=="YYYYY ", OPTIONS+="ignore_device,last_rule"


このルールは、前のルールと同じ条件を適用します。OPTIONS+ =“ ignore_device、last_rule”のみが、このデバイスでのすべてのアクションを無視するようudevに指示します。 つまり 指定されたデバイスを除くすべてのデバイスは無視されます。

LABEL="go_ignore_end"
このルールは、単純なファイルの終わりマークです。 リストの最後でなければなりません。

ステップ4、最後の戦い


次に、このルールを保存して適用するだけです。
このルールを正しい形式で/etc/udev/rules.dフォルダーに保存します。 「52-ignore-unused-devices.rules」という名前を使用しました。 この後、何か他のことをする必要があります。 アダプタードライバーがramdiskにある場合、そこからドライバーを削除し、udevサブシステムの起動後にのみロードする必要があります。そうしないと、このルールが機能しません。 デバイスはudevが起動する前に作成されます。

これを行うには、/ etc / sysconfig / kernelファイルに変更を加える必要があります。

  1. 変数INITRD_MODULES = "...."のドライバーFCデバイスを削除します
  2. 変数MODULES_LOADED_ON_BOOT = "..."に追加します
  3. mkinitrdコマンドでramdiskを再生成します。


これで、サーバーを再起動し、必要なデバイスのみが作成されることを確認できます。 残りは、システムに表示されますが、指定されていません。 ファイル、したがって、ユーザーはそれらを使用して何もできません。 次のようになります。

# lssci

SCSI ID TYPE VENDOR MODEL REV. device
[5:0:0:10] disk XXX YYYYY 0619 -
[5:0:0:20] disk XXX YYYYY 0619 /dev/sds
[5:0:0:21] disk XXX YYYYY 0619 /dev/sdu
......
[5:0:1:10] disk XXX YYYYY 0619 -
[5:0:1:20] disk XXX YYYYY 0619 /dev/sdao
[5:0:1:21] disk XXX YYYYY 0619 /dev/sdar


その結果、私たちの仕事はエレガントで美しく解決されました。 また、組み込みのマルチパスメカニズムを使用する場合は特に、読み込みを高速化します。

これが少なくとも一人に役立つことを願っています。

たくさん助けた資料

Source: https://habr.com/ru/post/J112453/


All Articles