]> git.pld-linux.org Git - projects/geninitrd.git/blob - mod-multipath.sh
- dm_export is internal to mod-multipath
[projects/geninitrd.git] / mod-multipath.sh
1 #!/bin/sh
2 #
3 # geninitrd mod: dm-multipath
4
5 # if we should init dm-multipath at boot
6 have_multipath=no
7
8 if [ -x /sbin/multipath ]; then
9         USE_MULTIPATH=yes
10 else
11         USE_MULTIPATH=no
12 fi
13
14 # dm-multipath wwid which is used for rootfs
15 MPATH_WWID=
16
17 # return true if node is multipath controlled
18 # @param        string $node device node to be examined
19 # @access       public
20 is_multipath() {
21         local devpath="$1"
22
23         # multipath disabled
24         if ! is_yes "$USE_MULTIPATH"; then
25                 return 1
26         fi
27
28         # multipath nodes are under device mapper
29         if [[ "$devpath" != /dev/mapper/* ]]; then
30                 return 1
31         fi
32
33         DM_NAME=
34         eval $(dm_export "$devpath")
35         if [ -z "$DM_NAME" ]; then
36                 die "dm_export failed unexpectedly"
37         fi
38
39         local MPATH_WWID=${DM_UUID##*-}
40         local info=$(multipath -l $MPATH_WWID)
41         if [ -z "$info" ]; then
42                 return 1
43         fi
44
45         return 0
46 }
47
48 # find modules for $devpath
49 # @param        $devpath        device to be examined
50 # @access       public
51 # find dm-multipath modules for $devpath
52 # returns false if $devpath is not dm-multipath
53 find_modules_multipath() {
54         local devpath="$1"
55
56         DM_NAME=
57         eval $(dm_export "$devpath")
58         if [ -z "$DM_NAME" ]; then
59                 die "dm_export failed unexpectedly"
60         fi
61
62         # Partition:
63         #  DM_NAME=LUN-28p1
64         #  DM_UUID=part1-mpath-36006016002c11800a0aa05fbfae0db11
65         # Disk:
66         #  DM_NAME=LUN-28
67         #  DM_UUID=mpath-36006016002c11800a0aa05fbfae0db11
68         MPATH_WWID=${DM_UUID##*-}
69
70         local info=$(multipath -l $MPATH_WWID)
71         if [ -z "$info" ]; then
72                 return 1
73         fi
74
75         debug "Finding modules for dm-multipath (WWID=$MPATH_WWID)"
76         have_multipath=yes
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"
81         done
82
83         local hw hwhandlers=$(echo "$info" | awk '/hwhandler=1/{sub(/.*hwhandler=1 /, ""); sub(/\]$/, ""); print}')
84         for hw in $hwhandlers; do
85                 findmodule "dm-$hw"
86         done
87
88         local target targets=$(echo "$info" | awk '/prio=/{print $2}' | sort -u)
89         for target in $targets; do
90                 findmodule "dm-$target"
91         done
92
93         findmodule "dm-mod"
94         return 0
95 }
96
97 # generate initrd fragment
98 # @access       public
99 initrd_gen_multipath() {
100         inst_d /sbin /lib/udev /etc/multipath
101         inst_exec /sbin/kpartx /sbin
102         inst_exec /sbin/multipath /sbin
103
104         # for udev callouts
105         inst_exec /sbin/scsi_id /lib/udev
106         inst_exec /sbin/mpath* /sbin
107         egrep -v '^([   ]*$|#)' /etc/multipath.conf > $DESTDIR/etc/multipath.conf
108
109         if [ -f /etc/multipath/bindings ]; then
110                 egrep -v '^([   ]*$|#)' /etc/multipath/bindings > $DESTDIR/etc/multipath/bindings
111         else
112                 touch $DESTDIR/etc/multipath/bindings
113         fi
114
115         mount_dev
116         initrd_gen_devices
117
118         mount_sys
119         echo "export MPATH_WWID=$MPATH_WWID" | add_linuxrc
120         add_linuxrc <<-'EOF'
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
127                                         MPATH_WWID=
128                                         echo "multipath: Activating all WWID-s"
129                                 else
130                                         echo "multipath: Activating WWID=$WWID"
131                                 fi
132                         fi
133                 done
134
135                 debugshell
136                 /sbin/multipath -v 0 $MPATH_WWID
137
138                 for a in /dev/mapper/*; do
139                         [ $a = /dev/mapper/control ] && continue
140                         /sbin/kpartx -a -p p $a
141                 done
142                 debugshell
143         EOF
144 }
145
146
147 # PRIVATE METHODS
148 # export info from dmsetup
149 # param can be:
150 # - MAJOR:MINOR
151 # - /dev/dm-MINOR
152 # - /dev/mapper/DM_NAME
153 dm_export() {
154         local arg="$1"
155
156         case "$arg" in
157         *:*)
158                 local maj=${arg%:*} min=${arg#*:}
159                 dmsetup -j $maj -m $min export
160                 ;;
161         /dev/dm-*)
162                 local min=${arg#*dm-}
163                 local maj=$(awk '$2 == "device-mapper" {print $1}' /proc/devices)
164                 dm_export $maj:$min
165                 ;;
166         /dev/mapper/*)
167                 local dm_name=${arg#/dev/mapper/}
168                 dmsetup export $dm_name
169                 ;;
170         *)
171                 die "dm_export: unexpected $arg"
172                 ;;
173         esac
174 }
175
This page took 0.046665 seconds and 4 git commands to generate.