]> git.ipfire.org Git - ipfire-2.x.git/blob - src/nash/mkinitrd
PPOE Skript sollte den kill, CGI Fixes
[ipfire-2.x.git] / src / nash / mkinitrd
1 #!/bin/bash --norc
2
3 # mkinitrd
4 #
5 # Copyright 2005 Red Hat, Inc.
6 #
7 # Written by Erik Troan <ewt@redhat.com>
8 #
9 # Contributors:
10 # Elliot Lee <sopwith@cuc.edu>
11 # Miguel de Icaza <miguel@nuclecu.unam.mx>
12 # Christian 'Dr. Disk' Hechelmann <drdisk@ds9.au.s.shuttle.de>
13 # Michael K. Johnson <johnsonm@redhat.com>
14 # Pierre Habraken <Pierre.Habraken@ujf-grenoble.fr>
15 # Jakub Jelinek <jakub@redhat.com>
16 # Carlo Arenas Belon (carenas@chasqui.lared.net.pe>
17 # Keith Owens <kaos@ocs.com.au>
18 # Bernhard Rosenkraenzer <bero@redhat.com>
19 # Matt Wilson <msw@redhat.com>
20 # Trond Eivind Glomsrød <teg@redhat.com>
21 # Jeremy Katz <katzj@redhat.com>
22 # Preston Brown <pbrown@redhat.com>
23 # Bill Nottingham <notting@redhat.com>
24 # Guillaume Cottenceau <gc@mandrakesoft.com>
25 # Peter Jones <pjones@redhat.com>
26
27 umask 0022
28
29 PATH=/sbin:/usr/sbin:/bin:/usr/bin:$PATH
30 export PATH
31
32 VERSION=4.2.11
33
34 compress=1
35 allowmissing=""
36 target=""
37 kernel=""
38 force=""
39 verbose=""
40 MODULES=""
41 img_vers=""
42 builtins=""
43 pivot=1
44 squashfs=1
45 initramfs=""
46 modulefile=/etc/modules.conf
47 rc=0
48
49 IMAGESIZE=8000
50 PRESCSIMODS="scsi_mod sd_mod unknown"
51 fstab="/etc/fstab"
52
53 if [ -f /etc/udev/udev.conf ]; then
54 USE_UDEV="yes"
55 UDEV_TMPFS="yes"
56 UDEV_KEEP_DEV="yes"
57 . /etc/udev/udev.conf
58 [ -x /sbin/udev.static ] || USE_UDEV=
59 fi
60
61 usage () {
62 echo "usage: `basename $0` [--version] [-v] [-f] [--preload <module>]" >&2
63 echo " [--omit-scsi-modules] [--omit-raid-modules] [--omit-lvm-modules]" >&2
64 echo " [--with=<module>] [--image-version] [--fstab=<fstab>] [--nocompress]" >&2
65 echo " [--builtin=<module>] [--nopivot] [--nosquashfs] <initrd-image> <kernel-version>" >&2
66 echo "" >&2
67 echo " (ex: `basename $0` /boot/initrd-2.2.5-15.img 2.2.5-15)" >&2
68 exit 1
69 }
70
71 moduledep() {
72 if [ ! -f "/lib/modules/$kernel/modules.dep" ]; then
73 echo "No dep file found for kernel $kernel" >&2
74 exit 1
75 fi
76
77 [ -n "$verbose" ] && echo -n "Looking for deps of module $1"
78 deps=$(gawk 'BEGIN { searched=ARGV[2]; ARGV[2]=""; rc=1 } \
79 function modname(filename) { match(filename, /\/([^\/]+)\.k?o:?$/, ret); return ret[1] } \
80 function show() { if (orig == searched) { print dep; orig=""; rc=0; exit } } \
81 /^\/lib/ { show(); \
82 orig=modname($1); dep=""; \
83 if ($2) { for (i = 2; i <= NF; i++) { dep=sprintf("%s %s", dep, modname($i)); } } } \
84 /^ / { dep=sprintf("%s %s", dep, modname($1)); } \
85 END { show(); exit(rc) }' /lib/modules/$kernel/modules.dep $1)
86 [ -n "$verbose" ] && echo -e "\t$deps"
87 }
88
89 findmodule() {
90 skiperrors=""
91
92 if [ $1 == "--skiperrors" ]; then
93 skiperrors=--skiperrors
94 shift
95 fi
96
97 local modName=$1
98
99 if [ "$modName" = "off" -o "$modName" = "null" ]; then
100 return
101 fi
102
103 if [ $(echo $modName | cut -b1) = "-" ]; then
104 skiperrors=--skiperrors
105 modName=$(echo $modName | cut -b2-)
106 fi
107
108 if echo $builtins | egrep -q '(^| )'$modName'( |$)' ; then
109 [ -n "$verbose" ] && echo "module $modName assumed to be built in"
110 set +x
111 return
112 fi
113
114 # special cases
115 if [ "$modName" = "i2o_block" ]; then
116 findmodule i2o_core
117 findmodule -i2o_pci
118 modName="i2o_block"
119 elif [ "$modName" = "ppa" ]; then
120 findmodule parport
121 findmodule parport_pc
122 modName="ppa"
123 elif [ "$modName" = "sbp2" ]; then
124 findmodule ieee1394
125 findmodule ohci1394
126 modName="sbp2"
127 else
128 moduledep $modName
129 for i in $deps; do
130 findmodule $i
131 done
132 fi
133
134 for modExt in o.gz o ko ; do
135 if [ -d /lib/modules/$kernel/updates ]; then
136 fmPath=`(cd /lib/modules/$kernel/updates; echo find . -name $modName.$modExt -type f | /sbin/nash --quiet) | gawk {'print $1; exit;'}`
137 fi
138
139 if [ -f /lib/modules/$kernel/updates/$fmPath ]; then
140 fmPath=updates/$fmPath
141 break
142 fi
143
144 fmPath=`(cd /lib/modules/$kernel; echo find . -name $modName.$modExt -type f | /sbin/nash --quiet) | gawk {'print $1; exit;'}`
145 if [ -f /lib/modules/$kernel/$fmPath ]; then
146 break
147 fi
148 done
149
150 if [ ! -f /lib/modules/$kernel/$fmPath ]; then
151 if [ -n "$skiperrors" ]; then
152 return
153 fi
154
155 # ignore the absence of the scsi modules
156 for n in $PRESCSIMODS; do
157 if [ "$n" = "$modName" ]; then
158 return;
159 fi
160 done;
161
162 if [ -n "$allowmissing" ]; then
163 echo "WARNING: No module $modName found for kernel $kernel, continuing anyway" >&2
164 return
165 fi
166
167 echo "No module $modName found for kernel $kernel, aborting." >&2
168 exit 1
169 fi
170
171 # only need to add each module once
172 if ! echo $MODULES | grep -q "$fmPath" 2>/dev/null ; then
173 MODULES="$MODULES $fmPath"
174 fi
175 }
176
177 inst() {
178 if [ "$#" != "2" ];then
179 echo "usage: inst <file> <destination>"
180 return
181 fi
182 [ -n "$verbose" ] && echo "$1 -> $2"
183 cp $1 $2
184 }
185
186 while [ $# -gt 0 ]; do
187 case $1 in
188 --fstab*)
189 if echo $1 | grep -q '=' ; then
190 fstab=`echo $1 | sed 's/^--fstab=//'`
191 else
192 fstab=$2
193 shift
194 fi
195 ;;
196
197 --with-usb)
198 withusb=yes
199 ;;
200
201 --with*)
202 if echo $1 | grep -q '=' ; then
203 modname=`echo $1 | sed 's/^--with=//'`
204 else
205 modname=$2
206 shift
207 fi
208
209 basicmodules="$basicmodules $modname"
210 ;;
211
212 --builtin*)
213 if echo $1 | grep -q '=' ; then
214 modname=`echo $1 | sed 's/^--builtin=//'`
215 else
216 modname=$2
217 shift
218 fi
219 builtins="$builtins $modname"
220 ;;
221
222 --version)
223 echo "mkinitrd: version $VERSION"
224 exit 0
225 ;;
226
227 -v)
228 verbose=-v
229 ;;
230
231 --nocompress)
232 compress=""
233 ;;
234
235 --nopivot)
236 pivot=""
237 ;;
238
239 --nosquashfs)
240 squashfs=""
241 ;;
242
243 --ifneeded)
244 # legacy
245 ;;
246
247 -f)
248 force=1
249 ;;
250 --preload*)
251 if echo $1 | grep -q '=' ; then
252 modname=`echo $1 | sed 's/^--preload=//'`
253 else
254 modname=$2
255 shift
256 fi
257 PREMODS="$PREMODS $modname"
258 ;;
259 --omit-scsi-modules)
260 PRESCSIMODS=""
261 noscsi=1;
262 ;;
263 --omit-raid-modules)
264 noraid=1;
265 ;;
266 --omit-lvm-modules)
267 nolvm=1
268 ;;
269 --image-version)
270 img_vers=yes
271 ;;
272 --noudev)
273 USE_UDEV=
274 ;;
275 --allow-missing)
276 allowmissing=yes
277 ;;
278 *)
279 if [ -z "$target" ]; then
280 target=$1
281 elif [ -z "$kernel" ]; then
282 kernel=$1
283 else
284 usage
285 fi
286 ;;
287 esac
288
289 shift
290 done
291
292 if [ -z "$target" -o -z "$kernel" ]; then
293 usage
294 fi
295
296 if [ -n "$img_vers" ]; then
297 target="$target-$kernel"
298 fi
299
300 if [ -z "$force" -a -f $target ]; then
301 echo "$target already exists." >&2
302 exit 1
303 fi
304
305 if [ ! -d /lib/modules/$kernel ]; then
306 echo "/lib/modules/$kernel is not a directory." >&2
307 exit 1
308 fi
309
310 if [ $UID != 0 ]; then
311 echo "mkinitrd must be run as root"
312 exit 1
313 fi
314
315 kernelmajor=`echo $kernel | cut -d . -f 1,2`
316
317 if [ "$kernelmajor" == "2.4" ]; then
318 if [ -n "$verbose" ]; then echo "Creating old-style initrd"; fi
319 USE_UDEV=
320 else
321 if [ -n "$verbose" ]; then echo "Creating initramfs"; fi
322 modulefile=/etc/modprobe.conf
323 initramfs=1
324 pivot=""
325 fi
326
327 # if we're not using udev, don't set any of the other bits
328 [ -z "$USE_UDEV" ] && UDEV_TMPFS= && UDEV_KEEP_DEV=
329
330 # find a temporary directory which doesn't use tmpfs
331 TMPDIR=""
332 for t in /tmp /var/tmp /root ${PWD}; do
333 if [ ! -d $t ]; then continue; fi
334 if ! echo access -w $t | /sbin/nash --quiet; then continue; fi
335
336 fs=$(df -T $t 2>/dev/null | gawk '{line=$1;} END {printf $2;}')
337 if [ "$fs" != "tmpfs" ]; then
338 TMPDIR=$t
339 break
340 fi
341 done
342
343 if [ -z "$TMPDIR" ]; then
344 echo "no temporary directory could be found" >&2
345 exit 1
346 fi
347
348 if [ $TMPDIR = "/root" -o $TMPDIR = "${PWD}" ]; then
349 echo "WARNING: using $TMPDIR for temporary files" >&2
350 fi
351
352 for n in $PREMODS; do
353 findmodule $n
354 done
355
356 needusb=""
357 if [ -n "$withusb" ]; then
358 # If / or /boot is on a USB device include the driver. With root by
359 # label we could still get some odd behaviors
360 for fs in / /boot ; do
361 esc=$(echo $fs | sed 's,/,\\/,g')
362 dev=$(mount | gawk "/ on ${esc} / { print \$1 }" | sed 's/[0-9]*$//' | cut -d/ -f3)
363 if [ "$(echo $dev | cut -c1-2)" = sd ]; then
364 if [ `which kudzu 2>/dev/null` ]; then
365 host=$(kudzu --probe -b scsi |
366 gawk '/^device: '${dev}'/,/^host:/ { if (/^host/) { print $2; exit; } }')
367 if [ -d /proc/scsi/usb-storage-${host} -o -f /proc/scsi/usb-storage/${host} ]; then
368 needusb=1
369 fi
370 fi
371 fi
372 done
373 fi
374
375 if [ -n "$needusb" ]; then
376 drivers=$(gawk '/^alias[[:space:]]+usb-controller[0-9]* / { print $3}' < $modulefile)
377 if [ -n "$drivers" ]; then
378 for driver in $drivers; do
379 findmodule $driver
380 done
381 findmodule scsi_mod
382 findmodule sd_mod
383 findmodule usb-storage
384 fi
385 fi
386
387 if [ -z "$noscsi" ]; then
388 if [ ! -f $modulefile ]; then
389 modulefile=/etc/conf.modules
390 fi
391
392 if [ -f $modulefile ]; then
393 scsimodules=`grep "alias[[:space:]]\+scsi_hostadapter" $modulefile | grep -v '^[ ]*#' | LC_ALL=C sort -u | gawk '{ print $3 }'`
394
395 if [ -n "$scsimodules" ]; then
396 for n in $PRESCSIMODS; do
397 findmodule $n
398 done
399
400 for n in $scsimodules; do
401 # for now allow scsi modules to come from anywhere. There are some
402 # RAID controllers with drivers in block/
403 findmodule $n
404 done
405 fi
406 fi
407 fi
408
409 # If we have ide devices and module ide, do the right thing
410 ide=/proc/ide/ide*
411 if [ -n "$ide" ]; then
412 findmodule -ide-disk
413 fi
414
415 # If we use LVM, include lvm-mod
416 if [ -z "$nolvm" ]; then
417 if [ -f /proc/lvm/global ]; then
418 if grep -q '^VG:' /proc/lvm/global ; then
419 if [ "$kernelmajor" == "2.4" ]; then
420 findmodule -lvm-mod
421 else
422 findmodule -dm-mod
423 fi
424 fi
425 fi
426
427 if [ -x /sbin/dmsetup -a -e /dev/mapper/control ]; then
428 dmout=$(/sbin/dmsetup ls 2>/dev/null)
429 if [ "$dmout" != "No devices found" -a "$dmout" != "" ]; then
430 findmodule -dm-mod
431 fi
432 fi
433 fi
434
435 # If we have dasd devices, include the necessary modules (S/390)
436 if [ -d /proc/dasd ]; then
437 findmodule -dasd_mod
438 findmodule -dasd_eckd_mod
439 findmodule -dasd_fba_mod
440 fi
441
442 if [ -z "$noraid" -a -f /proc/mdstat ]; then
443 # load appropriate raid devices if necessary -- we'll load whatever
444 # /proc/mdstat suggests
445
446 # note that the gawk below contains a space and a tab
447 for level in $(gawk '/^md[0-9][0-9]*[ ]*:/ { print $4 }' \
448 /proc/mdstat | sort -u); do
449 case $level in
450 linear)
451 findmodule linear
452 startraid=1
453 ;;
454 multipath)
455 findmodule multipath
456 startraid=1
457 ;;
458 raid[01456])
459 findmodule $level
460 startraid=1
461 ;;
462 *)
463 echo "raid level $level (in /proc/mdstat) not recognized" >&2
464 ;;
465 esac
466 done
467
468 if [ -n "$startraid" ]; then
469 raiddevices=$(gawk '/^md[0-9][0-9]*[ ]*:/ { print $1 }' \
470 /proc/mdstat | sort)
471 fi
472 fi
473
474 # check to see if we need to set up a loopback filesystem
475 rootdev=$(gawk '/^[ \t]*[^#]/ { if ($2 == "/") { print $1; }}' $fstab)
476 if echo $rootdev | cut -d/ -f3 | grep -q loop ; then
477 key="^# $(echo $rootdev | cut -d/ -f3 | tr '[a-z]' '[A-Z]'):"
478 if ! grep "$key" $fstab >> /dev/null; then
479 echo "The root filesystem is on a $rootdev, but there is no magic entry in $fstab" >&2
480 echo "for this device. Consult the mkinitrd man page for more information" >&2
481 exit 1
482 fi
483
484 line=$(grep "$key" $fstab)
485 loopDev=$(echo $line | gawk '{print $3}')
486 loopFs=$(echo $line | gawk '{print $4}')
487 loopFile=$(echo $line | gawk '{print $5}')
488
489 basicmodules="$basicmodules -loop"
490 if [ "$loopFs" = "vfat" -o "$loopFs" = "msdos" ]; then
491 basicmodules="$basicmodules -fat"
492 fi
493 basicmodules="$basicmodules -${loopFs}"
494 # check if the root fs is on a logical volume
495 elif ! echo $rootdev | cut -c1-6 |grep -q "LABEL=" ; then
496 root_vg=$(echo $rootdev | cut -d/ -f3)
497 rootdev=$(echo "readlink $rootdev" | /sbin/nash --quiet)
498 major=`ls -l $rootdev | sed -e "s/.* \\([0-9]\+\\), *[0-9]\+.*/\\1/"`
499 [ "$major" != "58" ] || root_lvm=1
500 if echo $rootdev |grep -q /dev/mapper 2>/dev/null ; then root_lvm=1 ; fi
501 fi
502
503 rootfs=$(gawk '{ if ($1 !~ /^[ \t]*#/ && $2 == "/") { print $3; }}' $fstab)
504 rootopts=$(gawk '{ if ($1 !~ /^[ \t]*#/ && $2 == "/") { print $4; }}' $fstab \
505 | sed -e 's/\(^rw,\|rw,$\)//' -e 's/,rw,/,/' -e 's/^rw$/ro/')
506
507 # in case the root filesystem is modular
508 findmodule -${rootfs}
509
510 if [ -n "$root_lvm" ]; then
511 if [ "$kernelmajor" == "2.4" ]; then
512 findmodule -lvm-mod
513 else
514 findmodule -dm-mod
515 # DM requires all of these to be there in case someone used the
516 # feature. broken. (#132001)
517 findmodule -dm-mirror
518 findmodule -dm-zero
519 findmodule -dm-snapshot
520 fi
521 fi
522
523 for n in $basicmodules; do
524 findmodule $n
525 done
526
527 if [ -n "$verbose" ]; then
528 echo "Using modules: $MODULES"
529 fi
530
531
532 MNTIMAGE=`mktemp -d ${TMPDIR}/initrd.XXXXXX`
533 IMAGE=`mktemp ${TMPDIR}/initrd.img.XXXXXX`
534 if [ -z "$initramfs" ]; then
535 MNTPOINT=`mktemp -d ${TMPDIR}/initrd.mnt.XXXXXX`
536 RCFILE=$MNTIMAGE/linuxrc
537 else
538 RCFILE=$MNTIMAGE/init
539 fi
540
541 if [ -z "$MNTIMAGE" -o -z "$IMAGE" ]; then
542 echo "Error creating temporaries. Try again" >&2
543 exit 1
544 fi
545
546 if [ -z "$initramfs" ]; then
547 dd if=/dev/zero of=$IMAGE bs=1k count=$IMAGESIZE 2> /dev/null || exit 1
548
549 LODEV=$(echo findlodev | /sbin/nash --quiet)
550
551 if [ -z "$LODEV" ]; then
552 rm -rf $MNTIMAGE $MNTPOINT $IMAGE
553 echo "All of your loopback devices are in use." >&2
554 exit 1
555 fi
556
557 losetup ${LODEV} $IMAGE || exit 1
558
559 # We have to "echo y |" so that it doesn't complain about $IMAGE not
560 # being a block device
561 echo y | mkfs.minix -i 100 $LODEV $IMAGESIZE >/dev/null 2>/dev/null
562
563 if [ -n "$verbose" ]; then
564 echo "Using loopback device $LODEV"
565 fi
566
567 mkdir -p $MNTPOINT
568 mount -t minix $LODEV $MNTPOINT || {
569 echo "Can't get a loopback device"
570 exit 1
571 }
572
573 # We don't need this directory, so let's save space
574 rmdir $MNTPOINT/lost+found >/dev/null 2>&1
575 fi
576
577 mkdir -p $MNTIMAGE
578 mkdir -p $MNTIMAGE/lib
579 mkdir -p $MNTIMAGE/bin
580 mkdir -p $MNTIMAGE/etc
581 mkdir -p $MNTIMAGE/dev
582 mkdir -p $MNTIMAGE/hd
583 mkdir -p $MNTIMAGE/loopfs
584 mkdir -p $MNTIMAGE/proc
585 mkdir -p $MNTIMAGE/sys
586 mkdir -p $MNTIMAGE/sysroot
587 ln -s bin $MNTIMAGE/sbin
588
589 inst /sbin/nash "$MNTIMAGE/bin/nash"
590 inst /sbin/insmod.static "$MNTIMAGE/bin/insmod"
591 ln -s /sbin/nash $MNTIMAGE/sbin/modprobe
592
593 if [ -n "$USE_UDEV" ]; then
594 inst /sbin/udev.static $MNTIMAGE/sbin/udev
595 inst /sbin/udevstart.static $MNTIMAGE/sbin/udevstart
596 mkdir -p $MNTIMAGE/etc/udev
597 inst /etc/udev/udev.conf $MNTIMAGE/etc/udev/udev.conf
598 ln -s /sbin/nash $MNTIMAGE/sbin/hotplug
599 fi
600
601 for MODULE in $MODULES; do
602 if [ -x /usr/bin/strip ]; then
603 /usr/bin/strip -g $verbose /lib/modules/$kernel/$MODULE -o $MNTIMAGE/lib/$(basename $MODULE)
604 else
605 cp $verbose -a /lib/modules/$kernel/$MODULE $MNTIMAGE/lib
606 fi
607 done
608
609 # mknod'ing the devices instead of copying them works both with and
610 # without devfs...
611 mknod $MNTIMAGE/dev/console c 5 1
612 mknod $MNTIMAGE/dev/null c 1 3
613 mknod $MNTIMAGE/dev/ram b 1 1
614 mknod $MNTIMAGE/dev/systty c 4 0
615 for i in 1 2 3 4; do
616 mknod $MNTIMAGE/dev/tty$i c 4 $i
617 done
618
619 # FIXME -- this won't work if you're using devfs
620 if [ -n "$root_lvm" -a "$kernelmajor" == "2.4" ]; then
621 pvs=$(/sbin/pvscan | grep " PV " | gawk {'print $5;'} |sed 's/"//g')
622 for pv in $pvs; do
623 cp $verbose --parents -a $pv $MNTIMAGE/
624 done
625
626 inst /sbin/vgwrapper "$MNTIMAGE/bin/vgwrapper"
627 ln "$MNTIMAGE/bin/vgwrapper" "$MNTIMAGE/bin/vgscan"
628 ln "$MNTIMAGE/bin/vgwrapper" "$MNTIMAGE/bin/vgchange"
629
630 mknod $MNTIMAGE/dev/lvm b 109 0
631 fi
632
633 if [ -n "$root_lvm" -a "$kernelmajor" == "2.6" ]; then
634 inst /sbin/lvm.static "$MNTIMAGE/bin/lvm"
635 if [ -f /etc/lvm/lvm.conf ]; then
636 cp $verbose --parents /etc/lvm/lvm.conf $MNTIMAGE/
637 fi
638 fi
639
640 echo "#!/bin/nash" >| $RCFILE
641 echo "" >> $RCFILE
642
643 echo "mount -t proc /proc /proc" >> $RCFILE
644 echo "setquiet" >> $RCFILE
645 echo "echo Mounted /proc filesystem" >> $RCFILE
646
647 if [ "$kernelmajor" != "2.4" ]; then
648 echo "echo Mounting sysfs" >> $RCFILE
649 echo "mount -t sysfs /sys /sys" >> $RCFILE
650 fi
651
652 if [ -n "$USE_UDEV" ]; then
653 if [ -n "$UDEV_TMPFS" ]; then
654 cat >> $RCFILE <<EOF
655 echo Creating /dev
656 mount -o mode=0755 -t tmpfs /dev /dev
657 mknod /dev/console c 5 1
658 mknod /dev/null c 1 3
659 mknod /dev/zero c 1 5
660 mkdir /dev/pts
661 mkdir /dev/shm
662 EOF
663 fi
664 cat >> $RCFILE <<EOF
665 echo Starting udev
666 /sbin/udevstart
667 echo -n "/sbin/hotplug" > /proc/sys/kernel/hotplug
668 EOF
669 fi
670
671 for MODULE in $MODULES; do
672 text=""
673 module=`echo $MODULE | sed "s|.*/||" | sed "s/.k\?o$//"`
674 fullmodule=`echo $MODULE | sed "s|.*/||"`
675
676 options=`sed -n -e "s/^options[ ][ ]*$module[ ][ ]*//p" $modulefile 2>/dev/null`
677
678 if [ -n "$verbose" ]; then
679 if [ -n "$options" ]; then
680 text=" with options $options"
681 fi
682 echo "Loading module $module$text"
683 fi
684 echo "echo \"Loading $fullmodule module\"" >> $RCFILE
685 echo "insmod /lib/$fullmodule $options" >> $RCFILE
686
687 # Hack - we need a delay after loading usb-storage to give things
688 # time to settle down before we start looking a block devices
689 if [ "$module" = "usb-storage" ]; then
690 echo "sleep 8" >> $RCFILE
691 fi
692 if [ "$module" = "zfcp" -a -f /etc/zfcp.conf ]; then
693 echo "sleep 2" >> $RCFILE
694 cat /etc/zfcp.conf | grep -v "^#" | tr "A-Z" "a-z" | while read DEVICE SCSIID WWPN SCSILUN FCPLUN; do
695 echo "echo -n $WWPN > /sys/bus/ccw/drivers/zfcp/${DEVICE/0x/}/port_add" >>$RCFILE
696 echo "echo -n $FCPLUN > /sys/bus/ccw/drivers/zfcp/${DEVICE/0x/}/$WWPN/unit_add" >>$RCFILE
697 echo "echo -n 1 > /sys/bus/ccw/drivers/zfcp/${DEVICE/0x/}/online" >>$RCFILE
698 done
699 fi
700 done
701
702 # HACK: module loading + device creation isn't necessarily synchronous...
703 # this will make sure that we have all of our devices before trying
704 # things like RAID or LVM
705 if [ -n "$USE_UDEV" ]; then
706 echo "/sbin/udevstart" >> $RCFILE
707 fi
708
709 echo "sleep 2" >> $RCFILE
710
711 if [ -n "$startraid" ]; then
712 for dev in $raiddevices; do
713 cp -a /dev/${dev} $MNTIMAGE/dev
714 echo "raidautorun /dev/${dev}" >> $RCFILE
715 done
716 fi
717
718 if [ -z "$USE_UDEV" ]; then
719 echo "echo Creating block devices" >> $RCFILE
720 echo "mkdevices /dev" >> $RCFILE
721 fi
722
723 echo "mknod /dev/loop0 b 7 0" >> $RCFILE
724
725 if [ -n "$loopDev" ]; then
726 mkdir /initrd
727 cp -a $loopDev $MNTIMAGE/dev
728 cp -a $rootdev $MNTIMAGE/dev
729 echo "echo Mounting device containing loopback root filesystem" >> $RCFILE
730 echo "mount -t $loopFs $loopDev /loopfs" >> $RCFILE
731 echo "echo Setting up loopback device $rootdev" >> $RCFILE
732 echo "losetup $rootdev /loopfs$loopFile" >> $RCFILE
733 elif [ -n "$root_lvm" ]; then
734 if [ "$kernelmajor" == "2.4" ]; then
735 echo "echo Scanning logical volumes" >> $RCFILE
736 echo "vgscan" >> $RCFILE
737 echo "echo Activating logical volumes" >> $RCFILE
738 echo "vgchange -ay" >> $RCFILE
739 else
740 echo "echo Making device-mapper control node" >> $RCFILE
741 echo "mkdmnod" >> $RCFILE
742 echo "echo Scanning logical volumes" >> $RCFILE
743 echo "lvm vgscan --ignorelockingfailure" >> $RCFILE
744 echo "echo Activating logical volumes" >> $RCFILE
745 echo "lvm vgchange -ay --ignorelockingfailure $root_vg" >> $RCFILE
746 fi
747 fi
748
749 echo "echo Creating root device" >> $RCFILE
750 echo "mkrootdev /dev/root" >> $RCFILE
751 rootdev=/dev/root
752
753 if [ -n "$initramfs" ]; then
754 echo "echo Mounting root filesystem" >> $RCFILE
755 if [ -n "$squashfs" ]; then
756 echo "mount -o $rootopts --ro -t $rootfs $rootdev /sysroot" >> $RCFILE
757 else
758 echo "fsck.minix $rootdev" >> $RCFILE
759 echo "mount -o $rootopts -t minix $rootdev /hd" >> $RCFILE
760 echo "losetup /dev/loop0 /hd/ipcop-1.5.0a1.squashfs" >> $RCFILE
761 echo "mount --ro -t squashfs /dev/loop0 /sysroot" >> $RCFILE
762 echo "mount -t tmpfs none /sysroot/var" >> $RCFILE
763 echo "echo Unpacking IPCop configuration.. Please wait.." >> $RCFILE
764 echo "tar -C /sysroot -xjf /hd/ipcop.tbz2" >> $RCFILE
765 fi
766
767 echo "echo Switching to new root" >> $RCFILE
768 if [ -n "$UDEV_KEEP_DEV" ]; then
769 echo "switchroot --movedev /sysroot" >> $RCFILE
770 else
771 echo "switchroot /sysroot" >> $RCFILE
772 fi
773 else
774 if [ "$kernelmajor" != "2.4" ]; then
775 echo "umount /sys" >> $RCFILE
776 fi
777
778 if [ -n "$pivot" ]; then
779 echo "echo 0x0100 > /proc/sys/kernel/real-root-dev" >> $RCFILE
780
781 echo "echo Mounting root filesystem" >> $RCFILE
782 if [ -n "$squashfs" ]; then
783 echo "mount -o $rootopts --ro -t $rootfs $rootdev /sysroot" >> $RCFILE
784 else
785 echo "fsck.minix $rootdev" >> $RCFILE
786 echo "mount -o $rootopts -t minix $rootdev /hd" >> $RCFILE
787 echo "losetup /dev/loop0 /hd/ipcop-1.5.0a1.squashfs" >> $RCFILE
788 echo "mount --ro -t squashfs /dev/loop0 /sysroot" >> $RCFILE
789 echo "mount -t tmpfs none /sysroot/var" >> $RCFILE
790 echo "echo Unpacking IPCop configuration.. Please wait.." >> $RCFILE
791 echo "tar -C /sysroot -xjf /hd/ipcop.tbz2" >> $RCFILE
792 fi
793
794 echo "pivot_root /sysroot /sysroot/initrd" >> $RCFILE
795 echo "umount /initrd/proc" >> $RCFILE
796 else
797 echo "umount /proc" >> $RCFILE
798 fi
799
800 [ -n "$UDEV_TMPFS" ] && echo "umount /initrd/dev" >> $RCFILE
801 fi
802 chmod +x $RCFILE
803
804 if [ -z "$initramfs" ]; then
805 (cd $MNTIMAGE; tar cf - .) | (cd $MNTPOINT; tar xf -) || exit 1
806
807 umount $MNTPOINT
808 losetup -d $LODEV
809 else
810 (cd $MNTIMAGE; find . | cpio --quiet -c -o) >| $IMAGE || exit 1
811 fi
812
813 if [ -n "$compress" ]; then
814 gzip -9 < $IMAGE >| $target || rc=1
815 else
816 cp -a $IMAGE $target || rc=1
817 fi
818 rm -rf $MNTIMAGE $IMAGE
819 if [ -n "$MNTPOINT" ]; then rm -rf $MNTPOINT ; fi
820
821 exit $rc