Magellan Linux

Contents of /trunk/mkinitrd-magellan/mkinitrd.in

Parent Directory Parent Directory | Revision Log Revision Log


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