Clusterware Installation Linux (OEL5, RHEL5, SLES10): Multipathing und UDEV
von Sebastian Solbach, ORACLE Deutschland GmbH

Ausschlaggebend für die Verfügbarkeit einer Applikation, sowie einer erfolgreichen Oracle Clusterware Installation ist eine funktionierende Konfiguration des Storagezugriffs.

Seit Linux Kernel Version 2.6 ist der Device Mapper für generisches Volume Management und Udev, der Device Manager, für das dynamische erstellen und löschen von Gerätedateien unter /dev zuständig. Udev bietet zudem die Möglichkeit persistente Device Namen mit zugehörigen Rechten abzubilden. Der Device Mapper unterstützt durch Multipathing die redundante Anbindung eines Storage Systems über mehrere Pfade.

Mit Oracle Enterprise Linux 5 (OEL5) bzw. RHEL5 und SLES10 haben sich einige Technologien zur Anbindung von Shared Storage geändert. Die Oracle Dokumentation konzentriert sich bei der Beschreibung der Konfiguration dieser Komponenten auf die wichtigsten Bestandteile. Eine ganzheitliche Übersicht über das Zusammenspiel dieser Komponenten fehlt jedoch und ist teilweise über viele Metalink Notes und Whitepaper verstreut.

Gerade beim Setzen der Berechtigungen verwenden die Notes, z.B. für OEL und RH, ein root Skript (rc.local). Dies ist zwar funktionell, hat aber die Einschränkung nur beim Serverreboot zu greifen. Sollten dynamisch Multipathing Devices hinzugefügt werden (z.B. über multipath -v2), so greift das rc.local Skript nicht und die Berechtigungen müssen manuell vergeben werden. Eleganter geht dies unter der Verwendung der UDEV Regeln.

Der folgende Tipp führt diese Informationen zusammen und zeigt die UDEV Regeln anhand einer Beispielkonfiguration:

Ausgangssituation

Es gibt viele gute Metalink Notes zu RAW Devices, Multipathing Konfiguration und UDEV, diese befinden sich unter den Links am Ende des Tipps. Da aber sowohl 10g (ab 10.2.0.2) als auch 11g unter Linux keine Charakter Devices (RAW) mehr benötigen und direkt auf Block Devices zugreifen können, beschränkt sich der Tipp auf diese Anbindung.

Die Beispielkonfiguration greift auf 7 Platten zu:

AnzahlMultipath AliasEnthältWWID
1xocr2 Partitionen: OCR + 1st Voting Disk3600c0ff000d5948967a4804801000000
1xocrmirror2 Partitionen: OCRMIRROR + 2nd Voting Disk3600c0ff000d5948982a4804801000000
1xvote1 Partition: 3rd Voting Disk3600c0ff000d59489bba4804801000000
4xasm*1 Partition: ASM3600c0ff000d59489f1a5804801000000
3600c0ff000d5948965a6804801000000
3600c0ff000d59489d0a6804801000000
3600c0ff000d59489e2a6804801000000

Multipathing

Das Einrichten des Device Mappers und die Konfiguration von Multipathing wird in den folgenden 2 Metalink Notes beschrieben:

