Magellan Linux

Annotation of /trunk/mkinitrd-magellan/livecd/mkinitrd-livecd

Parent Directory Parent Directory | Revision Log Revision Log


Revision 559 - (hide annotations) (download)
Sun Sep 2 00:34:48 2007 UTC (16 years, 8 months ago) by niro
File size: 8621 byte(s)
-variable LIBDIR

1 niro 532 #!/bin/bash
2 niro 559 # $Header: /home/cvsd/magellan-cvs/magellan-src/mkinitrd-magellan/livecd/mkinitrd-livecd,v 1.3 2007-09-02 00:34:47 niro Exp $
3 niro 532
4     # mkinitrd-livecd
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     MODULES=""
39     NOSTRIP=false
40    
41     [ -e /etc/conf.d/mkinitrd-livecd ] && . /etc/conf.d/mkinitrd-livecd
42    
43 niro 559 LIBDIR="%LIBDIR%"
44 niro 558 LINUXRC="${LIBDIR}/mkinitrd/linuxrc.sh"
45     MODULES_GENERIC="${LIBDIR}/mkinitrd/modules.generic"
46     MODULES_USB="${LIBDIR}/mkinitrd/modules.usb"
47     MODULES_SCSI="${LIBDIR}/mkinitrd/modules.scsi"
48     MODULES_SATA="${LIBDIR}/mkinitrd/modules.sata"
49     MODULES_PATA="${LIBDIR}/mkinitrd/modules.pata"
50     MAKEDEV="${LIBDIR}/mkinitrd/MAKEDEV.sh"
51 niro 532
52     compress=1
53     allowmissing=""
54     target=""
55     kernel=""
56     force=""
57     verbose=""
58     img_vers=""
59     builtins=""
60     modulefile=/etc/modules.conf
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]"
78     echo " [--image-version] [--no-strip] [--nocompress]"
79     echo " <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     /^\/lib/ { 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     install_kernel_modules()
210     {
211     local list="$1"
212     local module
213    
214     while read module args
215     do
216     case "${module}" in
217     \#*|"") continue ;;
218     esac
219    
220     findmodule ${module}
221     done << EOF
222     $(cat ${list}; echo)
223     EOF
224    
225     # create empty modules.lala file
226     :> ${DEST}/etc/$(basename ${list})
227    
228     # install detected modules
229     echo "Coping your modules to '${DEST}/lib' ..."
230     for MODULE in ${MODULES}
231     do
232     if [ -x /usr/bin/strip ] && [[ ${NOSTRIP} = false ]]
233     then
234     /usr/bin/strip -g ${verbose} ${MODULE} -o ${DEST}/lib/$(basename ${MODULE}) || die
235     else
236     cp ${verbose} -a ${MODULE} ${DEST}/lib || die
237     fi
238    
239     # generate modules load file
240     echo "$(basename ${MODULE} .ko)" >> ${DEST}/etc/$(basename ${list}) || die
241     done
242    
243     export ALL_MODULES="${ALL_MODULES} ${MODULES}"
244     unset MODULES
245     }
246    
247     # need r00t privs
248     [[ $(id -u) != 0 ]] && die "you must be r00t."
249    
250     # enforce initramfs method as default
251     [[ -z ${IMAGE_TYPE} ]] && IMAGE_TYPE=initramfs
252    
253     while [ $# -gt 0 ]; do
254     case $1 in
255     --version)
256     echo "mkinitrd: version ${VERSION}"
257     exit 0
258     ;;
259    
260     -v) verbose=-v ;;
261     -f) force=1 ;;
262     --nocompress) compress="" ;;
263     --image-version) img_vers=yes ;;
264     --allow-missing) allowmissing=yes ;;
265     --noresume) noresume=1 ;;
266     --help) usage -n ;;
267     --initramfs) IMAGE_TYPE=initramfs ;;
268     --loopback) IMAGE_TYPE=loopback ;;
269     --no-strip) NOSTRIP=true ;;
270     *)
271     if [ -z "${target}" ]
272     then
273     target=$1
274     elif [ -z "${kernel}" ]
275     then
276     kernel=$1
277     else
278     usage
279     fi
280     ;;
281     esac
282    
283     shift
284     done
285    
286    
287     # create basic filesystem layout
288     install -d ${DEST}/{bin,dev,etc,lib,loopfs,proc,sbin,sys,sysroot} || die
289    
290     # install busybox
291     echo "$(which busybox.mkinitrd)"
292     install -m0755 $(which busybox.mkinitrd) ${DEST}/bin/busybox || die
293     for i in '[' ash basename cat cut clear cp dirname echo env false find \
294     grep gunzip gzip ln ls loadkmap mkdir mknod more mount mv \
295     ps pwd rm rmdir sh sleep test touch true umount uname \
296     xargs yes chmod chown
297     do
298     # use soft links from now on;
299     # hardlinks in initramfs apears to be broken on newer kernels
300     # -> "request module: runaway loop modprobe binfmt-0000"
301     # see: http://www.gossamer-threads.com/lists/linux/kernel/728042
302     ln -s /bin/busybox ${DEST}/bin/${i} || die "${i}"
303     done
304    
305     # sbin related
306     for i in chroot init losetup modprobe pivot_root
307     do
308     # static links
309     ln ${DEST}/bin/busybox ${DEST}/sbin/${i} || die "${i}"
310     done
311    
312     # install run-init
313     echo "$(which run-init.mkinitrd)"
314     install -m0755 $(which run-init.mkinitrd) ${DEST}/sbin/run-init || die
315    
316     # install insmod.static
317     echo "$(which insmod.static)"
318     install -m0755 $(which insmod.static) ${DEST}/sbin/insmod || die
319    
320     # create some needed device nodes
321     install -o root -g root -m0754 ${MAKEDEV} ${DEST}/dev/MAKEDEV || die
322     ( cd ${DEST}/dev; ./MAKEDEV -v generic-nopty)
323    
324     ## install kernel modules ##
325     # generic needed
326     install_kernel_modules "${MODULES_GENERIC}"
327    
328     # usb
329     install_kernel_modules "${MODULES_USB}"
330    
331     # scsi
332     install_kernel_modules "${MODULES_SCSI}"
333    
334     # sata
335     install_kernel_modules "${MODULES_SATA}"
336    
337     # pata
338     install_kernel_modules "${MODULES_PATA}"
339    
340     # show all modules
341     for i in ${ALL_MODULES}
342     do
343     echo ${i}
344     done
345    
346     # install linuxrc
347     install -m0755 ${LINUXRC} ${DEST}/init || die
348    
349     # create the image
350     echo "Creating initrd image '${target}' ..."
351     if [[ ${IMAGE_TYPE} = initramfs ]]
352     then
353     (cd "${DEST}" ; find . | cpio --quiet -o -H newc | gzip -9 >${IMAGE})
354     cat ${IMAGE} > ${target} || die
355     fi
356    
357     if [[ ${IMAGE_TYPE} = loopback ]]
358     then
359     MOUNTTMP="$(mktemp -d)"
360    
361     # create ext2 img
362     dd if=/dev/zero of=${IMAGE} bs=1024 count=${IMAGESIZE} &> /dev/null || die
363     mke2fs -m 0 -i 1024 -F ${IMAGE} &> /dev/null || die
364     mount -o loop ${IMAGE} ${MOUNTTMP} || die
365     mv ${DEST}/* ${MOUNTTMP} || die
366     umount ${MOUNTTMP} || die
367     gzip -9 ${IMAGE} || die
368     cat ${IMAGE}.gz > ${target} || die
369     [ -d ${MOUNTTMP} ] && rm -rf ${MOUNTTMP}
370    
371     # create inird dir for pivot_root
372     [ ! -d /initrd ] && { install -d /initrd || die; }
373     fi
374    
375     # clean up
376     [ -d ${DEST} ] && rm -rf ${DEST}
377     [ -f ${IMAGE} ] && rm -f ${IMAGE}
378    
379     # all went ok at this point
380     exit 0