Magellan Linux

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 336 - (hide annotations) (download) (as text)
Thu Feb 23 15:55:08 2006 UTC (18 years, 2 months ago) by niro
File MIME type: application/x-sh
File size: 8735 byte(s)
fixed libdir and using initramfs image as default

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