3 # geninitrd mod: dm-multipath
5 # if we should init dm-multipath at boot
8 if [ -x /sbin/multipath ]; then
14 # dm-multipath wwid which is used for rootfs
17 # return true if node is multipath controlled
18 # @param string $node device node to be examined
24 if ! is_yes "$USE_MULTIPATH"; then
28 # multipath nodes are under device mapper
29 if [[ "$devpath" != /dev/mapper/* ]]; then
34 eval $(dm_export "$devpath")
35 if [ -z "$DM_NAME" ]; then
36 die "dm_export failed unexpectedly"
39 local MPATH_WWID=${DM_UUID##*-}
40 local info=$(multipath -l $MPATH_WWID)
41 if [ -z "$info" ]; then
48 # find modules for $devpath
49 # @param $devpath device to be examined
51 # find dm-multipath modules for $devpath
52 # returns false if $devpath is not dm-multipath
53 find_modules_multipath() {
57 eval $(dm_export "$devpath")
58 if [ -z "$DM_NAME" ]; then
59 die "dm_export failed unexpectedly"
64 # DM_UUID=part1-mpath-36006016002c11800a0aa05fbfae0db11
67 # DM_UUID=mpath-36006016002c11800a0aa05fbfae0db11
68 MPATH_WWID=${DM_UUID##*-}
70 local info=$(multipath -l $MPATH_WWID)
71 if [ -z "$info" ]; then
75 debug "Finding modules for dm-multipath (WWID=$MPATH_WWID)"
77 local dev phydevs=$(echo "$info" | awk '$2 ~ /^[0-9]+:[0-9]+:[0-9]+:[0-9]+$/{printf("/dev/%s\n", $3)}')
78 for dev in $phydevs; do
79 find_modules_for_devpath $dev
80 lvm_ignore_devices="$lvm_ignore_devices $dev"
83 local hw hwhandlers=$(echo "$info" | awk '/hwhandler=1/{sub(/.*hwhandler=1 /, ""); sub(/\]$/, ""); print}')
84 for hw in $hwhandlers; do
88 local target targets=$(echo "$info" | awk '/prio=/{print $2}' | sort -u)
89 for target in $targets; do
90 findmodule "dm-$target"
97 # generate initrd fragment
99 initrd_gen_multipath() {
100 inst_d /sbin /lib/udev /etc/multipath
101 inst_exec /sbin/kpartx /sbin
102 inst_exec /sbin/multipath /sbin
105 inst_exec /sbin/scsi_id /lib/udev
106 inst_exec /sbin/mpath* /sbin
107 egrep -v '^([ ]*$|#)' /etc/multipath.conf > $DESTDIR/etc/multipath.conf
109 if [ -f /etc/multipath/bindings ]; then
110 egrep -v '^([ ]*$|#)' /etc/multipath/bindings > $DESTDIR/etc/multipath/bindings
112 touch $DESTDIR/etc/multipath/bindings
119 echo "export MPATH_WWID=$MPATH_WWID" | add_linuxrc
121 # parse mpath_wwid= from kernel commandline
122 for arg in $CMDLINE; do
123 if [ "${arg##mpath_wwid=}" != "${arg}" ]; then
124 MPATH_WWID=${arg##mpath_wwid=}
125 if [ "$MPATH_WWID" = "*" ]; then
126 # '*' would mean activate all WWID-s
128 echo "multipath: Activating all WWID-s"
130 echo "multipath: Activating WWID=$WWID"
136 /sbin/multipath -v 0 $MPATH_WWID
138 for a in /dev/mapper/*; do
139 [ $a = /dev/mapper/control ] && continue
140 /sbin/kpartx -a -p p $a
148 # export info from dmsetup
152 # - /dev/mapper/DM_NAME
158 local maj=${arg%:*} min=${arg#*:}
159 dmsetup -j $maj -m $min export
162 local min=${arg#*dm-}
163 local maj=$(awk '$2 == "device-mapper" {print $1}' /proc/devices)
167 local dm_name=${arg#/dev/mapper/}
168 dmsetup export $dm_name
171 die "dm_export: unexpected $arg"