Magellan Linux

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 559 - (show annotations) (download)
Sun Sep 2 00:34:48 2007 UTC (16 years, 7 months ago) by niro
File size: 8621 byte(s)
-variable LIBDIR

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