Magellan Linux

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 703 - (show annotations) (download) (as text)
Mon Mar 31 13:50:09 2008 UTC (16 years, 1 month ago) by niro
File MIME type: application/x-sh
File size: 8746 byte(s)
-include v86d for uvesafb support in the initrd

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