Unter Einbeziehung meiner Erfahrungen beim Testen von Multipathing ergibt sich für die Beispielkonfiguration folgende Konfiguration in /etc/multipath.conf:
blacklist {
        devnode "^(ram|raw|loop|fd|md|dm-|sr|scd|st)[0-9]*"
        devnode "^hd[a-z]"
        devnode "^cciss!c[0-9]d[0-9]*"
}
defaults {
        udev_dir                /dev
        polling_interval        10
        selector                "round-robin 0"
        path_grouping_policy    multibus
        getuid_callout          "/sbin/scsi_id -g -u -s /block/%n"
        prio_callout            /bin/true
        path_checker            readsector0
        rr_min_io               100
        max_fds                 8192
        rr_weight               priorities
        failback                immediate
        no_path_retry           2
        user_friendly_names     yes
}
multipaths {
        multipath {
                wwid            3600c0ff000d5948967a4804801000000
                alias           ocr

        }
        multipath {
                wwid            3600c0ff000d5948982a4804801000000
                alias           ocrmirror
        }
        multipath {
                wwid            3600c0ff000d59489bba4804801000000
                alias           vote
        }
        multipath {
                wwid            3600c0ff000d59489f1a5804801000000
                alias           asm1
        }
        multipath {
                wwid            3600c0ff000d5948965a6804801000000
                alias           asm2
        }
        multipath {
                wwid            3600c0ff000d59489d0a6804801000000
                alias           asm3
        }
        multipath {
                wwid            3600c0ff000d59489e2a6804801000000
                alias           asm4
        }
}
Der Device Mapper legt nun mit Hilfe der Konfiguration /etc/multipath.conf und den UDEV Regeln folgende Devices an:
Unter /dev/mapper:
[root@hpeterac4 rules.d]# ll /dev/mapper
brw-rw---- 1 root disk 253,  3 Sep  3 14:19 asm1a
brw-rw---- 1 root disk 253,  8 Sep  3 14:19 asm1ap1
brw-rw---- 1 root disk 253,  4 Sep  3 14:19 asm1b
brw-rw---- 1 root disk 253, 13 Sep  3 14:19 asm1bp1
brw-rw---- 1 root disk 253,  5 Sep  3 14:19 asm2a
brw-rw---- 1 root disk 253,  7 Sep  3 14:19 asm2ap1
brw-rw---- 1 root disk 253,  6 Sep  3 14:19 asm2b
brw-rw---- 1 root disk 253, 14 Sep  3 14:19 asm2bp1
crw------- 1 root root  10, 63 Sep  3 08:35 control
brw-rw---- 1 root disk 253,  0 Sep  3 14:19 ocr
brw-rw---- 1 root disk 253,  1 Sep  3 14:19 ocrmirror
brw-rw---- 1 root disk 253, 11 Sep  3 14:19 ocrmirrorp1
brw-rw---- 1 root disk 253, 12 Sep  3 14:19 ocrmirrorp2
brw-rw---- 1 root disk 253,  9 Sep  3 14:19 ocrp1
brw-rw---- 1 root disk 253, 10 Sep  3 14:19 ocrp2
brw-rw---- 1 root disk 253,  2 Sep  3 14:19 vote
brw-rw---- 1 root disk 253, 15 Sep  3 14:19 votep1
Unter /dev/dm-* :
[root@hpeterac4 rules.d]# ll /dev/dm*
brw-rw---- 1 root root 253,  0 Sep  3 14:19 /dev/dm-0
brw-rw---- 1 root root 253,  1 Sep  3 14:19 /dev/dm-1
brw-rw---- 1 root root 253, 10 Sep  3 14:19 /dev/dm-10
brw-rw---- 1 root root 253, 11 Sep  3 14:19 /dev/dm-11
brw-rw---- 1 root root 253, 12 Sep  3 14:19 /dev/dm-12
brw-rw---- 1 root root 253, 13 Sep  3 14:19 /dev/dm-13
brw-rw---- 1 root root 253, 14 Sep  3 14:19 /dev/dm-14
brw-rw---- 1 root root 253, 15 Sep  3 14:19 /dev/dm-15
brw-rw---- 1 root root 253,  2 Sep  3 14:19 /dev/dm-2
brw-rw---- 1 root root 253,  3 Sep  3 14:19 /dev/dm-3
brw-rw---- 1 root root 253,  4 Sep  3 14:19 /dev/dm-4
brw-rw---- 1 root root 253,  5 Sep  3 14:19 /dev/dm-5
brw-rw---- 1 root root 253,  6 Sep  3 14:19 /dev/dm-6
brw-rw---- 1 root root 253,  7 Sep  3 14:19 /dev/dm-7
brw-rw---- 1 root root 253,  8 Sep  3 14:19 /dev/dm-8
brw-rw---- 1 root root 253,  9 Sep  3 14:19 /dev/dm-9
,sowie symbolische Links auf die dm-* Devices unter /dev/mpath:
[root@hpeterac4 rules.d]# ll /dev/mpath
lrwxrwxrwx 1 root root 7 Sep  3 14:19 asm1a -> ../dm-3
lrwxrwxrwx 1 root root 7 Sep  3 14:19 asm1ap1 -> ../dm-8
lrwxrwxrwx 1 root root 7 Sep  3 14:19 asm1b -> ../dm-4
lrwxrwxrwx 1 root root 8 Sep  3 14:19 asm1bp1 -> ../dm-13
lrwxrwxrwx 1 root root 7 Sep  3 14:19 asm2a -> ../dm-5
lrwxrwxrwx 1 root root 7 Sep  3 14:19 asm2ap1 -> ../dm-7
lrwxrwxrwx 1 root root 7 Sep  3 14:19 asm2b -> ../dm-6
lrwxrwxrwx 1 root root 8 Sep  3 14:19 asm2bp1 -> ../dm-14
lrwxrwxrwx 1 root root 7 Sep  3 14:19 ocr -> ../dm-0
lrwxrwxrwx 1 root root 7 Sep  3 14:19 ocrmirror -> ../dm-1
lrwxrwxrwx 1 root root 8 Sep  3 14:19 ocrmirrorp1 -> ../dm-11
lrwxrwxrwx 1 root root 8 Sep  3 14:19 ocrmirrorp2 -> ../dm-12
lrwxrwxrwx 1 root root 7 Sep  3 14:19 ocrp1 -> ../dm-9
lrwxrwxrwx 1 root root 8 Sep  3 14:19 ocrp2 -> ../dm-10
lrwxrwxrwx 1 root root 7 Sep  3 14:19 vote -> ../dm-2
lrwxrwxrwx 1 root root 8 Sep  3 14:19 votep1 -> ../dm-15
Allerdings wie hier zu sehen, haben die Devices die falsche Berechtigung. Es ist auch zu beachten, dass die dm-* Devices nach einem Reboot durchaus eine andere Reihenfolge haben können.

