Contents of /trunk/mkinitrd/mkinitrd-livecd.sh
Parent Directory | Revision Log
Revision 344 -
(show annotations)
(download)
(as text)
Sun Feb 26 00:53:40 2006 UTC (18 years, 7 months ago) by niro
File MIME type: application/x-sh
File size: 8994 byte(s)
Sun Feb 26 00:53:40 2006 UTC (18 years, 7 months ago) by niro
File MIME type: application/x-sh
File size: 8994 byte(s)
making mkinitrd aware of sbin as a directory
1 | #!/bin/bash |
2 | # $Header: /home/cvsd/magellan-cvs/magellan-src/mkinitrd/mkinitrd-livecd.sh,v 1.3 2006-02-26 00:53:34 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 | |
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 | # enforce initramfs method as default |
248 | [[ -z ${IMAGE_TYPE} ]] && IMAGE_TYPE=initramfs |
249 | |
250 | 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,sbin,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 clear cp dirname echo env false find \ |
291 | grep gunzip gzip ln ls loadkmap mkdir mknod more mount mv \ |
292 | 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 | # sbin related |
300 | for i in chroot init losetup modprobe pivot_root |
301 | do |
302 | # static links |
303 | ln ${DEST}/bin/busybox ${DEST}/sbin/${i} || die "${i}" |
304 | done |
305 | |
306 | # install run-init |
307 | echo "$(which run-init.mkinitrd)" |
308 | install -m0755 $(which run-init.mkinitrd) ${DEST}/sbin/run-init || die |
309 | |
310 | # install insmod.static |
311 | echo "$(which insmod.static)" |
312 | install -m0755 $(which insmod.static) ${DEST}/sbin/insmod || die |
313 | |
314 | # install udev |
315 | cp -a /etc/udev ${DEST}/etc || die |
316 | install -m0755 /sbin/udev.static ${DEST}/sbin/udev || die |
317 | install -m0755 /sbin/udevd.static ${DEST}/sbin/udevd || die |
318 | install -m0755 /sbin/udevstart.static ${DEST}/sbin/udevstart || die |
319 | |
320 | # create some needed device nodes |
321 | mkdir ${DEST}/dev/pts || die |
322 | mkdir ${DEST}/dev/shm || die |
323 | mkdir ${DEST}/dev/mapper || die |
324 | mkdir ${DEST}/dev/misc || die |
325 | mkdir ${DEST}/dev/fb || die |
326 | mkdir ${DEST}/dev/vc || die |
327 | mknod ${DEST}/dev/console c 5 1 || die |
328 | mknod ${DEST}/dev/null c 1 3 || die |
329 | mknod ${DEST}/dev/ram b 1 1 || die |
330 | mknod ${DEST}/dev/rtc c 10 135 || die |
331 | mknod ${DEST}/dev/systty c 4 0 || die |
332 | mknod ${DEST}/dev/tty c 5 0 || die |
333 | mknod ${DEST}/dev/zero c 1 5 || die |
334 | for ((i=0; i < 13; i++)) |
335 | do |
336 | mknod ${DEST}/dev/tty${i} c 4 ${i} || die "tty${i}" |
337 | done |
338 | for ((i=64; i < 68; i++)) |
339 | do |
340 | mknod ${DEST}/dev/ttyS$((${i} - 64)) c 4 ${i} || die "ttyS$((${i} - 64))" |
341 | done |
342 | |
343 | ## install kernel modules ## |
344 | # generic needed |
345 | install_kernel_modules "${MODULES_GENERIC}" |
346 | |
347 | # usb |
348 | install_kernel_modules "${MODULES_USB}" |
349 | |
350 | # scsi |
351 | install_kernel_modules "${MODULES_SCSI}" |
352 | |
353 | # sata |
354 | install_kernel_modules "${MODULES_SATA}" |
355 | |
356 | # show all modules |
357 | for i in ${ALL_MODULES} |
358 | do |
359 | echo ${i} |
360 | done |
361 | |
362 | # install linuxrc |
363 | install -m0755 ${LINUXRC} ${DEST}/init || die |
364 | |
365 | # create the image |
366 | echo "Creating initrd image '${target}' ..." |
367 | if [[ ${IMAGE_TYPE} = initramfs ]] |
368 | then |
369 | (cd "${DEST}" ; find . | cpio --quiet -o -H newc | gzip -9 >${IMAGE}) |
370 | cat ${IMAGE} > ${target} || die |
371 | fi |
372 | |
373 | if [[ ${IMAGE_TYPE} = loopback ]] |
374 | then |
375 | MOUNTTMP="$(mktemp -d)" |
376 | |
377 | # create ext2 img |
378 | dd if=/dev/zero of=${IMAGE} bs=1024 count=${IMAGESIZE} &> /dev/null || die |
379 | mke2fs -m 0 -i 1024 -F ${IMAGE} &> /dev/null || die |
380 | mount -o loop ${IMAGE} ${MOUNTTMP} || die |
381 | mv ${DEST}/* ${MOUNTTMP} || die |
382 | umount ${MOUNTTMP} || die |
383 | gzip -9 ${IMAGE} || die |
384 | cat ${IMAGE}.gz > ${target} || die |
385 | [ -d ${MOUNTTMP} ] && rm -rf ${MOUNTTMP} |
386 | |
387 | # create inird dir for pivot_root |
388 | [ ! -d /initrd ] && { install -d /initrd || die; } |
389 | fi |
390 | |
391 | # clean up |
392 | [ -d ${DEST} ] && rm -rf ${DEST} |
393 | [ -f ${IMAGE} ] && rm -f ${IMAGE} |
394 | |
395 | # all went ok at this point |
396 | exit 0 |