Magellan Linux

Annotation of /trunk/mkinitrd/mkinitrd.sh

Parent Directory Parent Directory | Revision Log Revision Log


Revision 302 - (hide annotations) (download) (as text)
Tue Dec 6 21:38:12 2005 UTC (18 years, 5 months ago) by niro
File MIME type: application/x-sh
File size: 21897 byte(s)
added exit 0 at eof

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