Magellan Linux

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 333 - (hide annotations) (download) (as text)
Tue Feb 21 00:02:17 2006 UTC (18 years, 2 months ago) by niro
File MIME type: application/x-sh
File size: 9057 byte(s)
mkinitrd-livecd; probably working

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