Magellan Linux

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 400 - (show annotations) (download) (as text)
Fri Nov 24 17:27:28 2006 UTC (17 years, 5 months ago) by niro
File MIME type: application/x-sh
File size: 8286 byte(s)
removed udev, using a static /dev for initial boots. udev gets started later

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