3 # geninitrd mod: dm-multipath
5 # if we should init dm-multipath at boot
8 # dm-multipath wwid which is used for rootfs
11 # setup geninitrd module
13 setup_mod_multipath() {
14 if [ -x /sbin/multipath ]; then
21 # return true if node is multipath controlled
22 # @param string $node device node to be examined
28 if ! is_yes "$USE_MULTIPATH"; then
32 # multipath nodes are under device mapper
33 if [[ "$devpath" != /dev/mapper/* ]]; then
38 eval $(dm_export "$devpath")
39 if [ -z "$DM_NAME" ]; then
40 die "dm_export failed unexpectedly"
43 local MPATH_WWID=${DM_UUID##*-}
44 local info=$(multipath -l $MPATH_WWID)
45 if [ -z "$info" ]; then
52 # find modules for $devpath
53 # @param $devpath device to be examined
55 # find dm-multipath modules for $devpath
56 # returns false if $devpath is not dm-multipath
57 find_modules_multipath() {
61 eval $(dm_export "$devpath")
62 if [ -z "$DM_NAME" ]; then
63 die "dm_export failed unexpectedly"
68 # DM_UUID=part1-mpath-36006016002c11800a0aa05fbfae0db11
71 # DM_UUID=mpath-36006016002c11800a0aa05fbfae0db11
72 MPATH_WWID=${DM_UUID##*-}
74 local info=$(multipath -l $MPATH_WWID)
75 if [ -z "$info" ]; then
79 debug "Finding modules for dm-multipath (WWID=$MPATH_WWID)"
81 local dev phydevs=$(echo "$info" | awk '$2 ~ /^[0-9]+:[0-9]+:[0-9]+:[0-9]+$/{printf("/dev/%s\n", $3)}')
82 for dev in $phydevs; do
83 find_modules_for_devpath $dev
84 lvm_ignore_devices="$lvm_ignore_devices $dev"
87 local hw hwhandlers=$(echo "$info" | awk '/hwhandler=1/{sub(/.*hwhandler=1 /, ""); sub(/\]$/, ""); print}')
88 for hw in $hwhandlers; do
92 local target targets=$(echo "$info" | awk '/prio=/{print $2}' | sort -u)
93 for target in $targets; do
94 find_module "dm-$target"
101 # generate initrd fragment
103 initrd_gen_multipath() {
104 inst_d /sbin /lib/udev /etc/multipath
105 inst_exec /sbin/kpartx /sbin
106 inst_exec /sbin/multipath /sbin
109 inst_exec /sbin/scsi_id /lib/udev
110 inst_exec /sbin/mpath* /sbin
111 egrep -v '^([ ]*$|#)' /etc/multipath.conf > $DESTDIR/etc/multipath.conf
113 if [ -f /etc/multipath/bindings ]; then
114 egrep -v '^([ ]*$|#)' /etc/multipath/bindings > $DESTDIR/etc/multipath/bindings
116 touch $DESTDIR/etc/multipath/bindings
123 echo "export MPATH_WWID=$MPATH_WWID" | add_linuxrc
125 # parse mpath_wwid= from kernel commandline
126 for arg in $CMDLINE; do
127 if [ "${arg##mpath_wwid=}" != "${arg}" ]; then
128 MPATH_WWID=${arg##mpath_wwid=}
129 if [ "$MPATH_WWID" = "*" ]; then
130 # '*' would mean activate all WWID-s
132 echo "multipath: Activating all WWID-s"
134 echo "multipath: Activating WWID=$WWID"
140 /sbin/multipath -v 0 $MPATH_WWID
142 for a in /dev/mapper/*; do
143 [ $a = /dev/mapper/control ] && continue
144 /sbin/kpartx -a -p p $a
152 # export info from dmsetup
156 # - /dev/mapper/DM_NAME
162 local maj=${arg%:*} min=${arg#*:}
163 dmsetup -j $maj -m $min export
166 local min=${arg#*dm-}
167 local maj=$(awk '$2 == "device-mapper" {print $1}' /proc/devices)
171 local dm_name=${arg#/dev/mapper/}
172 dmsetup export $dm_name
175 die "dm_export: unexpected $arg"