Magellan Linux

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2906 - (show annotations) (download)
Mon Nov 16 13:20:21 2015 UTC (8 years, 5 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