]> git.pld-linux.org Git - packages/anaconda.git/blob - anaconda-mk-images
- live with old llh
[packages/anaconda.git] / anaconda-mk-images
1 #!/bin/bash
2 LANG=C
3
4 PATH=$PATH:/sbin:/usr/sbin
5 IMAGEUUID=$(date +%Y%m%d%H%M)
6
7 usage () {
8         echo "usage: mk-images <pkgsrc> <toplevel> <template> <imgdir> <buildarch> <productname> <version> [<productpath>]"
9     exit 0
10 }
11
12 DEBUG=""
13 if [ "$1" == "--debug" ]; then
14     DEBUG="--debug"
15     shift
16 fi
17
18 if [ -z "$1" -o -z "$2" -o -z "$3" -o -z "$4" -o -z "$5" -o -z "$6" -o -z "$7" -o -z "$8" ]; then usage; fi
19
20 PRODUCT=$6
21 VERSION=$7
22 PRODUCTPATH=$8
23 if [ -n "$9" ]; then
24     BUGURL=$9
25 fi
26
27 TOPDIR=$(echo $0 | sed "s,/[^/]*$,,")
28 if [ $TOPDIR = $0 ]; then
29     $TOPDIR="."
30 fi
31
32 TOPDIR=$(cd $TOPDIR; pwd)
33
34 # Set, verify, and create paths
35     KERNELPATH=$1
36     TOPDESTPATH=$2
37     IMAGEPATH=$TOPDESTPATH/images
38     FULLMODPATH=/tmp/instimagemods.$$
39     FINALFULLMODPATH=$4/modules
40     INSTIMGPATH=$TOPDESTPATH/$PRODUCTPATH/base
41     INSTIMGTEMPLATE=$3
42     IMGPATH=$4
43     KERNELBASE=/tmp/updboot.kernel.$$
44     MODDEPS=$KERNELBASE/moddeps
45     MODMAPS=$KERNELBASE/modules.pcimap
46     USBMAPS=$KERNELBASE/modules.usbmap
47     BUILDARCH=$5
48
49     KERNELNAME=vmlinuz
50
51     if [ "$BUILDARCH" = "ia64" ]; then
52         KERNELDIR="/boot/efi/EFI/redhat"
53     else
54         KERNELDIR="/boot"
55     fi
56     
57     if [ "$BUILDARCH" = "sparc64" ]; then
58         BASEARCH=sparc
59     else
60         BASEARCH=$BUILDARCH
61     fi
62
63     # explicit block size setting for some arches (FIXME: we compose 
64     # ppc64-ish trees as ppc, so we have to set the "wrong" block size)
65     if [ "$BUILDARCH" = "sparc64" ]; then
66         CRAMBS="--blocksize 8192"
67     elif [ "$BUILDARCH" = "sparc" ]; then
68         CRAMBS="--blocksize 4096"
69     else
70         CRAMBS=""
71     fi
72
73     if [ ! -d "$1" ]; then
74         LATEST="rsh porkchop latest --arch $BUILDARCH"
75     else
76         LATEST=findPackage
77     fi
78
79     if [ $BUILDARCH = x86_64 -o $BUILDARCH = s390x ]; then
80         LIBDIR=lib64
81     else
82         LIBDIR=lib
83     fi
84
85     rm -rf $IMAGEPATH
86     rm -rf $FULLMODPATH
87     rm -rf $FINALFULLMODPATH
88     rm -rf $KERNELBASE
89     mkdir -p $IMAGEPATH
90     mkdir -p $FULLMODPATH
91     mkdir -p $FINALFULLMODPATH
92     mkdir -p $KERNELBASE
93     mkdir -p $INSTIMGPATH
94
95     FONTARCH=${BASEARCH}
96     if [ $FONTARCH = i686 ]
97     then
98            FONTARCH=i386
99     fi
100 # Stuff that we need
101     TRIMPCITABLE=$IMGPATH/usr/lib/anaconda-runtime/trimpcitable
102     TRIMMODMAP=$IMGPATH/usr/lib/anaconda-runtime/trimmodmap
103     TRIMPCIIDS=$IMGPATH/usr/lib/anaconda-runtime/trimpciids
104     TRIMUSBMAP=$IMGPATH/usr/lib/anaconda-runtime/trimusbmap
105     GETKEYMAPS=$IMGPATH/usr/lib/anaconda-runtime/getkeymaps
106     KEYMAPS=/tmp/keymaps-$BUILDARCH.$$
107     SCREENFONT=$IMGPATH/usr/lib/anaconda-runtime/screenfont-${FONTARCH}.gz
108     GETMODDEPS=$IMGPATH/usr/lib/anaconda-runtime/moddeps
109     MODLIST=$IMGPATH/usr/lib/anaconda-runtime/modlist
110     MODINFO=$IMGPATH/usr/lib/anaconda-runtime/loader/module-info
111     FILTERMODDEPS=$IMGPATH/usr/lib/anaconda-runtime/filtermoddeps
112     LOADERBINDIR=$IMGPATH/usr/lib/anaconda-runtime/loader
113     BOOTDISKDIR=$IMGPATH/usr/lib/anaconda-runtime/boot
114     LANGTABLE=$IMGPATH/usr/lib/anaconda/lang-table
115     PCITABLE=$IMGPATH/usr/share/hwdata/pcitable
116     PCIIDS=$IMGPATH/usr/share/hwdata/pci.ids
117     CACHE=$KERNELBASE/.cache
118     MODULESUSED=$KERNELBASE/modules-used
119
120     touch $MODULESUSED
121
122     REQUIREMENTS="$TRIMPCITABLE $TRIMMODMAP $TRIMPCIIDS $PCITABLE $PCIIDS $GETMODDEPS $MODINFO
123                   $FILTERMODDEPS $LANGTABLE $GETKEYMAPS $TRIMUSBMAP"
124
125     dieLater=
126     for n in $REQUIREMENTS; do
127         if [ ! -f $n ]; then
128             echo "$n doesn't exist"
129             dieLater=1
130         fi
131     done
132
133     for n in $BOOTDISKDIR; do
134         if [ ! -d $n ]; then
135             echo "$n doesn't exist"
136             dieLater=1
137         fi
138     done
139
140     if [ -n "$dieLater" ]; then exit 1; fi
141
142     if [ "$BUILDARCH" != "s390" -a "$BUILDARCH" != "s390x" ]; then
143        # go ahead and create the keymaps so we only have to do it once
144        if [ -f $IMGPATH/usr/lib/anaconda-runtime/keymaps-override-$BUILDARCH ]; then
145            echo "Found keymap override, using it"
146            cp $IMGPATH/usr/lib/anaconda-runtime/keymaps-override-$BUILDARCH $KEYMAPS
147        else
148            echo "Running: $GETKEYMAPS $BUILDARCH $KEYMAPS $IMGPATH"
149            $GETKEYMAPS $BUILDARCH $KEYMAPS $IMGPATH
150            if [ $? != 0 ]; then
151                echo "Unable to create keymaps and thus can't create initrd."
152                exit 1
153            fi
154        fi
155     fi
156  
157 findPackage() {
158     dir=$1
159     name=$2
160     
161     for n in $dir/$name*{$KERNELARCH,noarch}.rpm; do
162         thisName=$(rpm --nodigest --nosignature --qf '%{NAME}' -qp $n)
163         if [ -z "$thisName" ]; then
164             continue
165         fi
166         if [ $thisName = $name ]; then
167             echo $n
168             return
169         fi
170     done
171
172     echo "cannot find package $name in path $dir" >&2
173 }
174
175 findmodule () {
176     if [ ! -f $CACHE ]; then
177         find $KERNELROOT/lib/modules/ > $CACHE
178     fi
179     
180     grep "/$1\.ko" $CACHE
181 }
182
183 rundepmod () {
184     what=$1
185     final=$2
186
187     $FAKEARCH /sbin/depmod -a -F $KERNELROOT/boot/System.map-$version \
188             -b $KERNELROOT $version
189     mv $KERNELROOT/lib/modules/$version/modules.pcimap $MODMAPS
190     mv $KERNELROOT/lib/modules/$version/modules.usbmap $USBMAPS
191
192     cat $KERNELROOT/lib/modules/$version/modules.dep | $FILTERMODDEPS > $final 
193 }
194
195 getmoddeps () {
196     what=$1
197     final=$2
198
199     for mod in $what ; do
200         mod=$(echo $mod | sed 's/\.ko  */|^/g;s/\.ko$//;s/.*\///')
201         egrep $mod $MODDEPS >> $final.foo
202     done
203     mv $final.foo $final
204 }
205
206 padfile () {
207     PS_FILE=$1
208     PS_SIZE=$2
209
210     size=`cat $PS_FILE | wc -c`
211     filler=`expr $PS_SIZE "*" 1024 - $size`
212     dd if=/dev/zero bs=$filler count=1 >> $PS_FILE 2> /dev/null
213 }
214
215 intcopymodules () {
216     dir=$2
217
218     for n in $1; do
219         m=$(findmodule $n)
220         if [ -z "$m" ]; then
221             [ -n "$DEBUG" ] && echo "Module $n not found in kernel rpm" >&2
222         else 
223             echo $n >> $MODULESUSED
224             for o in $m ; do 
225                 echo $n
226                 ver=$(echo $o |cut -d / -f 7)
227                 myarch=$(echo $o |cut -d / -f 4)
228                 if ! [ -d $dir/$ver/$myarch ] ; then mkdir -p $dir/$ver/$myarch ; fi
229                 if ! cp $o $dir/$ver/$myarch; then
230                     echo "Failed to copy $o to $dir/$ver/$myarch (for module $n)" >&2
231                 fi
232             done
233         fi
234     done
235 }
236
237 # This loops to make sure it resolves dependencies of dependencies of...
238 resdeps () {
239     items="$*"
240
241     before=1
242     after=2
243
244     while [ $before != $after ]; do
245         before=`echo $items | wc -c`
246
247         if [ $? != "0" ] ; then
248             kill -9 $$
249         fi      
250         list=`$GETMODDEPS -m $MODDEPS $items`
251         items=$(for n in $items $list; do echo $n; done | sort -u)
252         after=`echo $items | wc -c`
253     done
254
255     echo $items
256 }
257
258 expandModuleSet() {
259     SET=""
260     for name in $1; do
261         char=$(echo $name | cut -c1)
262         if [ $char = '=' ]; then
263             NAME=$(echo $name | cut -c2-)
264             SET="$SET $($MODLIST --modinfo-file $MODINFO $NAME)"
265         elif [ $char = '+' ]; then
266             NAME=$(echo $name | cut -c2-)
267
268             # all of the modules of this type
269             $MODLIST --modinfo-file $MODINFO $NAME > /tmp/emsAll.$$
270             # the modules used that are of this type
271             sort -u $MODULESUSED | cat - /tmp/emsAll.$$ | sort | 
272                     uniq -d > /tmp/emsUsed.$$
273             # the modules that are of this type, but not used
274             SET="$SET $(cat /tmp/emsAll.$$ /tmp/emsUsed.$$ | sort | uniq -u)"
275
276             rm -f /tmp/emsAll.$$ /tmp/emsUsed.$$
277         else
278             SET="$SET $name"
279         fi
280     done
281
282     echo $SET
283 }
284
285 makemoduleball() {
286     unset MMB_DD
287     MMB_MODINFO="module-info"
288     MMB_NAME="modules.cgz"
289
290     while [ x$(echo $1 | cut -c1-2) = x"--" ]; do
291         if [ "$1" = "--dd" ]; then
292             MMB_DD="$2"
293             shift; shift
294             MMB_MODINFO="modinfo"
295             continue
296         elif [ "$1" = "--name" ]; then
297             MMB_NAME="$2"
298             shift; shift
299             continue
300         fi
301         echo "unknown option passed to $0"
302         exit 1
303     done
304
305     MMB_DIR=$1
306     MMB_MODULESET=$(resdeps $2)
307
308     rm -rf $MMB_DIR/modules $MMB_DIR/$MMB_NAME $MMB_DIR/modules.dep \
309            $MMB_DIR/modules.pcimap $MMB_DIR/pcitable $MMB_DIR/$MMB_MODINFO \
310            $MMB_DIR/pci.ids
311     mkdir -p $MMB_DIR/modules
312
313     MMB_MODULESET=$(intcopymodules "$MMB_MODULESET" $MMB_DIR/modules)
314
315     pushd $MMB_DIR/modules > /dev/null
316
317     $MODLIST --modinfo-file $MODINFO --ignore-missing --modinfo \
318         $MMB_MODULESET > ../$MMB_MODINFO
319
320     getmoddeps "$(find . -name *.ko)" ../modules.dep
321
322     # create the pcitable
323     $TRIMPCITABLE ignore $(find . -name *.ko -exec basename {} \;) < $PCITABLE > ../pcitable
324     
325     # create the modules.pcimap
326     $TRIMMODMAP $PCITABLE $(find . -name *.ko -exec basename {} \;) < $MODMAPS > ../modules.pcimap
327
328     # create the modules.usbmap
329     $TRIMUSBMAP $(find . -name *.ko -exec basename {} \;) < $USBMAPS > ../modules.usbmap
330     # remove a zero-byte modules.usbmap
331     if [ "$(ls -s ../modules.usbmap |cut -f 1 -d ' ')" = "0" ]; then
332         rm -f ../modules.usbmap
333     fi
334     # create the pci.ids
335     awk '!/^(\t\t|#)/ { print ;if ($0 == "ffff  Illegal Vendor ID") nextfile; }' < $PCIIDS | \
336       $TRIMPCIIDS ../pcitable ../modules.pcimap > ../pci.ids
337
338     if [ -n "$MMB_DD" ]; then
339         echo $MMB_DD > $MMB_DIR/rhdd
340     fi
341
342     find . -type f | cpio --quiet -H crc -o | gzip -9 > ../$MMB_NAME
343     cd ..
344     rm -rf modules
345     chmod 644 *
346     popd  > /dev/null
347 }
348
349 makemainmodules() {
350     modlist=`expandModuleSet "$1"`
351
352     if [ -n "$2" ]; then
353         extraargs="--name $2"
354     fi
355
356     rm -rf $FULLMODPATH
357     rm -rf $FINALFULLMODPATH
358
359     if [ "$BUILDARCH" = "s390" -o "$BUILDARCH" = "s390x" ]; then
360        mkdir -p $KERNELROOT/lib/modules/misc
361        find $KERNELROOT/lib/modules/*/kernel/drivers/s390/ -name "*.ko" \
362           -exec cp -f {} $KERNELROOT/lib/modules/misc \;
363     fi
364     makemoduleball $extraargs $FULLMODPATH "$modlist"
365     cp -ar $FULLMODPATH $FINALFULLMODPATH
366     rm -rf $FULLMODPATH
367 }
368
369 makeproductfile() {
370     root=$1
371
372     rm -f $root/.buildstamp
373     echo $IMAGEUUID > $root/.buildstamp
374     echo $PRODUCT >> $root/.buildstamp
375     echo $VERSION >> $root/.buildstamp
376     echo $PRODUCTPATH >> $root/.buildstamp
377     if [ -n "$BUGURL" ]; then
378         echo $BUGURL >> $root/.buildstamp
379     fi
380 }
381
382 setupShellEnvironment() {
383     # setup password/group entries
384     cat > $MBD_DIR/etc/passwd << EOF
385 root::0:0::/:/sbin/loader
386 debug::0:0:debug shell:/:/bin/bash
387 sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
388 EOF
389     cat > $MBD_DIR/etc/group << EOF
390 root:x:0:root
391 tty:x:5:
392 EOF
393     echo "sshd:x:74:" >> $MBD_DIR/etc/group
394     echo "telnet          23/tcp" > $MBD_DIR/etc/services 
395     echo "tcp     6       TCP" > $MBD_DIR/etc/protocols
396
397     # PAM configuration
398     for i in pam_limits.so pam_env.so pam_unix.so pam_deny.so; do
399        cp -f $IMGPATH/$LIBDIR/security/$i $MBD_DIR/$LIBDIR/security
400     done
401     
402     cp -f $IMGPATH/etc/pam.d/other $MBD_DIR/etc/pam.d
403     cat > $MBD_DIR/etc/pam.d/login << EOF
404 #%PAM-1.0
405 auth        required      pam_env.so
406 auth        sufficient    pam_unix.so likeauth nullok
407 auth        required      pam_deny.so
408 account     required      pam_unix.so
409 password    sufficient    pam_unix.so nullok use_authtok md5 shadow
410 password    required      pam_deny.so
411 session     required      pam_limits.so
412 session     required      pam_unix.so
413 EOF
414     cp -f $MBD_DIR/etc/pam.d/login $MBD_DIR/etc/pam.d/sshd
415     cp -f $MBD_DIR/etc/pam.d/login $MBD_DIR/etc/pam.d/remote
416
417     cp -f $IMGPATH/etc/security/{limits.conf,pam_env.conf} $MBD_DIR/etc/security/
418
419     # setup xinetd for telnet
420     cp -f $IMGPATH/etc/xinetd.conf $MBD_DIR/etc/xinetd.conf
421     mkdir -p $MBD_DIR/etc/xinetd.d
422     cat > $MBD_DIR/etc/xinetd.d/telnet <<EOF
423 service telnet
424 {
425         flags           = REUSE
426         socket_type     = stream
427         wait            = no
428         user            = root
429         server          = /sbin/in.telnetd
430         log_on_failure  += USERID
431         disable         = no
432 }
433 EOF
434
435     # key generation takes ages on s390, you really don't want this for every
436     # installation attempt. These are NOT the keys of the installed system!
437     mkdir -m 0700 -p $MBD_DIR/etc/ssh
438     echo -n "Generating SSH1 RSA host key: "
439     /usr/bin/ssh-keygen -q -t rsa1 -f $MBD_DIR/etc/ssh/ssh_host_key \
440                         -C '' -N '' >&/dev/null
441     echo
442     echo -n "Generating SSH2 RSA host key: "
443     /usr/bin/ssh-keygen -q -t rsa -f $MBD_DIR/etc/ssh/ssh_host_rsa_key \
444                         -C '' -N '' >&/dev/null
445     echo
446     echo -n "Generating SSH2 DSA host key: "
447     /usr/bin/ssh-keygen -q -t dsa -f $MBD_DIR/etc/ssh/ssh_host_dsa_key \
448                         -C '' -N '' >&/dev/null
449     echo
450     (cd $MBD_DIR/etc/ssh; \
451         chmod 600 ssh_host_key ssh_host_rsa_key ssh_host_dsa_key; \
452         chmod 644 ssh_host_key.pub ssh_host_rsa_key.pub ssh_host_dsa_key.pub; )
453
454
455     cat > $MBD_DIR/etc/ssh/sshd_config <<EOF
456 Port 22
457 HostKey /etc/ssh/ssh_host_key
458 HostKey /etc/ssh/ssh_host_rsa_key
459 HostKey /etc/ssh/ssh_host_dsa_key
460 PermitRootLogin yes
461 IgnoreRhosts yes
462 StrictModes yes
463 X11Forwarding yes
464 X11DisplayOffset 10
465 PrintMotd yes
466 XAuthLocation /sbin/xauth
467 KeepAlive yes
468 SyslogFacility AUTHPRIV
469 RSAAuthentication yes
470 PasswordAuthentication yes
471 PermitEmptyPasswords yes
472 PermitUserEnvironment yes
473 EOF
474     chmod 600 $MBD_DIR/etc/ssh/sshd_config
475
476     # copy in the binaries
477     cp -f $IMGPATH/bin/login $MBD_DIR/sbin/login
478     cp -f $IMGPATH/usr/sbin/sshd $MBD_DIR/sbin/sshd
479     cp -f $IMGPATH/usr/sbin/xinetd $MBD_DIR/sbin/xinetd
480     cp -f $IMGPATH/usr/sbin/in.telnetd $MBD_DIR/sbin/in.telnetd
481     cp -f $IMGPATH/bin/bash $MBD_DIR/sbin/bash
482     cp -f $IMGPATH/bin/busybox $MBD_DIR/sbin/busybox
483     
484     # make some symlinks
485     ln -sf bash $MBD_DIR/bin/sh
486     (cd $MBD_DIR/sbin;
487         set $(./busybox 2>&1| awk '/^\t([[:alnum:]_\[]+,)+/' | sed 's/,//g' | sed 's/ +//');
488         while [ -n "$1" ]; do
489               if [ $1 != "busybox" -a $1 != "sh" ]; then
490                  # if file doesnt already exist, link to busybox
491                    if [ ! -f "$1" ]; then
492                       ln -sf ./busybox $1
493                    else
494                       [ -n "$DEBUG" ] && echo "Overriding busybox version of $1"
495                    fi
496               fi
497               shift
498          done )
499
500     # and copy libraries too
501     mkdir -p $MBD_DIR/$LIBDIR
502     for lib in $IMGPATH/$LIBDIR/libc.so* \
503                $IMGPATH/$LIBDIR/libc-*.so* \
504                $IMGPATH/$LIBDIR/ld-*.so* \
505                $IMGPATH/$LIBDIR/ld.so* \
506                $IMGPATH/$LIBDIR/ld64.so* \
507                $IMGPATH/$LIBDIR/libtermcap.so* \
508                $IMGPATH/$LIBDIR/libpam.so* \
509                $IMGPATH/$LIBDIR/libdl.so* \
510                $IMGPATH/$LIBDIR/libdl-*.so* \
511                $IMGPATH/$LIBDIR/libnss_files* \
512                $IMGPATH/$LIBDIR/libnsl* \
513                $IMGPATH/$LIBDIR/libutil.so* \
514                $IMGPATH/$LIBDIR/libutil-*.so* \
515                $IMGPATH/$LIBDIR/libcrypt*so* \
516                $IMGPATH/$LIBDIR/libselinux*so* \
517                $IMGPATH/$LIBDIR/libsepol*so* \
518                $IMGPATH/$LIBDIR/libattr*so* \
519                $IMGPATH/$LIBDIR/libresolv.so* \
520                $IMGPATH/$LIBDIR/libresolv-*.so* \
521                $IMGPATH/$LIBDIR/libm.so* \
522                $IMGPATH/$LIBDIR/libm-*.so* \
523                $IMGPATH/usr/$LIBDIR/libz.so* \
524                $IMGPATH/$LIBDIR/libssl* \
525                $IMGPATH/$LIBDIR/libcom_err* \
526                $IMGPATH/$LIBDIR/libe2p* \
527                $IMGPATH/$LIBDIR/libuuid* \
528                $IMGPATH/usr/$LIBDIR/libwrap*.so* \
529                $IMGPATH/usr/X11R6/$LIBDIR/libX11.so* \
530                $IMGPATH/usr/X11R6/$LIBDIR/libXmuu.so* \
531                $IMGPATH/usr/X11R6/$LIBDIR/libXext.so* \
532                $IMGPATH/usr/X11R6/$LIBDIR/libXt.so* \
533                $IMGPATH/usr/X11R6/$LIBDIR/libSM.so* \
534                $IMGPATH/usr/X11R6/$LIBDIR/libICE.so* ; do
535         if [ -e $lib ]; then cp -df $lib $MBD_DIR/$LIBDIR/ ; fi
536     done 
537
538     mkdir -p $MBD_DIR/usr/$LIBDIR
539     for lib in $IMGPATH/usr/$LIBDIR/libkrb5.so* \
540                $IMGPATH/usr/$LIBDIR/libkrb5support.so* \
541                $IMGPATH/usr/$LIBDIR/libgssapi_krb5.so* \
542                $IMGPATH/usr/$LIBDIR/libk5crypto.so* \
543                $IMGPATH/usr/$LIBDIR/libcom_err.so* ; do
544         if [ -e $lib ]; then cp -df $lib $MBD_DIR/usr/$LIBDIR/ ; fi
545     done 
546 }
547
548 makeinitrd() {
549     EXTRAINITRDPATH=""
550     PCMCIA=""
551     INITRDSIZE=""
552     KEEP=""
553     PADSIZE=""
554     LOADERBIN=""
555     INITRDMODULES=""
556     MODULEBALLNAME="modules.cgz"
557     MYLANGTABLE=$LANGTABLE
558     MYLOADERTR=loader.tr
559     BOGL=yes
560     while [ x$(echo $1 | cut -c1-2) = x"--" ]; do
561         if [ $1 = "--initrdto" ]; then
562             EXTRAINITRDPATH=$2
563             shift; shift
564             continue
565         elif [ $1 = "--pcmcia" ]; then
566             PCMCIA=yes
567             shift
568             continue
569         elif [ $1 = "--keep" ]; then
570             KEEP=yes
571             shift
572             continue
573         elif [ $1 = "--initrdsize" ]; then
574             INITRDSIZE=$2
575             shift; shift
576             continue
577         elif [ $1 = "--loaderbin" ]; then
578             LOADERBIN=$2
579             shift; shift
580             continue
581         elif [ $1 = "--modules" ]; then
582             INITRDMODULES=$2
583             shift; shift
584             continue
585         elif [ $1 = "--moduleballname" ]; then
586             MODULEBALLNAME=$2
587             shift; shift
588             continue
589         elif [ $1 = "--nobogl" ]; then
590             BOGL=""
591             shift
592             continue
593         fi
594         echo "Unknown option passed to makeinitrd"
595         exit 1
596     done
597     if [ -z "$LOADERBIN" ]; then
598         echo "no loader binary specified!" >&2
599         exit 1
600     fi
601     if [ -z "$INITRDMODULES" ]; then
602         echo "warning: no loader modules specified!" >&2
603     fi
604     if [ -z "$INITRDSIZE" ]; then
605         echo "I don't know how big to make the initrd image!" >&2
606         exit 1
607     fi
608
609     MBD_DIR=/tmp/makebootdisk.dir.$$
610     MBD_FSIMAGE=/tmp/makebootdisk.initrdimage.$$
611     MBD_BOOTTREE=/tmp/makebootdisk.tree.$$
612
613     rm -rf $MBD_DIR MBD_FSIMAGE
614     mkdir -p $MBD_DIR/modules
615     mkdir -p $MBD_DIR/sbin
616     mkdir -p $MBD_DIR/dev
617     mkdir -p $MBD_DIR/etc
618     mkdir -p $MBD_DIR/proc
619     mkdir -p $MBD_DIR/selinux
620     mkdir -p $MBD_DIR/sys
621     mkdir -p $MBD_DIR/tmp
622     mkdir -p $MBD_DIR/etc/terminfo/{a,b,d,l,s,v,x}
623     mkdir -p $MBD_DIR/var/state
624     mkdir -p $MBD_DIR/var/run
625     mkdir -p $MBD_DIR/var/lock/rpm
626
627     if [ "$BUILDARCH" = "ppc" -o "$BUILDARCH" = "ppc64" ]; then
628         mkdir -p $MBD_DIR/dev/iseries
629     fi
630
631     if [ "$BUILDARCH" = "s390" -o "$BUILDARCH" = "s390x" ]; then
632         mkdir -m 111 -p $MBD_DIR/var/empty/sshd
633         mkdir -p $MBD_DIR/etc/{pam.d,security}
634         mkdir -p $MBD_DIR/$LIBDIR/security
635         cp $IMGPATH/$LIBDIR/libpam_misc.so.0.* $MBD_DIR/$LIBDIR/libpam_misc.so.0
636         ln -s /tmp $MBD_DIR/var/state/xkb
637         cp $IMGPATH/usr/X11R6/bin/xauth $MBD_DIR/sbin/xauth
638         cp $IMGPATH/usr/sbin/cmsfs* $MBD_DIR/sbin/
639     fi
640
641     if [ -n "$INITRDMODULES" ]; then
642         MODSET=`expandModuleSet "$INITRDMODULES"`
643         makemoduleball --name $MODULEBALLNAME $MBD_DIR/modules "$MODSET"
644     fi
645
646     cat > $MBD_DIR/etc/passwd << EOF
647     root::0:0:root:/:/bin/bash
648 EOF
649
650     # set up the arch bits
651     echo $arch > $MBD_DIR/etc/arch
652
653     install -s -m 755 $LOADERBINDIR/$LOADERBIN $MBD_DIR/sbin/loader
654     if [ "$BUILDARCH" != "s390" -a "$BUILDARCH" != "s390x" ]; then
655         install -s -m 755 $LOADERBINDIR/init $MBD_DIR/sbin
656         ln -s ./init $MBD_DIR/sbin/shutdown
657         ln -s ./init $MBD_DIR/sbin/halt
658         ln -s ./init $MBD_DIR/sbin/poweroff
659     else
660         install -s -m 755 $LOADERBINDIR/shutdown $MBD_DIR/sbin/shutdown
661         install -m 755 $IMGPATH/usr/lib/anaconda-runtime/loader/linuxrc.s390 $MBD_DIR/sbin/init
662         install -m 755 $IMGPATH/usr/sbin/dasdfmt $MBD_DIR/sbin/dasdfmt
663     fi
664
665     if [ "$BUILDARCH" != "s390" -a "$BUILDARCH" != "s390x" ]; then
666        install -m 644 $KEYMAPS $MBD_DIR/etc/keymaps.gz
667        install -m 644 $SCREENFONT $MBD_DIR/etc/screenfont.gz
668     fi
669     install -m 644 $MYLANGTABLE $MBD_DIR/etc/lang-table
670     
671     install -m 644 $LOADERBINDIR/$MYLOADERTR $MBD_DIR/etc/loader.tr
672     for i in a/ansi d/dumb l/linux s/screen v/vt100 v/vt100-nav v/vt102 x/xterm x/xterm-color b/bterm g/gnome ; do
673         [ -f $IMGPATH/usr/share/terminfo/$i ] && \
674           install -m 644 $IMGPATH/usr/share/terminfo/$i $MBD_DIR/etc/terminfo/$i
675     done
676
677     makeproductfile $MBD_DIR
678
679     if [ -n "$BOGL" ]; then
680         install -m 644 $LOADERBINDIR/font.bgf.gz $MBD_DIR/etc
681     fi
682
683     if [ -n "$PCMCIA" ]; then
684         mkdir -p $MBD_BOOTTREE/etc
685         cp -a $KERNELROOT/etc/pcmcia $MBD_DIR/etc
686     fi
687
688     for n in insmod rmmod modprobe; do
689         ln -s loader $MBD_DIR/sbin/$n
690     done
691
692     ln -s /usr/bin/sh $MBD_DIR/sbin/sh
693     ln -s /sbin/init $MBD_DIR/init
694     ln -s /proc/mounts $MBD_DIR/etc/mtab
695     ln -s sbin $MBD_DIR/bin
696
697     # s390/s390x need sshd/telnet setup
698     if [ "$BUILDARCH" = "s390" -o "$BUILDARCH" = "s390x" ]; then
699         setupShellEnvironment
700     fi
701
702 cat > $MBD_DIR/.profile <<EOF
703 PATH=/bin:/usr/bin:/usr/sbin:/usr/X11R6/bin:/mnt/sysimage/sbin:/mnt/sysimage/usr/sbin:/mnt/sysimage/bin:/mnt/sysimage/usr/bin
704 export PATH
705 EOF
706
707     rm -f $MBD_FSIMAGE
708     (cd $MBD_DIR; find . |cpio --quiet -c -o) |gzip -9 > $MBD_FSIMAGE
709
710     size=$(du $MBD_FSIMAGE | awk '{ print $1 }')
711
712     echo "Wrote $MBD_FSIMAGE (${size}k compressed)"
713
714     if [ -n "$EXTRAINITRDPATH" ]; then
715         mkdir -p `dirname $EXTRAINITRDPATH`
716         cp -a $MBD_FSIMAGE $EXTRAINITRDPATH
717     fi
718
719     if [ -z "$KEEP" ]; then
720         rm -rf $MBD_FSIMAGE $MBD_BOOTTREE
721     fi
722 }
723
724 makebootdisk() {
725     BOOTDISKSIZE=""
726     EXTRAKERNELPATH=""
727     INITRDFLAGS=""
728     MBD_FILENAME=""
729     INITRDFILE=""
730     while [ x$(echo $1 | cut -c1-2) = x"--" ]; do
731         if [ $1 = "--bootdisksize" ]; then
732              BOOTDISKSIZE=$2
733              shift; shift
734              continue
735         elif [ $1 = "--kernelto" ]; then
736             EXTRAKERNELPATH=$2
737             shift; shift
738             continue
739         elif [ $1 = "--initrdflags" ]; then
740             INITRDFLAGS=$2
741             shift; shift
742             continue
743         elif [ $1 = "--initrd" ]; then
744             INITRDFILE=$2
745             shift; shift
746             continue
747         elif [ $1 = "--imagename" ]; then
748             MBD_FILENAME=$IMAGEPATH/$2
749             shift; shift
750             continue
751         fi
752         echo "Unknown option passed to makebootdisk"
753         exit 1
754     done
755
756     if [ -z "$MBD_FILENAME" ]; then
757         echo "No imagename passed"
758         exit 1
759     fi
760
761     if [ -n "$INITRDFILE" ]; then
762         MBD_FSIMAGE="$INITRDFILE"
763     elif [ -n "$INITRDFLAGS" ]; then
764         eval makeinitrd --keep $INITRDFLAGS
765     fi
766
767     mkdir -p $MBD_BOOTTREE
768
769     # provided by the mk-image.$ARCH file
770     prepareBootImage
771
772     left=$(df $MBD_BOOTTREE | tail +2)
773     left=$(echo $left | awk '{print $4'})
774
775     umount $MBD_BOOTTREE
776
777     if [ -n "$EXTRAKERNELPATH" ]; then
778         mkdir -p `dirname $EXTRAKERNELPATH`
779         cp -f $KERNELROOT/$KERNELDIR/${KERNELNAME}-* $EXTRAKERNELPATH
780     fi
781
782     mkdir -p `dirname $MBD_FILENAME`
783     rm -f $MBD_FILENAME
784     mv -f $MBD_TMPIMAGE $MBD_FILENAME
785     rm -rf $MBD_TMPIMAGE $MBD_MNTPOINT $MBD_BOOTTREE
786     if [ -z "$INITRDFILE" ]; then
787         rm -f $MBD_FSIMAGE
788     fi
789
790     echo "Wrote $MBD_FILENAME (${left}k free)"
791 }
792
793 makeinstimage () {
794     imagename=$1
795     modlist=$(expandModuleSet "$2")
796     tmpdir=/tmp/instimage.dir.$$
797
798     rm -rf $tmpimage $tmpdir
799     mkdir -p $mntpoint $tmpdir
800
801     mkdir -p $tmpdir
802     (cd $INSTIMGTEMPLATE; find . | cpio --quiet -p $tmpdir)
803     if [ "$BUILDARCH" = "s390" -o "$BUILDARCH" = "s390x" ]; then
804        mkdir -p $KERNELROOT/lib/modules/misc
805        find $KERNELROOT/lib/modules/*/kernel/drivers/s390/ -name "*.ko" \
806          -exec cp -f {} $KERNELROOT/lib/modules/misc \;
807     fi
808     makemoduleball $tmpdir/modules "$modlist"
809     makeproductfile $tmpdir
810
811     echo "Running mkcramfs $CRAMBS $tmpdir $INSTIMGPATH/${imagename}2.img"
812     mkcramfs $CRAMBS $tmpdir /tmp/${imagename}2.img.$$
813     cp /tmp/${imagename}2.img.$$ $INSTIMGPATH/${imagename}2.img
814     size=$(ls -l $INSTIMGPATH/${imagename}2.img | awk '{print $5}')
815     size=$(expr $size / 1024)
816     echo "Wrote $INSTIMGPATH/${imagename}2.img (${size}k)..."
817     rm -rf $tmpdir
818 }
819
820 findloopdevice () {
821     if [ -z "$1" ]; then
822         echo "usage: findloopdevice image"
823         exit 1
824     fi
825
826     for devnum in 0 1 2 3 4 5 6 7 8; do
827         if losetup /dev/loop$devnum $1 2>/dev/null ; then break; fi
828     done
829     echo /dev/loop$devnum
830 }
831
832 makemainimage () {
833     imagename=$1
834     type=$2
835     mmi_tmpimage=/tmp/instimage.img.$$
836     mmi_mntpoint=/tmp/instimage.mnt.$$
837     
838     rm -rf $mmi_tmpimage $mmi_mntpoint
839     mkdir $mmi_mntpoint
840
841     if [ $type = "ext2" ]; then
842         SIZE=$(du -sk $IMGPATH | awk '{ print int($1 * 1.1) }')
843         if [ -d $IMGPATH/usr/lib/anaconda-runtime ]; then
844             ERROR=$(du -sk $IMGPATH/usr/lib/anaconda-runtime | awk '{ print $1 }')
845             SIZE=$(expr $SIZE - $ERROR)
846         fi
847         dd if=/dev/zero bs=1k count=${SIZE} of=$mmi_tmpimage 2>/dev/null
848         mke2fs -q -F $mmi_tmpimage > /dev/null 
849         tune2fs -c0 -i0 $mmi_tmpimage >/dev/null
850         mount -o loop $mmi_tmpimage $mmi_mntpoint
851
852         (cd $IMGPATH; find . | fgrep -v "./usr/lib/anaconda-runtime" |
853                 cpio -H crc -o) | (cd $mmi_mntpoint; cpio -iumd)
854         makeproductfile $mmi_mntpoint
855         umount $mmi_mntpoint
856         rmdir $mmi_mntpoint
857     elif [ $type = "cramfs" ]; then
858         makeproductfile $IMGPATH
859         echo "Running mkcramfs $CRAMBS $IMGPATH $mmi_tmpimage"
860         mkcramfs $CRAMBS $IMGPATH $mmi_tmpimage
861         SIZE=$(expr `cat $mmi_tmpimage | wc -c` / 1024)
862     fi
863     
864     cp $mmi_tmpimage $INSTIMGPATH/${imagename}.img
865     chmod 644 $INSTIMGPATH/${imagename}.img
866
867     echo "Wrote $INSTIMGPATH/${imagename}.img (${SIZE}k)"
868     
869     rm $mmi_tmpimage
870 }
871
872 makedriverdisk () {
873     PADSIZE=""
874
875     while [ x$(echo $1 | cut -c1-2) = x"--" ]; do
876         if [ $1 = "--padsize" ]; then
877             PADSIZE=$2
878             shift; shift
879             continue
880         fi
881
882         echo "Unknown option passed to makedriverdisk"
883         exit 1
884     done
885
886     modlabel=$1
887     diskname=$2
888     modlist=$(expandModuleSet "$3")
889     diskpath=/tmp/makedriverdisk.$$
890
891     rm -rf $diskpath
892     mkdir -p $diskpath
893
894     makemoduleball --dd "$modlabel" $diskpath "$modlist"
895
896     size=$(expr 60 + $(du -sk $diskpath | awk '{print $1}'))
897     if [ $size -lt 57 ]; then
898         size=64
899     fi
900
901     dd if=/dev/zero of=/tmp/$diskname.img bs=1k count=$size 2> /dev/null
902     /sbin/mke2fs -q -F -i 4096 /tmp/$diskname.img  > /dev/null 2>/dev/null
903     /sbin/tune2fs -c0 -i0 /tmp/$diskname.img >/dev/null
904     mkdir -p /tmp/mkdd.$$
905     mount -t ext2 -o loop /tmp/$diskname.img /tmp/mkdd.$$
906     rmdir /tmp/mkdd.$$/lost+found
907     (cd $diskpath; tar cSpf - .) | (cd /tmp/mkdd.$$; tar xSpf -)
908     DIE=""
909     diff -upr $diskpath /tmp/mkdd.$$ > /dev/null 2>&1
910     if [ $? != 0 ]; then
911         echo copy to disk image failed
912         ls -l /tmp/mkdd.$$
913         echo "disk size: $size"
914         ls -l $diskpath
915         DIE=1
916     fi
917     umount /tmp/mkdd.$$
918     rm -rf /tmp/mkdd.$$
919
920     if [ -n "$DIE" ]; then
921         kill -9 $$
922     fi
923
924     cp /tmp/${diskname}.img $IMAGEPATH/${diskname}.img
925     rm /tmp/${diskname}.img
926     rm -rf $diskpath
927
928     size=$(ls -l $IMAGEPATH/${diskname}.img | awk '{ print $5 }')
929     size=$(expr $size / 1024)
930
931     echo "Wrote $IMAGEPATH/${diskname}.img (${size}k)"
932     echo "${diskname}.img - ${modlabel}" >> $IMAGEPATH/README
933
934     if [ -n "$PADSIZE" ]; then
935         padfile $IMAGEPATH/${diskname}.img $PADSIZE
936     fi
937 }
938
939 # source the architecture specific mk-images file so we can call functions
940 # in it
941 if [ ${BUILDARCH} = s390x ]; then
942     # FIXME: this is a bad hack for s390, but better than copying for now
943     source $TOPDIR/mk-images.s390
944 elif [ ${BUILDARCH} = i686 ]; then
945     source $TOPDIR/mk-images.i386
946 else
947     source $TOPDIR/mk-images.${BUILDARCH}
948 fi
949
950 # Find the kernel, unpack it, and verify it
951 vertag="BOOT"
952 if [ "$BUILDARCH" = "ppc" -o "$BUILDARCH" = "ppc64" ]; then
953     arches="ppc64pseries ppc64 ppc64iseries ppc"
954 elif [ "$BUILDARCH" = "i686" ]; then
955     arches="i386 i586 i686"
956 else
957     arches="$BUILDARCH"
958 fi
959 foundakernel=""
960 for KERNELARCH in $arches; do
961   for kernelvers in $vertag; do
962     kpackage=$($LATEST $KERNELPATH kernel-$kernelvers)
963     if [ ! -f "$kpackage" ]; then
964         echo "kernel-$kernelvers does not exist for $KERNELARCH -- using kernel package"
965         kpackage=$($LATEST $KERNELPATH kernel)
966         kernelvers=""
967     fi
968
969     if [ "$KERNELARCH" = "i586" -a ! -f "$kpackage" ]; then
970         echo "No i586 kernel, trying i686..."
971         KERNELARCH="i686"
972         kpackage=$($LATEST $KERNELPATH kernel)
973     fi
974
975     if [ ! -f "$kpackage" ]; then
976         echo "kernel doesn't exist for $KERNELARCH.  skipping arch"
977         continue
978     fi
979
980     KERNELROOT=$KERNELBASE/$KERNELARCH
981     mkdir -p $KERNELROOT
982
983     foundakernel="yes"
984
985     ppackage=$($LATEST $KERNELPATH hwdata)
986     if [ ! -f "$ppackage" ]; then
987         ppackage=""
988     fi
989
990     version=$(rpm --nodigest --nosignature --qf '%{VERSION}-%{RELEASE}' -qp $kpackage)${kernelvers}
991     arch=$(rpm --nodigest --nosignature --qf '%{ARCH}\n' -qp $kpackage)
992     echo "unpacking $kpackage.$arch"
993
994     rpm2cpio $kpackage | (cd $KERNELROOT; cpio --quiet -iumd)
995 #    mv -f $KERNELROOT/usr/lib/bootdisk/lib $KERNELROOT/
996 #    mv -f $KERNELROOT/usr/lib/bootdisk/boot $KERNELROOT/
997 #    rm -rf $KERNELROOT/usr/lib/bootdisk
998     mkdir -p $KERNELROOT/lib/modules/misc
999     for kaddpackage in pcmcia
1000     do
1001         thepackage=$($LATEST $KERNELPATH kernel-${kaddpackage})
1002         if [ -f $thepackage ]; then 
1003             echo "unpacking $thepackage.$arch"
1004             rpm2cpio $thepackage | (cd $KERNELROOT; cpio --quiet -iumd)
1005         fi
1006     done
1007     if [ ! -z $ppackage ]; then 
1008         rpm2cpio $ppackage | (cd $KERNELROOT; cpio --quiet -iumd etc/pcmcia/* ./etc/pcmcia/*)
1009     fi
1010
1011     if [ ! -d "$KERNELROOT/lib/modules/$version" ]; then
1012         echo "$KERNELROOT/lib/modules/$version is not a valid modules directory" 2>&1
1013         exit 1
1014     fi
1015
1016     if [ ! -f "$KERNELROOT/$KERNELDIR/${KERNELNAME}-$version" ]; then
1017         echo "$KERNELROOT/$KERNELDIR/${KERNELNAME}-$version does not exist"
1018         exit 1
1019     fi
1020
1021     if [ -f $KERNELROOT/etc/pcmcia/config ]; then
1022         # This gets everything mentioned in /etc/pcmcia/config.  We probably
1023         # want to do some module-info stuff here too
1024         PCMCIAMODULES=$((perl -e 'while (<>) { s/^.*class.*(network|scsi|ide).*module +"// || next; s/[" ]//g; s/,/\n/g; print }' $KERNELROOT/etc/pcmcia/config | sed 's/\.ko//g') | sort -u)
1025     fi
1026
1027     allmods=$(find $KERNELROOT/lib/modules/$version -name *.ko)
1028
1029     rundepmod "$allmods" $MODDEPS
1030     find $KERNELROOT/lib/modules/$version > $CACHE
1031
1032     # make the boot images
1033     makeBootImages
1034   done
1035 done
1036
1037 # do some clean up before making the cramfs of the second stage
1038 rm -rf $INSTIMGTEMPLATE/usr/lib/anaconda-runtime $INSTIMGTEMPLATE/usr/lib/syslinux $IMGPATH/usr/lib/syslinux
1039
1040 if [ -n "$foundakernel" ]; then
1041   # make the second stage
1042   find $KERNELBASE/*/lib/modules/ > $CACHE
1043   makeSecondStage
1044   rm -rf $KERNELBASE
1045 fi
1046
1047 cd $TOPDIR
This page took 0.173304 seconds and 3 git commands to generate.