UDEV Regeln

Setzt man nun die Berechtigungen über das rc.local Skript, so passiert dies nur während des Bootvorgangs. Die elegantere Variante ist nun die Berechtigungen über die UDEV Regeln zu vergeben. Allerdings gibt es hier die Herausforderung, dass nur die symbolischen Links von UDEV erstellt werden, die Devices unter /dev/mapper aber vom Device Mapper. Diese Devices sind daher nur indirekt über UDEV zu verändern Eine Möglichkeit dies zu bewerkstelligen ist, dass man die udev Regeln, die zum Zeitpunkt der Erstellung der dm-* Devices aktiv sind abändert.
Dies geschieht normalerweise in /etc/udev/rules.d/40-multipath.rules. Da man aber die Default udev Regeln nicht ändern sollte, empfiehlt es sich diese in 39-oraclemultipath.rules zu kopieren:

Original 40-multipath.rules:

# multipath wants the devmaps presented as meaninglful device names
# so name them after their devmap name
SUBSYSTEM!="block", GOTO="end_mpath"
KERNEL!="dm-[0-9]*", ACTION=="add", PROGRAM=="/bin/bash -c '/sbin/lsmod | /bin/grep ^dm_multipath'", RUN+="/sbin/multipath -v0 %M:%m"
KERNEL!="dm-[0-9]*", GOTO="end_mpath"
PROGRAM!="/sbin/mpath_wait %M %m", GOTO="end_mpath"
ACTION=="add", RUN+="/sbin/dmsetup ls --target multipath --exec '/sbin/kpartx -a -p p' -j %M -m %m"
PROGRAM=="/sbin/dmsetup ls --target multipath --exec /bin/basename -j %M -m %m", RESULT=="?*", NAME="%k", SYMLINK="mpath/%c", OPTIONS="last_rule"
PROGRAM!="/bin/bash -c '/sbin/dmsetup info -c --noheadings -j %M -m %m | /bin/grep -q .*:.*:.*:.*:.*:.*:.*:part[0-9]*-mpath-'", GOTO="end_mpath"
PROGRAM=="/sbin/dmsetup ls --target linear --exec /bin/basename -j %M -m %m", NAME="%k", RESULT=="?*", SYMLINK="mpath/%c", OPTIONS="last_rule"
LABEL="end_mpath"
Geänderte 39-oraclemultipath.rules (Änderungen Hervorgehoben):

