1 |
diff -up mkinitrd-5.1.19.6/mkinitrd.multipath mkinitrd-5.1.19.6/mkinitrd |
2 |
--- mkinitrd-5.1.19.6/mkinitrd.multipath 2007-07-18 13:39:44.000000000 -0400 |
3 |
+++ mkinitrd-5.1.19.6/mkinitrd 2007-07-18 13:40:46.000000000 -0400 |
4 |
@@ -42,7 +42,6 @@ VERSION=5.1.19.6 |
5 |
PROBE="yes" |
6 |
MODULES="" |
7 |
PREMODS="" |
8 |
-DMDEVS="" |
9 |
NET_LIST="" |
10 |
|
11 |
CFG_DIR=${MKINITRD_CONFIG_DIR:-/etc/sysconfig/mkinitrd} |
12 |
@@ -64,11 +63,8 @@ img_vers="" |
13 |
builtins="" |
14 |
modulefile=/etc/modules.conf |
15 |
withusb=1 |
16 |
-if [ "$MULTIPATH" == "no" ]; then |
17 |
- withmpath=0 |
18 |
-else |
19 |
- withmpath=1 |
20 |
-fi |
21 |
+[ "$MULTIPATH" == "no" ] && withmpath=0 || withmpath=1 |
22 |
+[ "$DMRAID" == "no" ] && withdmraid=0 || withdmraid=1 |
23 |
rc=0 |
24 |
|
25 |
IMAGESIZE=8000 |
26 |
@@ -109,7 +105,8 @@ usage () { |
27 |
$cmd " [--force-ide-probe] [--force-scsi-probe | --omit-scsi-modules]" |
28 |
$cmd " [--image-version] [--force-raid-probe | --omit-raid-modules]" |
29 |
$cmd " [--with=<module>] [--force-lvm-probe | --omit-lvm-modules]" |
30 |
- $cmd " [--builtin=<module>] [--omit-dmraid] [--net-dev=<interface>]" |
31 |
+ $cmd " [--builtin=<module>] [--net-dev=<interface>]" |
32 |
+ $cmd " [--without-usb] [--without-multipath] [--without-dmraid]" |
33 |
$cmd " [--fstab=<fstab>] [--nocompress] <initrd-image> <kernel-version>" |
34 |
$cmd "" |
35 |
$cmd " (ex: `basename $0` /boot/initrd-2.2.5-15.img 2.2.5-15)" |
36 |
@@ -136,14 +133,63 @@ findall() { |
37 |
echo nash-find "$@" | /sbin/nash --force --quiet |
38 |
} |
39 |
|
40 |
-dm_get_uuid() { |
41 |
- echo nash-dm get_uuid "$1" | /sbin/nash --force --quiet |
42 |
-} |
43 |
- |
44 |
resolve_device_name() { |
45 |
echo nash-resolveDevice "$1" | /sbin/nash --forcequiet |
46 |
} |
47 |
|
48 |
+find_dm_in_sysblock() { |
49 |
+ devname=$(resolve_device_name $1) |
50 |
+ [ -z "$devname" ] && return 1 |
51 |
+ majmin=$(get_numeric_dev dec $devname) |
52 |
+ [ -z "$majmin" ] && return 1 |
53 |
+ findall /sys/block -name dev | while read device ; do \ |
54 |
+ echo "$majmin" | cmp -s $device && echo $device ; done \ |
55 |
+ | sed -e 's,/dev$,,' |
56 |
+} |
57 |
+ |
58 |
+is_mpath() { |
59 |
+ major=$(echo $1 | cut -d: -f1) |
60 |
+ minor=$(echo $1 | cut -d: -f2) |
61 |
+ for target in $(dmsetup -C -j $major -m $minor table 2>/dev/null | \ |
62 |
+ grep -v "No devices found" | awk ' { print $3 }') ; do |
63 |
+ [ "$target" == "multipath" ] && return 0 |
64 |
+ done |
65 |
+ return 1 |
66 |
+} |
67 |
+ |
68 |
+# this sucks; we need a generic way to get the hardware handler |
69 |
+is_emc() { |
70 |
+ major=$(echo $1 | cut -d: -f1) |
71 |
+ minor=$(echo $1 | cut -d: -f2) |
72 |
+ if dmsetup -C -j $major -m $minor table 2>/dev/null | \ |
73 |
+ grep -v "No devices found" | grep -q " emc " ; then |
74 |
+ return 0 |
75 |
+ fi |
76 |
+ return 1 |
77 |
+} |
78 |
+ |
79 |
+find_mpath_deps() { |
80 |
+ local devpath="/dev/$(echo $1 | sed -e 's,.*/\([^/]\+\),\1,' )" |
81 |
+ local arg2="$2" |
82 |
+ local majmin=$(cat $1/dev) |
83 |
+ local ret=1 |
84 |
+ if is_mpath ${majmin} ; then |
85 |
+ arg2=yes |
86 |
+ if is_emc ${majmin} ; then |
87 |
+ ret=0 |
88 |
+ fi |
89 |
+ fi |
90 |
+ slaves="$1/slaves/*" |
91 |
+ for slave in $slaves ; do |
92 |
+ [ -e $slave ] || continue |
93 |
+ find_mpath_deps $(readlink $slave) ${arg2} && ret=0 |
94 |
+ done |
95 |
+ if [ "$2" == "yes" ]; then |
96 |
+ echo $devpath |
97 |
+ fi |
98 |
+ return $ret |
99 |
+} |
100 |
+ |
101 |
findmodule() { |
102 |
skiperrors="" |
103 |
|
104 |
@@ -259,38 +305,13 @@ findmodule() { |
105 |
fi |
106 |
} |
107 |
|
108 |
-finddmmods() { |
109 |
- line=$(/sbin/dmsetup table "$1" 2>/dev/null) |
110 |
- [ -z "$line" ] && return 1 |
111 |
- type=$(echo "$line" | awk '{ print $3 }') |
112 |
- [ -z "$type" ] && return 1 |
113 |
- case "$type" in |
114 |
- mirror) |
115 |
- findmodule -dm-mirror |
116 |
- ;; |
117 |
- emc) |
118 |
- findmodule -dm-emc |
119 |
- findmodule -dm-round-robin |
120 |
- ;; |
121 |
- multipath) |
122 |
- findmodule -dm-multipath |
123 |
- findmodule -dm-round-robin |
124 |
- ;; |
125 |
- crypt) |
126 |
- findmodule -dm-crypt |
127 |
- ;; |
128 |
- zero) |
129 |
- findmodule -dm-zero |
130 |
- ;; |
131 |
- esac |
132 |
-} |
133 |
- |
134 |
inst() { |
135 |
if [ "$#" != "2" ];then |
136 |
echo "usage: inst <file> <destination>" |
137 |
return |
138 |
fi |
139 |
vecho "$1 -> $2" |
140 |
+ mkdir -p $(dirname $2) |
141 |
cp $1 $2 |
142 |
} |
143 |
|
144 |
@@ -569,7 +590,6 @@ handlenfs() { |
145 |
addnetdev $netdev |
146 |
} |
147 |
|
148 |
- |
149 |
while [ $# -gt 0 ]; do |
150 |
case $1 in |
151 |
--fstab*) |
152 |
@@ -595,6 +615,14 @@ while [ $# -gt 0 ]; do |
153 |
withusb=0 |
154 |
;; |
155 |
|
156 |
+ --without-multipath) |
157 |
+ withmpath=0 |
158 |
+ ;; |
159 |
+ |
160 |
+ --without-dmraid) |
161 |
+ withdmraid=0 |
162 |
+ ;; |
163 |
+ |
164 |
--with*) |
165 |
if [ "$1" != "${1##--with=}" ]; then |
166 |
modname=${1##--with=} |
167 |
@@ -664,9 +692,6 @@ while [ $# -gt 0 ]; do |
168 |
--omit-lvm-modules) |
169 |
nolvm=1 |
170 |
;; |
171 |
- --omit-dmraid) |
172 |
- nodmraid=1 |
173 |
- ;; |
174 |
--force-ide-probe) |
175 |
forceide=1 |
176 |
;; |
177 |
@@ -933,17 +958,61 @@ if [ -n "${loopfs}" ] || [[ "$rootopts" |
178 |
fi |
179 |
|
180 |
# If we use LVM or dm-based raid, include dm-mod |
181 |
-# XXX: dm not really supported yet. |
182 |
testdm="" |
183 |
[ -n "$vg_list" ] && testdm="yes" |
184 |
[ -n "$forceraid" -o -n "$forcelvm" ] && testdm="yes" |
185 |
[ -z "$nolvm" -o -z "$noraid" ] && testdm="yes" |
186 |
[ "x$PROBE" != "xyes" ] && testdm="" |
187 |
|
188 |
+use_multipath=0 |
189 |
+use_emc=0 |
190 |
if [ -n "$testdm" -a -x /sbin/dmsetup -a -e /dev/mapper/control ]; then |
191 |
dmout=$(/sbin/dmsetup ls 2>/dev/null) |
192 |
if [ "$dmout" != "No devices found" -a "$dmout" != "" ]; then |
193 |
- |
194 |
+ sysroot=$(find_dm_in_sysblock ${rootdev}) |
195 |
+ rootdevs="" |
196 |
+ if [ "${withmpath}" -eq 1 -a -n "${sysroot}" ]; then |
197 |
+ for rd in ${sysroot} ; do |
198 |
+ somedeps=$(find_mpath_deps ${rd}) |
199 |
+ [ "$?" == "0" ] && use_emc=1 |
200 |
+ [ -z "$somedeps" ] && continue |
201 |
+ for dep in ${somedeps} ; do |
202 |
+ majmin=$(get_numeric_dev dec ${dep}) |
203 |
+ [[ ${majmin} =~ ^9: ]] && continue |
204 |
+ [[ ${dep} =~ ^/dev/xvd.+ ]] && continue |
205 |
+ case " ${rootdevs} " in |
206 |
+ *" ${dep} "*) continue ;; |
207 |
+ *) rootdevs="${rootdevs} ${dep}" ;; |
208 |
+ esac |
209 |
+ done |
210 |
+ done |
211 |
+ fi |
212 |
+ |
213 |
+ if [ -z "$rootdevs" ]; then |
214 |
+ rootdevs="$rootdev" |
215 |
+ fi |
216 |
+ |
217 |
+ root_wwids="" |
218 |
+ if [ "${withmpath}" -eq "1" ]; then |
219 |
+ for rootdev in ${rootdevs} ; do |
220 |
+ disk=$(find_dm_in_sysblock ${rootdev} | sed -e 's,^/sys,,') |
221 |
+ wwid=$(/sbin/scsi_id -g -u -s ${disk}) |
222 |
+ if [ -z "${wwid}" ]; then |
223 |
+ # Could be EMC unit requiring special option |
224 |
+ wwid=$(/sbin/scsi_id -g -ppre-spc3-83 -u -s ${disk}) |
225 |
+ fi |
226 |
+ if [ -n "${wwid}" ]; then |
227 |
+ case " ${root_wwids} " in |
228 |
+ *" ${wwid} "*) continue ;; |
229 |
+ *) root_wwids="${root_wwids} ${wwid}" ;; |
230 |
+ esac |
231 |
+ fi |
232 |
+ done |
233 |
+ if [ -n "$root_wwids" ]; then |
234 |
+ use_multipath=1 |
235 |
+ fi |
236 |
+ fi |
237 |
+ |
238 |
findmodule -dm-mod |
239 |
|
240 |
# DM requires all of these to be there in case someone used the |
241 |
@@ -951,58 +1020,15 @@ if [ -n "$testdm" -a -x /sbin/dmsetup -a |
242 |
findmodule -dm-mirror |
243 |
findmodule -dm-zero |
244 |
findmodule -dm-snapshot |
245 |
- |
246 |
- RAIDS=$(/sbin/dmraid -s -craidname 2>/dev/null | grep -vi "no raid disks") |
247 |
|
248 |
- # I fucking hate shell. |
249 |
- lineno=1 |
250 |
- PREV="" |
251 |
- LINE="" |
252 |
- while :; do |
253 |
- PREV="$LINE" |
254 |
- LINE=$(/sbin/dmsetup table | head -$lineno | tail -1) |
255 |
- if [ "$LINE" == "$PREV" ]; then |
256 |
- break; |
257 |
+ # If we use dm-multipath devices, include the needed modules |
258 |
+ if [ "$use_multipath" == "1" ]; then |
259 |
+ findmodule -dm-multipath |
260 |
+ findmodule -dm-round-robin |
261 |
+ if [ "$use_emc" == "1" ]; then |
262 |
+ findmodule -dm-emc |
263 |
fi |
264 |
- |
265 |
- eval $(echo $LINE | \ |
266 |
- while read NAME START END TYPE TABLE ; do |
267 |
- echo NAME=\"$(sed 's/:$//'<<< "$NAME")\" |
268 |
- echo START=\"$START\" |
269 |
- echo END=\"$END\" |
270 |
- echo TYPE=\"$TYPE\" |
271 |
- echo TABLE=\"$TABLE\" |
272 |
- done) |
273 |
- |
274 |
- case "$TYPE" in |
275 |
- multipath|emc) |
276 |
- [ "$withmpath" == "0" ] && continue |
277 |
- # ugggh. We could try to fish the module name out, but it |
278 |
- # requires real parsing... |
279 |
- # XXX also covered by #132001 |
280 |
- for mod in $TABLE ; do |
281 |
- DMMODS="$DMMODS $([[ "$mod" =~ "[[:alpha:]]" ]] && echo "$mod")" |
282 |
- done |
283 |
- DMDEVS="$DMDEVS $NAME" |
284 |
- ;; |
285 |
- *) |
286 |
- for raid in $RAIDS ; do |
287 |
- if [ "$raid" == "$NAME" ]; then |
288 |
- dmname=$(resolve_dm_name $NAME) |
289 |
- DMDEVS="$DMDEVS $dmname" |
290 |
- RAIDS=$(sed 's/ $NAME //' <<< "$RAIDS") |
291 |
- break |
292 |
- fi |
293 |
- done |
294 |
- ;; |
295 |
- esac |
296 |
- lineno=$(($lineno + 1)) |
297 |
- done |
298 |
- |
299 |
- for mod in $(tr ' ' '\n' <<< $DMMODS | sort -u) ; do |
300 |
- findmodule -dm-$mod |
301 |
- done |
302 |
- DMDEVS=$(tr ' ' '\n' <<< $DMDEVS | sort -u) |
303 |
+ fi |
304 |
fi |
305 |
fi |
306 |
|
307 |
@@ -1014,8 +1040,6 @@ for n in $CONFMODS; do |
308 |
findmodule $n |
309 |
done |
310 |
|
311 |
-finddmmods |
312 |
- |
313 |
vecho "Using modules: $MODULES" |
314 |
|
315 |
MNTIMAGE=`mktemp -d ${TMPDIR}/initrd.XXXXXX` |
316 |
@@ -1037,34 +1061,6 @@ emit() |
317 |
echo $NONL "$@" >> $RCFILE |
318 |
} |
319 |
|
320 |
-emitdm() |
321 |
-{ |
322 |
- vecho "Adding dm map \"$1\"" |
323 |
- UUID=$(dm_get_uuid "$1") |
324 |
- if [ -n "$UUID" ]; then |
325 |
- UUID="--uuid $UUID" |
326 |
- fi |
327 |
- emit dm create "$1" $UUID $(/sbin/dmsetup table "$1") |
328 |
-} |
329 |
- |
330 |
-emitdms() |
331 |
-{ |
332 |
- [ -z "$DMDEVS" ] && return 0 |
333 |
- echo dm list $DMDEVS | nash --force --quiet | while read ACTION NAME ; do |
334 |
- case $ACTION in |
335 |
- rmparts) |
336 |
- emit rmparts "$NAME" |
337 |
- ;; |
338 |
- create) |
339 |
- emitdm "$NAME" |
340 |
- ;; |
341 |
- part) |
342 |
- emit dm partadd "$NAME" |
343 |
- ;; |
344 |
- esac |
345 |
- done |
346 |
-} |
347 |
- |
348 |
if [ -z "$MNTIMAGE" -o -z "$IMAGE" ]; then |
349 |
error "Error creating temporaries. Try again" |
350 |
exit 1 |
351 |
@@ -1136,6 +1132,39 @@ if [ -n "$vg_list" ]; then |
352 |
fi |
353 |
fi |
354 |
|
355 |
+if [ "$use_multipath" == "1" ]; then |
356 |
+ # For multipath command |
357 |
+ inst /sbin/multipath.static $MNTIMAGE/bin/multipath |
358 |
+ if [ -f /etc/multipath.conf ]; then |
359 |
+ inst /etc/multipath.conf $MNTIMAGE/etc/multipath.conf |
360 |
+ fi |
361 |
+ if [ -f /var/lib/multipath/bindings ]; then |
362 |
+ inst /var/lib/multipath/bindings $MNTIMAGE/var/lib/multipath/bindings |
363 |
+ fi |
364 |
+ inst /sbin/scsi_id $MNTIMAGE/bin/scsi_id |
365 |
+ inst /etc/scsi_id.config $MNTIMAGE/etc/scsi_id.config |
366 |
+ # This includes all mpath_prio checkers in the image (~2.5M) |
367 |
+ # Alternately we can only include those that are used by the |
368 |
+ # current mpath config. This would require users to rebuild |
369 |
+ # the initrd if migrating/adding controllers from different |
370 |
+ # storage vendors |
371 |
+ for M in /sbin/mpath_prio_*.static ; do |
372 |
+ inst ${M} $MNTIMAGE/${M%%.static}; |
373 |
+ done |
374 |
+ mkdir -p $MNTIMAGE/tmp |
375 |
+ |
376 |
+ # For kpartx command which creates device maps for disk partitions |
377 |
+ # and creates device files |
378 |
+ inst /sbin/dmsetup.static $MNTIMAGE/bin/dmsetup |
379 |
+ inst /sbin/kpartx.static $MNTIMAGE/bin/kpartx |
380 |
+fi |
381 |
+ |
382 |
+if [ "$withdmraid" == "1" ]; then |
383 |
+ # Only dmraid is needed to set up dmraid volume |
384 |
+ inst /sbin/dmraid.static "$MNTIMAGE/bin/dmraid" |
385 |
+ inst /sbin/kpartx.static "$MNTIMAGE/bin/kpartx" |
386 |
+fi |
387 |
+ |
388 |
echo -n >| $RCFILE |
389 |
cemit << EOF |
390 |
#!/bin/nash |
391 |
@@ -1247,17 +1276,6 @@ EOF |
392 |
done |
393 |
unset usb_mounted |
394 |
|
395 |
-if [ -n "$scsi" ]; then |
396 |
- emit "echo Waiting for driver initialization." |
397 |
- emit "stabilized --hash --interval 250 /proc/scsi/scsi" |
398 |
-fi |
399 |
- |
400 |
- |
401 |
-if [ -n "$vg_list" ]; then |
402 |
- emit "echo Making device-mapper control node" |
403 |
- emit "mkdmnod" |
404 |
-fi |
405 |
- |
406 |
if [ -n "$net_list" ]; then |
407 |
for netdev in $net_list; do |
408 |
emit "echo Bringing up $netdev" |
409 |
@@ -1268,12 +1286,39 @@ fi |
410 |
|
411 |
emit_iscsi |
412 |
|
413 |
+if [ -n "$scsi" ]; then |
414 |
+ emit "echo Waiting for driver initialization." |
415 |
+ emit "stabilized --hash --interval 250 /proc/scsi/scsi" |
416 |
+fi |
417 |
+ |
418 |
# HACK: module loading + device creation isn't necessarily synchronous... |
419 |
# this will make sure that we have all of our devices before trying |
420 |
# things like RAID or LVM |
421 |
emit "mkblkdevs" |
422 |
|
423 |
-emitdms |
424 |
+#if [ -n "$vg_list" ]; then |
425 |
+# emit "echo Making device-mapper control node" |
426 |
+# emit "mkdmnod" |
427 |
+#fi |
428 |
+ |
429 |
+if [ "$use_multipath" == "1" ]; then |
430 |
+ emit "echo Creating multipath devices" |
431 |
+ for wwid in $root_wwids ; do |
432 |
+ emit "/bin/multipath -v 0 $wwid" |
433 |
+ done |
434 |
+ emit "dmsetup ls --target multipath --exec 'kpartx -a -p p'" |
435 |
+fi |
436 |
+ |
437 |
+if [ "$withdmraid" == "1" ]; then |
438 |
+ emit "echo Scanning and configuring dmraid supported devices" |
439 |
+ for x in $(/sbin/dmraid.static -ay -i -p -t 2>/dev/null | \ |
440 |
+ egrep -iv "^no " | awk -F ':' '{ print $1 }') ; do |
441 |
+ dmname=$(resolve_dm_name $x) |
442 |
+ [ -z "$dmname" ] && continue |
443 |
+ emit "dmraid -ay -i -p \"$dmname\"" |
444 |
+ emit "kpartx -a -p p \"/dev/mapper/$dmname\"" |
445 |
+ done |
446 |
+fi |
447 |
|
448 |
if [ -n "$raiddevices" ]; then |
449 |
for dev in $raiddevices; do |