]> git.pld-linux.org Git - packages/anaconda.git/blob - anaconda-mk-images
- new url
[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).$(uname -i)
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 TOPDIR=$(cd $TOPDIR; pwd)
32
33 # modules that are needed.  this is the generic "needed for every arch" stuff
34 COMMONMODS="fat vfat nfs sunrpc lockd floppy cramfs loop edd pcspkr squashfs"
35 USBMODS="ohci-hcd uhci-hcd ehci-hcd hid mousedev usb-storage sd_mod sr_mod ub"
36 FIREWIREMODS="ieee1394 ohci1394 sbp2"
37 IDEMODS="ide-cd"
38 SCSIMODS="sr_mod sg st sd_mod scsi_mod iscsi_tcp"
39 FSMODS="fat msdos vfat ext3 reiserfs jfs xfs"
40 LVMMODS="dm-mod dm-zero dm-snapshot dm-mirror"
41 RAIDMODS="md raid0 raid1 raid5 raid6"
42 SECSTAGE="$RAIDMODS $LVMMODS $FSMODS $IDEMODS $SCSIMODS"
43 BTERMMODS="vga16fb"
44 PCMCIASOCKMODS="yenta_socket i82365 tcic pcmcia"
45 INITRDMODS="$USBMODS $FIREWIREMODS $IDEMODS $SCSIMODS $FSMODS $LVMMODS $RAIDMODS $BTERMMODS $COMMONMODS $PCMCIASOCKMODS =scsi =net"
46
47 # Set, verify, and create paths
48     KERNELPATH=$1
49     TOPDESTPATH=$2
50     IMAGEPATH=$TOPDESTPATH/images
51     FULLMODPATH=/tmp/instimagemods.$$
52     FINALFULLMODPATH=$4/modules
53     INSTIMGPATH=$TOPDESTPATH/$PRODUCTPATH/base
54     INSTIMGTEMPLATE=$3
55     IMGPATH=$4
56     KERNELBASE=/tmp/updboot.kernel.$$
57     MODDEPS=$KERNELBASE/moddeps
58     MODALIAS=$KERNELBASE/modules.alias
59     BUILDARCH=$5
60
61     KERNELNAME=vmlinuz
62
63     if [ "$BUILDARCH" = "ia64" ]; then
64         KERNELDIR="/boot/efi/EFI/redhat"
65     else
66         KERNELDIR="/boot"
67     fi
68     
69     if [ "$BUILDARCH" = "sparc64" ]; then
70         BASEARCH=sparc
71     else
72         BASEARCH=$BUILDARCH
73     fi
74
75     # explicit block size setting for some arches (FIXME: we compose 
76     # ppc64-ish trees as ppc, so we have to set the "wrong" block size)
77     if [ "$BUILDARCH" = "sparc64" ]; then
78         CRAMBS="--blocksize 8192"
79     elif [ "$BUILDARCH" = "sparc" ]; then
80         CRAMBS="--blocksize 4096"
81     else
82         CRAMBS=""
83     fi
84
85     if [ $BUILDARCH = x86_64 -o $BUILDARCH = s390x ]; then
86         LIBDIR=lib64
87     else
88         LIBDIR=lib
89     fi
90
91         FONTARCH=${BASEARCH}
92         if [ $FONTARCH = i686 ]; then
93                 FONTARCH=i386
94         fi
95
96     rm -rf $IMAGEPATH
97     rm -rf $FULLMODPATH
98     rm -rf $FINALFULLMODPATH
99     rm -rf $KERNELBASE
100     mkdir -p $IMAGEPATH
101     mkdir -p $FULLMODPATH
102     mkdir -p $FINALFULLMODPATH
103     mkdir -p $KERNELBASE
104     mkdir -p $INSTIMGPATH
105
106 # Stuff that we need
107     TRIMMODALIAS=$IMGPATH/usr/lib/anaconda-runtime/trimmodalias
108     TRIMPCIIDS=$IMGPATH/usr/lib/anaconda-runtime/trimpciids
109     GETKEYMAPS=$IMGPATH/usr/lib/anaconda-runtime/getkeymaps
110     KEYMAPS=/tmp/keymaps-$BUILDARCH.$$
111     SCREENFONT=$IMGPATH/usr/lib/anaconda-runtime/screenfont-${FONTARCH}.gz
112     GETMODDEPS=$IMGPATH/usr/lib/anaconda-runtime/moddeps
113     MODLIST=$IMGPATH/usr/lib/anaconda-runtime/modlist
114     MODINFO=$IMGPATH/usr/lib/anaconda-runtime/loader/module-info
115     FILTERMODDEPS=$IMGPATH/usr/lib/anaconda-runtime/filtermoddeps
116     LOADERBINDIR=$IMGPATH/usr/lib/anaconda-runtime/loader
117     BOOTDISKDIR=$IMGPATH/usr/lib/anaconda-runtime/boot
118     LANGTABLE=$IMGPATH/usr/lib/anaconda/lang-table
119     PCIIDS=$IMGPATH/usr/share/hwdata/pci.ids
120     XDRIVERS=$IMGPATH/usr/share/hwdata/videoaliases
121     XDRIVERDESCS=$IMGPATH/usr/share/hwdata/videodrivers
122     CACHE=$KERNELBASE/.cache
123     MODULESUSED=$KERNELBASE/modules-used
124
125     touch $MODULESUSED
126
127     REQUIREMENTS="$TRIMMODALIAS $TRIMPCIIDS $PCIIDS $XDRIVERDESCS $GETMODDEPS $MODINFO
128                   $FILTERMODDEPS $LANGTABLE $GETKEYMAPS"
129
130     dieLater=
131     for n in $REQUIREMENTS; do
132         if [ ! -f $n ]; then
133             echo "$n doesn't exist"
134             dieLater=1
135         fi
136     done
137
138     for n in $BOOTDISKDIR; do
139         if [ ! -d $n ]; then
140             echo "$n doesn't exist"
141             dieLater=1
142         fi
143     done
144
145     if [ -n "$dieLater" ]; then exit 1; fi
146
147     if [ "$BUILDARCH" != "s390" -a "$BUILDARCH" != "s390x" ]; then
148        # go ahead and create the keymaps so we only have to do it once
149        if [ -f $IMGPATH/usr/lib/anaconda-runtime/keymaps-override-$BUILDARCH ]; then
150            echo "Found keymap override, using it"
151            cp $IMGPATH/usr/lib/anaconda-runtime/keymaps-override-$BUILDARCH $KEYMAPS
152        else
153            echo "Running: $GETKEYMAPS $BUILDARCH $KEYMAPS $IMGPATH"
154            $GETKEYMAPS $BUILDARCH $KEYMAPS $IMGPATH
155            if [ $? != 0 ]; then
156                echo "Unable to create keymaps and thus can't create initrd."
157                exit 1
158            fi
159        fi
160     fi
161  
162 findPackage() {
163     dir=$1
164     name=$2
165     
166     for n in $dir/$name*{$KERNELARCH,noarch}.rpm; do
167         thisName=$(rpm --nodigest --nosignature --qf '%{NAME}' -qp $n)
168         if [ -z "$thisName" ]; then
169             continue
170         fi
171         if [ $thisName = $name ]; then
172             echo $n
173             return
174         fi
175     done
176
177     echo "cannot find package $name in path $dir" >&2
178 }
179
180 findmodule () {
181     if [ ! -f $CACHE ]; then
182         find $KERNELROOT/lib/modules/ > $CACHE
183     fi
184     
185     grep "/$1\.ko" $CACHE
186 }
187
188 rundepmod () {
189     what=$1
190     final=$2
191
192     $FAKEARCH /sbin/depmod -a -F $KERNELROOT/boot/System.map-$version \
193             -b $KERNELROOT $version
194     mv $KERNELROOT/lib/modules/$version/modules.alias $MODALIAS
195
196     cat $KERNELROOT/lib/modules/$version/modules.dep | $FILTERMODDEPS > $final 
197 }
198
199 getmoddeps () {
200     what=$1
201     final=$2
202
203     for mod in $what ; do
204         mod=$(echo $mod | sed 's/\.ko  */|^/g;s/\.ko$//;s/.*\///')
205         egrep $mod $MODDEPS >> $final.foo
206     done
207     mv $final.foo $final
208 }
209
210 intcopymodules () {
211     dir=$2
212
213     for n in $1; do
214         m=$(findmodule $n)
215         if [ -z "$m" ]; then
216             [ -n "$DEBUG" ] && echo "Module $n not found in kernel rpm" >&2
217         else 
218             echo $n >> $MODULESUSED
219             for o in $m ; do 
220                 echo $n
221                 ver=$(echo $o |cut -d / -f 7)
222                 myarch=$(echo $o |cut -d / -f 4)
223                 if ! [ -d $dir/$ver/$myarch ] ; then mkdir -p $dir/$ver/$myarch ; fi
224                 if ! cp $o $dir/$ver/$myarch; then
225                     echo "Failed to copy $o to $dir/$ver/$myarch (for module $n)" >&2
226                 fi
227             done
228         fi
229     done
230 }
231
232 # This loops to make sure it resolves dependencies of dependencies of...
233 resdeps () {
234     items="$*"
235
236     before=1
237     after=2
238
239     while [ $before != $after ]; do
240         before=`echo $items | wc -c`
241
242         if [ $? != "0" ] ; then
243             kill -9 $$
244         fi      
245         list=`$GETMODDEPS -m $MODDEPS $items`
246         items=$(for n in $items $list; do echo $n; done | sort -u)
247         after=`echo $items | wc -c`
248     done
249
250     echo $items
251 }
252
253 expandModuleSet() {
254     SET=""
255     for name in $1; do
256         char=$(echo $name | cut -c1)
257         if [ $char = '=' ]; then
258             NAME=$(echo $name | cut -c2-)
259             SET="$SET $($MODLIST --modinfo-file $MODINFO $NAME)"
260         elif [ $char = '+' ]; then
261             NAME=$(echo $name | cut -c2-)
262
263             # all of the modules of this type
264             $MODLIST --modinfo-file $MODINFO $NAME > /tmp/emsAll.$$
265             # the modules used that are of this type
266             sort -u $MODULESUSED | cat - /tmp/emsAll.$$ | sort | 
267                     uniq -d > /tmp/emsUsed.$$
268             # the modules that are of this type, but not used
269             SET="$SET $(cat /tmp/emsAll.$$ /tmp/emsUsed.$$ | sort | uniq -u)"
270
271             rm -f /tmp/emsAll.$$ /tmp/emsUsed.$$
272         else
273             SET="$SET $name"
274         fi
275     done
276
277     echo $SET
278 }
279
280 makemoduleball() {
281     unset MMB_DD
282     MMB_MODINFO="module-info"
283     MMB_NAME="modules.cgz"
284
285     while [ x$(echo $1 | cut -c1-2) = x"--" ]; do
286         if [ "$1" = "--dd" ]; then
287             MMB_DD="$2"
288             shift; shift
289             MMB_MODINFO="modinfo"
290             continue
291         elif [ "$1" = "--name" ]; then
292             MMB_NAME="$2"
293             shift; shift
294             continue
295         fi
296         echo "unknown option passed to $0"
297         exit 1
298     done
299
300     MMB_DIR=$1
301     MMB_MODULESET=$(resdeps $2)
302
303     rm -rf $MMB_DIR/modules $MMB_DIR/$MMB_NAME $MMB_DIR/modules.dep $MMB_DIR/modules.alias \
304            $MMB_DIR/modules.pcimap $MMB_DIR/pcitable $MMB_DIR/$MMB_MODINFO \
305            $MMB_DIR/pci.ids
306     mkdir -p $MMB_DIR/modules
307
308     MMB_MODULESET=$(intcopymodules "$MMB_MODULESET" $MMB_DIR/modules)
309
310     pushd $MMB_DIR/modules > /dev/null
311
312     $MODLIST --modinfo-file $MODINFO --ignore-missing --modinfo \
313         $MMB_MODULESET > ../$MMB_MODINFO
314
315     getmoddeps "$(find . -name *.ko)" ../modules.dep
316
317     # create the modules.alias file
318     $TRIMMODALIAS $(find . -name *.ko -exec basename {} \;) < $MODALIAS > ../modules.alias
319     
320     # create the pci.ids, from modules.alias and the X driver aliases
321     awk '!/^(\t\t|#)/ { print ;if ($0 == "ffff  Illegal Vendor ID") nextfile; }' < $PCIIDS | \
322       $TRIMPCIIDS ../modules.alias $XDRIVERS/* > ../pci.ids
323
324     if [ -n "$MMB_DD" ]; then
325         echo $MMB_DD > $MMB_DIR/rhdd
326     fi
327
328     find . -type f | cpio --quiet -H crc -o | gzip -9 > ../$MMB_NAME
329     cd ..
330     rm -rf modules
331     chmod 644 *
332     popd  > /dev/null
333 }
334
335 makeproductfile() {
336     root=$1
337
338     rm -f $root/.buildstamp
339     echo $IMAGEUUID > $root/.buildstamp
340     echo $PRODUCT >> $root/.buildstamp
341     echo $VERSION >> $root/.buildstamp
342     echo $PRODUCTPATH >> $root/.buildstamp
343     if [ -n "$BUGURL" ]; then
344         echo $BUGURL >> $root/.buildstamp
345     fi
346 }
347
348 setupShellEnvironment() {
349     # setup password/group entries
350     cat > $MBD_DIR/etc/passwd << EOF
351 root::0:0::/:/sbin/loader
352 debug::0:0:debug shell:/:/bin/bash
353 sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
354 EOF
355     cat > $MBD_DIR/etc/group << EOF
356 root:x:0:root
357 tty:x:5:
358 EOF
359     echo "sshd:x:74:" >> $MBD_DIR/etc/group
360     echo "telnet          23/tcp" > $MBD_DIR/etc/services 
361     echo "tcp     6       TCP" > $MBD_DIR/etc/protocols
362
363     # PAM configuration
364     for i in pam_limits.so pam_env.so pam_unix.so pam_deny.so; do
365        cp -f $IMGPATH/$LIBDIR/security/$i $MBD_DIR/$LIBDIR/security
366     done
367     
368     cp -f $IMGPATH/etc/pam.d/other $MBD_DIR/etc/pam.d
369     cat > $MBD_DIR/etc/pam.d/login << EOF
370 #%PAM-1.0
371 auth        required      pam_env.so
372 auth        sufficient    pam_unix.so likeauth nullok
373 auth        required      pam_deny.so
374 account     required      pam_unix.so
375 password    sufficient    pam_unix.so nullok use_authtok md5 shadow
376 password    required      pam_deny.so
377 session     required      pam_limits.so
378 session     required      pam_unix.so
379 EOF
380     cp -f $MBD_DIR/etc/pam.d/login $MBD_DIR/etc/pam.d/sshd
381     cp -f $MBD_DIR/etc/pam.d/login $MBD_DIR/etc/pam.d/remote
382
383     cp -f $IMGPATH/etc/security/{limits.conf,pam_env.conf} $MBD_DIR/etc/security/
384
385     # setup xinetd for telnet
386     cp -f $IMGPATH/etc/xinetd.conf $MBD_DIR/etc/xinetd.conf
387     mkdir -p $MBD_DIR/etc/xinetd.d
388     cat > $MBD_DIR/etc/xinetd.d/telnet <<EOF
389 service telnet
390 {
391         flags           = REUSE
392         socket_type     = stream
393         wait            = no
394         user            = root
395         server          = /sbin/in.telnetd
396         log_on_failure  += USERID
397         disable         = no
398 }
399 EOF
400
401     # key generation takes ages on s390, you really don't want this for every
402     # installation attempt. These are NOT the keys of the installed system!
403     mkdir -m 0700 -p $MBD_DIR/etc/ssh
404     echo -n "Generating SSH1 RSA host key: "
405     /usr/bin/ssh-keygen -q -t rsa1 -f $MBD_DIR/etc/ssh/ssh_host_key \
406                         -C '' -N '' >&/dev/null
407     echo
408     echo -n "Generating SSH2 RSA host key: "
409     /usr/bin/ssh-keygen -q -t rsa -f $MBD_DIR/etc/ssh/ssh_host_rsa_key \
410                         -C '' -N '' >&/dev/null
411     echo
412     echo -n "Generating SSH2 DSA host key: "
413     /usr/bin/ssh-keygen -q -t dsa -f $MBD_DIR/etc/ssh/ssh_host_dsa_key \
414                         -C '' -N '' >&/dev/null
415     echo
416     (cd $MBD_DIR/etc/ssh; \
417         chmod 600 ssh_host_key ssh_host_rsa_key ssh_host_dsa_key; \
418         chmod 644 ssh_host_key.pub ssh_host_rsa_key.pub ssh_host_dsa_key.pub; )
419
420
421     cat > $MBD_DIR/etc/ssh/sshd_config <<EOF
422 Port 22
423 HostKey /etc/ssh/ssh_host_key
424 HostKey /etc/ssh/ssh_host_rsa_key
425 HostKey /etc/ssh/ssh_host_dsa_key
426 PermitRootLogin yes
427 IgnoreRhosts yes
428 StrictModes yes
429 X11Forwarding yes
430 X11DisplayOffset 10
431 PrintMotd yes
432 XAuthLocation /sbin/xauth
433 KeepAlive yes
434 SyslogFacility AUTHPRIV
435 RSAAuthentication yes
436 PasswordAuthentication yes
437 PermitEmptyPasswords yes
438 PermitUserEnvironment yes
439 EOF
440     chmod 600 $MBD_DIR/etc/ssh/sshd_config
441
442     # copy in the binaries
443     cp -f $IMGPATH/bin/login $MBD_DIR/sbin/login
444     cp -f $IMGPATH/usr/sbin/sshd $MBD_DIR/sbin/sshd
445     cp -f $IMGPATH/usr/sbin/xinetd $MBD_DIR/sbin/xinetd
446     cp -f $IMGPATH/usr/sbin/in.telnetd $MBD_DIR/sbin/in.telnetd
447     cp -f $IMGPATH/bin/bash $MBD_DIR/sbin/bash
448     cp -f $IMGPATH/bin/busybox $MBD_DIR/sbin/busybox
449     
450     # make some symlinks
451     ln -sf bash $MBD_DIR/bin/sh
452     (cd $MBD_DIR/sbin;
453         set $(./busybox 2>&1| awk '/^\t([[:alnum:]_\[]+,)+/' | sed 's/,//g' | sed 's/ +//');
454         while [ -n "$1" ]; do
455               if [ $1 != "busybox" -a $1 != "sh" ]; then
456                  # if file doesnt already exist, link to busybox
457                    if [ ! -f "$1" ]; then
458                       ln -sf ./busybox $1
459                    else
460                       [ -n "$DEBUG" ] && echo "Overriding busybox version of $1"
461                    fi
462               fi
463               shift
464          done )
465
466     # and copy libraries too
467     mkdir -p $MBD_DIR/$LIBDIR
468     for lib in $IMGPATH/$LIBDIR/libc.so* \
469                $IMGPATH/$LIBDIR/libc-*.so* \
470                $IMGPATH/$LIBDIR/ld-*.so* \
471                $IMGPATH/$LIBDIR/ld.so* \
472                $IMGPATH/$LIBDIR/ld64.so* \
473                $IMGPATH/$LIBDIR/libtermcap.so* \
474                $IMGPATH/$LIBDIR/libpam.so* \
475                $IMGPATH/$LIBDIR/libdl.so* \
476                $IMGPATH/$LIBDIR/libdl-*.so* \
477                $IMGPATH/$LIBDIR/libnss_files* \
478                $IMGPATH/$LIBDIR/libnsl* \
479                $IMGPATH/$LIBDIR/libutil.so* \
480                $IMGPATH/$LIBDIR/libutil-*.so* \
481                $IMGPATH/$LIBDIR/libcrypt*so* \
482                $IMGPATH/$LIBDIR/libselinux*so* \
483                $IMGPATH/$LIBDIR/libsepol*so* \
484                $IMGPATH/$LIBDIR/libattr*so* \
485                $IMGPATH/$LIBDIR/libresolv.so* \
486                $IMGPATH/$LIBDIR/libresolv-*.so* \
487                $IMGPATH/$LIBDIR/libm.so* \
488                $IMGPATH/$LIBDIR/libm-*.so* \
489                $IMGPATH/usr/$LIBDIR/libz.so* \
490                $IMGPATH/$LIBDIR/libssl* \
491                $IMGPATH/$LIBDIR/libcom_err* \
492                $IMGPATH/$LIBDIR/libe2p* \
493                $IMGPATH/$LIBDIR/libuuid* \
494                $IMGPATH/usr/$LIBDIR/libwrap*.so* \
495                $IMGPATH/usr/X11R6/$LIBDIR/libX11.so* \
496                $IMGPATH/usr/X11R6/$LIBDIR/libXmuu.so* \
497                $IMGPATH/usr/X11R6/$LIBDIR/libXext.so* \
498                $IMGPATH/usr/X11R6/$LIBDIR/libXt.so* \
499                $IMGPATH/usr/X11R6/$LIBDIR/libSM.so* \
500                $IMGPATH/usr/X11R6/$LIBDIR/libICE.so* ; do
501         if [ -e $lib ]; then cp -df $lib $MBD_DIR/$LIBDIR/ ; fi
502     done 
503
504     mkdir -p $MBD_DIR/usr/$LIBDIR
505     for lib in $IMGPATH/usr/$LIBDIR/libkrb5.so* \
506                $IMGPATH/usr/$LIBDIR/libkrb5support.so* \
507                $IMGPATH/usr/$LIBDIR/libgssapi_krb5.so* \
508                $IMGPATH/usr/$LIBDIR/libk5crypto.so* \
509                $IMGPATH/usr/$LIBDIR/libcom_err.so* ; do
510         if [ -e $lib ]; then cp -df $lib $MBD_DIR/usr/$LIBDIR/ ; fi
511     done 
512 }
513
514 makeinitrd() {
515     EXTRAINITRDPATH=""
516     INITRDSIZE=""
517     KEEP=""
518     PADSIZE=""
519     LOADERBIN=""
520     INITRDMODULES=""
521     MODULEBALLNAME="modules.cgz"
522     MYLANGTABLE=$LANGTABLE
523     MYLOADERTR=loader.tr
524     while [ x$(echo $1 | cut -c1-2) = x"--" ]; do
525         if [ $1 = "--initrdto" ]; then
526             EXTRAINITRDPATH=$2
527             shift; shift
528             continue
529         elif [ $1 = "--keep" ]; then
530             KEEP=yes
531             shift
532             continue
533         elif [ $1 = "--initrdsize" ]; then
534             INITRDSIZE=$2
535             shift; shift
536             continue
537         elif [ $1 = "--loaderbin" ]; then
538             LOADERBIN=$2
539             shift; shift
540             continue
541         elif [ $1 = "--modules" ]; then
542             INITRDMODULES=$2
543             shift; shift
544             continue
545         elif [ $1 = "--moduleballname" ]; then
546             MODULEBALLNAME=$2
547             shift; shift
548             continue
549         fi
550         echo "Unknown option passed to makeinitrd"
551         exit 1
552     done
553     if [ -z "$LOADERBIN" ]; then
554         echo "no loader binary specified!" >&2
555         exit 1
556     fi
557     if [ -z "$INITRDMODULES" ]; then
558         echo "warning: no loader modules specified!" >&2
559     fi
560     if [ -z "$INITRDSIZE" ]; then
561         echo "I don't know how big to make the initrd image!" >&2
562         exit 1
563     fi
564
565     MBD_DIR=/tmp/makebootdisk.dir.$$
566     MBD_FSIMAGE=/tmp/makebootdisk.initrdimage.$$
567     MBD_BOOTTREE=/tmp/makebootdisk.tree.$$
568
569     rm -rf $MBD_DIR MBD_FSIMAGE
570     mkdir -p $MBD_DIR/modules
571     mkdir -p $MBD_DIR/sbin
572     mkdir -p $MBD_DIR/dev
573     mkdir -p $MBD_DIR/etc
574     mkdir -p $MBD_DIR/proc
575     mkdir -p $MBD_DIR/selinux
576     mkdir -p $MBD_DIR/sys
577     mkdir -p $MBD_DIR/tmp
578     mkdir -p $MBD_DIR/etc/terminfo/{a,b,d,l,s,v,x}
579     mkdir -p $MBD_DIR/var/state
580     mkdir -p $MBD_DIR/var/run
581     mkdir -p $MBD_DIR/var/lock/rpm
582
583     if [ "$BUILDARCH" = "ppc" -o "$BUILDARCH" = "ppc64" ]; then
584         mkdir -p $MBD_DIR/dev/iseries
585     fi
586
587     if [ "$BUILDARCH" = "s390" -o "$BUILDARCH" = "s390x" ]; then
588         mkdir -m 111 -p $MBD_DIR/var/empty/sshd
589         mkdir -p $MBD_DIR/etc/{pam.d,security}
590         mkdir -p $MBD_DIR/$LIBDIR/security
591         cp $IMGPATH/$LIBDIR/libpam_misc.so.0.* $MBD_DIR/$LIBDIR/libpam_misc.so.0
592         ln -s /tmp $MBD_DIR/var/state/xkb
593         cp $IMGPATH/usr/X11R6/bin/xauth $MBD_DIR/sbin/xauth
594         cp $IMGPATH/usr/sbin/cmsfs* $MBD_DIR/sbin/
595     fi
596
597     if [ -n "$INITRDMODULES" ]; then
598         MODSET=`expandModuleSet "$INITRDMODULES"`
599         makemoduleball --name $MODULEBALLNAME $MBD_DIR/modules "$MODSET"
600     fi
601
602     cat > $MBD_DIR/etc/passwd << EOF
603     root::0:0:root:/:/bin/bash
604 EOF
605
606     # set up the arch bits
607     echo $arch > $MBD_DIR/etc/arch
608
609     install -s -m 755 $LOADERBINDIR/$LOADERBIN $MBD_DIR/sbin/loader
610     strip $MBD_DIR/sbin/loader
611     if [ "$BUILDARCH" != "s390" -a "$BUILDARCH" != "s390x" ]; then
612         install -s -m 755 $LOADERBINDIR/init $MBD_DIR/sbin
613         strip $MBD_DIR/sbin/init
614         ln -s ./init $MBD_DIR/sbin/shutdown
615         ln -s ./init $MBD_DIR/sbin/halt
616         ln -s ./init $MBD_DIR/sbin/poweroff
617     else
618         install -s -m 755 $LOADERBINDIR/shutdown $MBD_DIR/sbin/shutdown
619         install -m 755 $IMGPATH/usr/lib/anaconda-runtime/loader/linuxrc.s390 $MBD_DIR/sbin/init
620         install -m 755 $IMGPATH/usr/sbin/dasdfmt $MBD_DIR/sbin/dasdfmt
621     fi
622
623     if [ "$BUILDARCH" != "s390" -a "$BUILDARCH" != "s390x" ]; then
624        install -m 644 $KEYMAPS $MBD_DIR/etc/keymaps.gz
625        install -m 644 $SCREENFONT $MBD_DIR/etc/screenfont.gz
626     fi
627     install -m 644 $MYLANGTABLE $MBD_DIR/etc/lang-table
628     
629     install -m 644 $LOADERBINDIR/$MYLOADERTR $MBD_DIR/etc/loader.tr
630     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
631         [ -f $IMGPATH/usr/share/terminfo/$i ] && \
632           install -m 644 $IMGPATH/usr/share/terminfo/$i $MBD_DIR/etc/terminfo/$i
633     done
634
635     makeproductfile $MBD_DIR
636
637     for n in insmod rmmod modprobe; do
638         ln -s loader $MBD_DIR/sbin/$n
639     done
640
641     ln -s /usr/bin/sh $MBD_DIR/sbin/sh
642     ln -s /sbin/init $MBD_DIR/init
643     ln -s /proc/mounts $MBD_DIR/etc/mtab
644     ln -s sbin $MBD_DIR/bin
645     mkdir -p $MBD_DIR/var/lib
646     ln -s ../../tmp $MBD_DIR/var/lib/xkb
647
648     # s390/s390x need sshd/telnet setup
649     if [ "$BUILDARCH" = "s390" -o "$BUILDARCH" = "s390x" ]; then
650         setupShellEnvironment
651     fi
652
653 cat > $MBD_DIR/.profile <<EOF
654 PATH=/bin:/usr/bin:/usr/sbin:/usr/X11R6/bin:/mnt/sysimage/sbin:/mnt/sysimage/usr/sbin:/mnt/sysimage/bin:/mnt/sysimage/usr/bin
655 export PATH
656 EOF
657
658     rm -f $MBD_FSIMAGE
659     (cd $MBD_DIR; find . |cpio --quiet -c -o) |gzip -9 > $MBD_FSIMAGE
660
661     size=$(du $MBD_FSIMAGE | awk '{ print $1 }')
662
663     echo "Wrote $MBD_FSIMAGE (${size}k compressed)"
664
665     if [ -n "$EXTRAINITRDPATH" ]; then
666         mkdir -p `dirname $EXTRAINITRDPATH`
667         cp -a $MBD_FSIMAGE $EXTRAINITRDPATH
668     fi
669
670     if [ -z "$KEEP" ]; then
671         rm -rf $MBD_FSIMAGE $MBD_BOOTTREE
672     fi
673 }
674
675 makeinstimage () {
676     imagename=$1
677     type=$2
678     tmpdir=/tmp/instimage.dir.$$
679
680     rm -rf $tmpimage $tmpdir
681     mkdir -p $mntpoint $tmpdir
682
683     mkdir -p $tmpdir
684     (cd $INSTIMGTEMPLATE; find . | cpio --quiet -p $tmpdir)
685     makeproductfile $tmpdir
686
687     if [ -z "$type" -o "$type" = "cramfs" ]; then 
688         echo "Running mkcramfs $CRAMBS $tmpdir $INSTIMGPATH/${imagename}2.img"
689         mkfs.cramfs $CRAMBS $tmpdir /tmp/${imagename}2.img.$$
690     elif [ "$type" = "squashfs" ]; then
691         echo "Running mksquashfs $tmpdir /tmp/${imagename}2.img -all-root"
692         mksquashfs $tmpdir /tmp/${imagename}2.img.$$ -all-root
693         chmod 0644 /tmp/${imagename}2.img.$$
694     fi
695     cp /tmp/${imagename}2.img.$$ $INSTIMGPATH/${imagename}2.img
696     size=$(ls -l $INSTIMGPATH/${imagename}2.img | awk '{print $5}')
697     size=$(expr $size / 1024)
698     echo "Wrote $INSTIMGPATH/${imagename}2.img (${size}k)..."
699     rm -rf $tmpdir
700 }
701
702 makemainimage () {
703     imagename=$1
704     type=$2
705     mmi_tmpimage=/tmp/instimage.img.$$
706     mmi_mntpoint=/tmp/instimage.mnt.$$
707     
708     rm -rf $mmi_tmpimage $mmi_mntpoint
709     mkdir $mmi_mntpoint
710
711     if [ $type = "ext2" ]; then
712         SIZE=$(du -sk $IMGPATH | awk '{ print int($1 * 1.1) }')
713         if [ -d $IMGPATH/usr/lib/anaconda-runtime ]; then
714             ERROR=$(du -sk $IMGPATH/usr/lib/anaconda-runtime | awk '{ print $1 }')
715             SIZE=$(expr $SIZE - $ERROR)
716         fi
717         dd if=/dev/zero bs=1k count=${SIZE} of=$mmi_tmpimage 2>/dev/null
718         mke2fs -q -F $mmi_tmpimage > /dev/null 
719         tune2fs -c0 -i0 $mmi_tmpimage >/dev/null
720         mount -o loop $mmi_tmpimage $mmi_mntpoint
721
722         (cd $IMGPATH; find . | fgrep -v "./usr/lib/anaconda-runtime" |
723                 cpio -H crc -o) | (cd $mmi_mntpoint; cpio -iumd)
724         makeproductfile $mmi_mntpoint
725         umount $mmi_mntpoint
726         rmdir $mmi_mntpoint
727     elif [ $type = "squashfs" ]; then
728         makeproductfile $IMGPATH
729         echo "Running mksquashfs $IMGPATH $mmi_tmpimage -all-root"
730         mksquashfs $IMGPATH $mmi_tmpimage -all-root
731         chmod 0644 $mmi_tmpimage
732         SIZE=$(expr `cat $mmi_tmpimage | wc -c` / 1024)
733     elif [ $type = "cramfs" ]; then
734         makeproductfile $IMGPATH
735         echo "Running mkcramfs $CRAMBS $IMGPATH $mmi_tmpimage"
736         mkfs.cramfs $CRAMBS $IMGPATH $mmi_tmpimage
737         SIZE=$(expr `cat $mmi_tmpimage | wc -c` / 1024)
738     fi
739     
740     cp $mmi_tmpimage $INSTIMGPATH/${imagename}.img
741     chmod 644 $INSTIMGPATH/${imagename}.img
742
743     echo "Wrote $INSTIMGPATH/${imagename}.img (${SIZE}k)"
744     
745     rm $mmi_tmpimage
746 }
747
748 makeSecondStage() {
749     echo "Building minstg.img"
750     makeinstimage "minstg" "squashfs"
751     [ $? = 0 ] || exit 1
752     echo "Building stage2.img"
753     makemainimage "stage2" "squashfs"
754     [ $? = 0 ] || exit 1
755 }
756
757 doPostImages() {
758    /bin/true
759 }
760
761 # source the architecture specific mk-images file so we can call functions
762 # in it
763 if [ ${BUILDARCH} = s390x ]; then
764     # FIXME: this is a bad hack for s390, but better than copying for now
765     source $TOPDIR/mk-images.s390
766 elif [ ${BUILDARCH} = i686 ]; then
767         source $TOPDIR/mk-images.i386
768 else
769     source $TOPDIR/mk-images.${BUILDARCH}
770 fi
771
772 # Find the kernel, unpack it, and verify it
773 kerneltags="kernel"
774 if [ "$BUILDARCH" = "ppc" -o "$BUILDARCH" = "ppc64" ]; then
775     arches="ppc64pseries ppc64 ppc64iseries ppc"
776 elif [ "$BUILDARCH" = "i686" ]; then
777     arches="i386 i586 i686"
778     kerneltags="kernel kernel-xenU"
779 elif [ "$BUILDARCH" = "x86_64" ]; then
780     arches="x86_64"
781     kerneltags="kernel kernel-xenU"
782 else
783     arches="$BUILDARCH"
784 fi
785
786 foundakernel=""
787 for KERNELARCH in $arches; do
788   for kernelvers in $kerneltags; do
789     kpackage=$(findPackage $KERNELPATH $kernelvers)
790     if [ "$KERNELARCH" = "i586" -a ! -f "$kpackage" ]; then
791         echo "No i586 kernel, trying i686..."
792         KERNELARCH="i686"
793         kpackage=$(findPackage $KERNELPATH $kernelvers)
794     fi
795
796     if [ ! -f "$kpackage" ]; then
797         echo "kernel ($kernelvers) doesn't exist for $KERNELARCH.  skipping"
798         continue
799     fi
800
801     KERNELROOT=$KERNELBASE/$KERNELARCH
802     mkdir -p $KERNELROOT/lib/modules/misc
803
804     foundakernel="yes"
805
806     if [ "${kernelvers}" = "kernel-xenU" ]; then kerneltag="xenU" ; fi
807
808     version=$(rpm --nodigest --nosignature --qf '%{VERSION}-%{RELEASE}' -qp $kpackage)${kerneltag}
809     arch=$(rpm --nodigest --nosignature --qf '%{ARCH}\n' -qp $kpackage)
810     echo "unpacking $kpackage.$arch"
811
812     rpm2cpio $kpackage | (cd $KERNELROOT; cpio --quiet -iumd)
813
814     if [ ! -d "$KERNELROOT/lib/modules/$version" ]; then
815         echo "$KERNELROOT/lib/modules/$version is not a valid modules directory" 2>&1
816         exit 1
817     fi
818
819     if [ ! -f "$KERNELROOT/$KERNELDIR/${KERNELNAME}-$version" ]; then
820         echo "$KERNELROOT/$KERNELDIR/${KERNELNAME}-$version does not exist"
821         exit 1
822     fi
823
824     allmods=$(find $KERNELROOT/lib/modules/$version -name *.ko)
825
826     rundepmod "$allmods" $MODDEPS
827     find $KERNELROOT/lib/modules/$version > $CACHE
828
829     # make the boot images
830     makeBootImages
831   done
832 done
833
834 doPostImages
835
836 # do some clean up before making the cramfs of the second stage
837 rm -rf $INSTIMGTEMPLATE/usr/lib/anaconda-runtime $INSTIMGTEMPLATE/usr/lib/syslinux $IMGPATH/usr/lib/syslinux
838
839 if [ -n "$foundakernel" ]; then
840   # make the second stage
841   find $KERNELBASE/*/lib/modules/ > $CACHE
842   makeSecondStage
843   rm -rf $KERNELBASE
844 fi
845
846 cd $TOPDIR
This page took 0.098444 seconds and 3 git commands to generate.