Magellan Linux

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 894 - (hide annotations) (download)
Wed Aug 5 16:24:23 2009 UTC (14 years, 9 months ago) by niro
File size: 9123 byte(s)
-install all busybox applets
-use mdev for /dev management
-use inmod from busybox
-fixed a small typo regarding v86d installation
-set DOSATA and DOPATA as default settings
-support all do/no commandline combinations
1 niro 562 #!/bin/bash
2 niro 810 # $Id$
3 niro 562
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     LIBDIR="%LIBDIR%"
44     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 niro 664 MODULES_FRAMEBUFFER="${LIBDIR}/mkinitrd/modules.framebuffer"
51 niro 562 MAKEDEV="${LIBDIR}/mkinitrd/MAKEDEV.sh"
52    
53     compress=1
54     allowmissing=""
55     target=""
56     kernel=""
57     force=""
58     verbose=""
59     img_vers=""
60     builtins=""
61     modulefile=/etc/modules.conf
62     rc=0
63    
64     IMAGESIZE=4000
65     PRESCSIMODS="sd_mod"
66     fstab="/etc/fstab"
67    
68     vg_list=""
69    
70     die() { echo "Error: $@"; exit 1; }
71     add_initrd() { echo "$@" >> ${DEST}/init || die; }
72    
73     DEST="$(mktemp -d)"
74     IMAGE="$(mktemp)"
75    
76     usage()
77     {
78     echo "usage: $(basename $0) [--version] [--help] [-v] [-f]"
79     echo " [--image-version] [--no-strip] [--nocompress]"
80 niro 664 echo " [--linuxrc /path/to/custom/linuxrc ]"
81 niro 562 echo " <initrd-image> <kernel-version>"
82     echo
83     echo " (ex: $(basename $0) /boot/initrd-2.2.5-15.img 2.2.5-15)"
84    
85     exit 0
86     }
87    
88     moduledep()
89     {
90     if [ ! -f "/lib/modules/${kernel}/modules.dep" ]
91     then
92     die "No dep file found for kernel ${kernel}"
93     fi
94    
95     echo "Looking for deps of module $1"
96     deps=$(awk 'BEGIN { searched=ARGV[2]; ARGV[2]=""; rc=1 } \
97     function modname(filename) { match(filename, /\/([^\/]+)\.k?o:?$/, ret); return ret[1] } \
98     function show() { if (orig == searched) { print dep; orig=""; rc=0; exit } } \
99 niro 845 /^.*kernel/ { show(); \
100 niro 562 orig=modname($1); dep=""; \
101     if ($2) { for (i = 2; i <= NF; i++) { dep=sprintf("%s %s", dep, modname($i)); } } } \
102     /^ / { dep=sprintf("%s %s", dep, modname($1)); } \
103     END { show(); exit(rc) }' /lib/modules/${kernel}/modules.dep $1)
104     [ -n "${deps}" ] && echo ":${deps}" || echo
105     }
106    
107     findone() { /usr/bin/find "$@" | /bin/awk '{ print $1; exit; }'; }
108     findall() { /usr/bin/find "$@"; }
109    
110     findmodule()
111     {
112     skiperrors=""
113    
114     if [[ $1 = --skiperrors ]]
115     then
116     skiperrors=--skiperrors
117     shift
118     fi
119    
120     local modName=$1
121    
122     if [ "${modName}" = "off" -o "${modName}" = "null" ]
123     then
124     return
125     fi
126    
127     if [ $(echo ${modName} | cut -b1) = "-" ]
128     then
129     skiperrors=--skiperrors
130     modName=$(echo ${modName} | cut -b2-)
131     fi
132    
133     case "${MODULES} " in
134     *"/${modName}.ko "*) return ;;
135     esac
136    
137     if echo ${builtins} | egrep -q '(^| )'${modName}'( |$)'
138     then
139     echo "module ${modName} assumed to be built in"
140     return
141     fi
142    
143     # special cases
144     if [[ ${modName} = i2o_block ]]
145     then
146     findmodule i2o_core
147     findmodule -i2o_pci
148     modName="i2o_block"
149     elif [[ ${modName} = ppa ]]
150     then
151     findmodule parport
152     findmodule parport_pc
153     modName="ppa"
154     elif [[ ${modName} = sbp2 ]]
155     then
156     findmodule ieee1394
157     findmodule ohci1394
158     modName="sbp2"
159     else
160     moduledep ${modName}
161     for i in ${deps}
162     do
163     findmodule ${i}
164     done
165     fi
166    
167     for modExt in o.gz o ko
168     do
169     for modDir in /lib/modules/${kernel}/updates /lib/modules/${kernel}
170     do
171     if [ -d ${modDir} ]
172     then
173     fmPath=$(findone ${modDir} -name ${modName}.${modExt})
174     if [ -f "${fmPath}" ]
175     then
176     break 2
177     fi
178     fi
179     done
180     done
181    
182     if [ ! -f ${fmPath} ]
183     then
184     if [ -n "${skiperrors}" ]
185     then
186     return
187     fi
188    
189     # ignore the absence of the scsi modules
190     for n in ${PRESCSIMODS}
191     do
192     if [[ ${n} = ${modName} ]]
193     then
194     return
195     fi
196     done
197    
198     if [ -n "${allowmissing}" ]
199     then
200     echo "WARNING: No module ${modName} found for kernel ${kernel}, continuing anyway"
201     return
202     fi
203    
204     die "No module ${modName} found for kernel ${kernel}, aborting."
205     fi
206    
207     # only need to add each module once
208     MODULES="${MODULES} ${fmPath}"
209     }
210    
211     install_kernel_modules()
212     {
213     local list="$1"
214     local module
215    
216 niro 664 # no list found; return
217     [[ -z ${list} ]] && return
218    
219 niro 562 while read module args
220     do
221     case "${module}" in
222     \#*|"") continue ;;
223     esac
224    
225     findmodule ${module}
226     done << EOF
227     $(cat ${list}; echo)
228     EOF
229    
230     # create empty modules.lala file
231     :> ${DEST}/etc/$(basename ${list})
232    
233     # install detected modules
234     echo "Coping your modules to '${DEST}/lib' ..."
235     for MODULE in ${MODULES}
236     do
237     if [ -x /usr/bin/strip ] && [[ ${NOSTRIP} = false ]]
238     then
239     /usr/bin/strip -g ${verbose} ${MODULE} -o ${DEST}/lib/$(basename ${MODULE}) || die
240     else
241     cp ${verbose} -a ${MODULE} ${DEST}/lib || die
242     fi
243    
244     # generate modules load file
245     echo "$(basename ${MODULE} .ko)" >> ${DEST}/etc/$(basename ${list}) || die
246     done
247    
248     export ALL_MODULES="${ALL_MODULES} ${MODULES}"
249     unset MODULES
250     }
251    
252     # need r00t privs
253     [[ $(id -u) != 0 ]] && die "you must be r00t."
254    
255     # enforce initramfs method as default
256     [[ -z ${IMAGE_TYPE} ]] && IMAGE_TYPE=initramfs
257    
258     while [ $# -gt 0 ]; do
259     case $1 in
260     --version)
261     echo "mkinitrd: version ${VERSION}"
262     exit 0
263     ;;
264    
265     -v) verbose=-v ;;
266     -f) force=1 ;;
267     --nocompress) compress="" ;;
268     --image-version) img_vers=yes ;;
269     --allow-missing) allowmissing=yes ;;
270     --noresume) noresume=1 ;;
271     --help) usage -n ;;
272     --initramfs) IMAGE_TYPE=initramfs ;;
273     --loopback) IMAGE_TYPE=loopback ;;
274     --no-strip) NOSTRIP=true ;;
275 niro 664 --linuxrc) shift; LINUXRC="$1" ;;
276 niro 562 *)
277     if [ -z "${target}" ]
278     then
279     target=$1
280     elif [ -z "${kernel}" ]
281     then
282     kernel=$1
283     else
284     usage
285     fi
286     ;;
287     esac
288    
289     shift
290     done
291    
292 niro 664 # no kernel or target given
293     if [[ -z ${target} ]] || [[ -z ${kernel} ]]
294     then
295     usage
296     fi
297 niro 562
298 niro 664 # die if linuxrc does not exist
299     [[ ! -e ${LINUXRC} ]] && die "linuxrc '${LINUXRC}' not found."
300    
301 niro 562 # create basic filesystem layout
302 niro 894 install -d ${DEST}/{bin,dev,etc,lib,loopfs,proc,sbin,sys,sysroot,usr/bin,usr/sbin} || die
303 niro 562
304     # install busybox
305     echo "$(which busybox.mkinitrd)"
306     install -m0755 $(which busybox.mkinitrd) ${DEST}/bin/busybox || die
307     for i in '[' ash basename cat cut clear cp dirname echo env false find \
308     grep gunzip gzip ln ls loadkmap mkdir mknod more mount mv \
309     ps pwd rm rmdir sh sleep test touch true umount uname \
310     xargs yes chmod chown
311     do
312     # use soft links from now on;
313     # hardlinks in initramfs apears to be broken on newer kernels
314     # -> "request module: runaway loop modprobe binfmt-0000"
315     # see: http://www.gossamer-threads.com/lists/linux/kernel/728042
316     ln -s /bin/busybox ${DEST}/bin/${i} || die "${i}"
317     done
318    
319     # sbin related
320     for i in chroot init losetup modprobe pivot_root
321     do
322 niro 894 ln -s ${DEST}/bin/busybox ${DEST}/sbin/${i} || die "${i}"
323 niro 562 done
324    
325     # install run-init
326     echo "$(which run-init.mkinitrd)"
327     install -m0755 $(which run-init.mkinitrd) ${DEST}/sbin/run-init || die
328    
329     # install insmod.static
330 niro 894 #echo "$(which insmod.static)"
331     #install -m0755 $(which insmod.static) ${DEST}/sbin/insmod || die
332 niro 562
333 niro 703 # install v86d for uvesafb support if installed
334     if which v86d &> /dev/null
335     then
336 niro 894 echo "$(which v86d)"
337 niro 703 install -m0755 $(which v86d) ${DEST}/sbin/v86d || die
338     fi
339    
340 niro 562 # create some needed device nodes
341 niro 894 #install -o root -g root -m0754 ${MAKEDEV} ${DEST}/dev/MAKEDEV || die
342     #( cd ${DEST}/dev; ./MAKEDEV -v generic-nopty)
343 niro 562
344     ## install kernel modules ##
345     # generic needed
346     install_kernel_modules "${MODULES_GENERIC}"
347    
348     # usb
349     install_kernel_modules "${MODULES_USB}"
350    
351     # scsi
352     install_kernel_modules "${MODULES_SCSI}"
353    
354     # sata
355     install_kernel_modules "${MODULES_SATA}"
356    
357     # pata
358     install_kernel_modules "${MODULES_PATA}"
359    
360 niro 664 # framebuffer
361     install_kernel_modules "${MODULES_FRAMEBUFFER}"
362    
363 niro 562 # show all modules
364     for i in ${ALL_MODULES}
365     do
366     echo ${i}
367     done
368    
369     # install linuxrc
370     install -m0755 ${LINUXRC} ${DEST}/init || die
371    
372     # create the image
373     echo "Creating initrd image '${target}' ..."
374     if [[ ${IMAGE_TYPE} = initramfs ]]
375     then
376     (cd "${DEST}" ; find . | cpio --quiet -o -H newc | gzip -9 >${IMAGE})
377     cat ${IMAGE} > ${target} || die
378     fi
379    
380     if [[ ${IMAGE_TYPE} = loopback ]]
381     then
382     MOUNTTMP="$(mktemp -d)"
383    
384     # create ext2 img
385     dd if=/dev/zero of=${IMAGE} bs=1024 count=${IMAGESIZE} &> /dev/null || die
386     mke2fs -m 0 -i 1024 -F ${IMAGE} &> /dev/null || die
387     mount -o loop ${IMAGE} ${MOUNTTMP} || die
388     mv ${DEST}/* ${MOUNTTMP} || die
389     umount ${MOUNTTMP} || die
390     gzip -9 ${IMAGE} || die
391     cat ${IMAGE}.gz > ${target} || die
392     [ -d ${MOUNTTMP} ] && rm -rf ${MOUNTTMP}
393    
394     # create inird dir for pivot_root
395     [ ! -d /initrd ] && { install -d /initrd || die; }
396     fi
397    
398     # clean up
399     [ -d ${DEST} ] && rm -rf ${DEST}
400     [ -f ${IMAGE} ] && rm -f ${IMAGE}
401    
402     # all went ok at this point
403     exit 0