Magellan Linux

Contents of /tags/mkinitrd-6_3_4/mkinitrd.in

Parent Directory Parent Directory | Revision Log Revision Log


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