Magellan Linux

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1220 - (show annotations) (download)
Sat Jan 29 14:04:05 2011 UTC (13 years, 3 months ago) by niro
File size: 9255 byte(s)
-support for gzip compressed kernel-modules
1 #!/bin/bash
2 # $Id$
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
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 echo " [--linuxrc /path/to/custom/linuxrc ]"
80 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.?g?z?:?$/, ret); return ret[1] } \
97 function show() { if (orig == searched) { print dep; orig=""; rc=0; exit } } \
98 /^.*kernel/ { show(); \
99 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 *"/${modName}.ko.gz "*) 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 ko.gz
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 # handle gzip compressed modules right
241 elif [[ ${MODULE##*.} = gz ]]
242 then
243 zcat ${verbose} ${MODULE} > ${DEST}/lib/$(basename ${MODULE} .gz) || die
244 MODULE="${MODULE/.gz/}"
245 else
246 cp ${verbose} -a ${MODULE} ${DEST}/lib || die
247 fi
248
249 # generate modules load file
250 local modname i
251 modname="${MODULE##*/}"
252 for i in .o .ko .gz
253 do
254 modname="${modname/${i}/}"
255 done
256 echo "${modname}" >> ${DEST}/etc/$(basename ${list}) || die
257 done
258
259 export ALL_MODULES="${ALL_MODULES} ${MODULES}"
260 unset MODULES
261 }
262
263 # need r00t privs
264 [[ $(id -u) != 0 ]] && die "you must be r00t."
265
266 # enforce initramfs method as default
267 [[ -z ${IMAGE_TYPE} ]] && IMAGE_TYPE=initramfs
268
269 while [ $# -gt 0 ]; do
270 case $1 in
271 --version)
272 echo "mkinitrd: version ${VERSION}"
273 exit 0
274 ;;
275
276 -v) verbose=-v ;;
277 -f) force=1 ;;
278 --nocompress) compress="" ;;
279 --image-version) img_vers=yes ;;
280 --allow-missing) allowmissing=yes ;;
281 --noresume) noresume=1 ;;
282 --help) usage -n ;;
283 --initramfs) IMAGE_TYPE=initramfs ;;
284 --loopback) IMAGE_TYPE=loopback ;;
285 --no-strip) NOSTRIP=true ;;
286 --linuxrc) shift; LINUXRC="$1" ;;
287 *)
288 if [ -z "${target}" ]
289 then
290 target=$1
291 elif [ -z "${kernel}" ]
292 then
293 kernel=$1
294 else
295 usage
296 fi
297 ;;
298 esac
299
300 shift
301 done
302
303 # no kernel or target given
304 if [[ -z ${target} ]] || [[ -z ${kernel} ]]
305 then
306 usage
307 fi
308
309 # die if linuxrc does not exist
310 [[ ! -e ${LINUXRC} ]] && die "linuxrc '${LINUXRC}' not found."
311
312 # create basic filesystem layout
313 install -d ${DEST}/{bin,dev,etc,lib,loopfs,proc,sbin,sys,sysroot,usr/bin,usr/sbin} || die
314
315 # install busybox
316 echo "$(which busybox.mkinitrd)"
317 install -m0755 $(which busybox.mkinitrd) ${DEST}/bin/busybox || die
318 for i in '[' ash basename cat cut clear cp dirname echo env false find \
319 grep gunzip gzip ln ls loadkmap mkdir mknod more mount mv \
320 ps pwd rm rmdir sh sleep test touch true umount uname \
321 xargs yes chmod chown
322 do
323 # use soft links from now on;
324 # hardlinks in initramfs apears to be broken on newer kernels
325 # -> "request module: runaway loop modprobe binfmt-0000"
326 # see: http://www.gossamer-threads.com/lists/linux/kernel/728042
327 ln -s /bin/busybox ${DEST}/bin/${i} || die "${i}"
328 done
329
330 # sbin related
331 for i in chroot init losetup modprobe pivot_root
332 do
333 ln -s ${DEST}/bin/busybox ${DEST}/sbin/${i} || die "${i}"
334 done
335
336 # install run-init
337 echo "$(which run-init.mkinitrd)"
338 install -m0755 $(which run-init.mkinitrd) ${DEST}/sbin/run-init || die
339
340 # install insmod.static
341 #echo "$(which insmod.static)"
342 #install -m0755 $(which insmod.static) ${DEST}/sbin/insmod || die
343
344 # install v86d for uvesafb support if installed
345 if which v86d &> /dev/null
346 then
347 echo "$(which v86d)"
348 install -m0755 $(which v86d) ${DEST}/sbin/v86d || die
349 fi
350
351 ## install kernel modules ##
352 # generic needed
353 install_kernel_modules "${MODULES_GENERIC}"
354
355 # usb
356 install_kernel_modules "${MODULES_USB}"
357
358 # scsi
359 install_kernel_modules "${MODULES_SCSI}"
360
361 # sata
362 install_kernel_modules "${MODULES_SATA}"
363
364 # pata
365 install_kernel_modules "${MODULES_PATA}"
366
367 # framebuffer
368 install_kernel_modules "${MODULES_FRAMEBUFFER}"
369
370 # show all modules
371 for i in ${ALL_MODULES}
372 do
373 echo ${i}
374 done
375
376 # install linuxrc
377 install -m0755 ${LINUXRC} ${DEST}/init || die
378
379 # create the image
380 echo "Creating initrd image '${target}' ..."
381 if [[ ${IMAGE_TYPE} = initramfs ]]
382 then
383 (cd "${DEST}" ; find . | cpio --quiet -o -H newc | gzip -9 >${IMAGE})
384 cat ${IMAGE} > ${target} || die
385 fi
386
387 if [[ ${IMAGE_TYPE} = loopback ]]
388 then
389 MOUNTTMP="$(mktemp -d)"
390
391 # create ext2 img
392 dd if=/dev/zero of=${IMAGE} bs=1024 count=${IMAGESIZE} &> /dev/null || die
393 mke2fs -m 0 -i 1024 -F ${IMAGE} &> /dev/null || die
394 mount -o loop ${IMAGE} ${MOUNTTMP} || die
395 mv ${DEST}/* ${MOUNTTMP} || die
396 umount ${MOUNTTMP} || die
397 gzip -9 ${IMAGE} || die
398 cat ${IMAGE}.gz > ${target} || die
399 [ -d ${MOUNTTMP} ] && rm -rf ${MOUNTTMP}
400
401 # create inird dir for pivot_root
402 [ ! -d /initrd ] && { install -d /initrd || die; }
403 fi
404
405 # clean up
406 [ -d ${DEST} ] && rm -rf ${DEST}
407 [ -f ${IMAGE} ] && rm -f ${IMAGE}
408
409 # all went ok at this point
410 exit 0