Magellan Linux

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 664 - (show annotations) (download)
Mon Jan 14 19:35:02 2008 UTC (16 years, 3 months ago) by niro
File size: 9073 byte(s)
-added support for frambuffer modules
-added support for a custom linuxrc
-display usage if no target or kernel are given
-ignore non existens modules.lists in install_kernel_modules()

1 #!/bin/bash
2 # $Header: /home/cvsd/magellan-cvs/magellan-src/mkinitrd-magellan/livecd/mkinitrd-livecd.in,v 1.2 2008-01-14 19:35:02 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=%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 MODULES_FRAMEBUFFER="${LIBDIR}/mkinitrd/modules.framebuffer"
51 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 echo " [--linuxrc /path/to/custom/linuxrc ]"
81 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 /^\/lib/ { show(); \
100 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 # no list found; return
217 [[ -z ${list} ]] && return
218
219 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 --linuxrc) shift; LINUXRC="$1" ;;
276 *)
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 # no kernel or target given
293 if [[ -z ${target} ]] || [[ -z ${kernel} ]]
294 then
295 usage
296 fi
297
298 # die if linuxrc does not exist
299 [[ ! -e ${LINUXRC} ]] && die "linuxrc '${LINUXRC}' not found."
300
301 # create basic filesystem layout
302 install -d ${DEST}/{bin,dev,etc,lib,loopfs,proc,sbin,sys,sysroot} || die
303
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 # static links
323 ln ${DEST}/bin/busybox ${DEST}/sbin/${i} || die "${i}"
324 done
325
326 # install run-init
327 echo "$(which run-init.mkinitrd)"
328 install -m0755 $(which run-init.mkinitrd) ${DEST}/sbin/run-init || die
329
330 # install insmod.static
331 echo "$(which insmod.static)"
332 install -m0755 $(which insmod.static) ${DEST}/sbin/insmod || die
333
334 # create some needed device nodes
335 install -o root -g root -m0754 ${MAKEDEV} ${DEST}/dev/MAKEDEV || die
336 ( cd ${DEST}/dev; ./MAKEDEV -v generic-nopty)
337
338 ## install kernel modules ##
339 # generic needed
340 install_kernel_modules "${MODULES_GENERIC}"
341
342 # usb
343 install_kernel_modules "${MODULES_USB}"
344
345 # scsi
346 install_kernel_modules "${MODULES_SCSI}"
347
348 # sata
349 install_kernel_modules "${MODULES_SATA}"
350
351 # pata
352 install_kernel_modules "${MODULES_PATA}"
353
354 # framebuffer
355 install_kernel_modules "${MODULES_FRAMEBUFFER}"
356
357 # show all modules
358 for i in ${ALL_MODULES}
359 do
360 echo ${i}
361 done
362
363 # install linuxrc
364 install -m0755 ${LINUXRC} ${DEST}/init || die
365
366 # create the image
367 echo "Creating initrd image '${target}' ..."
368 if [[ ${IMAGE_TYPE} = initramfs ]]
369 then
370 (cd "${DEST}" ; find . | cpio --quiet -o -H newc | gzip -9 >${IMAGE})
371 cat ${IMAGE} > ${target} || die
372 fi
373
374 if [[ ${IMAGE_TYPE} = loopback ]]
375 then
376 MOUNTTMP="$(mktemp -d)"
377
378 # create ext2 img
379 dd if=/dev/zero of=${IMAGE} bs=1024 count=${IMAGESIZE} &> /dev/null || die
380 mke2fs -m 0 -i 1024 -F ${IMAGE} &> /dev/null || die
381 mount -o loop ${IMAGE} ${MOUNTTMP} || die
382 mv ${DEST}/* ${MOUNTTMP} || die
383 umount ${MOUNTTMP} || die
384 gzip -9 ${IMAGE} || die
385 cat ${IMAGE}.gz > ${target} || die
386 [ -d ${MOUNTTMP} ] && rm -rf ${MOUNTTMP}
387
388 # create inird dir for pivot_root
389 [ ! -d /initrd ] && { install -d /initrd || die; }
390 fi
391
392 # clean up
393 [ -d ${DEST} ] && rm -rf ${DEST}
394 [ -f ${IMAGE} ] && rm -f ${IMAGE}
395
396 # all went ok at this point
397 exit 0