Magellan Linux

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

Parent Directory Parent Directory | Revision Log Revision Log


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