Magellan Linux

Annotation of /trunk/mkinitrd/mkinitrd-livecd.sh

Parent Directory Parent Directory | Revision Log Revision Log


Revision 400 - (hide annotations) (download) (as text)
Fri Nov 24 17:27:28 2006 UTC (17 years, 5 months ago) by niro
File MIME type: application/x-sh
File size: 8286 byte(s)
removed udev, using a static /dev for initial boots. udev gets started later

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