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