Magellan Linux

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

Parent Directory Parent Directory | Revision Log Revision Log


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