Magellan Linux

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1159 - (show annotations) (download)
Tue Sep 14 20:27:19 2010 UTC (13 years, 7 months ago) by niro
File size: 8931 byte(s)
-removed deprecated MAKEDEV stuff
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:?$/, 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 esac
135
136 if echo ${builtins} | egrep -q '(^| )'${modName}'( |$)'
137 then
138 echo "module ${modName} assumed to be built in"
139 return
140 fi
141
142 # special cases
143 if [[ ${modName} = i2o_block ]]
144 then
145 findmodule i2o_core
146 findmodule -i2o_pci
147 modName="i2o_block"
148 elif [[ ${modName} = ppa ]]
149 then
150 findmodule parport
151 findmodule parport_pc
152 modName="ppa"
153 elif [[ ${modName} = sbp2 ]]
154 then
155 findmodule ieee1394
156 findmodule ohci1394
157 modName="sbp2"
158 else
159 moduledep ${modName}
160 for i in ${deps}
161 do
162 findmodule ${i}
163 done
164 fi
165
166 for modExt in o.gz o ko
167 do
168 for modDir in /lib/modules/${kernel}/updates /lib/modules/${kernel}
169 do
170 if [ -d ${modDir} ]
171 then
172 fmPath=$(findone ${modDir} -name ${modName}.${modExt})
173 if [ -f "${fmPath}" ]
174 then
175 break 2
176 fi
177 fi
178 done
179 done
180
181 if [ ! -f ${fmPath} ]
182 then
183 if [ -n "${skiperrors}" ]
184 then
185 return
186 fi
187
188 # ignore the absence of the scsi modules
189 for n in ${PRESCSIMODS}
190 do
191 if [[ ${n} = ${modName} ]]
192 then
193 return
194 fi
195 done
196
197 if [ -n "${allowmissing}" ]
198 then
199 echo "WARNING: No module ${modName} found for kernel ${kernel}, continuing anyway"
200 return
201 fi
202
203 die "No module ${modName} found for kernel ${kernel}, aborting."
204 fi
205
206 # only need to add each module once
207 MODULES="${MODULES} ${fmPath}"
208 }
209
210 install_kernel_modules()
211 {
212 local list="$1"
213 local module
214
215 # no list found; return
216 [[ -z ${list} ]] && return
217
218 while read module args
219 do
220 case "${module}" in
221 \#*|"") continue ;;
222 esac
223
224 findmodule ${module}
225 done << EOF
226 $(cat ${list}; echo)
227 EOF
228
229 # create empty modules.lala file
230 :> ${DEST}/etc/$(basename ${list})
231
232 # install detected modules
233 echo "Coping your modules to '${DEST}/lib' ..."
234 for MODULE in ${MODULES}
235 do
236 if [ -x /usr/bin/strip ] && [[ ${NOSTRIP} = false ]]
237 then
238 /usr/bin/strip -g ${verbose} ${MODULE} -o ${DEST}/lib/$(basename ${MODULE}) || die
239 else
240 cp ${verbose} -a ${MODULE} ${DEST}/lib || die
241 fi
242
243 # generate modules load file
244 echo "$(basename ${MODULE} .ko)" >> ${DEST}/etc/$(basename ${list}) || die
245 done
246
247 export ALL_MODULES="${ALL_MODULES} ${MODULES}"
248 unset MODULES
249 }
250
251 # need r00t privs
252 [[ $(id -u) != 0 ]] && die "you must be r00t."
253
254 # enforce initramfs method as default
255 [[ -z ${IMAGE_TYPE} ]] && IMAGE_TYPE=initramfs
256
257 while [ $# -gt 0 ]; do
258 case $1 in
259 --version)
260 echo "mkinitrd: version ${VERSION}"
261 exit 0
262 ;;
263
264 -v) verbose=-v ;;
265 -f) force=1 ;;
266 --nocompress) compress="" ;;
267 --image-version) img_vers=yes ;;
268 --allow-missing) allowmissing=yes ;;
269 --noresume) noresume=1 ;;
270 --help) usage -n ;;
271 --initramfs) IMAGE_TYPE=initramfs ;;
272 --loopback) IMAGE_TYPE=loopback ;;
273 --no-strip) NOSTRIP=true ;;
274 --linuxrc) shift; LINUXRC="$1" ;;
275 *)
276 if [ -z "${target}" ]
277 then
278 target=$1
279 elif [ -z "${kernel}" ]
280 then
281 kernel=$1
282 else
283 usage
284 fi
285 ;;
286 esac
287
288 shift
289 done
290
291 # no kernel or target given
292 if [[ -z ${target} ]] || [[ -z ${kernel} ]]
293 then
294 usage
295 fi
296
297 # die if linuxrc does not exist
298 [[ ! -e ${LINUXRC} ]] && die "linuxrc '${LINUXRC}' not found."
299
300 # create basic filesystem layout
301 install -d ${DEST}/{bin,dev,etc,lib,loopfs,proc,sbin,sys,sysroot,usr/bin,usr/sbin} || die
302
303 # install busybox
304 echo "$(which busybox.mkinitrd)"
305 install -m0755 $(which busybox.mkinitrd) ${DEST}/bin/busybox || die
306 for i in '[' ash basename cat cut clear cp dirname echo env false find \
307 grep gunzip gzip ln ls loadkmap mkdir mknod more mount mv \
308 ps pwd rm rmdir sh sleep test touch true umount uname \
309 xargs yes chmod chown
310 do
311 # use soft links from now on;
312 # hardlinks in initramfs apears to be broken on newer kernels
313 # -> "request module: runaway loop modprobe binfmt-0000"
314 # see: http://www.gossamer-threads.com/lists/linux/kernel/728042
315 ln -s /bin/busybox ${DEST}/bin/${i} || die "${i}"
316 done
317
318 # sbin related
319 for i in chroot init losetup modprobe pivot_root
320 do
321 ln -s ${DEST}/bin/busybox ${DEST}/sbin/${i} || die "${i}"
322 done
323
324 # install run-init
325 echo "$(which run-init.mkinitrd)"
326 install -m0755 $(which run-init.mkinitrd) ${DEST}/sbin/run-init || die
327
328 # install insmod.static
329 #echo "$(which insmod.static)"
330 #install -m0755 $(which insmod.static) ${DEST}/sbin/insmod || die
331
332 # install v86d for uvesafb support if installed
333 if which v86d &> /dev/null
334 then
335 echo "$(which v86d)"
336 install -m0755 $(which v86d) ${DEST}/sbin/v86d || die
337 fi
338
339 ## install kernel modules ##
340 # generic needed
341 install_kernel_modules "${MODULES_GENERIC}"
342
343 # usb
344 install_kernel_modules "${MODULES_USB}"
345
346 # scsi
347 install_kernel_modules "${MODULES_SCSI}"
348
349 # sata
350 install_kernel_modules "${MODULES_SATA}"
351
352 # pata
353 install_kernel_modules "${MODULES_PATA}"
354
355 # framebuffer
356 install_kernel_modules "${MODULES_FRAMEBUFFER}"
357
358 # show all modules
359 for i in ${ALL_MODULES}
360 do
361 echo ${i}
362 done
363
364 # install linuxrc
365 install -m0755 ${LINUXRC} ${DEST}/init || die
366
367 # create the image
368 echo "Creating initrd image '${target}' ..."
369 if [[ ${IMAGE_TYPE} = initramfs ]]
370 then
371 (cd "${DEST}" ; find . | cpio --quiet -o -H newc | gzip -9 >${IMAGE})
372 cat ${IMAGE} > ${target} || die
373 fi
374
375 if [[ ${IMAGE_TYPE} = loopback ]]
376 then
377 MOUNTTMP="$(mktemp -d)"
378
379 # create ext2 img
380 dd if=/dev/zero of=${IMAGE} bs=1024 count=${IMAGESIZE} &> /dev/null || die
381 mke2fs -m 0 -i 1024 -F ${IMAGE} &> /dev/null || die
382 mount -o loop ${IMAGE} ${MOUNTTMP} || die
383 mv ${DEST}/* ${MOUNTTMP} || die
384 umount ${MOUNTTMP} || die
385 gzip -9 ${IMAGE} || die
386 cat ${IMAGE}.gz > ${target} || die
387 [ -d ${MOUNTTMP} ] && rm -rf ${MOUNTTMP}
388
389 # create inird dir for pivot_root
390 [ ! -d /initrd ] && { install -d /initrd || die; }
391 fi
392
393 # clean up
394 [ -d ${DEST} ] && rm -rf ${DEST}
395 [ -f ${IMAGE} ] && rm -f ${IMAGE}
396
397 # all went ok at this point
398 exit 0