Magellan Linux

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1140 - (hide annotations) (download)
Thu Aug 19 12:24:23 2010 UTC (13 years, 8 months ago) by niro
File size: 21565 byte(s)
-dropped kudzu, using hwinfo instead if present
1 niro 564 #!/bin/bash
2 niro 738 # $Header: /home/cvsd/magellan-cvs/magellan-src/mkinitrd-magellan/mkinitrd.in,v 1.4 2008-06-11 22:11:40 niro Exp $
3 niro 564
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 niro 993 modulefile="/etc/modules.conf"
57     modprobeconf="/etc/modprobe.d/*"
58 niro 564 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 niro 845 /^.*kernel/ { show(); \
98 niro 564 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 niro 897 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 niro 901 # 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 niro 897 echo ${UUID}
340     }
341    
342 niro 564 # 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 niro 1140 dev=$(mount | awk "/ on ${esc} / { print \$1 }" | sed 's/[0-9]*$//')
491     if [ "$(echo ${dev} | cut -c6-7)" = sd ]
492 niro 564 then
493 niro 1140 if [ $(which hwinfo 2>/dev/null) ]
494 niro 564 then
495 niro 1140 if [[ -n $(hwinfo --disk --only ${dev} | grep 'Driver Modules' | grep 'usb[_|-]storage') ]]
496 niro 564 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 niro 894 install -d ${DEST}/{bin,dev,etc,lib,loopfs,proc,sbin,sys,sysroot,usr/bin,usr/sbin} || die
670 niro 564
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 niro 894 ln -s ${DEST}/bin/busybox ${DEST}/sbin/${i} || die "${i}"
690 niro 564 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 niro 894 #echo "$(which insmod.static)"
698     #install -m0755 $(which insmod.static) ${DEST}/sbin/insmod || die
699 niro 564
700 niro 703 # install v86d for uvesafb support if installed
701     if which v86d &> /dev/null
702     then
703 niro 894 echo "$(which v86d)"
704 niro 703 install -m0755 $(which v86d) ${DEST}/sbin/v86d || die
705     fi
706    
707 niro 564 # 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 niro 894 add_initrd 'mount -t tmpfs tmpfs /dev -o rw,mode=0644,size=1024'
747 niro 564
748     [[ ${IMAGE_TYPE} = loopback ]] && add_initrd 'mount -t ramfs -o remount,rw /dev/ram /'
749    
750 niro 894 # install all busybox applets
751     add_initrd 'busybox --install -s'
752    
753 niro 564 # silencio
754     add_initrd 'echo 0 > /proc/sys/kernel/printk'
755    
756 niro 737 add_initrd 'echo "-- Creating initial device nodes ..."'
757 niro 894 # populate dev
758     add_initrd 'mdev -s'
759     # handle hotplug events properly
760     add_initrd 'echo /sbin/mdev > /proc/sys/kernel/hotplug'
761 niro 564
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 niro 993 options=$(sed -n -e "s/^options[ ][ ]*${module}[ ][ ]*//p" ${modprobeconf} 2>/dev/null)
770 niro 564
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 niro 738 add_initrd 'mount /sysroot || ash'
843 niro 564
844 niro 894 # unset hotplug event-manager
845     add_initrd 'echo > /proc/sys/kernel/hotplug'
846    
847 niro 564 # de-silencio
848     add_initrd 'echo 3 > /proc/sys/kernel/printk'
849    
850     add_initrd 'echo "-- Switching to real sysroot ..."'
851 niro 894 add_initrd 'umount /dev'
852 niro 564 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 niro 897 echo "device='UUID=$(get_blkid ${rootdev})'" > ${DEST}/etc/rootdev || die
868     echo "rootfs='${rootfs}'" >> ${DEST}/etc/rootdev || die
869 niro 564
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