Magellan Linux

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

Parent Directory Parent Directory | Revision Log Revision Log


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