]>
Commit | Line | Data |
---|---|---|
bb529f94 JK |
1 | #!/bin/sh |
2 | ||
3 | # geninitrd | |
4 | # | |
5 | # by Jacek Konieczny <jajcus@pld.org.pl> | |
6 | # | |
413878f8 | 7 | # based on mkinitrd from RedHat |
c31050f3 | 8 | |
78ba9381 | 9 | RCSID='$Id: geninitrd,v 2.24 2002/11/27 17:56:24 wiget Exp $' |
bb529f94 JK |
10 | PATH=/sbin:$PATH |
11 | export PATH | |
12 | ||
2b649ae0 | 13 | VERSION="`echo "$RCSID"|awk '{print $3}'`" |
bb529f94 JK |
14 | |
15 | . /etc/rc.d/init.d/functions | |
16 | ||
17 | COMPRESS="yes" | |
2ad94d8a AF |
18 | # INITRDFS is set later (catch obsoleted FS option) |
19 | #INITRDFS="rom" | |
6bd433bc | 20 | USERAIDSTART="yes" |
7c38b114 | 21 | uselvm="no" |
10c3df06 MM |
22 | # it should be safe to remove scsi_mod from here, but I'm not sure... |
23 | PRESCSIMODS="-scsi_mod unknown -sd_mod" | |
24 | PREIDEMODS="-ide-probe -ide-probe-mod -ide-disk" | |
bb529f94 JK |
25 | target="" |
26 | kernel="" | |
27 | force="" | |
28 | verbose="" | |
29 | MODULES="" | |
30 | img_vers="" | |
7c38b114 AF |
31 | modulefile="/etc/modules.conf" |
32 | raidtab="/etc/raidtab" | |
bb529f94 JK |
33 | fstab="/etc/fstab" |
34 | ||
35 | usage () { | |
a2c2980f | 36 | echo "usage: `basename $0` [--version] [-v] [-f] [--ifneeded] [--preload <module>]" 1>&2 |
c31050f3 | 37 | echo " [--with=<module>] [--image-version] [--fstab=<fstab>] [--nocompress]" 1>&2 |
fd2dc249 | 38 | echo " [--initrdfs=rom|ext2|cram] [--modules-conf=<modules.conf>]" 1>&2 |
6bd433bc | 39 | echo " [--with-raidstart] [--without-raidstart]" 1>&2 |
a2c2980f AF |
40 | echo " <initrd-image> <kernel-version>" 1>&2 |
41 | echo " (ex: `basename $0` /boot/initrd-2.2.5-15.img 2.2.5-15)" 1>&2 | |
7d2fc5eb | 42 | exit 1 |
bb529f94 JK |
43 | } |
44 | ||
aa69da6e | 45 | |
10c3df06 MM |
46 | my_dirname() { |
47 | echo $1|awk -F/ '{print substr($0, 0, length($0) - length($NF));}' | |
48 | } | |
49 | ||
50 | find_depmod () { | |
51 | typeset mods module f level depfile first | |
52 | ||
53 | depfile=/lib/modules/$kernel/modules.dep | |
f6de9380 MM |
54 | |
55 | if test -f $depfile ; then | |
56 | : ok | |
57 | else | |
c83257bc AF |
58 | echo "Error: no $depfile ! Run depmod and rerun geninitrd." 1>&2 |
59 | exit 1 | |
f6de9380 MM |
60 | fi |
61 | ||
4fd11db9 | 62 | # prepend / if no path given, append .o.gz if not given, |
10c3df06 | 63 | # quote / |
3b00e899 | 64 | origmodule="$2" |
10c3df06 MM |
65 | module=$(echo "$2" | \ |
66 | awk '/\// {print;next} {print "/" $0}' | \ | |
4fd11db9 | 67 | awk '/\./ {print;next} {print $0 ".o.gz"}' | |
10c3df06 MM |
68 | awk '{gsub("/","\\/");print}') |
69 | mods=$(awk ' | |
70 | BEGIN { here = 0 } | |
71 | /'"$module"':(.*)/ { gsub(/:/," "); gsub(/\\/," "); print; here = 1; next } | |
72 | /:/ { here = 0 } | |
73 | /(.*)/ { gsub(/\\/," "); if (here) print } | |
4fd11db9 AF |
74 | ' $depfile | xargs) |
75 | ||
76 | # fallback to .o | |
77 | if [ "$mods" = "" ] ; then | |
78 | module=$(echo "$module" | \ | |
79 | awk '{gsub("\.o\.gz$","\.o",$0);print}') | |
80 | fi | |
81 | mods=$(awk ' | |
82 | BEGIN { here = 0 } | |
83 | /'"$module"':(.*)/ { gsub(/:/," "); gsub(/\\/," "); print; here = 1; next } | |
84 | /:/ { here = 0 } | |
85 | /(.*)/ { gsub(/\\/," "); if (here) print } | |
10c3df06 MM |
86 | ' $depfile | xargs) |
87 | ||
88 | if [ "$mods" = "" ] ; then | |
89 | if [ "$1" != silent ] ; then | |
3b00e899 | 90 | echo "$origmodule: module not found in $depfile" 1>&2 |
10c3df06 | 91 | fi |
fd2dc249 AF |
92 | if ! is_no "$EXIT_IF_MISSING" ; then |
93 | exit 1 | |
94 | else | |
3b00e899 | 95 | echo "If $origmodule isn't compiled in kernel then this initrd may not start your system". 1>&2 |
fd2dc249 | 96 | fi |
10c3df06 MM |
97 | fi |
98 | ||
99 | level=$3 | |
100 | if [ "$level" = "" ] ; then | |
101 | level=0 | |
102 | fi | |
103 | level=$(awk "BEGIN{print $level + 1}") | |
104 | if [ $level -gt 20 ] ; then | |
3b00e899 | 105 | echo "$origmodule: cycle in $depfile" 1>&2 |
10c3df06 MM |
106 | exit 1 |
107 | fi | |
108 | ||
109 | first= | |
110 | for f in $mods ; do | |
111 | if [ "$first" = "" ] ; then | |
112 | first=$f | |
413878f8 | 113 | else |
10c3df06 | 114 | find_depmod $1 $f $level |
9c9f7cdb | 115 | fi |
aa69da6e | 116 | done |
10c3df06 MM |
117 | |
118 | echo $first | |
aa69da6e | 119 | } |
120 | ||
10c3df06 MM |
121 | addmodule() { |
122 | fmPath=$1 | |
123 | skiperrors=$2 | |
124 | ||
125 | if [ ! -f "/lib/modules/$kernel/$fmPath" ]; then | |
126 | if [ -n "$skiperrors" ]; then | |
127 | return | |
128 | fi | |
129 | ||
130 | echo "module $fmPath present in modules.dep, but not in filesystem (kernel = $kernel)" 1>&2 | |
131 | exit 1 | |
132 | fi | |
133 | ||
134 | # only need to add each module once | |
135 | # quote / | |
136 | tmpFmPath=$(echo $fmPath | awk '{gsub(/\//,"\\/");print}') | |
137 | if echo "$MODULES" | awk '/'"$tmpFmPath"'/ {exit 1}' ; then | |
138 | MODULES="$MODULES $fmPath" | |
139 | fi | |
81de8443 AF |
140 | } |
141 | ||
bb529f94 | 142 | findmodule() { |
413878f8 | 143 | skiperrors="" |
144 | modName=$1 | |
10c3df06 | 145 | |
413878f8 | 146 | if [ "$(echo $modName | awk '{print(substr($0,1,1));}')" = "-" ]; then |
147 | skiperrors=1 | |
148 | modName="$(echo $modName | awk '{print(substr($0,2));}')" | |
149 | fi | |
bb529f94 | 150 | |
10c3df06 | 151 | # what's that? |
413878f8 | 152 | if [ "$modName" = "pluto" ]; then |
153 | findmodule fc4 | |
154 | findmodule soc | |
155 | fi | |
156 | if [ "$modName" = "fcal" ]; then | |
157 | findmodule fc4 | |
158 | findmodule socal | |
159 | fi | |
bb529f94 | 160 | |
10c3df06 MM |
161 | if [ -n "$skiperrors" ]; then |
162 | allModulesToFind=`find_depmod silent $modName` | |
163 | else | |
164 | allModulesToFind=`find_depmod normal $modName` | |
165 | if [ $? != 0 ] ; then | |
166 | exit 1 | |
413878f8 | 167 | fi |
413878f8 | 168 | fi |
10c3df06 MM |
169 | |
170 | for mod in $allModulesToFind ; do | |
171 | mod=$(echo $mod | \ | |
172 | awk '{sub(/^\/lib\/modules\/[^\/]*\//,"");print}') | |
173 | addmodule $mod "$skiperrors" | |
174 | done | |
bb529f94 JK |
175 | } |
176 | ||
177 | inst() { | |
413878f8 | 178 | if [ "$#" != "2" ];then |
179 | echo "usage: inst <file> <destination>" | |
180 | return | |
c31050f3 | 181 | fi |
413878f8 | 182 | [ -n "$verbose" ] && echo "$1 -> $2" |
183 | cp "$1" "$2" | |
bb529f94 JK |
184 | } |
185 | ||
a2c2980f AF |
186 | get_label_ext2 () { |
187 | /sbin/e2label $1 2> /dev/null | |
188 | } | |
189 | ||
190 | get_uuid_ext2 () { | |
c31050f3 | 191 | /sbin/tune2fs -l $1 2> /dev/null | awk -F: '/UUID:/ {gsub(" ",""); print $2}' |
a2c2980f AF |
192 | } |
193 | ||
194 | get_label_xfs () { | |
3b9c8219 | 195 | /usr/sbin/xfs_db -x -p xfs_admin -c label -r "$1"|awk -F= '{sub("^\"","", $2); sub("\"$", "", $2); print $2}' |
c31050f3 | 196 | |
a2c2980f AF |
197 | } |
198 | ||
199 | get_uuid_xfs () { | |
3b9c8219 | 200 | /usr/sbin/xfs_db -x -p xfs_admin -c uuid -r "$1"|awk -F= '{print $2}' |
a2c2980f AF |
201 | } |
202 | ||
c31050f3 | 203 | find_root() { |
a2c2980f AF |
204 | eval `awk '/^[\t ]*#/ {next} {if ( $2 == "/" ) {print "rootdev=\"" $1 "\"\nrootFs=\"" $3 "\""}}' $fstab` |
205 | case $rootdev in | |
206 | LABEL=*) | |
4fd11db9 AF |
207 | if [ -x /sbin/findfs -a \( "$rootFs." = "ext2." -o "$rootFs." = "ext3." \) ] ; then |
208 | rootdev2="`/sbin/findfs $rootdev 2>/dev/null`" | |
209 | if [ -n "$rootdev2" ] ; then | |
210 | rootdev=$rootdev2 | |
211 | rootdev_found=1 | |
a2c2980f | 212 | fi |
4fd11db9 AF |
213 | fi |
214 | if [ "$rootdev_found." != "1." ] ; then | |
215 | case $rootFs in | |
216 | ext2|ext3) | |
217 | if [ ! -x /sbin/e2label ] ; then | |
218 | echo "/sbin/e2label is missing" 1>&2 | |
219 | exit 1 | |
220 | fi | |
221 | get_label="get_label_ext2" | |
222 | ;; | |
223 | xfs) | |
224 | if [ ! -x /usr/sbin/xfs_db ] ; then | |
225 | echo "/usr/sbin/xfs_db is missing" 1>&2 | |
226 | exit 1 | |
227 | fi | |
228 | get_label="get_label_xfs" | |
229 | ;; | |
230 | *) | |
231 | echo "LABEL on $rootFs in not supported by geninitrd" 1>&2 | |
232 | exit 1 | |
233 | ;; | |
234 | esac | |
235 | if [ ! -r /proc/partitions ] ; then | |
236 | echo '/proc/partitions is not readable'; 1>&2 | |
3b9c8219 AF |
237 | exit 1 |
238 | fi | |
4fd11db9 AF |
239 | label=${rootdev#"LABEL="} |
240 | for dev in `awk 'BEGIN {getline;getline} {print "/dev/" $4}' /proc/partitions` ; do | |
241 | if [ -r $dev ] && [ "$label" = "`$get_label $dev`" ] ; then | |
242 | if [ -n "$verbose" ] ; then | |
243 | echo "Using $dev as device for rootfs" | |
244 | fi | |
245 | rootdev=$dev | |
246 | rootdev_found=1 | |
247 | break | |
a2c2980f | 248 | fi |
4fd11db9 AF |
249 | done |
250 | if [ "$rootdev_found." != "1." ] ; then | |
251 | echo "geninitrd can't find real device for LABEL=$label" 1>&2 | |
252 | exit 1 | |
253 | fi | |
a2c2980f AF |
254 | fi |
255 | ;; | |
256 | UUID=*) | |
4fd11db9 AF |
257 | if [ -x /sbin/findfs -a \( "$rootFs." = "ext2." -o "$rootFs." = "ext3." \) ] ; then |
258 | rootdev2="`/sbin/findfs $rootdev 2>/dev/null`" | |
259 | if [ -n "$rootdev2" ] ; then | |
260 | rootdev=$rootdev2 | |
261 | rootdev_found=1 | |
a2c2980f | 262 | fi |
4fd11db9 AF |
263 | fi |
264 | if [ "$rootdev_found." != "1." ] ; then | |
265 | case $rootFs in | |
266 | ext2|ext3) | |
267 | if [ ! -x /sbin/tune2fs ] ; then | |
268 | echo "/sbin/tune2fs is missing" 1>&2 | |
269 | exit 1 | |
270 | fi | |
271 | get_uuid="get_uuid_ext2" | |
272 | ;; | |
273 | xfs) | |
274 | if [ ! -x /usr/sbin/xfs_db ] ; then | |
275 | echo "/usr/sbin/xfs_db is missing" 1>&2 | |
276 | exit 1 | |
277 | fi | |
278 | get_label="get_uuid_xfs" | |
279 | ;; | |
280 | *) | |
281 | echo "UUID on $rootFs in not supported by geninitrd" 1>&2 | |
282 | exit 1 | |
283 | ;; | |
284 | esac | |
285 | if [ ! -r /proc/partitions ] ; then | |
286 | echo '/proc/partitions is not readable'; 1>&2 | |
3b9c8219 AF |
287 | exit 1 |
288 | fi | |
4fd11db9 AF |
289 | uuid=${rootdev#"UUID="} |
290 | for dev in `awk 'BEGIN {getline;getline} {print "/dev/" $4}' /proc/partitions` ; do | |
291 | if [ -r $dev ] && [ "$uuid" = "`$get_uuid $dev`" ] ; then | |
292 | if [ -n "$verbose" ] ; then | |
293 | echo "Using $dev as device for rootfs" | |
294 | fi | |
295 | rootdev=$dev | |
296 | rootdev_found=1 | |
297 | break | |
a2c2980f | 298 | fi |
4fd11db9 AF |
299 | done |
300 | if [ "$rootdev_found" != 1 ] ; then | |
301 | echo "geninitrd can't find real device for UUID=$uuid" 1>&2 | |
302 | exit 1 | |
303 | fi | |
a2c2980f AF |
304 | fi |
305 | ;; | |
306 | esac | |
307 | ||
308 | } | |
bb529f94 | 309 | |
7c38b114 AF |
310 | find_modules_softraid() { |
311 | eval `awk -v rootdev="$1" 'BEGIN { | |
312 | found="no"; | |
313 | dev_list=""; | |
314 | } | |
315 | ||
316 | { | |
317 | gsub("\t"," "); | |
318 | gsub(" +", " "); | |
319 | gsub("^ ",""); | |
320 | if (/^[\t ]*#/) | |
321 | next; | |
322 | if (/^raiddev/) { | |
323 | if ($2 == rootdev) { | |
324 | found="yes"; | |
325 | } else { | |
326 | if (found == "yes") { | |
327 | exit 0; | |
328 | }; | |
329 | }; | |
330 | }; | |
331 | if (found == "yes") { | |
332 | if ($1 == "device") { | |
333 | dev_list = dev_list " " $2; | |
334 | }; | |
335 | if ($1 == "raid-level") { | |
336 | raidlevel=$2; | |
337 | } | |
338 | }; | |
339 | } | |
340 | ||
341 | END { | |
342 | print "raidfound=" found "\nraidlevel=" raidlevel "\ndev_list=\"" dev_list "\"\n"; | |
343 | }' $raidtab ` | |
344 | if is_yes "$raidfound" ; then | |
345 | case "$raidlevel" in | |
346 | [0145]) | |
347 | findmodule "raid$raidlevel" | |
348 | ;; | |
349 | linear) | |
350 | findmodule "linear" | |
351 | ;; | |
352 | *) | |
353 | echo "raid level $number (in $raidtab) not recognized" 1>&2 | |
354 | ;; | |
355 | esac | |
356 | fi | |
357 | for device in $dev_list; do | |
358 | find_modules_for $device | |
359 | done | |
360 | } | |
361 | ||
362 | find_modules_scsi() { | |
363 | for n in $PRESCSIMODS; do | |
364 | if [ "X$n" = "Xunknown" ] ; then | |
365 | if [ ! -f "$modulefile" ]; then | |
366 | modulefile=/etc/conf.modules | |
367 | fi | |
368 | if [ -f "$modulefile" ]; then | |
369 | scsimodules="`awk '/scsi_hostadapter/ && ! /^[\t ]*#/ { print $3; }' $modulefile| LC_ALL=C sort -u`" | |
370 | for n in $scsimodules; do | |
371 | # for now allow scsi modules to come from anywhere. There are some | |
372 | # RAID controllers with drivers in block | |
373 | findmodule "$n" | |
374 | done | |
375 | fi | |
376 | else | |
377 | findmodule "$n" | |
378 | fi | |
379 | done | |
380 | } | |
381 | ||
382 | find_modules_ide() { | |
383 | for n in $PREIDEMODS; do | |
384 | findmodule "$n" | |
385 | done | |
386 | } | |
387 | ||
388 | find_modules_for() { | |
389 | if is_yes "`echo "$1" | awk '/^\/dev\/md/ { print "yes"; }'`"; then | |
390 | find_modules_softraid "$1" | |
391 | elif is_yes "$(echo "$1" | awk '/^\/dev\/(sd|scsi)/ { print "yes"; }')" ; then | |
392 | find_modules_scsi | |
393 | elif is_yes "`echo "$1" | awk '/^\/dev\/(hd|ide|ataraid)/ { print "yes"; }'`" ; then | |
394 | find_modules_ide | |
395 | elif is_yes "`echo "$1" | awk '/\/dev\/rd\// { print "yes"; }'`" ; then | |
396 | findmodule "DAC960" | |
397 | elif is_yes "`echo "$1" | awk '/\/dev\/ida\// { print "yes"; }'`" ; then | |
398 | findmodule "cpqarray" | |
399 | elif is_yes "`echo "$1" | awk '/\/dev\/cciss\// { print "yes"; }'`" ; then | |
400 | findmodule "cciss" | |
401 | elif is_yes "`echo "$1" | awk '/\/dev\/ataraid\// { print "yes"; }'`"; then | |
402 | findmodule "ataraid" | |
403 | ataraidmodules="`awk '/ataraid_hostadapter/ && ! /^[\t ]*#/ { print $3; }' $modulefile| LC_ALL=C sort -u`" | |
404 | if -n "$ataraidmodules" ; then | |
405 | # FIXME: think about modules compiled in kernel | |
406 | echo "ERROR: ataraid_hostadapter alias not defined in $modulefile !" | |
407 | echo "Please set it and run $0 again." | |
408 | exit 1 | |
409 | fi | |
410 | for n in $ataraidmodules; do | |
411 | findmodule "$n" | |
412 | done | |
413 | # check to see if we need to set up a loopback filesystem | |
414 | elif is_yes "`echo "$1" | awk -F/ '{print($3);}' | awk '/loop/ { print "yes"; }'`" ; then | |
415 | echo "Sorry, root on loop device isn't supported." 1>&2 | |
416 | exit 1 | |
417 | # TODO: rewrite for bsp and make nfs ready | |
418 | if [ ! -x /sbin/losetup ]; then | |
419 | echo "losetup is missing" | |
420 | exit 1 | |
421 | fi | |
422 | key="^# $(echo $1 | awk -F/ '{print($3);}' | tr '[a-z]' '[A-Z]'):" | |
423 | if ! is_yes "`awk '/'$key'/ { print( "yes"); }' $fstab`" ; then | |
424 | echo "The root filesystem is on a $1, but there is no magic entry in $fstab" 1>&2 | |
425 | echo "for this device. Consult the geninitrd man page for more information" 1>&2 | |
426 | exit 1 | |
427 | fi | |
428 | ||
429 | line="`awk '/'$key'/ { print $0; }' $fstab`" | |
430 | loopDev="$(echo $line | awk '{print $3}')" | |
431 | loopFs="$(echo $line | awk '{print $4}')" | |
432 | loopFile="$(echo $line | awk '{print $5}')" | |
433 | ||
434 | BASICMODULES="$BASICMODULES -loop" | |
435 | findmodule "-$loopFs" | |
436 | BASICMODULES="$BASICMODULES -${loopFs}" | |
437 | # don't have any clue, how is this supposed to work | |
438 | elif ls -l "$1"|awk '{if (/^b/) { if ($5 == "58,") { exit 0; } else { exit 1; } } else { exit 1; }}'; then | |
439 | if [ ! -f /sbin/initrd-lvm ] ; then | |
440 | echo "ERROR: root on LVM but /sbin/initrd-lvm not found." | |
441 | echo "Please install lvm-initrd package and rerun $0." | |
442 | exit 1 | |
443 | fi | |
444 | if [ -n "$PVDEVICES" ] ; then | |
445 | for device in $PVDEVICES; do | |
446 | find_modules_for $device | |
447 | done | |
448 | else | |
449 | echo "ERROR: Sorry, but searching for PV isn't implemented yet." | |
450 | echo "Use PVDEVICES in /etc/sysconfig/geninitrd to set it." | |
451 | exit 1 | |
452 | fi | |
453 | findmodule "-lvm" | |
454 | findmodule "-lvm-mod" | |
455 | uselvm="yes" | |
456 | fi | |
457 | } | |
458 | ||
5dc785c7 | 459 | if [ -r /etc/sysconfig/geninitrd ] ; then |
460 | . /etc/sysconfig/geninitrd | |
461 | fi | |
462 | ||
2ad94d8a AF |
463 | if [ "x" = "x$INITRDFS" ] ; then |
464 | if [ "x" = "x$FS" ] ; then | |
465 | # default value | |
466 | INITRDFS="rom" | |
467 | else | |
468 | echo "Warning: FS configuration options is obsoleted. Use INITRDFS instead" 1>&2 | |
469 | INITRDFS="$FS" | |
470 | fi | |
471 | fi | |
472 | ||
fd2dc249 AF |
473 | if [ ! -x /sbin/bsp ] ; then |
474 | echo "/sbin/bsp is missing !" | |
475 | exit 1 | |
5dc785c7 | 476 | fi |
477 | if [ "`uname -m`" = "ia64" ]; then | |
478 | IMAGESIZE=3000 | |
479 | else | |
480 | IMAGESIZE=1500 | |
481 | fi | |
bb529f94 | 482 | while [ $# -gt 0 ]; do |
413878f8 | 483 | case $1 in |
6bd433bc AF |
484 | --fstab=*) |
485 | fstab="`echo $1 | awk -F= '{print $2;}'`" | |
486 | ;; | |
487 | --fstab) | |
488 | fstab="$2" | |
489 | shift | |
413878f8 | 490 | ;; |
cd670d83 AF |
491 | --modules-conf=*) |
492 | modulefile="`echo $1 | awk -F= '{print $2;}'`" | |
493 | ;; | |
57188d60 | 494 | --modules-conf) |
cd670d83 AF |
495 | modulefile="$2" |
496 | shift | |
497 | ;; | |
611e9e47 AF |
498 | --raidtab=*) |
499 | raidtab="`echo $1 | awk -F= '{print $2;}'`" | |
500 | ;; | |
501 | --raidtab) | |
502 | raidtab="$2" | |
503 | shift | |
504 | ;; | |
6bd433bc AF |
505 | --use-raidstart|--with-raidstart) |
506 | USERAIDSTART="yes" | |
507 | ;; | |
508 | --without-raidstart) | |
509 | USERAIDSTART="no" | |
510 | ;; | |
511 | --with=*) | |
512 | BASICMODULES="$BASICMODULES `echo $1 | awk -F= '{print $2;}'`" | |
513 | ;; | |
514 | --with) | |
515 | BASICMODULES="$BASICMODULES $2" | |
516 | shift | |
413878f8 | 517 | ;; |
bb529f94 | 518 | --version) |
413878f8 | 519 | echo "geninitrd: version $VERSION" |
520 | exit 0 | |
521 | ;; | |
bb529f94 | 522 | -v) |
413878f8 | 523 | verbose=-v |
524 | ;; | |
bb529f94 | 525 | --nocompress) |
413878f8 | 526 | COMPRESS="no" |
527 | ;; | |
bb529f94 | 528 | --ifneeded) |
413878f8 | 529 | ifneeded=1 |
530 | ;; | |
bb529f94 | 531 | -f) |
413878f8 | 532 | force=1 |
533 | ;; | |
6bd433bc AF |
534 | --preload=*) |
535 | PREMODS="$PREMODS `echo $1 | awk -F= '{print $2;}'`" | |
536 | ;; | |
537 | --preload) | |
72623c13 | 538 | PREMODS="$PREMODS $2" |
6bd433bc | 539 | shift |
413878f8 | 540 | ;; |
2ad94d8a AF |
541 | --fs=*) |
542 | echo "Warning: --fs option is obsoleted. Use --initrdfs instead" 1>&2 | |
543 | INITRDFS="`echo $1 | awk -F= '{print $2;}'`" | |
544 | ;; | |
2ad94d8a AF |
545 | --fs) |
546 | echo "Warning: --fs option is obsoleted. Use --initrdfs instead" 1>&2 | |
547 | INITRDFS="$2" | |
548 | shift | |
cd670d83 | 549 | ;; |
6bd433bc AF |
550 | --initrdfs=*) |
551 | INITRDFS="`echo $1 | awk -F= '{print $2;}'`" | |
552 | ;; | |
fd2dc249 | 553 | --initrdfs) |
2ad94d8a | 554 | INITRDFS="$2" |
413878f8 | 555 | shift |
556 | ;; | |
bb529f94 | 557 | --image-version) |
413878f8 | 558 | img_vers=yes |
559 | ;; | |
bb529f94 | 560 | *) |
413878f8 | 561 | if [ -z "$target" ]; then |
562 | target="$1" | |
563 | elif [ -z "$kernel" ]; then | |
564 | kernel="$1" | |
565 | else | |
566 | usage | |
567 | fi | |
568 | ;; | |
569 | esac | |
570 | ||
571 | shift | |
bb529f94 JK |
572 | done |
573 | ||
06ac05d6 | 574 | if [ -z "$target" -o -z "$kernel" ]; then |
413878f8 | 575 | usage |
06ac05d6 AF |
576 | fi |
577 | ||
2ad94d8a | 578 | case "$INITRDFS" in |
8b1e4ac7 | 579 | ext2) |
f5d71bb2 | 580 | if [ ! -x /sbin/mke2fs ]; then |
a2c2980f | 581 | echo "/sbin/mke2fs is missing" 1>&2 |
8b1e4ac7 AF |
582 | exit 1 |
583 | fi | |
584 | ;; | |
585 | rom) | |
586 | if [ ! -x /sbin/genromfs ]; then | |
a2c2980f | 587 | echo "/sbin/genromfs is missing" 1>&2 |
8b1e4ac7 AF |
588 | exit 1 |
589 | fi | |
590 | ;; | |
591 | cram) | |
592 | if [ ! -x /sbin/mkcramfs ]; then | |
a2c2980f | 593 | echo "/sbin/mkcramfs is missing" 1>&2 |
8b1e4ac7 AF |
594 | exit 1 |
595 | fi | |
c31050f3 | 596 | ;; |
8b1e4ac7 | 597 | *) |
2ad94d8a | 598 | echo "Filesystem $INITRDFS on initrd is not supported" 1>&2 |
8b1e4ac7 AF |
599 | exit 1 |
600 | ;; | |
601 | esac | |
bb529f94 | 602 | |
bb529f94 | 603 | if [ -n "$img_vers" ]; then |
413878f8 | 604 | target="$target-$kernel" |
bb529f94 JK |
605 | fi |
606 | ||
35164381 | 607 | if [ -z "$force" -a -f "$target" ]; then |
a2c2980f | 608 | echo "$target already exists." 1>&2 |
413878f8 | 609 | exit 1 |
bb529f94 JK |
610 | fi |
611 | ||
35164381 | 612 | if [ ! -d "/lib/modules/$kernel" ]; then |
a2c2980f | 613 | echo "/lib/modules/$kernel is not a directory." 1>&2 |
413878f8 | 614 | exit 1 |
bb529f94 JK |
615 | fi |
616 | ||
617 | for n in $PREMODS; do | |
35164381 | 618 | findmodule "$n" |
bb529f94 JK |
619 | done |
620 | ||
7c38b114 AF |
621 | # allow forcing loading SCSI and/or IDE modules |
622 | if is_yes "$ADDSCSI" ; then | |
623 | find_modules_scsi | |
bb529f94 JK |
624 | fi |
625 | ||
7c38b114 AF |
626 | if is_yes "$ADDIDE" ; then |
627 | find_modules_ide | |
cd670d83 AF |
628 | fi |
629 | ||
7c38b114 | 630 | find_root |
cd670d83 | 631 | |
7c38b114 | 632 | find_modules_for "$rootdev" |
cd670d83 | 633 | |
7c38b114 | 634 | findmodule "-$rootFs" |
bb529f94 | 635 | |
c31050f3 | 636 | for n in $BASICMODULES; do |
7d2fc5eb | 637 | findmodule "$n" |
bb529f94 JK |
638 | done |
639 | ||
7c38b114 | 640 | |
bb529f94 | 641 | if [ -n "$ifneeded" -a -z "$MODULES" ]; then |
7d2fc5eb | 642 | if [ -n "$verbose" ]; then |
643 | echo "No modules are needed -- not building initrd image." | |
644 | fi | |
645 | exit 0 | |
bb529f94 JK |
646 | fi |
647 | ||
648 | if [ -n "$verbose" ]; then | |
7d2fc5eb | 649 | echo "Using modules: $MODULES" |
bb529f94 JK |
650 | fi |
651 | ||
35164381 SZ |
652 | MNTIMAGE="`mktemp -d /tmp/initrd.XXXXXX`" |
653 | IMAGE="`mktemp -u /tmp/initrd.img-XXXXXX`" | |
654 | MNTPOINT="`mktemp -d /tmp/initrd.mnt-XXXXXX`" | |
655 | RCFILE="$MNTIMAGE/linuxrc" | |
bb529f94 | 656 | |
35164381 | 657 | if [ -f "$MNTIMAGE" ]; then |
c31050f3 | 658 | echo "$MNTIMAGE already exists. Remove it and try again" 1>&2 |
7d2fc5eb | 659 | exit 1 |
bb529f94 JK |
660 | fi |
661 | ||
35164381 | 662 | if [ -f "$IMAGE" ]; then |
a2c2980f | 663 | echo "$IMAGE already exists. Remove it and try again" 1>&2 |
7d2fc5eb | 664 | exit 1 |
bb529f94 JK |
665 | fi |
666 | ||
2ad94d8a | 667 | if [ "$INITRDFS" = "ext2" ] ; then |
35164381 | 668 | dd if=/dev/zero of="$IMAGE" bs=1k count="$IMAGESIZE" 2> /dev/null |
bb529f94 | 669 | |
bb529f94 JK |
670 | # We have to "echo y |" so that it doesn't complain about $IMAGE not |
671 | # being a block device | |
35164381 | 672 | echo y | mke2fs -F "$IMAGE" "$IMAGESIZE" >/dev/null 2>/dev/null |
bb529f94 | 673 | |
35164381 SZ |
674 | mkdir -p "$MNTPOINT" |
675 | mount -o loop -t ext2 "$IMAGE" "$MNTPOINT" | |
bb529f94 | 676 | else |
35164381 | 677 | mkdir -p "$MNTPOINT" |
bb529f94 JK |
678 | fi |
679 | ||
8b1e4ac7 | 680 | |
35164381 | 681 | mkdir -p "$MNTIMAGE"/{lib,bin,etc,dev,loopfs} |
8b1e4ac7 | 682 | |
bb529f94 JK |
683 | |
684 | # We don't need this directory, so let's save space | |
35164381 | 685 | rm -rf "$MNTPOINT"/lost+found |
bb529f94 | 686 | |
bb529f94 | 687 | for MODULE in $MODULES; do |
81de8443 AF |
688 | MODULEDIR="`my_dirname "$MODULE"`" |
689 | mkdir -p "$MNTIMAGE/lib/modules/$kernel/$MODULEDIR" | |
690 | cp $verbose -a "/lib/modules/$kernel/$MODULE" "$MNTIMAGE/lib/modules/$kernel/$MODULE" | |
4fd11db9 | 691 | gunzip "$MNTIMAGE/lib/modules/$kernel/$MODULE" 2> /dev/null |
bb529f94 JK |
692 | done |
693 | ||
694 | # mknod'ing the devices instead of copying them works both with and | |
695 | # without devfs... | |
35164381 | 696 | mknod "$MNTIMAGE/dev/console" c 5 1 |
bb529f94 | 697 | |
fd2dc249 | 698 | s="$MNTIMAGE/etc/startup" |
ef66f232 MM |
699 | |
700 | if test -f /sbin/bsp-raidless ; then | |
701 | inst /sbin/bsp-raidless "$RCFILE" | |
702 | else | |
703 | inst /sbin/bsp "$RCFILE" | |
704 | fi | |
705 | ||
fd2dc249 AF |
706 | echo "# autogenerated startup" > "$s" |
707 | echo "" >> "$s" | |
c31050f3 | 708 | |
fd2dc249 | 709 | for MODULE in $MODULES; do |
4fd11db9 AF |
710 | MODULE2="`my_dirname "$MODULE"`" |
711 | NAME2=`basename "$MODULE" .gz` | |
712 | MODULE2=$MODULE2/$NAME2 | |
fd2dc249 AF |
713 | module="`echo $MODULE | awk -F/ '{ $0=$NF } /.o$/ { $0=substr($0,1,length($0)-2); } { print $0; }'`" |
714 | options="`awk '{ if($1 == "options" && $2 == "'${module}'") { for(i=3;i<=NF;i++) printf("%s ",$i); }}' "$modulefile"`" | |
c31050f3 | 715 | |
fd2dc249 AF |
716 | if [ -n "$verbose" ]; then |
717 | /bin/echo -n "Loading module $module " | |
718 | if [ -n "$options" ] ; then | |
719 | echo "with options $options." | |
ea10b6a5 | 720 | else |
fd2dc249 | 721 | echo "without options." |
7d2fc5eb | 722 | fi |
7d2fc5eb | 723 | fi |
4fd11db9 | 724 | echo "insmod /lib/modules/$kernel/$MODULE2 $options" >> "$s" |
fd2dc249 AF |
725 | done |
726 | ||
727 | # TODO: rewrite for bsp | |
728 | #if [ -n "$loopDev" ]; then | |
729 | # if [ ! -d /initrd ]; then | |
730 | # mkdir /initrd | |
731 | # fi | |
732 | # | |
733 | # cp -a "$loopDev" "$MNTIMAGE/dev" | |
734 | # cp -a "$rootdev" "$MNTIMAGE/dev" | |
735 | # echo "echo Mounting device containing loopback root filesystem" >> "$RCFILE" | |
736 | # echo "mount -t $loopFs $loopDev /loopfs" >> "$RCFILE" | |
737 | # echo "echo Setting up loopback device $rootdev" >> $RCFILE | |
738 | # echo "losetup $rootdev /loopfs$loopFile" >> "$RCFILE" | |
739 | #fi | |
bb529f94 | 740 | |
7c38b114 | 741 | if is_yes "$USERAIDSTART" && is_yes "$raidfound" ; then |
ef66f232 | 742 | [ -n "$verbose" ] && echo "Adding raidstart to initrd" |
fef73933 | 743 | inst "$raidtab" "$MNTIMAGE/etc/raidtab" |
ef66f232 MM |
744 | # don't use raidless version |
745 | inst /sbin/bsp "$RCFILE" | |
fef73933 | 746 | |
ef66f232 MM |
747 | # needed to determine md-version |
748 | if [ "$rootdev" != /dev/md0 ] ; then | |
749 | mknod $MNTIMAGE/dev/md0 b 9 0 | |
750 | fi | |
751 | ||
752 | for f in $dev_list $rootdev ; do | |
753 | # mkdir in case of devfs name | |
754 | mkdir -p `my_dirname $f` | |
755 | [ -n "$verbose" ] && echo "copying $f" | |
756 | # this works fine with and without devfs | |
757 | cp -HR $f $MNTIMAGE/$f | |
758 | done | |
fef73933 | 759 | |
ef66f232 | 760 | echo "raidstart $rootdev" >> "$s" |
2968c9dd AF |
761 | fi |
762 | ||
7c38b114 AF |
763 | if is_yes "$uselvm" ; then |
764 | [ -n "$verbose" ] && echo "Adding LVM support to initrd" | |
765 | inst /sbin/initrd-lvm $MNTIMAGE/bin/lvm | |
766 | mkdir $MNTIMAGE/tmp | |
767 | mkdir $MNTIMAGE/proc | |
768 | echo "mount none /proc proc" >> "$s" | |
769 | echo "mount none /tmp tmpfs" >> "$s" | |
770 | echo "mount none /dev devfs" >> "$s" | |
771 | echo "lvm vgscan -T" >> "$s" | |
78ba9381 | 772 | echo "lvm vgchange -T -a y" >> "$s" |
7c38b114 AF |
773 | echo "umount /tmp" >> "$s" |
774 | echo "umount /proc" >> "$s" | |
775 | echo "umount /devfs" >> "$s" | |
776 | fi | |
777 | ||
35164381 | 778 | chmod +x "$RCFILE" |
bb529f94 | 779 | |
35164381 | 780 | (cd "$MNTIMAGE"; tar cf - .) | (cd "$MNTPOINT"; tar xf -) |
bb529f94 | 781 | |
2ad94d8a | 782 | case "$INITRDFS" in |
8b1e4ac7 | 783 | ext2) |
35164381 | 784 | umount "$IMAGE" |
8b1e4ac7 AF |
785 | ;; |
786 | rom) | |
787 | genromfs -f "$IMAGE" -d "$MNTPOINT" -V "PLD initrd for kernel $kernel" | |
788 | ;; | |
789 | cram) | |
790 | mkcramfs "$MNTPOINT" "$IMAGE" | |
8b1e4ac7 AF |
791 | ;; |
792 | *) | |
2ad94d8a | 793 | echo "Filesystem $INITRDFS not supported by $0"; |
c31050f3 | 794 | esac |
bb529f94 JK |
795 | |
796 | if is_yes "$COMPRESS" ; then | |
7d2fc5eb | 797 | gzip -9 < "$IMAGE" > "$target" |
bb529f94 | 798 | else |
7d2fc5eb | 799 | cp -a "$IMAGE" "$target" |
bb529f94 | 800 | fi |
35164381 | 801 | rm -rf "$MNTIMAGE" "$MNTPOINT" "$IMAGE" |