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