Magellan Linux

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 333 - (show annotations) (download) (as text)
Tue Feb 21 00:02:17 2006 UTC (18 years, 2 months ago) by niro
File MIME type: application/x-sh
File size: 9057 byte(s)
mkinitrd-livecd; probably working

1 #!/bin/bash
2 # $Header: /home/cvsd/magellan-cvs/magellan-src/mkinitrd/mkinitrd-livecd.sh,v 1.1 2006-02-21 00:02:17 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="/home/tjoke/alx-cvs/magellan-src/mkinitrd/lib/linuxrc.sh"
44 #MODULES_GENERIC="/home/tjoke/alx-cvs/magellan-src/mkinitrd/lib/modules.generic"
45 #MODULES_USB="/home/tjoke/alx-cvs/magellan-src/mkinitrd/lib/modules.usb"
46 #MODULES_SCSI="/home/tjoke/alx-cvs/magellan-src/mkinitrd/lib/modules.scsi"
47 #MODULES_SATA="/home/tjoke/alx-cvs/magellan-src/mkinitrd/lib/modules.sata"
48
49 LINUXRC="/usr/lib/mkinitrd-livecd/linuxrc.sh"
50 MODULES_GENERIC="/usr/lib/mkinitrd-livecd/modules.generic"
51 MODULES_USB="/usr/lib/mkinitrd-livecd/modules.usb"
52 MODULES_SCSI="/usr/lib/mkinitrd-livecd/modules.scsi"
53 MODULES_SATA="/usr/lib/mkinitrd-livecd/modules.sata"
54
55 compress=1
56 allowmissing=""
57 target=""
58 kernel=""
59 force=""
60 verbose=""
61 img_vers=""
62 builtins=""
63 modulefile=/etc/modules.conf
64 rc=0
65
66 IMAGESIZE=4000
67 PRESCSIMODS="sd_mod"
68 fstab="/etc/fstab"
69
70 vg_list=""
71
72 die() { echo "Error: $@"; exit 1; }
73 add_initrd() { echo "$@" >> ${DEST}/init || die; }
74
75 DEST="$(mktemp -d)"
76 IMAGE="$(mktemp)"
77
78 usage()
79 {
80 echo "usage: $(basename $0) [--version] [--help] [-v] [-f]"
81 echo " [--image-version] [--no-strip] [--nocompress]"
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:?$/, ret); return ret[1] } \
99 function show() { if (orig == searched) { print dep; orig=""; rc=0; exit } } \
100 /^\/lib/ { 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 esac
137
138 if echo ${builtins} | egrep -q '(^| )'${modName}'( |$)'
139 then
140 echo "module ${modName} assumed to be built in"
141 return
142 fi
143
144 # special cases
145 if [[ ${modName} = i2o_block ]]
146 then
147 findmodule i2o_core
148 findmodule -i2o_pci
149 modName="i2o_block"
150 elif [[ ${modName} = ppa ]]
151 then
152 findmodule parport
153 findmodule parport_pc
154 modName="ppa"
155 elif [[ ${modName} = sbp2 ]]
156 then
157 findmodule ieee1394
158 findmodule ohci1394
159 modName="sbp2"
160 else
161 moduledep ${modName}
162 for i in ${deps}
163 do
164 findmodule ${i}
165 done
166 fi
167
168 for modExt in o.gz o ko
169 do
170 for modDir in /lib/modules/${kernel}/updates /lib/modules/${kernel}
171 do
172 if [ -d ${modDir} ]
173 then
174 fmPath=$(findone ${modDir} -name ${modName}.${modExt})
175 if [ -f "${fmPath}" ]
176 then
177 break 2
178 fi
179 fi
180 done
181 done
182
183 if [ ! -f ${fmPath} ]
184 then
185 if [ -n "${skiperrors}" ]
186 then
187 return
188 fi
189
190 # ignore the absence of the scsi modules
191 for n in ${PRESCSIMODS}
192 do
193 if [[ ${n} = ${modName} ]]
194 then
195 return
196 fi
197 done
198
199 if [ -n "${allowmissing}" ]
200 then
201 echo "WARNING: No module ${modName} found for kernel ${kernel}, continuing anyway"
202 return
203 fi
204
205 die "No module ${modName} found for kernel ${kernel}, aborting."
206 fi
207
208 # only need to add each module once
209 MODULES="${MODULES} ${fmPath}"
210 }
211
212 install_kernel_modules()
213 {
214 local list="$1"
215 local module
216
217 while read module args
218 do
219 case "${module}" in
220 \#*|"") continue ;;
221 esac
222
223 findmodule ${module}
224 done << EOF
225 $(cat ${list}; echo)
226 EOF
227
228 # create empty modules.lala file
229 :> ${DEST}/etc/$(basename ${list})
230
231 # install detected modules
232 echo "Coping your modules to '${DEST}/lib' ..."
233 for MODULE in ${MODULES}
234 do
235 if [ -x /usr/bin/strip ] && [[ ${NOSTRIP} = false ]]
236 then
237 /usr/bin/strip -g ${verbose} ${MODULE} -o ${DEST}/lib/$(basename ${MODULE}) || die
238 else
239 cp ${verbose} -a ${MODULE} ${DEST}/lib || die
240 fi
241
242 # generate modules load file
243 echo "$(basename ${MODULE} .ko)" >> ${DEST}/etc/$(basename ${list}) || die
244 done
245
246 export ALL_MODULES="${ALL_MODULES} ${MODULES}"
247 unset MODULES
248 }
249
250 # need r00t privs
251 [[ $(id -u) != 0 ]] && die "you must be r00t."
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,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 chroot clear cp dirname echo env false find \
294 grep gunzip gzip init ln ls loadkmap losetup mkdir mknod modprobe more mount mv \
295 pivot_root ps pwd rm rmdir sh sleep test touch true umount uname \
296 xargs yes chmod chown
297 do
298 # static links
299 ln ${DEST}/bin/busybox ${DEST}/bin/${i} || die "${i}"
300 done
301
302 # install run-init
303 echo "$(which run-init.mkinitrd)"
304 install -m0755 $(which run-init.mkinitrd) ${DEST}/bin/run-init || die
305
306 # install insmod.static
307 echo "$(which insmod.static)"
308 install -m0755 $(which insmod.static) ${DEST}/bin/insmod || die
309
310 # install udev
311 cp -a /etc/udev ${DEST}/etc || die
312 install -m0755 /sbin/udev.static ${DEST}/bin/udev || die
313 install -m0755 /sbin/udevd.static ${DEST}/bin/udevd || die
314 install -m0755 /sbin/udevstart.static ${DEST}/bin/udevstart || die
315
316 # create some needed device nodes
317 mkdir ${DEST}/dev/mapper || die
318 mknod ${DEST}/dev/console c 5 1 || die
319 mknod ${DEST}/dev/null c 1 3 || die
320 mknod ${DEST}/dev/ram b 1 1 || die
321 mknod ${DEST}/dev/rtc c 10 135 || die
322 mknod ${DEST}/dev/systty c 4 0 || die
323 mknod ${DEST}/dev/tty c 5 0 || die
324 mknod ${DEST}/dev/zero c 1 5 || die
325 for ((i=0; i < 13; i++))
326 do
327 mknod ${DEST}/dev/tty${i} c 4 ${i} || die "tty${i}"
328 done
329 for ((i=64; i < 68; i++))
330 do
331 mknod ${DEST}/dev/ttyS$((${i} - 64)) c 4 ${i} || die "ttyS$((${i} - 64))"
332 done
333
334 ## install kernel modules ##
335 # generic needed
336 install_kernel_modules "${MODULES_GENERIC}"
337
338 # usb
339 install_kernel_modules "${MODULES_USB}"
340
341 # scsi
342 install_kernel_modules "${MODULES_SCSI}"
343
344 # sata
345 install_kernel_modules "${MODULES_SATA}"
346
347 # show all modules
348 for i in ${ALL_MODULES}
349 do
350 echo ${i}
351 done
352
353 # install linuxrc
354 install -m0755 ${LINUXRC} ${DEST}/init || die
355
356 # create the image
357 echo "Creating initrd image '${target}' ..."
358 if [[ ${IMAGE_TYPE} = initramfs ]]
359 then
360 (cd "${DEST}" ; find . | cpio --quiet -o -H newc | gzip -9 >${IMAGE})
361 cat ${IMAGE} > ${target} || die
362 fi
363
364 if [[ ${IMAGE_TYPE} = loopback ]]
365 then
366 MOUNTTMP="$(mktemp -d)"
367
368 # create ext2 img
369 dd if=/dev/zero of=${IMAGE} bs=1024 count=${IMAGESIZE} &> /dev/null || die
370 mke2fs -m 0 -i 1024 -F ${IMAGE} &> /dev/null || die
371 mount -o loop ${IMAGE} ${MOUNTTMP} || die
372 mv ${DEST}/* ${MOUNTTMP} || die
373 umount ${MOUNTTMP} || die
374 gzip -9 ${IMAGE} || die
375 cat ${IMAGE}.gz > ${target} || die
376 [ -d ${MOUNTTMP} ] && rm -rf ${MOUNTTMP}
377
378 # create inird dir for pivot_root
379 [ ! -d /initrd ] && { install -d /initrd || die; }
380 fi
381
382 # clean up
383 [ -d ${DEST} ] && rm -rf ${DEST}
384 [ -f ${IMAGE} ] && rm -f ${IMAGE}
385
386 # all went ok at this point
387 exit 0