Contents of /trunk/mkinitrd-magellan/livecd/mkinitrd-livecd.in
Parent Directory | Revision Log
Revision 2906 -
(show annotations)
(download)
Mon Nov 16 13:20:21 2015 UTC (8 years, 10 months ago) by niro
File size: 10481 byte(s)
Mon Nov 16 13:20:21 2015 UTC (8 years, 10 months ago) by niro
File size: 10481 byte(s)
-use the right kernel version with modinfo to find proper firmware images
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 | FIRMWARE_PATH="/lib/firmware" |
52 | FIRMWARE_FILES="" |
53 | |
54 | compress=1 |
55 | allowmissing="" |
56 | target="" |
57 | kernel="" |
58 | force="" |
59 | verbose="" |
60 | img_vers="" |
61 | builtins="" |
62 | modulefile=/etc/modules.conf |
63 | rc=0 |
64 | |
65 | IMAGESIZE=4000 |
66 | PRESCSIMODS="sd_mod" |
67 | fstab="/etc/fstab" |
68 | |
69 | vg_list="" |
70 | |
71 | die() { echo "Error: $@"; exit 1; } |
72 | add_initrd() { echo "$@" >> ${DEST}/init || die; } |
73 | |
74 | DEST="$(mktemp -d)" |
75 | IMAGE="$(mktemp)" |
76 | |
77 | usage() |
78 | { |
79 | echo "usage: $(basename $0) [--version] [--help] [-v] [-f]" |
80 | echo " [--image-version] [--no-strip] [--nocompress]" |
81 | echo " [--linuxrc /path/to/custom/linuxrc ]" |
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.?g?z?:?$/, ret); return ret[1] } \ |
99 | function show() { if (orig == searched) { print dep; orig=""; rc=0; exit } } \ |
100 | /^.*kernel/ { 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 | *"/${modName}.ko.gz "*) return ;; |
137 | esac |
138 | |
139 | if echo ${builtins} | egrep -q '(^| )'${modName}'( |$)' |
140 | then |
141 | echo "module ${modName} assumed to be built in" |
142 | return |
143 | fi |
144 | |
145 | # special cases |
146 | if [[ ${modName} = i2o_block ]] |
147 | then |
148 | findmodule i2o_core |
149 | findmodule -i2o_pci |
150 | modName="i2o_block" |
151 | elif [[ ${modName} = ppa ]] |
152 | then |
153 | findmodule parport |
154 | findmodule parport_pc |
155 | modName="ppa" |
156 | elif [[ ${modName} = sbp2 ]] |
157 | then |
158 | findmodule ieee1394 |
159 | findmodule ohci1394 |
160 | modName="sbp2" |
161 | else |
162 | moduledep ${modName} |
163 | for i in ${deps} |
164 | do |
165 | findmodule ${i} |
166 | done |
167 | fi |
168 | |
169 | for modExt in o.gz o ko ko.gz |
170 | do |
171 | for modDir in /lib/modules/${kernel}/updates /lib/modules/${kernel} |
172 | do |
173 | if [ -d ${modDir} ] |
174 | then |
175 | fmPath=$(findone ${modDir} -name ${modName}.${modExt}) |
176 | if [ -f "${fmPath}" ] |
177 | then |
178 | break 2 |
179 | fi |
180 | fi |
181 | done |
182 | done |
183 | |
184 | if [ ! -f ${fmPath} ] |
185 | then |
186 | if [ -n "${skiperrors}" ] |
187 | then |
188 | return |
189 | fi |
190 | |
191 | # ignore the absence of the scsi modules |
192 | for n in ${PRESCSIMODS} |
193 | do |
194 | if [[ ${n} = ${modName} ]] |
195 | then |
196 | return |
197 | fi |
198 | done |
199 | |
200 | if [ -n "${allowmissing}" ] |
201 | then |
202 | echo "WARNING: No module ${modName} found for kernel ${kernel}, continuing anyway" |
203 | return |
204 | fi |
205 | |
206 | die "No module ${modName} found for kernel ${kernel}, aborting." |
207 | fi |
208 | |
209 | # only need to add each module once |
210 | MODULES="${MODULES} ${fmPath}" |
211 | } |
212 | |
213 | install_kernel_modules() |
214 | { |
215 | local list="$1" |
216 | local module |
217 | |
218 | # no list found; return |
219 | [[ -z ${list} ]] && return |
220 | |
221 | while read module args |
222 | do |
223 | case "${module}" in |
224 | \#*|"") continue ;; |
225 | esac |
226 | |
227 | findmodule ${module} |
228 | done << EOF |
229 | $(cat ${list}; echo) |
230 | EOF |
231 | |
232 | # create empty modules.lala file |
233 | :> ${DEST}/etc/$(basename ${list}) |
234 | |
235 | # install detected modules |
236 | echo "Coping your modules to '${DEST}/lib' ..." |
237 | for MODULE in ${MODULES} |
238 | do |
239 | if [ -x /usr/bin/strip ] && [[ ${NOSTRIP} = false ]] |
240 | then |
241 | /usr/bin/strip -g ${verbose} ${MODULE} -o ${DEST}/lib/$(basename ${MODULE}) || die |
242 | # handle gzip compressed modules right |
243 | elif [[ ${MODULE##*.} = gz ]] |
244 | then |
245 | zcat ${verbose} ${MODULE} > ${DEST}/lib/$(basename ${MODULE} .gz) || die |
246 | MODULE="${MODULE/.gz/}" |
247 | else |
248 | cp ${verbose} -a ${MODULE} ${DEST}/lib || die |
249 | fi |
250 | |
251 | # generate modules load file |
252 | local modname i |
253 | modname="${MODULE##*/}" |
254 | for i in .o .ko .gz |
255 | do |
256 | modname="${modname/${i}/}" |
257 | done |
258 | echo "${modname}" >> ${DEST}/etc/$(basename ${list}) || die |
259 | |
260 | # get and install firmware files if neccessary |
261 | if [ -x $(which modinfo 2> /dev/null) ] |
262 | then |
263 | local firmware_blobs |
264 | local firmware |
265 | module=$(echo ${MODULE} | sed "s|.*/||" | sed -e "s/.k\?o.\?g\?z\?$//" -e "s/.gz//") |
266 | firmware_blobs=$(modinfo -k ${kernel} ${module} | grep 'firmware:' | sed 's:^firmware\:.*[[:space:]]\(.*\):\1:') |
267 | if [[ ! -z ${firmware_blobs} ]] |
268 | then |
269 | for firmware in ${firmware_blobs} |
270 | do |
271 | add_firmware "${firmware}" |
272 | done |
273 | fi |
274 | if [[ ! -z ${FIRMWARE_FILES} ]] |
275 | then |
276 | for firmware in ${FIRMWARE_FILES} |
277 | do |
278 | if [ -e ${FIRMWARE_PATH}/${firmware} ] |
279 | then |
280 | echo "installing firmware '${firmware}'" |
281 | install ${verbose} -d ${DEST}/${FIRMWARE_PATH}/${firmware%/*} || die |
282 | cp ${verbose} -a ${FIRMWARE_PATH}/${firmware} ${DEST}/${FIRMWARE_PATH}/${firmware%/*} || die |
283 | fi |
284 | done |
285 | fi |
286 | else |
287 | echo "Warning 'modinfo' not found" |
288 | fi |
289 | done |
290 | |
291 | export ALL_MODULES="${ALL_MODULES} ${MODULES}" |
292 | unset MODULES |
293 | } |
294 | |
295 | add_firmware() |
296 | { |
297 | local firmware="$1" |
298 | local i |
299 | |
300 | # check if given firmware is already included in FIRMWARE_FILES |
301 | for i in ${FIRMWARE_FILES} |
302 | do |
303 | [[ ${firmware} = ${i} ]] && return 0 |
304 | done |
305 | |
306 | # include firmware |
307 | FIRMWARE_FILES="${FIRMWARE_FILES} ${firmware}" |
308 | } |
309 | |
310 | # need r00t privs |
311 | [[ $(id -u) != 0 ]] && die "you must be r00t." |
312 | |
313 | # enforce initramfs method as default |
314 | [[ -z ${IMAGE_TYPE} ]] && IMAGE_TYPE=initramfs |
315 | |
316 | while [ $# -gt 0 ]; do |
317 | case $1 in |
318 | --version) |
319 | echo "mkinitrd: version ${VERSION}" |
320 | exit 0 |
321 | ;; |
322 | |
323 | -v) verbose=-v ;; |
324 | -f) force=1 ;; |
325 | --nocompress) compress="" ;; |
326 | --image-version) img_vers=yes ;; |
327 | --allow-missing) allowmissing=yes ;; |
328 | --noresume) noresume=1 ;; |
329 | --help) usage -n ;; |
330 | --initramfs) IMAGE_TYPE=initramfs ;; |
331 | --loopback) IMAGE_TYPE=loopback ;; |
332 | --no-strip) NOSTRIP=true ;; |
333 | --linuxrc) shift; LINUXRC="$1" ;; |
334 | *) |
335 | if [ -z "${target}" ] |
336 | then |
337 | target=$1 |
338 | elif [ -z "${kernel}" ] |
339 | then |
340 | kernel=$1 |
341 | else |
342 | usage |
343 | fi |
344 | ;; |
345 | esac |
346 | |
347 | shift |
348 | done |
349 | |
350 | # no kernel or target given |
351 | if [[ -z ${target} ]] || [[ -z ${kernel} ]] |
352 | then |
353 | usage |
354 | fi |
355 | |
356 | # die if linuxrc does not exist |
357 | [[ ! -e ${LINUXRC} ]] && die "linuxrc '${LINUXRC}' not found." |
358 | |
359 | # create basic filesystem layout |
360 | install -d ${DEST}/{bin,dev,etc,lib,loopfs,proc,sbin,sys,sysroot,usr/bin,usr/sbin} || die |
361 | |
362 | # install busybox |
363 | echo "$(which busybox.mkinitrd)" |
364 | install -m0755 $(which busybox.mkinitrd) ${DEST}/bin/busybox || die |
365 | for i in '[' ash basename cat cut clear cp dirname echo env false find \ |
366 | grep gunzip gzip ln ls loadkmap mkdir mknod more mount mv \ |
367 | ps pwd rm rmdir sh sleep test touch true umount uname \ |
368 | xargs yes chmod chown |
369 | do |
370 | # use soft links from now on; |
371 | # hardlinks in initramfs apears to be broken on newer kernels |
372 | # -> "request module: runaway loop modprobe binfmt-0000" |
373 | # see: http://www.gossamer-threads.com/lists/linux/kernel/728042 |
374 | ln -s /bin/busybox ${DEST}/bin/${i} || die "${i}" |
375 | done |
376 | |
377 | # sbin related |
378 | for i in chroot init losetup modprobe pivot_root |
379 | do |
380 | ln -s ${DEST}/bin/busybox ${DEST}/sbin/${i} || die "${i}" |
381 | done |
382 | |
383 | # install run-init |
384 | echo "$(which run-init.mkinitrd)" |
385 | install -m0755 $(which run-init.mkinitrd) ${DEST}/sbin/run-init || die |
386 | |
387 | # install insmod.static |
388 | #echo "$(which insmod.static)" |
389 | #install -m0755 $(which insmod.static) ${DEST}/sbin/insmod || die |
390 | |
391 | # install v86d for uvesafb support if installed |
392 | if which v86d &> /dev/null |
393 | then |
394 | echo "$(which v86d)" |
395 | install -m0755 $(which v86d) ${DEST}/sbin/v86d || die |
396 | fi |
397 | |
398 | ## install kernel modules ## |
399 | # generic needed |
400 | install_kernel_modules "${MODULES_GENERIC}" |
401 | |
402 | # usb |
403 | install_kernel_modules "${MODULES_USB}" |
404 | |
405 | # scsi |
406 | install_kernel_modules "${MODULES_SCSI}" |
407 | |
408 | # sata |
409 | install_kernel_modules "${MODULES_SATA}" |
410 | |
411 | # pata |
412 | install_kernel_modules "${MODULES_PATA}" |
413 | |
414 | # framebuffer |
415 | install_kernel_modules "${MODULES_FRAMEBUFFER}" |
416 | |
417 | # show all modules |
418 | for i in ${ALL_MODULES} |
419 | do |
420 | echo ${i} |
421 | done |
422 | |
423 | # install linuxrc |
424 | install -m0755 ${LINUXRC} ${DEST}/init || die |
425 | |
426 | # create the image |
427 | echo "Creating initrd image '${target}' ..." |
428 | if [[ ${IMAGE_TYPE} = initramfs ]] |
429 | then |
430 | (cd "${DEST}" ; find . | cpio --quiet -o -H newc | gzip -9 >${IMAGE}) |
431 | cat ${IMAGE} > ${target} || die |
432 | fi |
433 | |
434 | if [[ ${IMAGE_TYPE} = loopback ]] |
435 | then |
436 | MOUNTTMP="$(mktemp -d)" |
437 | |
438 | # create ext2 img |
439 | dd if=/dev/zero of=${IMAGE} bs=1024 count=${IMAGESIZE} &> /dev/null || die |
440 | mke2fs -m 0 -i 1024 -F ${IMAGE} &> /dev/null || die |
441 | mount -o loop ${IMAGE} ${MOUNTTMP} || die |
442 | mv ${DEST}/* ${MOUNTTMP} || die |
443 | umount ${MOUNTTMP} || die |
444 | gzip -9 ${IMAGE} || die |
445 | cat ${IMAGE}.gz > ${target} || die |
446 | [ -d ${MOUNTTMP} ] && rm -rf ${MOUNTTMP} |
447 | |
448 | # create inird dir for pivot_root |
449 | [ ! -d /initrd ] && { install -d /initrd || die; } |
450 | fi |
451 | |
452 | # clean up |
453 | [ -d ${DEST} ] && rm -rf ${DEST} |
454 | [ -f ${IMAGE} ] && rm -f ${IMAGE} |
455 | |
456 | # all went ok at this point |
457 | exit 0 |