Translated message

A translation of this page exists in English.

Warning message

This translation is outdated. For the most up-to-date information, please refer to the English version.

Red Hat Enterprise Linux 5 で udev を使用して、SCSI デバイスに静的な名前を割り当てる方法

Solution Verified - Updated -

Environment

  • Red Hat Enterprise Linux 5

Issue

  • Red Hat Enterprise Linux 5 で udev を使用して SCSI デバイスに静的な名前を割り当てる方法は?

Resolution

ここに記載されている udev ルールは、Red Hat Enterprise Linux 5 にのみ適用されます。Red Hat Enterprise Linux 5 の udev ルールの構文は、udev のバージョン間で少し異なります。

  1. まず、SCSI デバイスの一意の識別子を取得します。/dev/sdc などの一意の識別子を取得するには、以下のコマンドを実行します1

    # /sbin/scsi_id -g -u -s /block/sdc                ; for disks
    # /sbin/scsi_id -g -u -s /class/scsi_tape/nst0     ; for tapes
    
    • 出力は以下のようになります。
    [root@rhel5 rules.d]# /sbin/scsi_id -g -u -s /block/sdc
    3600a0b800013275100000015427b625e
    
    [root@rhel5 rules.d]# /sbin/scsi_id -g -u -s /class/scsi_tape/nst0
    SHP_C7438A_HU110180G4
    
    • scsi_id コマンドが SCSI INQUIRY コマンドを実行して、VPD (vital product data) ページの 0x83 データにアクセスします。これには、他の情報と一緒に、デバイスの WWID (World Wide IDentifier) が含まれます。ページ 0x83 がデバイスには存在しない場合は、ユニットのシリアル番号を含むページ 0x80 データが使用されます。ユニットのシリアル番号がベンダー間で固有ではない場合があるため、一意の識別子を作成するために標準の問い合わせページは利用できません。

    • scsi_id コマンドの結果 (長い文字列) は、/dev/sdc (/sys/block/sdc) に現在マップされているデバイスの一意の識別子 (WWID またはシリアル番号ベース) です。一意の識別子は、デバイスへの各パスと、デバイスの各パーティションで同じになります。他のデバイスがシステムに追加されるか、システムから削除されると、一意の識別子は変更されません。ただし、デバイスの /dev/sdc へのマッピングは変更されます。そのため、静的なデバイス名を作成する必要があります。udev は、一意の識別子を元にデバイス名を決めます。

  2. /etc/udev/rules.d/20-names.rules ファイルを作成します。

    a) 永続的なシンボリックリンクをデバイスに作成するために、ルールを追加することができます。このファイル内では、命名規則が追加されます。ルールのフォーマットは、以下のようになります。

    KERNEL=="sd*", BUS=="scsi", PROGRAM=="/sbin/scsi_id -g -u -s %p", RESULT=="{UniqueIdentifier}",
    SYMLINK+="devicename%n"
    
    • これにより、システムが /dev/sd* に一致する SCSI デバイスをすべて確認し、指定した一意の識別子に対して確認します。一致するデバイスが見つかると、/dev/devicename という名のデバイスノードが作成されます。デバイスにパーティションがある場合、たとえば最初のパーティションには /dev/devicename1、次のパーティションに /dev/devicename2 が作成されます。ここで、実際のルールを書きます。{UniqueIdentifier} および devicename 文字列を、上で取得した実際の一意の識別子と、デバイスが要求する名前に置き換えます。この例では、ルールは以下のようになります。
    KERNEL=="sd*", BUS=="scsi", PROGRAM=="/sbin/scsi_id -g -u -s %p", RESULT=="3600a0b800013275100000015427b625e",
    SYMLINK+="mydevice%n"
    
    • このルールは、3600a0b800013275100000015427b625e に一致する一意の識別子を持つ SCSI デバイスに対して、シンボリックリンク /dev/mydevice を作成します。このデバイスのパーティションは、デバイス名 /dev/mydevice1/dev/mydevice2 などに割り当てられます。これにより、以下の特別なデバイスファイルエントリーになります。
    lrwxrwxrwx 1 root root      4 Feb  7 14:08 /dev/mydevice -> sdc
    

    b) デバイスに対して永続的な別のデバイス名を作成するために、ルールを追加することができます。このファイル内では、命名規則が追加されます。ルールのフォーマットは、以下のようになります。

    KERNEL=="nst[0-9]*", BUS=="scsi", PROGRAM=="/sbin/scsi_id -g -u", RESULT=="{UniqueIdentifier}",
    NAME="rmt0"
    
    • これにより、システムが /dev/nst* に一致する SCSI デバイスをすべて確認し、指定した一意の識別子に対して確認します。一致するデバイスが見つかると、/dev/rmt0 という名のデバイスノードが作成されます。これにより、オリジナルの、新しい、永続的なデバイス名に対する以下の特別なデバイスファイルエントリになります。
    crw-rw ---- 1 root disk 9, 128 Feb 7 14:08 /dev/nst0  
    crw-rw ---- 1 root disk 9, 128 Feb 7 14:07 /dev/rmt0
    
    • この場合、デバイスの nst* 名に関わらず、rmt0 は常に 一意の識別子 "SHP_C7438A_HU110180G4" を持つデバイスに関連づけられています。
  3. ルールをテストするには、以下のように udevtest コマンドを使用します。

    [root@rhel5 rules.d]# udevtest /block/sdc | grep mydevice
    udev_rules_get_name: add symlink 'mydevice'
    udev_node_add: creating symlink '/dev/mydevice' to 'sdc'
    

    /dev/sdc にパーティションがある場合は、このコマンドを実行して、デバイスが /dev/sdc1 に対して作成されるかどうかをテストします。

    [root@rhel5 rules.d]# udevtest /block/sdc/sdc1 | grep mydevice
    udev_rules_get_name: add symlink 'mydevice1'
    udev_node_add: creating symlink '/dev/mydevice1' to 'sdc1'
    
    • 注意: 古い udev パッケージがインストールされている場合、各パーティションのシンボリックリンクは作成されません。この場合は、ルールファイルに "all_partitions" オプションを使用するルールをもう 1 行追加する必要があります。
    KERNEL=="sd*", BUS=="scsi", PROGRAM=="/sbin/scsi_id -g -u -s %p", RESULT=="3600a0b800013275100000015427b625e",
    SYMLINK{all_partitions}+="mydevice%n"
    
  4. 基本的なデバイスの uevent ディレクトリに change をエコーして、udev がデバイスを作成します。

    [root@rhel5 rules.d]# echo change > /dev/block/sys/block/sdc/uevent
    [root@rhel5 rules.d]# echo change > /dev/block/sys/block/sdc/sdc1/uevent
    

デバイス /dev/mydevice* が作成され、/dev/sdc* へのシンボリックリンクとなっていることを確認します。

一意の識別子 3600a0b800013275100000015427b625e を持つデバイスが Red Hat Enterprise Linux に取り付けられている/見えていると、udev によって /dev/mydevice 名に静的にバインドされます。

コメント

参照先:


  1. 上のコマンド " -u -s /block/sdc" は、/block/sdc (/dev/sdc) に対して一意の ID を生成します。マウントポイントは含まないようにしてください。したがって、/sys/block/sdc ではなく、/block/sdc を使用します。 ↩︎

This solution is part of Red Hat’s fast-track publication program, providing a huge library of solutions that Red Hat engineers have created while supporting our customers. To give you the knowledge you need the instant it becomes available, these articles may be presented in a raw and unedited form.

Comments