]> git.pld-linux.org Git - projects/geninitrd.git/blame - geninitrd
Always use mdassemble.
[projects/geninitrd.git] / geninitrd
CommitLineData
bb529f94
JK
1#!/bin/sh
2
3# geninitrd
4#
4e9eb79c 5# by Jacek Konieczny <jajcus@pld-linux.org>
bb529f94 6#
413878f8 7# based on mkinitrd from RedHat
c31050f3 8
28eec2b1 9RCSID='$Id$'
bb529f94
JK
10PATH=/sbin:$PATH
11export PATH
12
2b649ae0 13VERSION="`echo "$RCSID"|awk '{print $3}'`"
bb529f94
JK
14
15. /etc/rc.d/init.d/functions
16
17COMPRESS="yes"
2ad94d8a
AF
18# INITRDFS is set later (catch obsoleted FS option)
19#INITRDFS="rom"
6bd433bc 20USERAIDSTART="yes"
d3fa6ec7 21USEMDADMSTATIC="no"
b2e62ae1 22USEINSMODSTATIC="no"
2a5bcca9 23USESUSPEND="yes"
7c38b114 24uselvm="no"
6fe19d5b 25usenfs="no"
10c3df06
MM
26# it should be safe to remove scsi_mod from here, but I'm not sure...
27PRESCSIMODS="-scsi_mod unknown -sd_mod"
64497ebb
AM
28PREIDEMODS="-ide-core unknown -ide-detect -ide-disk"
29PREIDEMODSOLD="-ide-probe -ide-probe-mod -ide-disk"
a62e2bd8 30SUSPENDMODS="-suspend2_core -suspend2_lzf -suspend2_block_io -suspend2_swap -suspend_core -suspend_text -suspend_lzf -suspend_block_io -suspend_swap"
bb529f94
JK
31target=""
32kernel=""
33force=""
34verbose=""
35MODULES=""
36img_vers=""
f121024f 37modulefile=""
bb529f94 38fstab="/etc/fstab"
0868f49f
AF
39insmod="insmod"
40modext=".o"
4e9eb79c 41rootdev_nr=0
5b71959c
AM
42# default bootsplash is off, if it have to be on, install bootsplash package
43BOOT_SPLASH=no
bb529f94 44
326d9c3a 45if [ -f /etc/udev/udev.conf -a -x /sbin/initrd-udev ]; then
1606e343
AM
46 USE_UDEV="yes"
47 UDEV_TMPFS="yes"
48 . /etc/udev/udev.conf
49fi
882472ae
ER
50
51if [ -x /sbin/dmraid-initrd ]; then
52 USE_DMRAID="yes"
53fi
1606e343 54
bb529f94 55usage () {
77bcfc68
AF
56 echo "usage: `basename $0` [--version] [-v] [-f] [--ifneeded] [--preload <module>]"
57 echo " [--with=<module>] [--image-version] [--fstab=<fstab>] [--nocompress]"
58 echo " [--initrdfs=rom|ext2|cram] [--modules-conf=<modules.conf>]"
59 echo " [--with-raidstart] [--without-raidstart] [--with-insmod-static]"
1606e343 60 echo " [--without-bootsplash] [--lvmtoolsversion=1|2] [--without-udev]"
882472ae 61 echo " [--without-suspend] [--without-dmraid]"
77bcfc68
AF
62 echo " <initrd-image> <kernel-version>"
63 echo " (ex: `basename $0` /boot/initrd-2.2.5-15.img 2.2.5-15)"
7d2fc5eb 64 exit 1
bb529f94
JK
65}
66
aa69da6e 67
10c3df06
MM
68my_dirname() {
69 echo $1|awk -F/ '{print substr($0, 0, length($0) - length($NF));}'
70}
71
72find_depmod () {
73 typeset mods module f level depfile first
74
75 depfile=/lib/modules/$kernel/modules.dep
f6de9380 76
b2e62ae1 77 if [ -f $depfile ] ; then
f6de9380
MM
78 : ok
79 else
c83257bc
AF
80 echo "Error: no $depfile ! Run depmod and rerun geninitrd." 1>&2
81 exit 1
f6de9380
MM
82 fi
83
0868f49f 84 # prepend / if no path given, append $modext.gz if not given,
10c3df06 85 # quote /
3b00e899 86 origmodule="$2"
10c3df06
MM
87 module=$(echo "$2" | \
88 awk '/\// {print;next} {print "/" $0}' | \
0868f49f 89 awk '/\./ {print;next} {print $0 "'$modext'.gz"}' |
10c3df06
MM
90 awk '{gsub("/","\\/");print}')
91 mods=$(awk '
92BEGIN { here = 0 }
93/'"$module"':(.*)/ { gsub(/:/," "); gsub(/\\/," "); print; here = 1; next }
94/:/ { here = 0 }
95/(.*)/ { gsub(/\\/," "); if (here) print }
4fd11db9
AF
96' $depfile | xargs)
97
0868f49f 98 # fallback to $modext
4fd11db9
AF
99 if [ "$mods" = "" ] ; then
100 module=$(echo "$module" | \
0868f49f 101 awk '{gsub("\'$modext'\.gz$","\'$modext'",$0);print}')
4fd11db9
AF
102 fi
103 mods=$(awk '
104BEGIN { here = 0 }
105/'"$module"':(.*)/ { gsub(/:/," "); gsub(/\\/," "); print; here = 1; next }
106/:/ { here = 0 }
107/(.*)/ { gsub(/\\/," "); if (here) print }
10c3df06
MM
108' $depfile | xargs)
109
110 if [ "$mods" = "" ] ; then
111 if [ "$1" != silent ] ; then
3b00e899 112 echo "$origmodule: module not found in $depfile" 1>&2
10c3df06 113 fi
fd2dc249
AF
114 if ! is_no "$EXIT_IF_MISSING" ; then
115 exit 1
116 else
3b00e899 117 echo "If $origmodule isn't compiled in kernel then this initrd may not start your system". 1>&2
fd2dc249 118 fi
10c3df06
MM
119 fi
120
121 level=$3
122 if [ "$level" = "" ] ; then
123 level=0
124 fi
125 level=$(awk "BEGIN{print $level + 1}")
126 if [ $level -gt 20 ] ; then
3b00e899 127 echo "$origmodule: cycle in $depfile" 1>&2
10c3df06
MM
128 exit 1
129 fi
130
131 first=
132 for f in $mods ; do
133 if [ "$first" = "" ] ; then
134 first=$f
413878f8 135 else
10c3df06 136 find_depmod $1 $f $level
9c9f7cdb 137 fi
aa69da6e 138 done
10c3df06
MM
139
140 echo $first
aa69da6e 141}
142
10c3df06
MM
143addmodule() {
144 fmPath=$1
145 skiperrors=$2
146
147 if [ ! -f "/lib/modules/$kernel/$fmPath" ]; then
148 if [ -n "$skiperrors" ]; then
149 return
150 fi
151
152 echo "module $fmPath present in modules.dep, but not in filesystem (kernel = $kernel)" 1>&2
153 exit 1
154 fi
155
156 # only need to add each module once
157 # quote /
158 tmpFmPath=$(echo $fmPath | awk '{gsub(/\//,"\\/");print}')
159 if echo "$MODULES" | awk '/'"$tmpFmPath"'/ {exit 1}' ; then
160 MODULES="$MODULES $fmPath"
161 fi
81de8443
AF
162}
163
bb529f94 164findmodule() {
413878f8 165 skiperrors=""
166 modName=$1
10c3df06 167
413878f8 168 if [ "$(echo $modName | awk '{print(substr($0,1,1));}')" = "-" ]; then
169 skiperrors=1
170 modName="$(echo $modName | awk '{print(substr($0,2));}')"
171 fi
bb529f94 172
10c3df06 173 # what's that?
413878f8 174 if [ "$modName" = "pluto" ]; then
175 findmodule fc4
176 findmodule soc
177 fi
178 if [ "$modName" = "fcal" ]; then
179 findmodule fc4
180 findmodule socal
181 fi
bb529f94 182
10c3df06
MM
183 if [ -n "$skiperrors" ]; then
184 allModulesToFind=`find_depmod silent $modName`
185 else
186 allModulesToFind=`find_depmod normal $modName`
187 if [ $? != 0 ] ; then
188 exit 1
413878f8 189 fi
413878f8 190 fi
10c3df06
MM
191
192 for mod in $allModulesToFind ; do
193 mod=$(echo $mod | \
194 awk '{sub(/^\/lib\/modules\/[^\/]*\//,"");print}')
195 addmodule $mod "$skiperrors"
196 done
bb529f94
JK
197}
198
199inst() {
413878f8 200 if [ "$#" != "2" ];then
201 echo "usage: inst <file> <destination>"
202 return
c31050f3 203 fi
413878f8 204 [ -n "$verbose" ] && echo "$1 -> $2"
205 cp "$1" "$2"
bb529f94
JK
206}
207
a2c2980f
AF
208get_label_ext2 () {
209 /sbin/e2label $1 2> /dev/null
210}
211
212get_uuid_ext2 () {
c31050f3 213 /sbin/tune2fs -l $1 2> /dev/null | awk -F: '/UUID:/ {gsub(" ",""); print $2}'
a2c2980f
AF
214}
215
216get_label_xfs () {
3b9c8219 217 /usr/sbin/xfs_db -x -p xfs_admin -c label -r "$1"|awk -F= '{sub("^\"","", $2); sub("\"$", "", $2); print $2}'
c31050f3 218
a2c2980f
AF
219}
220
221get_uuid_xfs () {
3b9c8219 222 /usr/sbin/xfs_db -x -p xfs_admin -c uuid -r "$1"|awk -F= '{print $2}'
a2c2980f
AF
223}
224
c31050f3 225find_root() {
a2c2980f
AF
226 eval `awk '/^[\t ]*#/ {next} {if ( $2 == "/" ) {print "rootdev=\"" $1 "\"\nrootFs=\"" $3 "\""}}' $fstab`
227 case $rootdev in
228 LABEL=*)
4fd11db9
AF
229 if [ -x /sbin/findfs -a \( "$rootFs." = "ext2." -o "$rootFs." = "ext3." \) ] ; then
230 rootdev2="`/sbin/findfs $rootdev 2>/dev/null`"
231 if [ -n "$rootdev2" ] ; then
232 rootdev=$rootdev2
233 rootdev_found=1
a2c2980f 234 fi
4fd11db9
AF
235 fi
236 if [ "$rootdev_found." != "1." ] ; then
237 case $rootFs in
238 ext2|ext3)
239 if [ ! -x /sbin/e2label ] ; then
240 echo "/sbin/e2label is missing" 1>&2
241 exit 1
242 fi
243 get_label="get_label_ext2"
244 ;;
245 xfs)
246 if [ ! -x /usr/sbin/xfs_db ] ; then
247 echo "/usr/sbin/xfs_db is missing" 1>&2
248 exit 1
249 fi
250 get_label="get_label_xfs"
251 ;;
252 *)
253 echo "LABEL on $rootFs in not supported by geninitrd" 1>&2
254 exit 1
255 ;;
256 esac
257 if [ ! -r /proc/partitions ] ; then
258 echo '/proc/partitions is not readable'; 1>&2
3b9c8219
AF
259 exit 1
260 fi
4fd11db9
AF
261 label=${rootdev#"LABEL="}
262 for dev in `awk 'BEGIN {getline;getline} {print "/dev/" $4}' /proc/partitions` ; do
263 if [ -r $dev ] && [ "$label" = "`$get_label $dev`" ] ; then
264 if [ -n "$verbose" ] ; then
265 echo "Using $dev as device for rootfs"
266 fi
267 rootdev=$dev
268 rootdev_found=1
269 break
a2c2980f 270 fi
4fd11db9
AF
271 done
272 if [ "$rootdev_found." != "1." ] ; then
273 echo "geninitrd can't find real device for LABEL=$label" 1>&2
274 exit 1
275 fi
a2c2980f
AF
276 fi
277 ;;
278 UUID=*)
4fd11db9
AF
279 if [ -x /sbin/findfs -a \( "$rootFs." = "ext2." -o "$rootFs." = "ext3." \) ] ; then
280 rootdev2="`/sbin/findfs $rootdev 2>/dev/null`"
281 if [ -n "$rootdev2" ] ; then
282 rootdev=$rootdev2
283 rootdev_found=1
a2c2980f 284 fi
4fd11db9
AF
285 fi
286 if [ "$rootdev_found." != "1." ] ; then
287 case $rootFs in
288 ext2|ext3)
289 if [ ! -x /sbin/tune2fs ] ; then
290 echo "/sbin/tune2fs is missing" 1>&2
291 exit 1
292 fi
293 get_uuid="get_uuid_ext2"
294 ;;
295 xfs)
296 if [ ! -x /usr/sbin/xfs_db ] ; then
297 echo "/usr/sbin/xfs_db is missing" 1>&2
298 exit 1
299 fi
300 get_label="get_uuid_xfs"
301 ;;
302 *)
303 echo "UUID on $rootFs in not supported by geninitrd" 1>&2
304 exit 1
305 ;;
306 esac
307 if [ ! -r /proc/partitions ] ; then
308 echo '/proc/partitions is not readable'; 1>&2
3b9c8219
AF
309 exit 1
310 fi
4fd11db9
AF
311 uuid=${rootdev#"UUID="}
312 for dev in `awk 'BEGIN {getline;getline} {print "/dev/" $4}' /proc/partitions` ; do
313 if [ -r $dev ] && [ "$uuid" = "`$get_uuid $dev`" ] ; then
314 if [ -n "$verbose" ] ; then
315 echo "Using $dev as device for rootfs"
316 fi
317 rootdev=$dev
318 rootdev_found=1
319 break
a2c2980f 320 fi
4fd11db9
AF
321 done
322 if [ "$rootdev_found" != 1 ] ; then
323 echo "geninitrd can't find real device for UUID=$uuid" 1>&2
324 exit 1
325 fi
a2c2980f
AF
326 fi
327 ;;
328 esac
4e9eb79c 329 rootdev1=${rootdev}
a2c2980f 330}
bb529f94 331
7c38b114 332find_modules_softraid() {
8c4ce35e 333 if [ -f /etc/mdadm.conf ] ; then
28eec2b1 334 [ -n "$verbose" ] && echo "Finding RAID details using mdadm for rootdev=$1"
8617aec3 335 eval `/sbin/mdadm -v --examine --scan --config=/etc/mdadm.conf | \
56946560
MM
336 awk -v rootdev="$1" '
337 BEGIN {
338 found = "no";
339 dev_list = "";
340 raidlevel = ""
514a668a
AM
341 rootdev_devfs = rootdev;
342 if (rootdev ~ /\/dev\/md\/[0-9]/) {
343 gsub(/\/dev\/md\//,"/dev/md",rootdev_devfs);
344 }
56946560
MM
345 }
346
347 /^ARRAY/ {
514a668a 348 if (($2 == rootdev) || ($2 == rootdev_devfs)) {
809cc4cc
AM
349 raidlevel=$3;
350 gsub(/level=/,NUL,raidlevel);
dc9a3d8d 351 if (raidlevel ~ /^raid([0-6]|10)/) {
809cc4cc
AM
352 gsub(/raid/,NUL,raidlevel);
353 };
354 found="yes";
56946560
MM
355 getline x;
356 if (x ~ /devices=/) {
357 dev_list = x;
358 gsub("devices=", NUL, dev_list);
359 gsub(",", " ", dev_list);
360 }
361 }
362 }
809cc4cc 363
56946560
MM
364 END {
365 print "raidfound=" found;
366 print "raidlevel=" raidlevel;
367 print "dev_list=\"" dev_list "\"";
368 }'`
4c02e358 369 fi
7c38b114 370
59846acb
AM
371 if [ "$raidfound" != "yes" -a -f /etc/raidtab ]; then
372 echo "ERROR: raidtools are not longer supported. Please migrate to mdadm setup!" 1>&2
373 exit 1
809cc4cc
AM
374 fi
375
7c38b114
AF
376 if is_yes "$raidfound" ; then
377 case "$raidlevel" in
dc9a3d8d 378 [01456]|10)
7c38b114
AF
379 findmodule "raid$raidlevel"
380 ;;
381 linear)
382 findmodule "linear"
383 ;;
384 *)
59846acb 385 echo "raid level $number (in mdadm config) not recognized" 1>&2
7c38b114
AF
386 ;;
387 esac
88614cd1
AM
388 else
389 echo "ERROR: RAID devices not found for \"$1\", check your configuration!" 1>&2
390 exit 1
7c38b114 391 fi
4e9eb79c
AM
392
393 rootdev_nr=$(( $rootdev_nr + 1 ))
394 eval "rootdev${rootdev_nr}=\"$1\""
395 eval "dev_list${rootdev_nr}=\"${dev_list}\""
396
7c38b114
AF
397 for device in $dev_list; do
398 find_modules_for $device
399 done
400}
401
402find_modules_scsi() {
403 for n in $PRESCSIMODS; do
404 if [ "X$n" = "Xunknown" ] ; then
7c38b114 405 if [ -f "$modulefile" ]; then
d4a15d5f 406 scsimodules="`awk '/scsi_hostadapter/ && ! /^[\t ]*#/ { print $3; }' $modulefile`"
7c38b114
AF
407 for n in $scsimodules; do
408 # for now allow scsi modules to come from anywhere. There are some
409 # RAID controllers with drivers in block
410 findmodule "$n"
411 done
412 fi
413 else
414 findmodule "$n"
415 fi
416 done
417}
418
419find_modules_ide() {
28eec2b1
AM
420 typeset rootdev
421
afa3d7a8 422 rootdev="$(echo "$1" | awk ' { gsub(/\/dev\//,NUL); gsub(/[0-9].*/, NUL); print $0 } ')"
64497ebb
AM
423 if [ "$pack_version_long" -lt "002004021" ]; then
424 [ -n "$verbose" ] && echo "Finding IDE modules for kernels <= 2.4.20"
425 for n in $PREIDEMODSOLD; do
7c38b114 426 findmodule "$n"
64497ebb
AM
427 done
428 else
429 tryauto=1
430 for n in $PREIDEMODS; do
431 if [ "X$n" = "Xunknown" ] ; then
64497ebb
AM
432 if [ -f "$modulefile" ]; then
433 [ -n "$verbose" ] && echo "Finding IDE modules using ide_hostadapter"
d4a15d5f 434 idemodules="`awk '/ide_hostadapter/ && ! /^[\t ]*#/ { print $3; }' $modulefile`"
9f2442b9 435 for na in $idemodules; do
64497ebb 436 tryauto=0;
9f2442b9 437 findmodule "$na"
64497ebb
AM
438 done
439 fi
440
441 if [ "$tryauto" -eq 1 ]; then
bf5b3bb7 442 if [ -r /usr/share/pci-database/ide.pci -a -r /proc/bus/pci/devices ]; then
64497ebb 443 [ -n "$verbose" ] && echo "Finding IDE modules using PCI ID database"
4f4e832d
AM
444 if is_yes "${ide_only_root}"; then
445 if [ -f /sys/block/${rootdev}/device/../../vendor -a -f /sys/block/${rootdev}/device/../../device ] ; then
afa3d7a8
AM
446 vendorid="$(awk ' { gsub(/0x/,NUL); print $0 } ' /sys/block/${rootdev}/device/../../vendor)"
447 deviceid="$(awk ' { gsub(/0x/,NUL); print $0 } ' /sys/block/${rootdev}/device/../../device)"
448 searchpciid="${vendorid}${deviceid}"
4f4e832d 449 elif [ -f /proc/ide/${rootdev}/../config ]; then
26bfa502 450 searchpciid="$(awk ' /pci bus/ { print $7$9 } ' /proc/ide/${rootdev}/../config)"
4f4e832d
AM
451 fi
452 fi
453 if [ -z "${searchpciid}" ]; then
afa3d7a8
AM
454 searchpciid="$(awk ' { print $2 } ' /proc/bus/pci/devices)"
455 fi
64497ebb 456 idemodules=""
afa3d7a8 457 for nb in $searchpciid; do
9f2442b9 458 eval `awk -v pciid="$nb" 'BEGIN {
64497ebb
AM
459}
460
461{
462 gsub("\t"," ");
463 gsub(" +", " ");
464 gsub("^ ","");
465 if (/^[\t ]*#/)
466 next;
91e589d6
JR
467 compmod = $1 ""; # make sure comparison type will be string
468 # cause pci IDs are hexadecimal numeric
469 if (compmod == pciid) {
64497ebb 470 module=$2;
6fd644af 471# min_kernel=$3; # now in ide.pci $3,$4 = vendor and device name
472# max_kernel=$4; #
64497ebb
AM
473 exit 0;
474 }
475}
476
477END {
478 print "module=" module "\nmin_kernel=" min_kernel "\nmax_kernel=\"" max_kernel "\"\n";
92b8ae17 479}' /usr/share/pci-database/ide.pci`
d09abbd7 480 [ -n "$module" ] && idemodules="$idemodules $module"
64497ebb 481 done
4f4e832d
AM
482 if is_yes "$(awk ' /ide=reverse/ { print "yes" } ' /proc/cmdline)"; then
483 new_idemodules=""
484 for nc in idemodules; do
485 new_idemodules="$nc $new_idemodules"
486 done
487 idemodules="${new_idemodules}"
488 fi
5de40f1f
AM
489 if [ -z "$idemodules" ]; then
490 echo "WARNING: rootfs on IDE device but no related modules found, loading ide-generic."
491 idemodules="ide-generic"
492 fi
9f2442b9
AM
493 for nd in $idemodules; do
494 findmodule "-$nd"
64497ebb 495 done
7add695b 496 else
9e8defd1
AM
497 [ -r /usr/share/pci-database/ide.pci ] || echo "WARNING: /usr/share/pci-database/ide.pci missing."
498 [ -r /proc/bus/pci/devices ] || echo "WARNING: /proc/bus/pci/devices missing."
bf5b3bb7 499 echo "Automatic IDE modules finding not available."
7add695b 500 fi
64497ebb 501 fi
9f2442b9
AM
502 else
503 findmodule "$n"
64497ebb
AM
504 fi
505 done
506 fi
7c38b114
AF
507}
508
509find_modules_for() {
4e9eb79c 510 if [ -z "$1" ]; then
0f8c08be 511 echo "ERROR: no argument passed to find_modules_for() - is your /etc/fstab correct?" >&2
4e9eb79c 512 exit
5c4cec75
AM
513 elif is_yes "`echo "$1" | awk '/^([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+:|\/dev\/nfs)/ { print "yes"; }'`"; then
514 if [ ! -x /usr/bin/pcidev -a -z "$NFS_ETH_MODULES" ] ; then
6fe19d5b
AM
515 echo "ERROR: root on NFS but /usr/bin/pcidev not found." >&2
516 echo "Please install correct pci-database package and rerun $0." >&2
517 exit 1
518 fi
5c4cec75
AM
519 [ -z "$NFS_ETH_MODULES" ] && NFS_ETH_MODULES=$(/usr/bin/pcidev /m net | xargs)
520 for m in $NFS_ETH_MODULES; do
6fe19d5b
AM
521 findmodule "$m"
522 done
523 findmodule "-ipv4"
524 findmodule "nfs"
525 usenfs="yes"
d024196b
AM
526 echo "Remember to use \`root=/dev/ram0 init=/linuxrc' when starting kernel" >&2
527 echo "or you will have problems like init(xx) being child process of swapper(1)." >&2
4e9eb79c 528 elif is_yes "`echo "$1" | awk '/^\/dev\/md/ { print "yes"; }'`"; then
7c38b114
AF
529 find_modules_softraid "$1"
530 elif is_yes "$(echo "$1" | awk '/^\/dev\/(sd|scsi)/ { print "yes"; }')" ; then
531 find_modules_scsi
5d27006d 532 elif is_yes "`echo "$1" | awk '/^\/dev\/(hd|ide)/ { print "yes"; }'`" ; then
afa3d7a8 533 find_modules_ide "$1"
7c38b114
AF
534 elif is_yes "`echo "$1" | awk '/\/dev\/rd\// { print "yes"; }'`" ; then
535 findmodule "DAC960"
536 elif is_yes "`echo "$1" | awk '/\/dev\/ida\// { print "yes"; }'`" ; then
537 findmodule "cpqarray"
538 elif is_yes "`echo "$1" | awk '/\/dev\/cciss\// { print "yes"; }'`" ; then
539 findmodule "cciss"
540 elif is_yes "`echo "$1" | awk '/\/dev\/ataraid\// { print "yes"; }'`"; then
5d27006d 541 find_modules_ide
7c38b114 542 findmodule "ataraid"
d4a15d5f 543 ataraidmodules="`awk '/ataraid_hostadapter/ && ! /^[\t ]*#/ { print $3; }' $modulefile`"
7c38b114
AF
544 if -n "$ataraidmodules" ; then
545 # FIXME: think about modules compiled in kernel
546 echo "ERROR: ataraid_hostadapter alias not defined in $modulefile !"
547 echo "Please set it and run $0 again."
548 exit 1
549 fi
550 for n in $ataraidmodules; do
551 findmodule "$n"
552 done
553 # check to see if we need to set up a loopback filesystem
38228bb7 554 elif is_yes "`echo "$1" | awk -F/ '{print($3);}' | awk '/loop/ { print "yes"; }'`" ; then
7c38b114
AF
555 echo "Sorry, root on loop device isn't supported." 1>&2
556 exit 1
557 # TODO: rewrite for bsp and make nfs ready
558 if [ ! -x /sbin/losetup ]; then
559 echo "losetup is missing"
560 exit 1
561 fi
562 key="^# $(echo $1 | awk -F/ '{print($3);}' | tr '[a-z]' '[A-Z]'):"
563 if ! is_yes "`awk '/'$key'/ { print( "yes"); }' $fstab`" ; then
564 echo "The root filesystem is on a $1, but there is no magic entry in $fstab" 1>&2
565 echo "for this device. Consult the geninitrd man page for more information" 1>&2
566 exit 1
567 fi
568
569 line="`awk '/'$key'/ { print $0; }' $fstab`"
570 loopDev="$(echo $line | awk '{print $3}')"
571 loopFs="$(echo $line | awk '{print $4}')"
572 loopFile="$(echo $line | awk '{print $5}')"
573
574 BASICMODULES="$BASICMODULES -loop"
575 findmodule "-$loopFs"
576 BASICMODULES="$BASICMODULES -${loopFs}"
577 # don't have any clue, how is this supposed to work
71888053 578 elif [ -e "$1" ] && ls -l "$1" 2> /dev/null | awk '{if (/^b/) { if ($5 == "58,") { exit 0; } else { exit 1; } } else { exit 1; }}' || /sbin/lvm lvdisplay "$1" > /dev/null 2>&1 ; then
9f2d32ed
AM
579 if [ ! -f /sbin/initrd-lvm -o ! -x /sbin/lvdisplay -o ! -x /sbin/pvdisplay ] ; then
580 echo "ERROR: root on LVM but /sbin/initrd-lvm, /sbin/lvdisplay and /sbin/pvdisplay not found." >&2
cff3058d 581 echo "Please install lvm(2) and lvm(2)-initrd package and rerun $0." >&2
7c38b114
AF
582 exit 1
583 fi
e0c502bb
AM
584 if [ -z "$LVMTOOLSVERSION" ] ; then
585 LVMTOOLSVERSION=$(/sbin/initrd-lvm vgchange --version 2>/dev/null|head -n 1|awk '{gsub("vgchange: Logical Volume Manager ",NIL); gsub("LVM version: ",NIL); gsub(/\..*/,NIL); print $1}')
586 if [ -z "$LVMTOOLSVERSION" ] ; then
587 echo "ERROR: Can't determine LVM tools version. Please set LVMTOOLSVERSION" >&2
b78e6497 588 echo "and rerun $0." >&2
cff3058d 589 exit 1
77bcfc68
AF
590 fi
591 fi
decd277c
AM
592 if [ -z "$PVDEVICES" ] ; then
593 VGVOLUME=$(/sbin/lvdisplay -c "$1" 2> /dev/null | awk -F":" ' { print $2 } ')
594 PVDEVICES=$(/sbin/pvdisplay -c | awk -F":" -v vg="$VGVOLUME" ' BEGIN { devices="" } { if ($2 == vg) { devices = devices " " $1 } } END { print devices } ')
595 fi
7c38b114
AF
596 if [ -n "$PVDEVICES" ] ; then
597 for device in $PVDEVICES; do
598 find_modules_for $device
599 done
600 else
b78e6497
AF
601 echo "ERROR: I wasn't able to find PV (via lvdisplay and pvdisplay)." >&2
602 echo "You can try to set PVDEVICES in /etc/sysconfig/geninitrd." >&2
7c38b114
AF
603 exit 1
604 fi
e0c502bb 605 if [ "$LVMTOOLSVERSION" = "2" ]; then
93d781d1 606 findmodule "-dm-mod"
e0c502bb 607 elif [ "$LVMTOOLSVERSION" = "1" ]; then
93d781d1
AM
608 findmodule "-lvm"
609 findmodule "-lvm-mod"
610 else
e0c502bb 611 echo "ERROR: LVM version $LVMTOOLSVERSION is not supported yet." >&2
cff3058d 612 exit 1
93d781d1 613 fi
7c38b114
AF
614 uselvm="yes"
615 fi
616}
617
2a5bcca9
AM
618modules_install() {
619 modules="$1"
620
621 for mod in $modules; do
622 MODULEDIR="`my_dirname "$mod"`"
623 mkdir -p "$MNTIMAGE/lib/modules/$kernel/$MODULEDIR"
624 cp $verbose -a "/lib/modules/$kernel/$mod" "$MNTIMAGE/lib/modules/$kernel/$mod"
625 gunzip "$MNTIMAGE/lib/modules/$kernel/$mod" 2> /dev/null
626 done
627}
628
629modules_add_linuxrc() {
630 modules="$1"
631 linuxrc="$2"
632
633 for mod in $modules; do
634 MODULE2="`my_dirname "$mod"`"
635 NAME2=`basename "$mod" .gz`
636 MODULE2=$MODULE2/$NAME2
637 module="`echo $mod | awk -F/ '{ $0=$NF } /'$modext'.*$/ { gsub(/'$modext'.*/, NIL, $0); } { print $0; }'`"
638 options="`awk '{ if($1 == "options" && $2 == "'${module}'") { for(i=3;i<=NF;i++) printf("%s ",$i); }}' "$modulefile"`"
ffa1b198 639
7bdf23ec 640 sleep_module=$(echo "${module}" | awk ' { gsub("-", "_", $0) } { print $0; } ')
ffa1b198 641 sleep_var="$(eval echo \$MODULE_${sleep_module}_USLEEP)"
2a5bcca9
AM
642
643 if [ -n "$verbose" ]; then
8e598759 644 echo -n "Loading module [$module] "
2a5bcca9 645 if [ -n "$options" ] ; then
8e598759 646 echo -n "with options [$options]"
2a5bcca9 647 else
8e598759 648 echo -n "without options"
2a5bcca9 649 fi
8e598759 650 if [ -n "$sleep_var" ]; then
ba0552ce 651 echo " and $sleep_var usleep."
8e598759
AM
652 else
653 echo "."
654 fi
2a5bcca9
AM
655 fi
656 echo "$insmod /lib/modules/$kernel/$MODULE2 $options" >> "$linuxrc"
8e598759
AM
657 if [ -n "${sleep_var}" ]; then
658 echo "usleep $sleep_var" >> "$linuxrc"
659 fi
2a5bcca9
AM
660 done
661}
662
5dc785c7 663if [ -r /etc/sysconfig/geninitrd ] ; then
664 . /etc/sysconfig/geninitrd
665fi
666
5b71959c
AM
667if [ -r /etc/sysconfig/bootsplash ] ; then
668 . /etc/sysconfig/bootsplash
669fi
670
2baa76b4
AM
671if [ ! -x /bin/initrd-busybox ] ; then
672 echo "/bin/initrd-busybox is missing !"
fd2dc249 673 exit 1
5dc785c7 674fi
901afd79
AM
675case "$(uname -m)" in
676 ia64|amd64|x86_64|sparc64)
677 IMAGESIZE=3000
678 ;;
679 *)
680 IMAGESIZE=1500
681 ;;
682esac
683
bb529f94 684while [ $# -gt 0 ]; do
413878f8 685 case $1 in
6bd433bc
AF
686 --fstab=*)
687 fstab="`echo $1 | awk -F= '{print $2;}'`"
688 ;;
689 --fstab)
690 fstab="$2"
691 shift
413878f8 692 ;;
cd670d83
AF
693 --modules-conf=*)
694 modulefile="`echo $1 | awk -F= '{print $2;}'`"
695 ;;
57188d60 696 --modules-conf)
cd670d83
AF
697 modulefile="$2"
698 shift
699 ;;
6bd433bc
AF
700 --use-raidstart|--with-raidstart)
701 USERAIDSTART="yes"
702 ;;
703 --without-raidstart)
704 USERAIDSTART="no"
705 ;;
57227e0a
AF
706 --use-insmod-static|--with-insmod-static)
707 USEINSMODSTATIC="yes"
708 ;;
709 --without-insmod-static)
710 USEINSMODSTATIC="no"
711 ;;
5b71959c
AM
712 --without-bootsplash)
713 BOOT_SPLASH="no"
714 ;;
2c52f208
AM
715 --without-suspend)
716 USESUSPEND="no";
717 ;;
e0c502bb
AM
718 --lvmtoolsversion=|--lvmversion=)
719 LVMTOOLSVERSION="`echo $1 | awk -F= '{print $2;}'`"
77bcfc68 720 ;;
e0c502bb
AM
721 --lvmtoolsversion|--lvmversion)
722 LVMTOOLSVERSION="$2"
77bcfc68
AF
723 shift
724 ;;
1606e343
AM
725 --without-udev)
726 USE_UDEV=
727 ;;
882472ae
ER
728 --without-dmraid)
729 USE_DMRAID=
730 ;;
6bd433bc
AF
731 --with=*)
732 BASICMODULES="$BASICMODULES `echo $1 | awk -F= '{print $2;}'`"
733 ;;
734 --with)
735 BASICMODULES="$BASICMODULES $2"
736 shift
413878f8 737 ;;
bb529f94 738 --version)
413878f8 739 echo "geninitrd: version $VERSION"
740 exit 0
741 ;;
bb529f94 742 -v)
413878f8 743 verbose=-v
744 ;;
bb529f94 745 --nocompress)
413878f8 746 COMPRESS="no"
747 ;;
bb529f94 748 --ifneeded)
413878f8 749 ifneeded=1
750 ;;
bb529f94 751 -f)
413878f8 752 force=1
753 ;;
6bd433bc
AF
754 --preload=*)
755 PREMODS="$PREMODS `echo $1 | awk -F= '{print $2;}'`"
756 ;;
757 --preload)
72623c13 758 PREMODS="$PREMODS $2"
6bd433bc 759 shift
413878f8 760 ;;
2ad94d8a
AF
761 --fs=*)
762 echo "Warning: --fs option is obsoleted. Use --initrdfs instead" 1>&2
763 INITRDFS="`echo $1 | awk -F= '{print $2;}'`"
764 ;;
2ad94d8a
AF
765 --fs)
766 echo "Warning: --fs option is obsoleted. Use --initrdfs instead" 1>&2
767 INITRDFS="$2"
768 shift
cd670d83 769 ;;
6bd433bc
AF
770 --initrdfs=*)
771 INITRDFS="`echo $1 | awk -F= '{print $2;}'`"
772 ;;
fd2dc249 773 --initrdfs)
2ad94d8a 774 INITRDFS="$2"
413878f8 775 shift
776 ;;
bb529f94 777 --image-version)
413878f8 778 img_vers=yes
779 ;;
4f4e832d
AM
780 --ide-only-root)
781 ide_only_root="yes"
782 ;;
bb529f94 783 *)
413878f8 784 if [ -z "$target" ]; then
785 target="$1"
786 elif [ -z "$kernel" ]; then
787 kernel="$1"
788 else
789 usage
790 fi
791 ;;
792 esac
793
794 shift
bb529f94
JK
795done
796
06ac05d6 797if [ -z "$target" -o -z "$kernel" ]; then
413878f8 798 usage
06ac05d6
AF
799fi
800
0868f49f 801pack_version="`echo "$kernel"|awk -F. '{print sprintf("%03d%03d",$1,$2)}'`"
64497ebb 802pack_version_long="`echo "$kernel"|awk -F. '{print sprintf("%03d%03d%03d",$1,$2,$3)}'`"
0868f49f 803
48413b7f
AM
804if [ "x" = "x$INITRDFS" ] ; then
805 if [ "x" = "x$FS" ] ; then
806 # default value
566ad08b
AM
807# if [ "$pack_version" -ge "002005" ] ; then
808# INITRDFS="initramfs"
809# else
48413b7f 810 INITRDFS="rom"
566ad08b 811# fi
48413b7f
AM
812 else
813 echo "Warning: FS configuration options is obsoleted. Use INITRDFS instead" 1>&2
814 INITRDFS="$FS"
815 fi
816fi
817
1606e343 818if [ "$pack_version" -lt "002006" ] ; then
882472ae
ER
819 USE_UDEV=
820 USE_DMRAID=
1606e343
AM
821fi
822[ -z "$USE_UDEV" ] && UDEV_TMPFS=
823
0868f49f
AF
824if [ "$pack_version" -ge "002005" ] ; then
825 modext=".ko"
0b6536f5 826 insmod="insmod"
0868f49f
AF
827fi
828
57227e0a
AF
829if is_yes "$USEINSMODSTATIC" ; then
830 insmod="insmod.static"
b2e62ae1 831 INSMOD="/sbin/insmod.static"
f7c18703
AM
832 if [ "$pack_version" -lt "002005" -a -f /sbin/insmod.static.modutils ] ; then
833 INSMOD="/sbin/insmod.static.modutils"
b2e62ae1
AF
834 fi
835 if [ ! -f "$INSMOD" ] ; then
836 echo "insmod.static requested but /sbin/insmod.static not found !" >&2
837 exit 1
838 fi
57227e0a
AF
839fi
840
2ad94d8a 841case "$INITRDFS" in
8b1e4ac7 842 ext2)
f5d71bb2 843 if [ ! -x /sbin/mke2fs ]; then
a2c2980f 844 echo "/sbin/mke2fs is missing" 1>&2
8b1e4ac7
AF
845 exit 1
846 fi
847 ;;
848 rom)
849 if [ ! -x /sbin/genromfs ]; then
a2c2980f 850 echo "/sbin/genromfs is missing" 1>&2
8b1e4ac7
AF
851 exit 1
852 fi
853 ;;
854 cram)
855 if [ ! -x /sbin/mkcramfs ]; then
a2c2980f 856 echo "/sbin/mkcramfs is missing" 1>&2
8b1e4ac7
AF
857 exit 1
858 fi
c31050f3 859 ;;
48413b7f
AM
860 initramfs)
861 if [ ! -x /bin/cpio ]; then
862 echo "/bin/cpio is missing" 1>&2
863 exit 1
864 fi
865 if [ ! -x /usr/bin/find ]; then
866 echo "/usr/bin/find is missing" 1>&2
867 exit 1
868 fi
869 ;;
8b1e4ac7 870 *)
2ad94d8a 871 echo "Filesystem $INITRDFS on initrd is not supported" 1>&2
8b1e4ac7
AF
872 exit 1
873 ;;
874esac
bb529f94 875
bb529f94 876if [ -n "$img_vers" ]; then
413878f8 877 target="$target-$kernel"
bb529f94
JK
878fi
879
35164381 880if [ -z "$force" -a -f "$target" ]; then
a2c2980f 881 echo "$target already exists." 1>&2
413878f8 882 exit 1
bb529f94
JK
883fi
884
35164381 885if [ ! -d "/lib/modules/$kernel" ]; then
a2c2980f 886 echo "/lib/modules/$kernel is not a directory." 1>&2
413878f8 887 exit 1
bb529f94
JK
888fi
889
48762878 890if [ ! -f /proc/mounts ]; then
9e8defd1 891 echo "WARNING: /proc filesystem not mounted, may cause wrong results or failure." 1>&2
48762878 892fi
f121024f
AM
893
894if [ "$pack_version" -lt "002005" ]; then
895 modulefile=/etc/modules.conf
896 if [ ! -f "$modulefile" -a -f /etc/conf.modules ]; then
897 modulefile=/etc/conf.modules
898 fi
899else
900 modulefile=/etc/modprobe.conf
901fi
902
bb529f94 903for n in $PREMODS; do
35164381 904 findmodule "$n"
bb529f94
JK
905done
906
7c38b114
AF
907# allow forcing loading SCSI and/or IDE modules
908if is_yes "$ADDSCSI" ; then
909 find_modules_scsi
bb529f94
JK
910fi
911
7c38b114
AF
912if is_yes "$ADDIDE" ; then
913 find_modules_ide
cd670d83
AF
914fi
915
7c38b114 916find_root
cd670d83 917
4e1e40bd
AM
918org_rootdev="$rootdev1"
919
4e9eb79c 920find_modules_for "$rootdev1"
cd670d83 921
7c38b114 922findmodule "-$rootFs"
bb529f94 923
c31050f3 924for n in $BASICMODULES; do
7d2fc5eb 925 findmodule "$n"
bb529f94
JK
926done
927
928if [ -n "$ifneeded" -a -z "$MODULES" ]; then
7d2fc5eb 929 if [ -n "$verbose" ]; then
930 echo "No modules are needed -- not building initrd image."
931 fi
932 exit 0
bb529f94
JK
933fi
934
935if [ -n "$verbose" ]; then
7d2fc5eb 936 echo "Using modules: $MODULES"
bb529f94
JK
937fi
938
35164381
SZ
939MNTIMAGE="`mktemp -d /tmp/initrd.XXXXXX`"
940IMAGE="`mktemp -u /tmp/initrd.img-XXXXXX`"
941MNTPOINT="`mktemp -d /tmp/initrd.mnt-XXXXXX`"
942RCFILE="$MNTIMAGE/linuxrc"
bb529f94 943
35164381 944if [ -f "$MNTIMAGE" ]; then
c31050f3 945 echo "$MNTIMAGE already exists. Remove it and try again" 1>&2
7d2fc5eb 946 exit 1
bb529f94
JK
947fi
948
35164381 949if [ -f "$IMAGE" ]; then
a2c2980f 950 echo "$IMAGE already exists. Remove it and try again" 1>&2
7d2fc5eb 951 exit 1
bb529f94
JK
952fi
953
2ad94d8a 954if [ "$INITRDFS" = "ext2" ] ; then
35164381 955 dd if=/dev/zero of="$IMAGE" bs=1k count="$IMAGESIZE" 2> /dev/null
bb529f94 956
bb529f94
JK
957 # We have to "echo y |" so that it doesn't complain about $IMAGE not
958 # being a block device
35164381 959 echo y | mke2fs -F "$IMAGE" "$IMAGESIZE" >/dev/null 2>/dev/null
bb529f94 960
35164381
SZ
961 mkdir -p "$MNTPOINT"
962 mount -o loop -t ext2 "$IMAGE" "$MNTPOINT"
bb529f94 963else
35164381 964 mkdir -p "$MNTPOINT"
bb529f94
JK
965fi
966
8b1e4ac7 967
cff3058d 968mkdir -p "$MNTIMAGE"/{lib,bin,etc,dev,loopfs,var}
8b1e4ac7 969
bb529f94
JK
970
971# We don't need this directory, so let's save space
35164381 972rm -rf "$MNTPOINT"/lost+found
bb529f94 973
2a5bcca9 974modules_install "$MODULES"
bb529f94
JK
975
976# mknod'ing the devices instead of copying them works both with and
977# without devfs...
35164381 978mknod "$MNTIMAGE/dev/console" c 5 1
eb6e37ff
MM
979mknod "$MNTIMAGE/dev/null" c 1 3
980mknod "$MNTIMAGE/dev/zero" c 1 5
bb529f94 981
84670990 982s="$RCFILE"
566ad08b 983ln -s /linuxrc $MNTIMAGE/init
ef66f232 984
7543158a 985inst /bin/initrd-busybox "$MNTIMAGE/bin/sh"
ee3a3416 986ln -s sh "$MNTIMAGE/bin/busybox"
ef66f232 987
b2e62ae1
AF
988if is_yes "$USEINSMODSTATIC" ; then
989 inst "$INSMOD" $MNTIMAGE/bin/insmod.static
57227e0a
AF
990fi
991
84670990
MM
992cat > "$s" <<EOF
993#! /bin/sh
994
d70364fa 995set -x
84670990
MM
996EOF
997chmod 755 "$s"
c31050f3 998
2a5bcca9 999modules_add_linuxrc "$MODULES" "$s"
fd2dc249 1000
4e9eb79c 1001# TODO: rewrite for busybox
fd2dc249
AF
1002#if [ -n "$loopDev" ]; then
1003# if [ ! -d /initrd ]; then
1004# mkdir /initrd
1005# fi
1006#
1007# cp -a "$loopDev" "$MNTIMAGE/dev"
4e9eb79c 1008# cp -a "$rootdev1" "$MNTIMAGE/dev"
fd2dc249
AF
1009# echo "echo Mounting device containing loopback root filesystem" >> "$RCFILE"
1010# echo "mount -t $loopFs $loopDev /loopfs" >> "$RCFILE"
4e9eb79c
AM
1011# echo "echo Setting up loopback device $rootdev1" >> $RCFILE
1012# echo "losetup $rootdev1 /loopfs$loopFile" >> "$RCFILE"
fd2dc249 1013#fi
bb529f94 1014
2df2e995 1015initrd_gen_suspend() {
2a5bcca9
AM
1016 MODULES=""
1017 for mod in $SUSPENDMODS; do
f2479fd9 1018 is_yes "$BOOT_SPLASH" && [ "$mod" = "-suspend-text" ] && mod="-suspend_bootsplash"
2a5bcca9
AM
1019 findmodule "$mod"
1020 done
1021 modules_install "$MODULES"
2c52f208
AM
1022 mkdir -p $MNTIMAGE/sys
1023 mkdir -p $MNTIMAGE/proc
2b1a3707
AM
1024cat << EOF >> "$s"
1025mount -t proc none /proc
1026if [ "\$(awk ' /resume2=/ { print "yes"; } ' /proc/cmdline)" = "yes" ]; then
1027EOF
2a5bcca9 1028 modules_add_linuxrc "$MODULES" "$s"
2b1a3707
AM
1029cat << EOF >> "$s"
1030 echo > /proc/software_suspend/activate
1031fi
1032umount /proc
1033EOF
2df2e995 1034}
2c52f208 1035
1606e343
AM
1036initrd_gen_udev() {
1037 [ -n "$verbose" ] && echo "Setting up udev..."
1038 mkdir -p $MNTIMAGE/sbin
d152a29d 1039 mkdir -p $MNTIMAGE/proc
1606e343
AM
1040 mkdir -p $MNTIMAGE/etc/udev
1041
1042 inst /sbin/initrd-udev $MNTIMAGE/sbin/udev
1043 ln -s udev $MNTIMAGE/sbin/udevstart
1044 inst /etc/udev/udev.conf $MNTIMAGE/etc/udev/udev.conf
1045
1046 ln -s udev $MNTIMAGE/sbin/hotplug
1047
1048 if is_yes "$USE_UDEV"; then
1049 if is_yes "$UDEV_TMPFS"; then
882472ae 1050 cat >> "$s" <<-EOF
1606e343
AM
1051echo Creating /dev
1052mount -o mode=0755 -t tmpfs none /dev
1053mknod /dev/console c 5 1
1054mknod /dev/null c 1 3
1055mknod /dev/zero c 1 5
1056mkdir /dev/pts
1057mkdir /dev/shm
1058EOF
1059 fi
882472ae 1060 cat >> "$s" <<-EOF
b161812e 1061mount -t proc none /proc
1606e343
AM
1062echo Starting udev
1063/sbin/udevstart
1064echo -n "/sbin/hotplug" > /proc/sys/kernel/hotplug
b161812e 1065umount /proc
1606e343
AM
1066EOF
1067 fi
1068}
1069
882472ae
ER
1070initrd_gen_dmraid() {
1071 if [ ! -x /sbin/dmraid-initrd ] ; then
1072 echo "/sbin/dmraid-initrd is missing missing !"
1073 exit 1
1074 fi
1075
1076 if [ ! -x $MNTIMAGE/sbin/udev ]; then
1077 echo "udev is needed on target initrd for dmraid to work!"
1078 exit 1
1079 fi
1080
1081 mkdir -p "$MNTIMAGE/sbin"
1082 inst /sbin/dmraid-initrd $MNTIMAGE/sbin/dmraid
1083cat <<-EOF >> "$s"
1084 mount -t proc none /proc
1085 mount -t sysfs none /sys
1086 # 2 secs was enough for my system to initialize. but really this is udev issue?
1087 usleep 2000000
1088 /sbin/dmraid -ay -i
1089 umount /sys
1090 umount /proc
1091EOF
1092}
1093
1094
2df2e995 1095initrd_gen_softraid() {
4e9eb79c 1096 [ -n "$verbose" ] && echo "Setting up mdadm..."
8c4ce35e 1097
6cca3165
AM
1098 if [ ! -x /sbin/mdadm -o ! -x /sbin/initrd-mdassemble ] ; then
1099 echo "/sbin/mdadm or /sbin/initrd-mdassemble is missing !"
8c4ce35e 1100 exit 1
d3fa6ec7 1101 fi
994eb509 1102
6cca3165
AM
1103 inst /sbin/initrd-mdassemble "$MNTIMAGE/bin/mdassemble"
1104
4e9eb79c 1105 # LVM on RAID case
6cca3165
AM
1106 dev_list_extra=$(awk '/^DEVICE / { for (i=2; i<=NF; i++) { printf "%s ", $i; }; } ' /etc/mdadm.conf)
1107 for ex_dev in $dev_list_extra; do
1108 echo "DEVICE $ex_dev" >> "$MNTIMAGE/etc/mdadm.conf"
1109 done
4e9eb79c
AM
1110 do_md0=1
1111 for nr in `seq 1 $rootdev_nr`; do
1112 eval cr_rootdev="\$rootdev${nr}"
1113 eval cr_dev_list="\$dev_list${nr}"
1114 [ -n "$verbose" ] && echo "Setting up array ($cr_rootdev = $cr_dev_list)"
1115
1116 [ "$cr_rootdev" = "/dev/md0" ] && do_md0=0
1117
6cca3165
AM
1118 echo "DEVICE $cr_dev_list" >> "$MNTIMAGE/etc/mdadm.conf"
1119 cr_dev_list_md="$(echo "$cr_dev_list" | xargs | awk ' { gsub(/ +/,",",$0); print $0; }')"
1120 cr_md_conf=$(/sbin/mdadm --detail --brief --config=/etc/mdadm.conf $cr_rootdev)
1121 if [ -n "$cr_md_conf" ]; then
1122 echo "$cr_md_conf" >> "$MNTIMAGE/etc/mdadm.conf"
1123 else
1124 echo "ARRAY $cr_rootdev devices=$cr_dev_list_md" >> "$MNTIMAGE/etc/mdadm.conf"
1125 fi
1126
1127 for f in $cr_dev_list $cr_rootdev $dev_list_extra; do
ef66f232 1128 # mkdir in case of devfs name
02266c5e 1129 mkdir -p $MNTIMAGE/`my_dirname $f`
6cca3165 1130 [ -e "$MNTIMAGE/$f" ] && continue
ef66f232
MM
1131 [ -n "$verbose" ] && echo "copying $f"
1132 # this works fine with and without devfs
1133 cp -HR $f $MNTIMAGE/$f
4e9eb79c 1134 done
ef66f232 1135 done
4e9eb79c 1136
6cca3165 1137 echo "mdassemble" >> "$s"
33d24e12 1138
4e9eb79c
AM
1139 # needed to determine md-version
1140 if [ "$do_md0" -eq 1 ] ; then
1141 mknod $MNTIMAGE/dev/md0 b 9 0
1142 fi
2df2e995 1143}
2968c9dd 1144
2df2e995 1145initrd_gen_nfs() {
51447ab3
AM
1146 # use root=/dev/ram0 init=/linuxrc when starting kernel or you will
1147 # have problems like init(XX) being child process of swapper(1).
6fe19d5b 1148 [ -n "$verbose" ] && echo "Adding rootfs on NFS support to initrd (dhcp)"
53623c90 1149 mknod "$MNTIMAGE/dev/urandom" c 1 8
5c4cec75 1150 mkdir "$MNTIMAGE/newroot"
5c4cec75
AM
1151 echo "ifconfig lo 127.0.0.1 up" >> "$s"
1152 echo "route add -net 127.0.0.0 netmask 255.0.0.0 lo" >> "$s"
1153 echo "ifconfig eth0 0.0.0.0 up" >> "$s"
c52ba2fe 1154 echo "udhcpc -i eth0 -f -q -s /bin/setdhcp" >> "$s"
5c4cec75
AM
1155 cat << EOF > "$MNTIMAGE/bin/setdhcp"
1156#!/bin/sh
1157[ "\$1" != "bound" ] && exit
1158[ -n "\$broadcast" ] && BROADCAST="broadcast \$broadcast"
1159[ -n "\$subnet" ] && NETMASK="netmask \$subnet"
1160set -x
1161ifconfig \$interface \$ip \$BROADCAST \$NETMASK up
1162set +x
1163if [ -n "\$router" ]; then
1164 for r in \$router; do
1165 set -x
1166 route add default gw \$r dev \$interface
1167 set +x
1168 done
1169fi
1170if [ -n "\$rootpath" ]; then
1171 set -x
cc64642a 1172 mount -n -t nfs -o ro,nolock,posix,tcp,wsize=8192,rsize=8192 \$rootpath /newroot
5c4cec75
AM
1173 set +x
1174else
1175 set +x
1176 echo "Missing rootpath in what DHCP server sent to us. Failing..."
1177 echo "All seen variables are listed below:"
1178 set
1179 set -x
1180fi
1181EOF
1182 chmod 755 "$MNTIMAGE/bin/setdhcp"
1183 echo "cd /newroot" >> "$s"
c52ba2fe 1184 echo "pivot_root . initrd" >> "$s"
d4a8e40e 1185 echo "[ -x /sbin/chroot ] && exec /sbin/chroot . /sbin/init -i < dev/console > dev/console 2>&1" >> "$s"
c52ba2fe 1186 echo "exec /usr/sbin/chroot . /sbin/init -i < dev/console > dev/console 2>&1" >> "$s"
2df2e995 1187}
6fe19d5b 1188
2df2e995 1189initrd_gen_lvm() {
7c38b114
AF
1190 [ -n "$verbose" ] && echo "Adding LVM support to initrd"
1191 inst /sbin/initrd-lvm $MNTIMAGE/bin/lvm
f34c76a3
AM
1192 mkdir -p $MNTIMAGE/etc
1193 mkdir -p $MNTIMAGE/tmp
1194 mkdir -p $MNTIMAGE/proc
4e1e40bd 1195 mkdir -p $MNTIMAGE/newroot
afaefcb5
AM
1196 if ! is_yes "$USE_UDEV"; then
1197 mkdir -p $MNTIMAGE/dev/mapper
1198 mknod $MNTIMAGE/dev/mapper/control c 10 63
b007399c 1199 for device in $PVDEVICES; do
7bdf23ec 1200 cp -HR $device $MNTIMAGE/dev/
b007399c 1201 done
afaefcb5 1202 fi
84670990 1203 echo "mount -t proc none /proc" >> "$s"
b78e6497 1204 echo "mount -t tmpfs none /tmp" >> "$s"
e0c502bb 1205 if [ "$LVMTOOLSVERSION" = "1" ] ; then
cff3058d 1206 echo "lvm vgscan -T" >> "$s"
90b5b05a 1207 echo "lvm vgchange -T -a y $VGVOLUME" >> "$s"
4e1e40bd
AM
1208 echo "umount /tmp" >> "$s"
1209 # fail to umount
1210 echo "umount /dev" >> "$s"
1211 echo "umount /proc" >> "$s"
cff3058d 1212 else
f34c76a3
AM
1213 echo "cat /etc/lvm.conf > /tmp/lvm.conf" >> "$s"
1214 echo "global {" > "$MNTIMAGE/etc/lvm.conf"
1215 echo " locking_type = 0" >> "$MNTIMAGE/etc/lvm.conf"
1216 echo " locking_dir = \"/tmp\"" >> "$MNTIMAGE/etc/lvm.conf"
1217 echo "}" >> "$MNTIMAGE/etc/lvm.conf"
1218 echo "devices {" >> "$MNTIMAGE/etc/lvm.conf"
8fb0a4d2 1219 echo " sysfs_scan=0" >> "$MNTIMAGE/etc/lvm.conf"
f34c76a3
AM
1220 if is_yes "$raidfound"; then
1221 echo " md_component_detection = 1" >> "$MNTIMAGE/etc/lvm.conf"
1222 fi
1223 lvm dumpconfig | awk '/filter=/' >> "$MNTIMAGE/etc/lvm.conf"
1224 echo "}" >> "$MNTIMAGE/etc/lvm.conf"
4e1e40bd 1225 echo "LVM_SYSTEM_DIR=/tmp lvm vgscan --ignorelockingfailure" >> "$s"
90b5b05a 1226 echo "LVM_SYSTEM_DIR=/tmp lvm vgchange --ignorelockingfailure -a y $VGVOLUME" >> "$s"
d152a29d 1227 echo "LVM_SYSTEM_DIR=/tmp lvm vgscan --ignorelockingfailure --mknodes" >> "$s"
91ed0242
AM
1228 # Find out major/minor
1229 echo "majmin=\"\`LVM_SYSTEM_DIR=/tmp lvm lvdisplay --ignorelockingfailure -c $org_rootdev\`\"" >> "$s"
1230 echo "majmin=\"\${majmin#*/}\"" >> "$s"
1231 echo "majmin=\"\${majmin#*:*:*:*:*:*:*:*:*:*:*:*}\"" >> "$s"
1232 echo "major=\"\${majmin%:*}\"" >> "$s"
1233 echo "minor=\"\${majmin#*:}\"" >> "$s"
1234 # Pass it to kernel
1235 echo "val=\$((256 * \$major + \$minor))" >> "$s"
1236 echo "echo \$val > /proc/sys/kernel/real-root-dev" >> "$s"
4e1e40bd 1237 echo "umount /tmp" >> "$s"
4e1e40bd 1238 echo "umount /proc" >> "$s"
cff3058d 1239 fi
2df2e995
AM
1240}
1241
2b1a3707
AM
1242initrd_gen_procdata() {
1243 [ -n "$verbose" ] && echo "Adding rootfs finding based on root= option support."
1244 mkdir -p $MNTIMAGE/proc
1245cat << EOF >> "$s"
1246set +x
1247mount -t proc none /proc
1248root="\$(busybox awk ' /root=\/dev\// { gsub(/.*root=\/dev\//,NIL,\$0); gsub(/ .*/,NIL,\$0); print \$0; } ' /proc/cmdline)"
1249if [ -n "\$root" ]; then
1250 rootnr="\$(busybox awk -v root="\$root" ' { if (\$4 == root) { print 256*\$1+\$2; } } ' /proc/partitions)"
1251 if [ -n "\$rootnr" ]; then
1252 echo "\$rootnr" > /proc/sys/kernel/real-root-dev
1253 fi
1254fi
9d949203 1255umount /proc
2b1a3707
AM
1256set -x
1257EOF
1258}
1259
2df2e995 1260# main generation
1606e343
AM
1261
1262if is_yes "$USE_UDEV"; then
1263 initrd_gen_udev
1264fi
1265
2df2e995
AM
1266if is_yes "$USESUSPEND"; then
1267 initrd_gen_suspend
1268fi
1269
882472ae
ER
1270if is_yes "$USE_DMRAID"; then
1271 initrd_gen_dmraid
1272fi
1273
2df2e995
AM
1274if is_yes "$usenfs" ; then
1275 initrd_gen_nfs
1276elif is_yes "$USERAIDSTART" && is_yes "$raidfound" ; then
1277 initrd_gen_softraid
1278 if is_yes "$uselvm" ; then
1279 initrd_gen_lvm
bfea009a
AM
1280 else
1281 initrd_gen_procdata
2df2e995
AM
1282 fi
1283elif is_yes "$uselvm" ; then
1284 initrd_gen_lvm
2b1a3707
AM
1285else
1286 initrd_gen_procdata
7c38b114
AF
1287fi
1288
35164381 1289chmod +x "$RCFILE"
bb529f94 1290
35164381 1291(cd "$MNTIMAGE"; tar cf - .) | (cd "$MNTPOINT"; tar xf -)
bb529f94 1292
2ad94d8a 1293case "$INITRDFS" in
8b1e4ac7 1294 ext2)
35164381 1295 umount "$IMAGE"
8b1e4ac7
AF
1296 ;;
1297 rom)
1298 genromfs -f "$IMAGE" -d "$MNTPOINT" -V "PLD initrd for kernel $kernel"
1299 ;;
1300 cram)
1301 mkcramfs "$MNTPOINT" "$IMAGE"
8b1e4ac7 1302 ;;
48413b7f 1303 initramfs)
566ad08b 1304 (cd $MNTPOINT ; find . | cpio -H newc -o > "$IMAGE")
48413b7f 1305 ;;
8b1e4ac7 1306 *)
2ad94d8a 1307 echo "Filesystem $INITRDFS not supported by $0";
c31050f3 1308esac
bb529f94
JK
1309
1310if is_yes "$COMPRESS" ; then
7d2fc5eb 1311 gzip -9 < "$IMAGE" > "$target"
bb529f94 1312else
7d2fc5eb 1313 cp -a "$IMAGE" "$target"
bb529f94 1314fi
5b71959c
AM
1315
1316if is_yes "$BOOT_SPLASH"; then
1317 if [ ! -x /bin/splash.bin ]; then
1318 echo "Failed to execute /bin/splash.bin. Is bootsplash package installed?" 1>&2
1319 elif [ -z "$THEME" ]; then
1320 echo "Please configure your /etc/sysconfig/bootsplash first." 1>&2
1321 echo "Generating bootsplashes skipped." 1>&2
1322 else
350cd2f9 1323 if [ -n "$BOOT_SPLASH_RESOLUTIONS" ]; then
5b71959c
AM
1324 for res in $BOOT_SPLASH_RESOLUTIONS; do
1325 if [ -f "/etc/bootsplash/themes/$THEME/config/bootsplash-$res.cfg" ]; then
1326 /bin/splash.bin -s -f "/etc/bootsplash/themes/$THEME/config/bootsplash-$res.cfg" >> "$target" && \
1327 [ -n "$verbose" ] && echo "Added $res $THEME theme to initrd."
1328 else
1329 echo "/etc/bootsplash/themes/$THEME/config/bootsplash-$res.cfg doesn't exist, skipped" 1>&2
1330 fi
1331 done
350cd2f9
AM
1332 else
1333 echo "No BOOT_SPLASH_RESOLUTIONS specified in /etc/sysconfig/bootsplash." 1>&2
1334 echo "Not adding bootsplash to initrd." 1>&2
1335 fi
5b71959c
AM
1336 fi
1337fi
1338
35164381 1339rm -rf "$MNTIMAGE" "$MNTPOINT" "$IMAGE"
This page took 0.264312 seconds and 4 git commands to generate.