# multipath wants the devmaps presented as meaninglful device names
# so name them after their devmap name
SUBSYSTEM!="block", GOTO="end_mpath"
KERNEL!="dm-[0-9]*", ACTION=="add", PROGRAM=="/bin/bash -c '/sbin/lsmod | /bin/grep ^dm_multipath'", RUN+="/sbin/multipath -v0 %M:%m"
KERNEL!="dm-[0-9]*", GOTO="end_mpath"
PROGRAM!="/sbin/mpath_wait %M %m", GOTO="end_mpath"
ACTION=="add", RUN+="/sbin/dmsetup ls --target multipath --exec '/sbin/kpartx -a -p p' -j %M -m %m"
PROGRAM=="/sbin/dmsetup ls --target multipath --exec /bin/basename -j %M -m %m", RESULT=="?*", NAME="%k", SYMLINK="mpath/%c", GOTO="oracle_check"
PROGRAM!="/bin/bash -c '/sbin/dmsetup info -c --noheadings -j %M -m %m | /bin/grep -q .*:.*:.*:.*:.*:.*:.*:part[0-9]*-mpath-'", GOTO="end_mpath"
PROGRAM=="/sbin/dmsetup ls --target linear --exec /bin/basename -j %M -m %m", NAME="%k", RESULT=="?*", SYMLINK="mpath/%c", GOTO="oracle_check"
LABEL="oracle_check"
RESULT=="ocrp1", GROUP="oinstall", MODE="640", RUN+="/bin/chown root:oinstall /dev/mapper/%c;/bin/chmod 640 /dev/mapper/%c"
RESULT=="ocrp2", OWNER="oracle", GROUP="oinstall", MODE="640", RUN+="/bin/chown oracle:oinstall /dev/mapper/%c;/bin/chmod 640 /dev/mapper/%c"
RESULT=="ocrmirrorp1", GROUP="oinstall", MODE="640", RUN+="/bin/chown root:oinstall /dev/mapper/%c;/bin/chmod 640 /dev/mapper/%c"
RESULT=="ocrmirrorp2", OWNER="oracle", GROUP="oinstall", MODE="640", RUN+="/bin/chown oracle:oinstall /dev/mapper/%c;/bin/chmod 640 /dev/mapper/%c"
RESULT=="votep1", OWNER="oracle", GROUP="oinstall", MODE="640", RUN+="/bin/chown oracle:oinstall /dev/mapper/%c;/bin/chmod 640 /dev/mapper/%c"
RESULT=="asm*p1", OWNER="oracle", GROUP="asm", MODE="660", RUN+="/bin/chown oracle:asm /dev/mapper/%c;/bin/chmod 660 /dev/mapper/%c"
OPTIONS="last_rule"
LABEL="end_mpath"
Hierbei wird der Name aus der multipath.conf verglichen mit dem RESULT.
GROUP, OWNER und MODE setzen die Berechtigungen auf das dm-* Device (über den symbolischen Link).
Die /dev/mapper Devices werden mit Hilfe des chown und chmod im RUN+ Block angepasst.

Damit die udev Regeln nun auf die Devices angewendet werden, müssen diese nun nur noch neu geladen werden.
Danach funktionieren die Regeln, sobald die multipath Devices erstellt oder verändert werden (hier zum testen):
udevcontrol reload_rules
multipath -F
multipath -v2

Anmerkung Verwendung von ASMLIB:

Sollte die ASMLIB zur Verwendung kommen, brauchen die Berechtigungen für die Devices von ASM nicht angepasst werden und man kann daher auf das RESULT=="asm*p1", ... verzichten.
Allerdings sollte man bei Verwendung von ASMLIB nicht die /dev/mapper Devices, sondern ausschließlich die Symlinks aus /dev/mpath bzw. die dm-* Devices verwenden und in /etc/sysconfig/oracleasm die ORACLEASM_SCANORDER="dm" setzen.
Siehe hierzu Note 602952.1 How To Setup ASM & ASMLIB On Native Linux Multipath Mapper disks?

Nützliche Links und Referenzen

  • Note 357472.1 Configuring device-mapper for CRS/ASM
  • Note 414897.1 How to Setup UDEV Rules for RAC OCR & Voting devices on SLES10, RHEL5, OEL5
  • Note 465001.1 Configuring raw devices (singlepath) for Oracle Clusterware 10g Release 2 (10.2.0) on RHEL5/OEL5
  • Note 564580.1 Configuring raw devices (multipath) for Oracle Clusterware 10g Release 2 (10.2.0) on RHEL5/OEL5
  • Note 605828.1 Configuring non-raw multipath devices for Oracle Clusterware 11g (11.1.0) on RHEL5/OEL5
  • Note 602952.1 How To Setup ASM & ASMLIB On Native Linux Multipath Mapper disks?
  • Zurück zur Community-Seite