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