]>
Commit | Line | Data |
---|---|---|
bb529f94 JK |
1 | #!/bin/sh |
2 | ||
3 | # geninitrd | |
4 | # | |
5 | # by Jacek Konieczny <jajcus@pld.org.pl> | |
6 | # | |
526ea24a | 7 | # based on mkinitrd written by Erik Troan <ewt@redhat.com> |
bb529f94 JK |
8 | # and contributors: |
9 | # Elliot Lee <sopwith@cuc.edu> | |
10 | # Miguel de Icaza <miguel@nuclecu.unam.mx> | |
11 | # Christian 'Dr. Disk' Hechelmann <drdisk@ds9.au.s.shuttle.de> | |
12 | # Michael K. Johnson <johnsonm@redhat.com> | |
13 | # Pierre Habraken <Pierre.Habraken@ujf-grenoble.fr> | |
14 | # Jakub Jelinek <jj@ultra.linux.cz> | |
15 | # Carlo Arenas Belon (carenas@chasqui.lared.net.pe> | |
16 | # | |
17 | PATH=/sbin:$PATH | |
18 | export PATH | |
19 | ||
20 | VERSION=%VERSIONTAG% | |
21 | ||
22 | . /etc/rc.d/init.d/functions | |
23 | ||
24 | COMPRESS="yes" | |
25 | FS="rom" | |
26 | PROBESCSI="yes" | |
27 | PROBEIDE="yes" | |
28 | PROBERAID="yes" | |
a0a82190 | 29 | USEBSP="yes" |
bb529f94 JK |
30 | |
31 | if [ -f /etc/sysconfig/initrd ] ; then | |
32 | . /etc/sysconfig/initrd | |
33 | fi | |
34 | ||
b90c5d54 | 35 | if is_yes $USEBSP ; then |
36 | [ ! -x /sbin/bsp ] && USEBSP="no" | |
37 | fi | |
bb529f94 JK |
38 | target="" |
39 | kernel="" | |
40 | force="" | |
41 | verbose="" | |
42 | MODULES="" | |
43 | img_vers="" | |
44 | modulefile=/etc/modules.conf | |
35164381 | 45 | if [ "`uname -m`" = "ia64" ]; then |
bb529f94 JK |
46 | IMAGESIZE=3000 |
47 | else | |
48 | IMAGESIZE=1500 | |
49 | fi | |
218614aa | 50 | PRESCSIMODS="scsi_mod unknown sd_mod" |
bb529f94 JK |
51 | PREIDEMODS="ide-mod ide-probe-mod ide-disk" |
52 | fstab="/etc/fstab" | |
53 | ||
54 | usage () { | |
55 | echo "usage: `basename $0` [--version] [-v] [-f] [--ifneeded] [--preload <module>]" >&2 | |
a0a82190 MM |
56 | echo " [--omit-scsi-modules] [--omit-raid-modules] [--omit-ide-modules]" >&2 |
57 | echo " [--with=<module>] [--image-version] [--fstab=<fstab>] [--nocompress]" >&2 | |
58 | echo " [--fs=rom|ext2|cram] [--no-bsp]" >&2 | |
bb529f94 JK |
59 | echo " <initrd-image> <kernel-version>" >&2 |
60 | echo " (ex: `basename $0` /boot/initrd-2.2.5-15.img 2.2.5-15)" >&2 | |
61 | exit 1 | |
62 | } | |
63 | ||
64 | findmodule() { | |
65 | skiperrors="" | |
526ea24a | 66 | modName=$1 |
f97d6d7b | 67 | if [ "$(echo $modName | awk '{print(substr($0,1,1));}')" = "-" ]; then |
bb529f94 | 68 | skiperrors=1 |
f97d6d7b | 69 | modName="$(echo $modName | awk '{print(substr($0,2));}')" |
bb529f94 JK |
70 | fi |
71 | ||
72 | if [ "$modName" = "pluto" ]; then | |
526ea24a AF |
73 | findmodule fc4 |
74 | findmodule soc | |
bb529f94 JK |
75 | fi |
76 | if [ "$modName" = "fcal" ]; then | |
526ea24a AF |
77 | findmodule fc4 |
78 | findmodule socal | |
bb529f94 JK |
79 | fi |
80 | ||
35164381 | 81 | fmPath="`(cd /lib/modules/$kernel; find -type f -name "$modName.o")`" |
bb529f94 | 82 | |
35164381 | 83 | if [ ! -f "/lib/modules/$kernel/$fmPath" ]; then |
bb529f94 JK |
84 | if [ -n "$skiperrors" ]; then |
85 | return | |
86 | fi | |
87 | ||
88 | # ignore the absence of the scsi modules | |
89 | for n in $PRESCSIMODS; do | |
90 | if [ "$n" = "$modName" ]; then | |
91 | return; | |
92 | fi | |
93 | done; | |
94 | ||
95 | # ignore the absence of the ide modules | |
96 | for n in $PREIDEMODS; do | |
97 | if [ "$n" = "$modName" ]; then | |
98 | return; | |
99 | fi | |
100 | done; | |
101 | ||
102 | echo "No module $modName found for kernel $kernel" >&2 | |
103 | exit 1 | |
104 | fi | |
105 | ||
106 | # only need to add each module once | |
35164381 SZ |
107 | tmpFmPath="`echo "$fmPath"|awk -F/ '{for(i=1;i<NF;i++) { printf("%s\\/",$i); } { print $NF; }}'`" |
108 | if is_yes "`echo "$MODULES" | awk '/"'$tmpFmPath'"/ { print "yes"; }' `" ; then : ; else | |
bb529f94 JK |
109 | MODULES="$MODULES $fmPath" |
110 | fi | |
111 | } | |
112 | ||
113 | inst() { | |
114 | if [ "$#" != "2" ];then | |
115 | echo "usage: inst <file> <destination>" | |
116 | return | |
117 | fi | |
118 | [ -n "$verbose" ] && echo "$1 -> $2" | |
35164381 | 119 | cp "$1" "$2" |
bb529f94 JK |
120 | } |
121 | ||
122 | ||
123 | while [ $# -gt 0 ]; do | |
124 | case $1 in | |
a0a82190 MM |
125 | --no-bsp) |
126 | USEBSP="no" | |
127 | ;; | |
128 | ||
bb529f94 | 129 | --fstab*) |
474f647f | 130 | if is_yes "`echo $1 | awk '/=/ { print "yes"; }'`" ; then |
35164381 | 131 | fstab="`echo $1 | awk -F= '{print $2;}'`" |
bb529f94 | 132 | else |
35164381 | 133 | fstab="$2" |
bb529f94 JK |
134 | shift |
135 | fi | |
136 | ;; | |
137 | ||
138 | --with*) | |
474f647f | 139 | if is_yes "`echo $1 | awk '/=/ { print "yes"; }'`" ; then |
35164381 | 140 | modname="`echo $1 | awk -F= '{print $2;}'`" |
bb529f94 | 141 | else |
35164381 | 142 | modname="$2" |
bb529f94 JK |
143 | shift |
144 | fi | |
145 | ||
146 | BASICMODULES="$BASICMODULES $modname" | |
147 | ;; | |
148 | ||
149 | --version) | |
150 | echo "geninitrd: version $VERSION" | |
151 | exit 0 | |
152 | ;; | |
153 | ||
154 | -v) | |
155 | verbose=-v | |
156 | ;; | |
157 | ||
158 | --nocompress) | |
159 | COMPRESS="no" | |
160 | ;; | |
161 | ||
162 | --ifneeded) | |
163 | ifneeded=1 | |
164 | ;; | |
165 | ||
166 | -f) | |
167 | force=1 | |
168 | ;; | |
169 | --preload) | |
474f647f | 170 | if is_yes "`echo $1 | awk '/=/ { print "yes"; }'`" ; then |
35164381 | 171 | modname="`echo $1 | awk -F= '{print $2;}'`" |
bb529f94 | 172 | else |
35164381 | 173 | modname="$2" |
bb529f94 JK |
174 | shift |
175 | fi | |
176 | PREMODS="$PREMODS $modname" | |
177 | ;; | |
178 | --omit-scsi-modules) | |
179 | PRESCSIMODS="" | |
180 | PROBESCSI="no"; | |
181 | ;; | |
182 | --omit-raid-modules) | |
183 | PROBERAID="no"; | |
184 | ;; | |
185 | --omit-ide-modules) | |
186 | PROBEIDE="no"; | |
187 | ;; | |
06ac05d6 | 188 | --fs) |
35164381 | 189 | FS="$2" |
03315813 AF |
190 | shift |
191 | ;; | |
192 | --fs*) | |
35164381 | 193 | FS="`echo $1 | awk -F= '{print $2;}'`" |
bb529f94 JK |
194 | ;; |
195 | --image-version) | |
196 | img_vers=yes | |
197 | ;; | |
198 | *) | |
199 | if [ -z "$target" ]; then | |
35164381 | 200 | target="$1" |
bb529f94 | 201 | elif [ -z "$kernel" ]; then |
35164381 | 202 | kernel="$1" |
bb529f94 JK |
203 | else |
204 | usage | |
205 | fi | |
206 | ;; | |
207 | esac | |
208 | ||
209 | shift | |
210 | done | |
211 | ||
06ac05d6 AF |
212 | if [ -z "$target" -o -z "$kernel" ]; then |
213 | usage | |
214 | fi | |
215 | ||
8b1e4ac7 AF |
216 | case "$FS" in |
217 | ext2) | |
f5d71bb2 JK |
218 | if [ ! -x /sbin/mke2fs ]; then |
219 | echo "mke2fs is missing" | |
8b1e4ac7 AF |
220 | exit 1 |
221 | fi | |
222 | ;; | |
223 | rom) | |
224 | if [ ! -x /sbin/genromfs ]; then | |
225 | echo "genromfs is missing" | |
226 | exit 1 | |
227 | fi | |
228 | ;; | |
229 | cram) | |
230 | if [ ! -x /sbin/mkcramfs ]; then | |
231 | echo "mkcramfs is missing" | |
232 | exit 1 | |
233 | fi | |
234 | ;; | |
235 | *) | |
236 | echo "Filesystem $FS not supported" | |
237 | exit 1 | |
238 | ;; | |
239 | esac | |
bb529f94 | 240 | |
bb529f94 JK |
241 | if [ -n "$img_vers" ]; then |
242 | target="$target-$kernel" | |
243 | fi | |
244 | ||
35164381 | 245 | if [ -z "$force" -a -f "$target" ]; then |
bb529f94 JK |
246 | echo "$target already exists." >&2 |
247 | exit 1 | |
248 | fi | |
249 | ||
35164381 | 250 | if [ ! -d "/lib/modules/$kernel" ]; then |
bb529f94 JK |
251 | echo "/lib/modules/$kernel is not a directory." >&2 |
252 | exit 1 | |
253 | fi | |
254 | ||
255 | for n in $PREMODS; do | |
35164381 | 256 | findmodule "$n" |
bb529f94 JK |
257 | done |
258 | ||
35164381 SZ |
259 | rootdev="$(awk '{ if ($2 == "/") { print $1; }}' $fstab)" |
260 | if is_yes "$PROBESCSI" && is_yes "$(echo "$rootdev" | awk '/^\/dev\/sd/ { print "yes"; }')" ; then | |
bb529f94 JK |
261 | |
262 | for n in $PRESCSIMODS; do | |
218614aa | 263 | if [ "$n" = "unknown" ] ; then |
35164381 | 264 | if [ ! -f "$modulefile" ]; then |
218614aa JK |
265 | modulefile=/etc/conf.modules |
266 | fi | |
35164381 SZ |
267 | if [ -f "$modulefile" ]; then |
268 | scsimodules="`awk '/scsi_hostadapter/ && ! /^[\t ]*#/ { print $3; }' $modulefile| LC_ALL=C sort -u`" | |
218614aa JK |
269 | for n in $scsimodules; do |
270 | # for now allow scsi modules to come from anywhere. There are some | |
271 | # RAID controllers with drivers in block/ | |
35164381 | 272 | findmodule "$n" |
218614aa JK |
273 | done |
274 | fi | |
275 | else | |
35164381 | 276 | findmodule "$n" |
218614aa | 277 | fi |
bb529f94 JK |
278 | done |
279 | ||
bb529f94 JK |
280 | fi |
281 | ||
474f647f | 282 | if is_yes "$PROBEIDE" && is_yes "`echo "$rootdev" | awk '/^\/dev\/hd/ { print "yes"; }'`" ; then |
bb529f94 | 283 | for n in $PREIDEMODS; do |
35164381 | 284 | findmodule "$n" |
bb529f94 JK |
285 | done |
286 | fi | |
287 | ||
288 | if is_yes "$PROBERAID" ; then | |
289 | # load appropriate raid devices if necessary | |
35164381 | 290 | if is_yes "`awk '/^\/dev\/md/ && ! /noauto/ { print "yes"; }' "$fstab"`" ; then |
474f647f | 291 | for number in $(awk '/^[\t ]*raid-level/ { print $2; }' /etc/raidtab | LC_ALL=C sort -u) ; do |
35164381 | 292 | case "$number" in |
bb529f94 | 293 | [0145]) |
35164381 | 294 | findmodule "raid$number" |
bb529f94 JK |
295 | ;; |
296 | *) | |
297 | echo "raid level $number (in /etc/raidtab) not recognized" >&2 | |
298 | ;; | |
299 | esac | |
300 | done | |
301 | fi | |
302 | fi | |
303 | ||
304 | # check to see if we need to set up a loopback filesystem | |
f97d6d7b | 305 | if is_yes "`echo "$rootdev" | awk -F/ '{print($3);}' | awk '/loop/ { print "yes"; }'`" ; then |
8dce5fcc JK |
306 | if [ ! -x /sbin/losetup ]; then |
307 | echo "losetup is missing" | |
308 | exit 1 | |
309 | fi | |
f97d6d7b | 310 | key="^# $(echo $rootdev | awk -F/ '{print($3);}' | tr '[a-z]' '[A-Z]'):" |
474f647f | 311 | if ! is_yes "`awk '/'$key'/ { print( "yes"); }' $fstab`" ; then |
bb529f94 JK |
312 | echo "The root filesystem is on a $rootdev, but there is no magic entry in $fstab" 1>&2 |
313 | echo "for this device. Consult the geninitrd man page for more information" 2>&2 | |
314 | exit 1 | |
315 | fi | |
316 | ||
35164381 SZ |
317 | line="`awk '/'$key'/ { print $0; }' $fstab`" |
318 | loopDev="$(echo $line | awk '{print $3}')" | |
319 | loopFs="$(echo $line | awk '{print $4}')" | |
320 | loopFile="$(echo $line | awk '{print $5}')" | |
bb529f94 JK |
321 | |
322 | BASICMODULES="$BASICMODULES -loop" | |
526ea24a | 323 | findmodule "-$loopFs" |
bb529f94 | 324 | BASICMODULES="$BASICMODULES -${loopFs}" |
a0a82190 MM |
325 | # don't have any clue, how is this supposed to work, |
326 | # anyway no bsp | |
327 | USEBSP="no" | |
2b9510ad | 328 | else # Check for other filesystems |
35164381 | 329 | rootFs="`awk '{if ($2 == "/") {print $3}}' $fstab`" |
2b9510ad | 330 | findmodule "-$rootFs" |
bb529f94 JK |
331 | fi |
332 | ||
333 | for n in $BASICMODULES; do | |
35164381 | 334 | findmodule "$n" |
bb529f94 JK |
335 | done |
336 | ||
337 | if [ -n "$ifneeded" -a -z "$MODULES" ]; then | |
338 | if [ -n "$verbose" ]; then | |
339 | echo "No modules are needed -- not building initrd image." | |
340 | fi | |
341 | exit 0 | |
342 | fi | |
343 | ||
344 | if [ -n "$verbose" ]; then | |
345 | echo "Using modules: $MODULES" | |
346 | fi | |
347 | ||
35164381 SZ |
348 | MNTIMAGE="`mktemp -d /tmp/initrd.XXXXXX`" |
349 | IMAGE="`mktemp -u /tmp/initrd.img-XXXXXX`" | |
350 | MNTPOINT="`mktemp -d /tmp/initrd.mnt-XXXXXX`" | |
351 | RCFILE="$MNTIMAGE/linuxrc" | |
bb529f94 | 352 | |
35164381 | 353 | if [ -f "$MNTIMAGE" ]; then |
bb529f94 JK |
354 | echo "$MNTIMAGE already exists. Remove it and try again" >&2 |
355 | exit 1 | |
356 | fi | |
357 | ||
35164381 | 358 | if [ -f "$IMAGE" ]; then |
bb529f94 JK |
359 | echo "$IMAGE already exists. Remove it and try again" >&2 |
360 | exit 1 | |
361 | fi | |
362 | ||
363 | if [ "$FS" = "ext2" ] ; then | |
35164381 | 364 | dd if=/dev/zero of="$IMAGE" bs=1k count="$IMAGESIZE" 2> /dev/null |
bb529f94 | 365 | |
bb529f94 JK |
366 | # We have to "echo y |" so that it doesn't complain about $IMAGE not |
367 | # being a block device | |
35164381 | 368 | echo y | mke2fs -F "$IMAGE" "$IMAGESIZE" >/dev/null 2>/dev/null |
bb529f94 | 369 | |
35164381 SZ |
370 | mkdir -p "$MNTPOINT" |
371 | mount -o loop -t ext2 "$IMAGE" "$MNTPOINT" | |
bb529f94 | 372 | else |
35164381 | 373 | mkdir -p "$MNTPOINT" |
bb529f94 JK |
374 | fi |
375 | ||
8b1e4ac7 | 376 | |
35164381 | 377 | mkdir -p "$MNTIMAGE"/{lib,bin,etc,dev,loopfs} |
8b1e4ac7 | 378 | |
bb529f94 JK |
379 | |
380 | # We don't need this directory, so let's save space | |
35164381 | 381 | rm -rf "$MNTPOINT"/lost+found |
bb529f94 | 382 | |
bb529f94 | 383 | for MODULE in $MODULES; do |
35164381 | 384 | cp $verbose -a "/lib/modules/$kernel/$MODULE" "$MNTIMAGE/lib" |
bb529f94 JK |
385 | done |
386 | ||
387 | # mknod'ing the devices instead of copying them works both with and | |
388 | # without devfs... | |
35164381 | 389 | mknod "$MNTIMAGE/dev/console" c 5 1 |
bb529f94 | 390 | |
a0a82190 | 391 | if is_yes "$USEBSP" ; then |
35164381 | 392 | s="$MNTIMAGE/etc/startup" |
a0a82190 | 393 | inst /sbin/bsp "$RCFILE" |
35164381 SZ |
394 | echo "# autogenerated startup" > "$s" |
395 | echo "" >> "$s" | |
a0a82190 MM |
396 | |
397 | for MODULE in $MODULES; do | |
35164381 SZ |
398 | module="`echo $MODULE | awk -F/ '{ $0=$NF } /.o$/ { $0=substr($0,1,length($0)-2); } { print $0; }'`" |
399 | options="`awk '{ if($1 == "options" && $2 == "'${module}'") { for(i=3;i<=NF;i++) printf("%s ",$i); }}' "$modulefile"`" | |
a0a82190 MM |
400 | |
401 | if [ -n "$verbose" ]; then | |
402 | echo "Loading module $module with options $options" | |
403 | fi | |
35164381 | 404 | echo "insmod $module.o $options" >> "$s" |
a0a82190 MM |
405 | done |
406 | else | |
407 | inst /bin/trash "$MNTIMAGE/bin/sh" | |
408 | inst /sbin/insmod.static "$MNTIMAGE/bin/insmod" | |
409 | ||
35164381 SZ |
410 | mknod "$MNTIMAGE/dev/null" c 1 3 |
411 | mknod "$MNTIMAGE/dev/ram" b 1 1 | |
412 | mknod "$MNTIMAGE/dev/systty" c 4 0 | |
a0a82190 | 413 | for i in 1 2 3 4; do |
35164381 | 414 | mknod "$MNTIMAGE/dev/tty$i" c 4 1 |
a0a82190 | 415 | done |
35164381 | 416 | mknod "$MNTIMAGE/dev/zero" c 1 5 |
a0a82190 | 417 | |
35164381 SZ |
418 | echo "#!/bin/sh" > "$RCFILE" |
419 | echo "" >> "$RCFILE" | |
a0a82190 MM |
420 | |
421 | for MODULE in $MODULES; do | |
35164381 SZ |
422 | module="`echo $MODULE | awk -F/ '{ $0=$NF } /.o$/ { $0=substr($0,1,length($0)-2); } { print $0; }'`" |
423 | options="`awk '{ if($1 == "options" && $2 == "'${module}'") { for(i=3;i<=NF;i++) printf("%s ",$i); }}' "$modulefile"`" | |
a0a82190 MM |
424 | |
425 | if [ -n "$verbose" ]; then | |
426 | echo "Loading module $module with options $options" | |
427 | fi | |
35164381 SZ |
428 | echo "echo \"Loading $module module\"" >> "$RCFILE" |
429 | echo "insmod /lib/$module.o $options" >> "$RCFILE" | |
a0a82190 MM |
430 | done |
431 | ||
432 | if [ -n "$loopDev" ]; then | |
433 | if [ ! -d /initrd ]; then | |
434 | mkdir /initrd | |
435 | fi | |
436 | ||
35164381 SZ |
437 | cp -a "$loopDev" "$MNTIMAGE/dev" |
438 | cp -a "$rootdev" "$MNTIMAGE/dev" | |
439 | echo "echo Mounting device containing loopback root filesystem" >> "$RCFILE" | |
440 | echo "mount -t $loopFs $loopDev /loopfs" >> "$RCFILE" | |
a0a82190 | 441 | echo "echo Setting up loopback device $rootdev" >> $RCFILE |
35164381 | 442 | echo "losetup $rootdev /loopfs$loopFile" >> "$RCFILE" |
bb529f94 | 443 | fi |
bb529f94 JK |
444 | fi |
445 | ||
35164381 | 446 | chmod +x "$RCFILE" |
bb529f94 | 447 | |
35164381 | 448 | (cd "$MNTIMAGE"; tar cf - .) | (cd "$MNTPOINT"; tar xf -) |
bb529f94 | 449 | |
8b1e4ac7 AF |
450 | case "$FS" in |
451 | ext2) | |
35164381 | 452 | umount "$IMAGE" |
8b1e4ac7 AF |
453 | ;; |
454 | rom) | |
455 | genromfs -f "$IMAGE" -d "$MNTPOINT" -V "PLD initrd for kernel $kernel" | |
456 | ;; | |
457 | cram) | |
458 | mkcramfs "$MNTPOINT" "$IMAGE" | |
8b1e4ac7 AF |
459 | ;; |
460 | *) | |
461 | echo "Filesystem $FS not supported by $0"; | |
462 | esac | |
bb529f94 JK |
463 | |
464 | if is_yes "$COMPRESS" ; then | |
35164381 | 465 | gzip -9 < "$IMAGE" > "$target" |
bb529f94 | 466 | else |
35164381 | 467 | cp -a "$IMAGE" "$target" |
bb529f94 | 468 | fi |
35164381 | 469 | rm -rf "$MNTIMAGE" "$MNTPOINT" "$IMAGE" |