Magellan Linux

Contents of /trunk/mkinitrd/mkinitrd.sh

Parent Directory Parent Directory | Revision Log Revision Log


Revision 302 - (show annotations) (download) (as text)
Tue Dec 6 21:38:12 2005 UTC (18 years, 4 months ago) by niro
File MIME type: application/x-sh
File size: 21897 byte(s)
added exit 0 at eof

1 #!/bin/bash
2 # $Header: /home/cvsd/magellan-cvs/magellan-src/mkinitrd/mkinitrd.sh,v 1.6 2005-12-06 21:38:12 niro Exp $
3
4 # mkinitrd
5 #
6 # Copyright 2005 Red Hat, Inc.
7 #
8 # Written by Erik Troan <ewt@redhat.com>
9 #
10 # Contributors:
11 # Elliot Lee <sopwith@cuc.edu>
12 # Miguel de Icaza <miguel@nuclecu.unam.mx>
13 # Christian 'Dr. Disk' Hechelmann <drdisk@ds9.au.s.shuttle.de>
14 # Michael K. Johnson <johnsonm@redhat.com>
15 # Pierre Habraken <Pierre.Habraken@ujf-grenoble.fr>
16 # Jakub Jelinek <jakub@redhat.com>
17 # Carlo Arenas Belon (carenas@chasqui.lared.net.pe>
18 # Keith Owens <kaos@ocs.com.au>
19 # Bernhard Rosenkraenzer <bero@redhat.com>
20 # Matt Wilson <msw@redhat.com>
21 # Trond Eivind Glomsrød <teg@redhat.com>
22 # Jeremy Katz <katzj@redhat.com>
23 # Preston Brown <pbrown@redhat.com>
24 # Bill Nottingham <notting@redhat.com>
25 # Guillaume Cottenceau <gc@mandrakesoft.com>
26 # Peter Jones <pjones@redhat.com>
27
28 # heavily modified for magellan-linux by Niels Rogalla <niro@magellan-linux.de>
29
30 umask 0022
31 export MALLOC_PERTURB_=204
32
33 PATH=/sbin:/usr/sbin:/bin:/usr/bin:$PATH
34 export PATH
35
36 VERSION=5.0.8
37
38 PROBE="yes"
39 MODULES=""
40 PREMODS=""
41
42 [ -e /etc/conf.d/mkinitrd ] && . /etc/conf.d/mkinitrd
43
44 CONFMODS="${MODULES}"
45 MODULES=""
46
47 compress=1
48 allowmissing=""
49 target=""
50 kernel=""
51 force=""
52 verbose=""
53 img_vers=""
54 builtins=""
55 modulefile=/etc/modules.conf
56 rc=0
57
58 IMAGESIZE=4000
59 PRESCSIMODS="sd_mod"
60 fstab="/etc/fstab"
61
62 vg_list=""
63
64 die() { echo "Error: $@"; exit 1; }
65 add_initrd() { echo "$@" >> ${DEST}/init || die; }
66
67 DEST="$(mktemp -d)"
68 IMAGE="$(mktemp)"
69
70 usage()
71 {
72 echo "usage: $(basename $0) [--version] [--help] [-v] [-f] [--preload <module>]"
73 echo " [--force-ide-probe] [--force-scsi-probe | --omit-scsi-modules]"
74 echo " [--image-version] [--force-scsi-probe | --omit-raid-modules]"
75 echo " [--with=<module>] [--force-lvm-probe | --omit-lvm-modules]"
76 echo " [--builtin=<module>] "
77 echo " [--fstab=<fstab>] [--nocompress] <initrd-image> <kernel-version>"
78 echo
79 echo " (ex: $(basename $0) /boot/initrd-2.2.5-15.img 2.2.5-15)"
80
81 exit 0
82 }
83
84 moduledep()
85 {
86 if [ ! -f "/lib/modules/${kernel}/modules.dep" ]
87 then
88 die "No dep file found for kernel ${kernel}"
89 fi
90
91 echo "Looking for deps of module $1"
92 deps=$(awk 'BEGIN { searched=ARGV[2]; ARGV[2]=""; rc=1 } \
93 function modname(filename) { match(filename, /\/([^\/]+)\.k?o:?$/, ret); return ret[1] } \
94 function show() { if (orig == searched) { print dep; orig=""; rc=0; exit } } \
95 /^\/lib/ { show(); \
96 orig=modname($1); dep=""; \
97 if ($2) { for (i = 2; i <= NF; i++) { dep=sprintf("%s %s", dep, modname($i)); } } } \
98 /^ / { dep=sprintf("%s %s", dep, modname($1)); } \
99 END { show(); exit(rc) }' /lib/modules/${kernel}/modules.dep $1)
100 [ -n "${deps}" ] && echo ":${deps}" || echo
101 }
102
103 findone() { /usr/bin/find "$@" | /bin/awk '{ print $1; exit; }'; }
104 findall() { /usr/bin/find "$@"; }
105
106 findmodule()
107 {
108 skiperrors=""
109
110 if [[ $1 = --skiperrors ]]
111 then
112 skiperrors=--skiperrors
113 shift
114 fi
115
116 local modName=$1
117
118 if [ "${modName}" = "off" -o "${modName}" = "null" ]
119 then
120 return
121 fi
122
123 if [ $(echo ${modName} | cut -b1) = "-" ]
124 then
125 skiperrors=--skiperrors
126 modName=$(echo ${modName} | cut -b2-)
127 fi
128
129 case "${MODULES} " in
130 *"/${modName}.ko "*) return ;;
131 esac
132
133 if echo ${builtins} | egrep -q '(^| )'${modName}'( |$)'
134 then
135 echo "module ${modName} assumed to be built in"
136 return
137 fi
138
139 # special cases
140 if [[ ${modName} = i2o_block ]]
141 then
142 findmodule i2o_core
143 findmodule -i2o_pci
144 modName="i2o_block"
145 elif [[ ${modName} = ppa ]]
146 then
147 findmodule parport
148 findmodule parport_pc
149 modName="ppa"
150 elif [[ ${modName} = sbp2 ]]
151 then
152 findmodule ieee1394
153 findmodule ohci1394
154 modName="sbp2"
155 else
156 moduledep ${modName}
157 for i in ${deps}
158 do
159 findmodule ${i}
160 done
161 fi
162
163 for modExt in o.gz o ko
164 do
165 for modDir in /lib/modules/${kernel}/updates /lib/modules/${kernel}
166 do
167 if [ -d ${modDir} ]
168 then
169 fmPath=$(findone ${modDir} -name ${modName}.${modExt})
170 if [ -f "${fmPath}" ]
171 then
172 break 2
173 fi
174 fi
175 done
176 done
177
178 if [ ! -f ${fmPath} ]
179 then
180 if [ -n "${skiperrors}" ]
181 then
182 return
183 fi
184
185 # ignore the absence of the scsi modules
186 for n in ${PRESCSIMODS}
187 do
188 if [[ ${n} = ${modName} ]]
189 then
190 return
191 fi
192 done
193
194 if [ -n "${allowmissing}" ]
195 then
196 echo "WARNING: No module ${modName} found for kernel ${kernel}, continuing anyway"
197 return
198 fi
199
200 die "No module ${modName} found for kernel ${kernel}, aborting."
201 fi
202
203 # only need to add each module once
204 MODULES="${MODULES} ${fmPath}"
205 }
206
207 inst()
208 {
209 if [ "$#" != "2" ]
210 then
211 echo "usage: inst <file> <destination>"
212 return
213 fi
214 echo "$1 -> $2"
215 cp $1 $2
216 }
217
218 findstoragedriver()
219 {
220 for device in $@
221 do
222 case " ${handledevices} " in
223 *" ${device} "*) continue ;;
224 *) handleddevices="${handleddevices} ${device}" ;;
225 esac
226
227 if [[ "${device}" =~ "md[0-9]+" ]]
228 then
229 echo "Found RAID component ${device}"
230 handleraid "${device}"
231 continue
232 fi
233 echo "Looking for driver for device ${device}"
234 sysfs=$(findone /sys/block -name ${device} -type d)
235 [ -z "${sysfs}" ] && return
236 pushd ${sysfs} >/dev/null 2>&1
237 while [ ! -L device ]
238 do
239 [[ ${PWD} = /sys ]] && continue 2
240 cd ..
241 done
242 cd $(readlink ./device)
243 while [ ! -f modalias ]
244 do
245 [[ ${PWD} = /sys/devices ]] && continue 2
246 cd ..
247 done
248 modalias=$(cat modalias)
249 for driver in $(modprobe --set-version ${kernel} --show-depends ${modalias} 2>/dev/null| awk '{ print gensub(".*/","","g",$2) }')
250 do
251 findmodule ${driver%%.ko}
252 done
253 popd >/dev/null 2>&1
254 done
255 }
256
257 handleraid()
258 {
259 local start=0
260
261 if [ -n "${noraid}" -o ! -f /proc/mdstat ]
262 then
263 return 0
264 fi
265
266 levels=$(grep "^$1[ ]*:" /proc/mdstat | \
267 awk '{ print $4 }')
268 devs=$(grep "^$1[ ]*:" /proc/mdstat | \
269 awk '{ print gensub("\\[[0-9]*\\]","","g",gensub("^md.*raid[0-9]*","","1")) }')
270
271 for level in ${levels}
272 do
273 case ${level} in
274 linear)
275 findmodule linear
276 start=1
277 ;;
278 multipath)
279 findmodule multipath
280 start=1
281 ;;
282 raid[01456])
283 findmodule ${level}
284 start=1
285 ;;
286 *)
287 error "raid level ${level} (in /proc/mdstat) not recognized"
288 ;;
289 esac
290 done
291 findstoragedriver ${devs}
292 if [[ ${start} = 1 ]]
293 then
294 raiddevices="${raiddevices} $1"
295 fi
296 return ${start}
297 }
298
299 handlelvordev()
300 {
301 local vg=$(lvs --noheadings -o vg_name $1 2>/dev/null)
302 if [ -n "${vg}" ]
303 then
304 vg=$(echo ${vg}) # strip whitespace
305 case " ${vg_list} " in
306 *" ${vg} "*)
307 ;;
308 *)
309 vg_list="${vg_list} ${vg}"
310 for device in $(vgdisplay -v ${vg} 2>/dev/null | sed -n 's/PV Name//p')
311 do
312 findstoragedriver ${device##/dev/}
313 done
314 ;;
315 esac
316 else
317 findstoragedriver ${1##/dev/}
318 fi
319 }
320
321 # need r00t privs
322 [[ $(id -u) != 0 ]] && die "you must be r00t."
323
324 while [ $# -gt 0 ]; do
325 case $1 in
326 --fstab*)
327 if echo $1 | grep -q '=' ; then
328 fstab=$(echo $1 | sed 's/^--fstab=//')
329 else
330 fstab=$2
331 shift
332 fi
333 ;;
334
335 --with-usb) withusb=yes ;;
336
337 --with*)
338 if echo $1 | grep -q '=' ; then
339 modname=$(echo $1 | sed 's/^--with=//')
340 else
341 modname=$2
342 shift
343 fi
344 basicmodules="${basicmodules} ${modname}"
345 ;;
346
347 --builtin*)
348 if echo $1 | grep -q '=' ; then
349 modname=$(echo $1 | sed 's/^--builtin=//')
350 else
351 modname=$2
352 shift
353 fi
354 builtins="${builtins} ${modname}"
355 ;;
356
357 --version)
358 echo "mkinitrd: version ${VERSION}"
359 exit 0
360 ;;
361
362 -v) verbose=-v ;;
363 --nocompress) compress="" ;;
364 --ifneeded)
365 # legacy
366 ;;
367 -f) force=1 ;;
368
369 --preload*)
370 if echo $1 | grep -q '=' ; then
371 modname=$(echo $1 | sed 's/^--preload=//')
372 else
373 modname=$2
374 shift
375 fi
376 PREMODS="${PREMODS} ${modname}"
377 ;;
378
379 --force-scsi-probe) forcescsi=1 ;;
380
381 --omit-scsi-modules)
382 PRESCSIMODS=""
383 noscsi=1
384 ;;
385 --force-raid-probe) forceraid=1 ;;
386 --omit-raid-modules) noraid=1 ;;
387 --force-lvm-probe) forcelvm=1 ;;
388 --omit-lvm-modules) nolvm=1 ;;
389 --force-ide-probe) forceide=1 ;;
390 --image-version) img_vers=yes ;;
391 --allow-missing) allowmissing=yes ;;
392 --noresume) noresume=1 ;;
393 --help) usage -n ;;
394 --initramfs) IMAGE_TYPE=initramfs ;;
395 --loopback) IMAGE_TYPE=loopback ;;
396 *)
397 if [ -z "${target}" ]
398 then
399 target=$1
400 elif [ -z "${kernel}" ]
401 then
402 kernel=$1
403 else
404 usage
405 fi
406 ;;
407 esac
408
409 shift
410 done
411
412 # enforce loopback method as default
413 [[ -z ${IMAGE_TYPE} ]] && IMAGE_TYPE=loopback
414
415 if [ -z "${target}" -o -z "${kernel}" ]
416 then
417 usage
418 fi
419
420 if [ -n "${img_vers}" ]
421 then
422 target="${target}-${kernel}"
423 fi
424
425 if [ -z "${force}" -a -f ${target} ]
426 then
427 die "${target} already exists."
428 fi
429
430 if [ -n "${forcescsi}" -a -n "${noscsi}" ]
431 then
432 die "Can't both force scsi probe and omit scsi modules"
433 fi
434
435 if [ -n "${forceraid}" -a -n "${noraid}" ]
436 then
437 die "Can't both force raid probe and omit raid modules"
438 fi
439
440 if [ -n "${forcelvm}" -a -n "${nolvm}" ]
441 then
442 die "Can't both force LVM probe and omit LVM modules"
443 fi
444
445 if [ ! -d /lib/modules/${kernel} ]
446 then
447 die "No modules available for kernel '${kernel}'."
448 fi
449
450 ##############################
451 ####### get modules ##########
452
453 echo "Creating ${IMAGE_TYPE} initrd image"
454 modulefile=/etc/modprobe.conf
455
456 for n in ${PREMODS}
457 do
458 findmodule ${n}
459 done
460
461 needusb=""
462 if [ -n "${withusb}" -a "x${PROBE}" == "xyes" ]
463 then
464 # If / or /boot is on a USB device include the driver. With root by
465 # label we could still get some odd behaviors
466 for fs in / /boot
467 do
468 esc=$(echo ${fs} | sed 's,/,\\/,g')
469 dev=$(mount | awk "/ on ${esc} / { print \$1 }" | sed 's/[0-9]*$//' | cut -d/ -f3)
470 if [ "$(echo ${dev} | cut -c1-2)" = sd ]
471 then
472 if [ $(which kudzu 2>/dev/null) ]
473 then
474 host=$(kudzu --probe -b scsi |
475 gawk '/^device: '${dev}'/,/^host:/ { if (/^host/) { print $2; exit; } }')
476 if [ -d /proc/scsi/usb-storage-${host} -o -f /proc/scsi/usb-storage/${host} ]
477 then
478 needusb=1
479 fi
480 fi
481 fi
482 done
483 fi
484
485 if [ -n "${needusb}" -a "x${PROBE}" == "xyes" ]
486 then
487 drivers=$(awk '/^alias[[:space:]]+usb-controller[0-9]* / { print $3}' < ${modulefile})
488 if [ -n "${drivers}" ]
489 then
490 for driver in ${drivers}
491 do
492 findmodule ${driver}
493 done
494 findmodule scsi_mod
495 findmodule sd_mod
496 findmodule usb-storage
497 fi
498 fi
499
500 if [ -n "${forcescsi}" -o -z "${noscsi}" -a "x${PROBE}" == "xyes" ]
501 then
502 if [ ! -f ${modulefile} ]
503 then
504 modulefile=/etc/conf.modules
505 fi
506
507 if [ -f ${modulefile} ]
508 then
509 scsimodules=$(grep "alias[[:space:]]\+scsi_hostadapter" ${modulefile} | grep -v '^[ ]*#' | LC_ALL=C sort -u | awk '{ print $3 }')
510
511 if [ -n "${scsimodules}" ]
512 then
513 for n in ${PRESCSIMODS}
514 do
515 findmodule ${n}
516 done
517
518 for n in ${scsimodules}
519 do
520 # for now allow scsi modules to come from anywhere. There are some
521 # RAID controllers with drivers in block/
522 findmodule ${n}
523 done
524 fi
525 fi
526 fi
527
528 # If we have ide devices and module ide, do the right thing
529 ide=/proc/ide/ide*
530 if [ -n "${forceide}" -o -n "${ide}" -a "x${PROBE}" == "xyes" ]
531 then
532 findmodule -ide-disk
533 fi
534
535 # If we have dasd devices, include the necessary modules (S/390)
536 if [ "x${PROBE}" == "xyes" -a -d /proc/dasd ]
537 then
538 findmodule -dasd_mod
539 findmodule -dasd_eckd_mod
540 findmodule -dasd_fba_mod
541 fi
542
543 if [ "x${PROBE}" == "xyes" ]
544 then
545 # check to see if we need to set up a loopback filesystem
546 rootdev=$(awk '/^[ \t]*[^#]/ { if ($2 == "/") { print $1; }}' ${fstab})
547 # check if it's root by label
548 if echo ${rootdev} | cut -c1-6 | grep -q "LABEL="
549 then
550 majmin=$(stat -c "%t:%T" /dev/root)
551 if [ -n "${majmin}" ]
552 then
553 dev=$(findall /sys/block -name dev | while read device ; do \
554 echo "${majmin}" | cmp -s ${device} && echo ${device} ; done \
555 | sed -e 's,.*/\([^/]\+\)/dev,\1,' )
556 if [ -n "${dev}" ]; then
557 echo "Found root device ${dev} for ${rootdev}"
558 rootdev=${dev}
559 fi
560 fi
561 fi
562 if echo ${rootdev} | cut -d/ -f3 | grep -q loop
563 then
564 key="^# $(echo ${rootdev} | cut -d/ -f3 | tr '[a-z]' '[A-Z]'):"
565 if ! grep "${key}" ${fstab} >> /dev/null
566 then
567 echo "The root filesystem is on a ${rootdev}, but there is no magic entry in ${fstab}"
568 echo "for this device. Consult the mkinitrd man page for more information"
569 echo "loopback root."
570 exit 1
571 fi
572
573 line=$(grep "${key}" ${fstab})
574 loopDev=$(echo ${line} | awk '{print $3}')
575 loopFs=$(echo ${line} | awk '{print $4}')
576 loopFile=$(echo ${line} | awk '{print $5}')
577
578 basicmodules="${basicmodules} -loop"
579 if [ "${loopFs}" = "vfat" -o "${loopFs}" = "msdos" ]
580 then
581 basicmodules="${basicmodules} -fat"
582 fi
583 basicmodules="${basicmodules} -${loopFs}"
584 # check if the root fs is on a logical volume
585 # this check must be last
586 else
587 handlelvordev ${rootdev}
588 fi
589
590 rootfs=$(awk '{ if ($1 !~ /^[ \t]*#/ && $2 == "/") { print $3; }}' ${fstab})
591 rootopts=$(awk '{ if ($1 !~ /^[ \t]*#/ && $2 == "/") { print $4; }}' ${fstab}\
592 | sed -e 's/^r[ow],//' -e 's/,r[ow],$//' -e 's/,r[ow],/,/' \
593 -e 's/^r[ow]$/defaults/' -e 's/$/,ro/')
594
595 # in case the root filesystem is modular
596 findmodule -${rootfs}
597
598 # find the first swap dev which would get used for swsusp
599 swsuspdev=$(awk '/^[ \t]*[^#]/ { if ($3 == "swap") { print $1; }}' ${fstab} \
600 | head -n 1)
601 if ! echo ${swsuspdev} | cut -c1-6 | grep -q "LABEL="
602 then
603 handlelvordev ${swsupdev}
604 fi
605 fi
606
607 # If we use LVM or dm-based raid, include dm-mod
608 # XXX: dm not really supported yet.
609 testdm=""
610 [ -n "${vg_list}" ] && testdm="yes"
611 [ -n "${forceraid}" -o -n "${forcelvm}" ] && testdm="yes"
612 [ "x${PROBE}" == "xyes" -a \
613 -n "$(test -z \"${nolvm}\" -o -z \"${noraid}\")" ] && testdm="yes"
614
615 if [ -n "${testdm}" ]
616 then
617 if [ -x /sbin/dmsetup -a -e /dev/mapper/control ]
618 then
619 dmout=$(/sbin/dmsetup ls 2>/dev/null)
620 if [ "${dmout}" != "No devices found" -a "${dmout}" != "" ]
621 then
622 findmodule -dm-mod
623
624 # DM requires all of these to be there in case someone used the
625 # feature. broken. (#132001)
626 findmodule -dm-mirror
627 findmodule -dm-zero
628 findmodule -dm-snapshot
629 fi
630 fi
631 fi
632
633 for n in ${basicmodules}
634 do
635 findmodule ${n}
636 done
637
638 for n in ${CONFMODS}
639 do
640 findmodule ${n}
641 done
642
643 echo "Using modules:${MODULES}"
644
645 ####### eof modules ##########
646 ##############################
647
648
649 # create basic filesystem layout
650 install -d ${DEST}/{bin,dev,etc,lib,loopfs,proc,sys,sysroot} || die
651
652 # install busybox
653 echo "$(which busybox.mkinitrd)"
654 install -m0755 $(which busybox.mkinitrd) ${DEST}/bin/busybox || die
655 for i in '[' ash basename cat cut chroot clear cp dirname echo env false find \
656 grep gunzip gzip init ln ls loadkmap losetup mkdir mknod modprobe more mount mv \
657 pivot_root ps pwd rm rmdir sh sleep test touch true umount uname \
658 xargs yes chmod chown
659 do
660 # static links
661 ln ${DEST}/bin/busybox ${DEST}/bin/${i} || die "${i}"
662 done
663
664 # install run-init
665 echo "$(which run-init.mkinitrd)"
666 install -m0755 $(which run-init.mkinitrd) ${DEST}/bin/run-init || die
667
668 # install insmod.static
669 echo "$(which insmod.static)"
670 install -m0755 $(which insmod.static) ${DEST}/bin/insmod || die
671
672 # install udev
673 cp -a /etc/udev ${DEST}/etc || die
674 install -m0755 /sbin/udev.static ${DEST}/bin/udev || die
675 install -m0755 /sbin/udevd.static ${DEST}/bin/udevd || die
676 install -m0755 /sbin/udevstart.static ${DEST}/bin/udevstart || die
677
678 # install lvm
679 if [ -n "${vg_list}" ]
680 then
681 inst /sbin/lvm.static "${DEST}/bin/lvm"
682 if [ -f /etc/lvm/lvm.conf ]
683 then
684 cp ${verbose} --parents /etc/lvm/lvm.conf ${DEST}/
685 fi
686 fi
687
688 # create some needed device nodes
689 mkdir ${DEST}/dev/mapper || die
690 mknod ${DEST}/dev/console c 5 1 || die
691 mknod ${DEST}/dev/null c 1 3 || die
692 mknod ${DEST}/dev/ram b 1 1 || die
693 mknod ${DEST}/dev/rtc c 10 135 || die
694 mknod ${DEST}/dev/systty c 4 0 || die
695 mknod ${DEST}/dev/tty c 5 0 || die
696 mknod ${DEST}/dev/zero c 1 5 || die
697 for ((i=0; i < 13; i++))
698 do
699 mknod ${DEST}/dev/tty${i} c 4 ${i} || die "tty${i}"
700 done
701 for ((i=64; i < 68; i++))
702 do
703 mknod ${DEST}/dev/ttyS$((${i} - 64)) c 4 ${i} || die "ttyS$((${i} - 64))"
704 done
705
706 # create init script
707 :> ${DEST}/init || die
708 add_initrd '#!/bin/sh'
709
710 add_initrd 'mount -t proc proc /proc'
711 add_initrd 'mount -t sysfs sysfs /sys'
712
713 [[ ${IMAGE_TYPE} = loopback ]] && add_initrd 'mount -t ramfs -o remount,rw /dev/ram /'
714
715 add_initrd 'echo "-- Creating inital device nodes ..."'
716 add_initrd 'mount -o mode=0755 -t tmpfs udev /dev'
717 add_initrd 'mkdir /dev/pts'
718 add_initrd 'mkdir /dev/shm'
719 add_initrd 'mkdir /dev/mapper'
720 add_initrd 'mknod /dev/console c 5 1'
721 add_initrd 'mknod /dev/null c 1 3'
722 add_initrd 'mknod /dev/ram b 1 1'
723 add_initrd 'mknod /dev/rtc c 10 135'
724 add_initrd 'mknod /dev/systty c 4 0'
725 add_initrd 'mknod /dev/tty c 5 0'
726 add_initrd 'mknod /dev/zero c 1 5'
727 for (( i=0; i < 13; i++ )); do
728 add_initrd "mknod /dev/tty${i} c 4 ${i}"
729 done
730 for (( i=64; i < 68; i++)); do
731 add_initrd "mknod /dev/ttyS$((${i} - 64)) c 4 ${i}"
732 done
733
734 add_initrd 'echo "-- Starting udevd ..."'
735 add_initrd 'ln -snf bin /sbin'
736 add_initrd '/sbin/udevstart'
737 add_initrd 'ln -snf /proc/self/fd /dev/fd'
738 add_initrd 'ln -snf fd/0 /dev/stdin'
739 add_initrd 'ln -snf fd/1 /dev/stdout'
740 add_initrd 'ln -snf fd/2 /dev/stderr'
741 add_initrd 'ln -snf /proc/kcore /dev/core'
742 add_initrd 'touch /dev/.udev'
743
744 add_initrd 'echo "-- Setting up hotplug ..."'
745 add_initrd 'echo "/sbin/hotplug" > /proc/sys/kernel/hotplug'
746 # add_initrd 'for i in $(find /lib -type f -name *.ko)'
747 # add_initrd 'do'
748 # add_initrd ' echo "-- Loading module ${i}"'
749 # add_initrd ' insmod ${i};'
750 # # handle special cases like usb
751 # add_initrd ' if [ "${i}" = "usb-storage" ]'
752 # add_initrd ' then'
753 # add_initrd ' echo "Waiting 8 seconds for usb-driver initialization."'
754 # add_initrd ' sleep 8'
755 # add_initrd ' fi'
756 # add_initrd 'done'
757
758 # loading detected modules with options
759 for MODULE in ${MODULES}
760 do
761 text=""
762 module=$(echo ${MODULE} | sed "s|.*/||" | sed "s/.k\?o$//")
763 fullmodule=$(echo ${MODULE} | sed "s|.*/||")
764
765 options=$(sed -n -e "s/^options[ ][ ]*${module}[ ][ ]*//p" ${modulefile} 2>/dev/null)
766
767 if [ -n "${options}" ]
768 then
769 echo "Adding module ${module}${text} with options ${options} ..."
770 else
771 echo "Adding module ${module}${text} ..."
772 fi
773
774 add_initrd "echo \"-- Loading ${fullmodule} module\""
775 add_initrd "insmod /lib/${fullmodule} ${options}"
776
777 # Hack - we need a delay after loading usb-storage to give things
778 # time to settle down before we start looking a block devices
779 if [ "${module}" = "usb-storage" ]
780 then
781 add_initrd 'echo Waiting 8 seconds for driver initialization.'
782 add_initrd 'sleep 8'
783 fi
784 if [ "${module}" = "zfcp" -a -f /etc/zfcp.conf ]
785 then
786 add_initrd 'echo Waiting 2 seconds for driver initialization.'
787 add_initrd 'sleep 2'
788 cat /etc/zfcp.conf | grep -v "^#" | tr "A-Z" "a-z" | while read DEVICE SCSIID WWPN SCSILUN FCPLUN
789 do
790 add_initrd "echo -n ${WWPN} > /sys/bus/ccw/drivers/zfcp/${DEVICE/0x/}/port_add"
791 add_initrd "echo -n ${FCPLUN} > /sys/bus/ccw/drivers/zfcp/${DEVICE/0x/}/${WWPN}/unit_add"
792 add_initrd "echo -n 1 > /sys/bus/ccw/drivers/zfcp/${DEVICE/0x/}/online"
793 done
794 fi
795 done
796
797 # lvm support
798 if [ -n "${vg_list}" ]
799 then
800 add_initrd 'echo Scanning logical volumes'
801 add_initrd 'lvm vgscan --ignorelockingfailure'
802 add_initrd 'echo Activating logical volumes'
803 add_initrd "lvm vgchange -ay --ignorelockingfailure ${vg_list}"
804 fi
805
806 # loopback support
807 if [ -n "${loopDev}" ]
808 then
809 # needed on the host system
810 install -d /initrd
811 cp -a ${loopDev} ${DEST}/dev || die
812 cp -a ${rootdev} ${DEST}/dev || die
813 add_initrd 'echo "Mounting device containing loopback root filesystem ..."'
814 add_initrd "mount -t ${loopFs} ${loopDev} /loopfs"
815 add_initrd "echo Setting up loopback device ${rootdev}"
816 add_initrd "losetup ${rootdev} /loopfs${loopFile}"
817 fi
818
819 # software suspend
820 if [ -z "${noresume}" ]
821 then
822 add_initrd "resume ${swsuspdev}"
823 fi
824
825 # raid
826 if [ -n "${raiddevices}" ]
827 then
828 for dev in ${raiddevices}
829 do
830 cp -a /dev/${dev} ${DEST}/dev || die
831 add_initrd "raidautorun /dev/${dev}"
832 done
833 fi
834
835 add_initrd 'echo "-- Mounting sysroot ..."'
836 add_initrd '. /etc/rootdev'
837 add_initrd '[ ! -e ${device} ] && mknod ${device} b ${major} ${minor}'
838 add_initrd 'echo "${device} /sysroot ${rootfs} defaults,ro 0 0" > /etc/fstab'
839 add_initrd 'mount /sysroot'
840
841 add_initrd 'echo "-- Switching to real sysroot ..."'
842 add_initrd 'umount /sys'
843 add_initrd 'umount /proc'
844
845 [[ ${IMAGE_TYPE} = initramfs ]] && add_initrd 'exec run-init /sysroot /sbin/init $@ </sysroot/dev/console >/sysroot/dev/console'
846 if [[ ${IMAGE_TYPE} = loopback ]]
847 then
848 add_initrd 'cd /sysroot'
849 add_initrd 'pivot_root . initrd'
850 add_initrd "exec /sbin/chroot . sh -c 'umount -n /initrd >/dev/null 2>&1;exec -a init.new /sbin/init'</dev/console >/dev/console 2>&1"
851 fi
852
853 chmod +x ${DEST}/init || die
854
855 # setup root block device
856 [[ -z ${rootdev} ]] && die "no known rootdev found."
857 echo "device=${rootdev}" > ${DEST}/etc/rootdev || die
858 echo "major=$(stat -c %t ${rootdev})" >> ${DEST}/etc/rootdev || die
859 echo "minor=$(stat -c %T ${rootdev})" >> ${DEST}/etc/rootdev || die
860 echo "rootfs=${rootfs}" >> ${DEST}/etc/rootdev || die
861
862 # install detected modules
863 echo "Coping your modules to '${DEST}/lib' ..."
864 for MODULE in ${MODULES}
865 do
866 if [ -x /usr/bin/strip ]
867 then
868 /usr/bin/strip -g ${verbose} ${MODULE} -o ${DEST}/lib/$(basename ${MODULE}) || die
869 else
870 cp ${verbose} -a ${MODULE} ${DEST}/lib || die
871 fi
872 done
873
874 # create the image
875 echo "Creating initrd image '${target}' ..."
876 if [[ ${IMAGE_TYPE} = initramfs ]]
877 then
878 (cd "${DEST}" ; find . | cpio --quiet -o -H newc | gzip -9 >${IMAGE})
879 cat ${IMAGE} > ${target} || die
880 fi
881
882 if [[ ${IMAGE_TYPE} = loopback ]]
883 then
884 MOUNTTMP="$(mktemp -d)"
885
886 # create ext2 img
887 dd if=/dev/zero of=${IMAGE} bs=1024 count=${IMAGESIZE} &> /dev/null || die
888 mke2fs -m 0 -i 1024 -F ${IMAGE} &> /dev/null || die
889 mount -o loop ${IMAGE} ${MOUNTTMP} || die
890 mv ${DEST}/* ${MOUNTTMP} || die
891 umount ${MOUNTTMP} || die
892 gzip -9 ${IMAGE} || die
893 cat ${IMAGE}.gz > ${target} || die
894 [ -d ${MOUNTTMP} ] && rm -rf ${MOUNTTMP}
895
896 # create inird dir for pivot_root
897 [ ! -d /initrd ] && { install -d /initrd || die; }
898 fi
899
900 # clean up
901 [ -d ${DEST} ] && rm -rf ${DEST}
902 [ -f ${IMAGE} ] && rm -f ${IMAGE}
903
904 # all went ok at this point
905 exit 0