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