Mercurial > illumos > onarm
diff usr/src/cmd/boot/scripts/root_archive.ksh @ 0:c9caec207d52 b86
Initial porting based on b86
author | Koji Uno <koji.uno@sun.com> |
---|---|
date | Tue, 02 Jun 2009 18:56:50 +0900 |
parents | |
children | 1a15d5aaf794 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/usr/src/cmd/boot/scripts/root_archive.ksh Tue Jun 02 18:56:50 2009 +0900 @@ -0,0 +1,877 @@ +#!/bin/ksh -p +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License (the "License"). +# You may not use this file except in compliance with the License. +# +# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE +# or http://www.opensolaris.org/os/licensing. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# When distributing Covered Code, include this CDDL HEADER in each +# file and include the License file at usr/src/OPENSOLARIS.LICENSE. +# If applicable, add the following below this CDDL HEADER, with the +# fields enclosed by brackets "[]" replaced with your own identifying +# information: Portions Copyright [yyyy] [name of copyright owner] +# +# CDDL HEADER END +# + +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# ident "@(#)root_archive.ksh 1.15 08/01/11 SMI" + +# utility to pack and unpack a boot/root archive +# both ufs and hsfs (iso9660) format archives are unpacked +# only ufs archives are generated +# +# usage: pack <archive> <root> +# unpack <archive> <root> +# packmedia <solaris_image> <root> +# unpackmedia <solaris_image> <root> +# +# Where <root> is the directory to unpack to and will be cleaned out +# if it exists. +# +# In the case of (un)packmedia, the image is packed or unpacked to/from +# Solaris media and all the things that don't go into the ramdisk image +# are (un)cpio'd as well +# +# This utility is also used to pack parts (in essence the window system, +# usr/dt and usr/openwin) of the non ramdisk SPARC +# miniroot. (un)packmedia will recognize that they are being run a SPARC +# miniroot and do the appropriate work. +# + +usage() +{ + printf "usage: root_archive pack <archive> <root>\n" + printf " root_archive unpack <archive> <root>\n" + printf " root_archive packmedia <solaris_image> <root>\n" + printf " root_archive unpackmedia <solaris_image> <root>\n" +} + +cleanup() +{ + if [ -d $MNT ] ; then + umount $MNT 2> /dev/null + rmdir $MNT + fi + + lofiadm -d "$TMR" 2>/dev/null + if [ "$REALTHING" != true ] ; then + rm -f "$TMR" + fi + rm -f "$TMR.gz" +} + +preload_Gnome() +{ + MEDIA="$1" + MINIROOT="$2" + + + ( + # Prepopulate the gconf database. This needs to be done and + # done first for several reasons. 1) Archiving out the gnome + # libraries and binaries causes the gconftool-2 to not run + # appropriately at boot time. 2) The binaries and libraries + # needed to run this are big and thus we want to archive + # them separately. 3) Having schemas prepopluated in the + # miniroot means faster boot times. + # + + cd "$MINIROOT" + HOME="./tmp/root" + export HOME + umask 0022 + mumble=.tmp_proto/root/etc/gconf/gconf.xml.defaults + GCONF_CONFIG_SOURCE="xml:merged:$MINIROOT/$mumble" + export GCONF_CONFIG_SOURCE + SCHEMADIR="$MINIROOT/.tmp_proto/root/etc/gconf/schemas" + export SCHEMADIR + /usr/bin/gconftool-2 --makefile-install-rule \ + $SCHEMADIR/*.schemas >/dev/null 2>&1 + echo ' + xml:readwrite:/tmp/root/.gconf + xml:readonly:/etc/gconf/gconf.xml.defaults + ' > /"$MINIROOT"/.tmp_proto/root/etc/gconf/2/path + ) +} + +archive_Gnome() +{ + MEDIA="$1" + MINIROOT="$2" + + RELEASE=`/bin/ls -d "$MEDIA/Solaris_"*` + RELEASE=`basename "$RELEASE"` + CPIO_DIR="$MEDIA/$RELEASE/Tools/Boot" + + # Create the gnome archive + # + ( + # usr/share gnome stuff + cd "$MINIROOT" + find usr/share/GConf usr/share/application-registry \ + usr/share/autostart usr/share/dbus-1 usr/share/dtds \ + usr/share/emacs usr/share/gnome usr/share/gnome-2.0 \ + usr/share/gnome-background-properties \ + usr/share/gtk-engines usr/share/gui-install \ + usr/share/icon-naming-utils usr/share/control-center \ + usr/share/icons usr/share/locale usr/share/metacity \ + usr/share/mime usr/share/mime-info usr/share/pixmaps \ + usr/share/scrollkeeper usr/share/sgml usr/share/themes \ + usr/share/xml \ + -print > /tmp/gnome_share.$$ 2>/dev/null + + if [ ! -f /tmp/gnome_share.$$ ] ; then + echo "/tmp/gnome_share.$$ file list not found." + return + fi + + # usr/lib gnome stuff + + find usr/lib/libgnome*\.so\.* \ + usr/lib/libgst*\.so\.* usr/lib/libgconf*\.so\.* \ + usr/lib/libgdk*\.so\.* usr/lib/libgtk*\.so\.* \ + usr/lib/libglade*\.so\.* usr/lib/libmetacity*\.so\.* \ + usr/lib/libfontconfig*\.so\.* usr/lib/libgmodule*\.so\.* \ + usr/lib/libgobject*\.so\.* usr/lib/libgthread*\.so\.* \ + usr/lib/libpopt*\.so\.* usr/lib/libstartup*\.so\.* \ + usr/lib/libexif*\.so\.* usr/lib/libtiff*\.so\.* \ + usr/lib/libdbus*\.so\.* usr/lib/libstartup*\.so\.* \ + usr/lib/libexif*\.so\.* usr/lib/libORBit*\.so\.* \ + usr/lib/libmlib*\.so\.* usr/lib/libxsl*\.so\.* \ + usr/lib/libpango*\.so\.* usr/lib/libpng*\.so\.* \ + usr/lib/liboil*\.so\.* usr/lib/libbonobo*\.so\.* \ + usr/lib/libart*\.so\.* usr/lib/libcairo*\.so\.* \ + usr/lib/libjpeg*\.so\.* \ + usr/lib/libpolkit*\.so\.* \ + -print | egrep -v '\.so\.[0]$' > \ + /tmp/gnome_lib.$$ 2>/dev/null + + find usr/lib/nautilus usr/lib/pango usr/lib/iconv \ + usr/lib/metacity-dialog usr/lib/window-manager-settings \ + usr/lib/bonobo-2.0 usr/lib/bononbo usr/lib/gtk-2.0 \ + usr/lib/GConf usr/lib/bonobo-activation-server \ + usr/lib/python2.4 usr/lib/gstreamer-0.10 \ + usr/lib/gconf-sanity-check-2 usr/lib/gconfd \ + usr/lib/gnome-vfs-2.0 usr/lib/dbus-daemon \ + usr/lib/gnome-vfs-daemon usr/lib/gnome-settings-daemon \ + usr/lib/gnome_segv2 usr/lib/orbit-2.0 \ + usr/lib/libmlib \ + print > /tmp/gnome_libdir.$$ 2>/dev/null + + if [ ! -f /tmp/gnome_lib.$$ -a ! -f gnome_libdir.$$ ] ; then + echo "/tmp/gnome_lib.$$ file list not found." + return + fi + + # /usr/sfw gnome stuff + find usr/sfw/bin usr/sfw/include usr/sfw/share usr/sfw/src \ + -print > /tmp/gnome_sfw.$$ 2>/dev/null + + if [ ! -f /tmp/gnome_sfw.$$ ] ; then + echo "/tmp/gnome_sfw.$$ file list not found." + return + fi + + # gnome app binaries usr/bin + find usr/bin/gnome* usr/bin/gui-install usr/bin/bonobo* \ + usr/bin/gtk-* usr/bin/fax* usr/bin/gdk* usr/bin/gif2tiff \ + usr/bin/install-lan \ + usr/bin/metacity* usr/bin/gst-* usr/bin/gconftool-2 \ + usr/bin/pango* usr/bin/desktop* usr/bin/djpeg \ + usr/bin/notify-send usr/bin/oil-bugreport \ + usr/bin/bmp2tiff usr/bin/thembus-theme-applier \ + usr/bin/thumbnail usr/lib/update-* \ + usr/bin/ras2tiff usr/bin/raw2tiff usr/bin/rdjpgcom \ + usr/bin/thumbnail usr/bin/dbus* \ + usr/bin/tiff* usr/bin/rgb2ycbcr \ + usr/bin/fc-cache usr/bin/fc-list \ + -print > /tmp/gnome_bin.$$ 2>/dev/null + + if [ ! -f /tmp/gnome_bin.$$ ] ; then + echo "/tmp/gnome_bin.$$ file list not found." + return + fi + + # Cat all the files together and create the gnome archive + # + + cat /tmp/gnome_libdir.$$ /tmp/gnome_lib.$$ \ + /tmp/gnome_share.$$ /tmp/gnome_sfw.$$ /tmp/gnome_bin.$$ \ + > /tmp/gnome.$$ + + if [ ! -f /tmp/gnome.$$ ] ; then + echo "/tmp/gnome.$$ file not found." + return + fi + # Save off this file in the miniroot for use later + # when unpacking. Clean up old cruft if there. + # + + if [ -f .tmp_proto/gnome_saved ]; then + rm -f .tmp_proto/gnome_saved + fi + + cp /tmp/gnome.$$ .tmp_proto/gnome_saved + + # Create gnome archive + # + + cpio -ocmPuB < /tmp/gnome.$$ 2>/dev/null | bzip2 > \ + "$CPIO_DIR/gnome.cpio.bz2" + + # Remove files from miniroot that are in archive. + # Create symlinks for files in archive + + rm -rf `cat /tmp/gnome_share.$$` + + for i in `cat /tmp/gnome_share.$$` + do + ln -s /tmp/root/$i $i 2>/dev/null + done + + rm -rf `cat /tmp/gnome_lib.$$` + for i in `cat /tmp/gnome_lib.$$` + do + ln -s /tmp/root/$i $i 2>/dev/null + done + + rm -rf `cat /tmp/gnome_libdir.$$` + for i in `cat /tmp/gnome_libdir.$$` + do + ln -s /tmp/root/$i $i 2>/dev/null + done + + rm -rf `cat /tmp/gnome_sfw.$$` + for i in `cat /tmp/gnome_sfw.$$` + do + ln -s /tmp/root/$i $i 2>/dev/null + done + + rm -rf `cat /tmp/gnome_bin.$$` + for i in `cat /tmp/gnome_bin.$$` + do + ln -s /tmp/root/$i $i 2>/dev/null + done + rm -f /tmp/gnome_share.$$ + rm -f /tmp/gnome_lib.$$ + rm -f /tmp/gnome_libdir.$$ + rm -f /tmp/gnome_bin.$$ + ) +} + +archive_JavaGUI() +{ + MEDIA="$1" + MINIROOT="$2" + + RELEASE=`/bin/ls -d "$MEDIA/Solaris_"*` + RELEASE=`basename "$RELEASE"` + + CPIO_DIR="$MEDIA/$RELEASE/Tools/Boot" + + # Archive the java wizard components that are only used in the + # non developer express path. + # + ( + # path is usr/lib/install/data + cd "$MINIROOT" + find usr/lib/install/data/wizards \ + -print > /tmp/java_ui.$$ 2>/dev/null + + if [ ! -f /tmp/java_ui.$$ ] ; then + echo "/tmp/java_ui.$$ file list not found." + return + fi + + cpio -ocmPuB < /tmp/java_ui.$$ 2>/dev/null | bzip2 > \ + "$CPIO_DIR/javaui.cpio.bz2" + + rm -rf `cat /tmp/java_ui.$$` + ln -s /tmp/root/usr/lib/install/data/wizards \ + usr/lib/install/data/wizards 2>/dev/null + + rm -f /tmp/java_ui.$$ + + ) +} + +archive_Misc() +{ + MEDIA="$1" + MINIROOT="$2" + + RELEASE=`/bin/ls -d "$MEDIA/Solaris_"*` + RELEASE=`basename "$RELEASE"` + + CPIO_DIR="$MEDIA/$RELEASE/Tools/Boot" + + # Archive misc stuff that is needed by non devex installer + # + ( + # usr/lib stuff + cd "$MINIROOT" + find usr/lib/lp -print > /tmp/lp.$$ 2>/dev/null + if [ ! -f /tmp/lp.$$ ] ; then + echo "/tmp/lp.$$ file list not found." + return + fi + + cpio -ocmPuB < /tmp/lp.$$ 2>/dev/null | bzip2 > \ + "$CPIO_DIR/lpmisc.cpio.bz2" + + rm -rf `cat /tmp/lp.$$` + ln -s /tmp/root/usr/lib/lp usr/lib/lp 2>/dev/null + + rm -f /tmp/lp.$$ + ) + +} + +archive_Perl() +{ + MEDIA="$1" + MINIROOT="$2" + + RELEASE=`/bin/ls -d "$MEDIA/Solaris_"*` + RELEASE=`basename "$RELEASE"` + + CPIO_DIR="$MEDIA/$RELEASE/Tools/Boot" + + # Archive perl, it is only needed by gnome gui. + # + ( + # in usr + cd "$MINIROOT" + find usr/perl5 -print > /tmp/perl.$$ 2>/dev/null + + if [ ! -f /tmp/perl.$$ ] ; then + echo "/tmp/perl.$$ file list not found." + return + fi + cpio -ocmPuB < /tmp/perl.$$ 2>/dev/null | bzip2 > \ + "$CPIO_DIR/perl.cpio.bz2" + + rm -rf `cat /tmp/perl.$$` 2>/dev/null + ln -s /tmp/root/usr/perl5 usr/perl5 2>/dev/null + + rm -f /tmp/perl.$$ + ) +} +archive_X() +{ + MEDIA="$1" + MINIROOT="$2" + + RELEASE=`/bin/ls -d "$MEDIA/Solaris_"*` + RELEASE=`basename "$RELEASE"` + + CPIO_DIR="$MEDIA/$RELEASE/Tools/Boot" + + # create the graphics and non-graphics X archive + # + ( + cd "$MINIROOT" + find usr/openwin usr/dt usr/X11 -print 2> /dev/null |\ + cpio -ocmPuB 2> /dev/null | bzip2 > "$CPIO_DIR/X.cpio.bz2" + + find usr/openwin/bin/mkfontdir \ + usr/openwin/lib/installalias \ + usr/openwin/server/lib/libfont.so.1 \ + usr/openwin/server/lib/libtypesclr.so.0 \ + -print | cpio -ocmPuB 2> /dev/null | bzip2 > \ + "$CPIO_DIR/X_small.cpio.bz2" + + rm -rf usr/dt usr/openwin usr/X11 + ln -s /tmp/root/usr/dt usr/dt + ln -s /tmp/root/usr/openwin usr/openwin + ln -s /tmp/root/usr/X11 usr/X11 + ) +} + +archive_lu() +{ + MEDIA="$1" + MINIROOT="$2" + + RELEASE=`/bin/ls -d "$MEDIA/Solaris_"*` + RELEASE=`basename "$RELEASE"` + + CPIO_DIR="$MEDIA/$RELEASE/Tools/Boot" + + ( + cd "$MINIROOT" + find usr/lib/install usr/snadm usr/sbin | \ + cpio -ocmPuB 2> /dev/null | bzip2 > "$CPIO_DIR"/lu.cpio.bz2 + ls platform > "$CPIO_DIR/lu.platforms" + ) +} + +packmedia() +{ + MEDIA="$1" + MINIROOT="$2" + + RELEASE=`/bin/ls -d "$MEDIA/Solaris_"*` + RELEASE=`basename "$RELEASE"` + ARCHIVES="X X_small perl lpmisc javaui gnome" + + mkdir -p "$MEDIA/$RELEASE/Tools/Boot" + + if [ -d "$MINIROOT/platform/i86pc" ] ; then + mkdir -p "$MEDIA/boot/amd64" + mkdir -p "$MEDIA/boot/platform/i86pc/kernel" + mkdir -p "$MEDIA/boot/platform/i86pc/kernel/amd64" + mkdir -p "$MEDIA/boot/platform/i86xpv/kernel" + mkdir -p "$MEDIA/boot/platform/i86xpv/kernel/amd64" + cp "$MINIROOT/platform/i86pc/multiboot" "$MEDIA/boot" + cp "$MINIROOT/platform/i86pc/kernel/unix" \ + "$MEDIA/boot/platform/i86pc/kernel/unix" + cp "$MINIROOT/platform/i86pc/kernel/amd64/unix" \ + "$MEDIA/boot/platform/i86pc/kernel/amd64/unix" + cp "$MINIROOT/platform/i86xpv/kernel/unix" \ + "$MEDIA/boot/platform/i86xpv/kernel/unix" + cp "$MINIROOT/platform/i86xpv/kernel/amd64/unix" \ + "$MEDIA/boot/platform/i86xpv/kernel/amd64/unix" + ( + cd "$MEDIA/$RELEASE/Tools/Boot" + ln -sf ../../../boot/x86.miniroot + ln -sf ../../../boot/multiboot + ln -sf ../../../boot/platform/i86pc/kernel/unix + ln -sf ../../../boot/platform/i86pc/kernel/amd64/unix + ln -sf ../../../boot/platform/i86xpv/kernel/unix + ln -sf ../../../boot/platform/i86xpv/kernel/amd64/unix + ln -sf ../../../boot/grub/pxegrub + ) + fi + + if [ -d "$MINIROOT/platform/sun4u" ] ; then + mkdir -p "$MEDIA/boot" + dd if="$MINIROOT/usr/platform/sun4u/lib/fs/hsfs/bootblk" \ + of="$MEDIA/boot/hsfs.bootblock" \ + bs=1b oseek=1 count=15 conv=sync 2> /dev/null + fi + + for arch in sun4u sun4v ; do + if [ -d "$MINIROOT/platform/$arch" ] ; then + archdir="$MEDIA/$RELEASE/Tools/Boot/platform/$arch" + mkdir -p $archdir + ln -sf ../../../../../boot/sparc.miniroot \ + "$archdir/boot_archive" + cp "$MINIROOT/usr/platform/$arch/lib/fs/nfs/inetboot" \ + "$archdir" + cp "$MINIROOT/platform/$arch/wanboot" \ + "$archdir" + mkdir -p "$MEDIA/platform/$arch" + ln -sf ../../boot/sparc.miniroot \ + "$MEDIA/platform/$arch/boot_archive" + fi + done + + # archive package databases to conserve memory + # + ( + cd "$MINIROOT" + find tmp/root/var/sadm/install tmp/root/var/sadm/pkg -print | \ + cpio -ocmPuB 2> /dev/null | bzip2 > \ + "$MEDIA/$RELEASE/Tools/Boot/pkg_db.cpio.bz2" + ) + rm -rf "$MINIROOT/tmp/root/var/sadm/install" + rm -rf "$MINIROOT/tmp/root/var/sadm/pkg" + + if [ -d "$MINIROOT/kernel/drv/sparcv9" ] ; then + archive_lu "$MEDIA" "$MINIROOT" + fi + + archive_X "$MEDIA" "$MINIROOT" + + # Take out the gnome and java parts of the installer from + # the miniroot. These are not required to boot the system + # and start the installers. + + if [ -d "$MINIROOT/platform/i86pc" ] ; then + preload_Gnome "$MEDIA" "$MINIROOT" + archive_Gnome "$MEDIA" "$MINIROOT" + archive_JavaGUI "$MEDIA" "$MINIROOT" + archive_Misc "$MEDIA" "$MINIROOT" + archive_Perl "$MEDIA" "$MINIROOT" + MR="$MEDIA/boot/amd64/x86.miniroot" + pack + + # Now that the 64-bit archives & miniroot have been created, + # restore the files from archives and save the 64-bit + # archives. Strip the 64-bit objects and create the + # 32-bit archives and miniroot + + unpackmedia "$MEDIA" "$MINIROOT" + mkdir -p "$MEDIA/$RELEASE/Tools/Boot/amd64" + for i in $ARCHIVES; do + mv "$MEDIA/$RELEASE/Tools/Boot/${i}.cpio.bz2" \ + "$MEDIA/$RELEASE/Tools/Boot/amd64" + done + if [ -z "$STRIP_AMD64" ]; then + strip_amd64 + fi + + archive_X "$MEDIA" "$MINIROOT" + archive_Gnome "$MEDIA" "$MINIROOT" + archive_JavaGUI "$MEDIA" "$MINIROOT" + archive_Perl "$MEDIA" "$MINIROOT" + archive_Misc "$MEDIA" "$MINIROOT" + MR="$MEDIA/boot/x86.miniroot" + fi + + # copy the install menu to menu.lst so we have a menu + # on the install media + # + if [ -f "$MINIROOT/boot/grub/install_menu" ] ; then + cp $MINIROOT/boot/grub/install_menu \ + $MEDIA/boot/grub/menu.lst + fi +} + +unarchive_X() +{ + MEDIA="$1" + UNPACKED_ROOT="$2" + + RELEASE=`/bin/ls -d "$MEDIA/Solaris_"*` + RELEASE=`basename "$RELEASE"` + + CPIO_DIR="$MEDIA/$RELEASE/Tools/Boot" + + # unpack X + # + ( + cd "$UNPACKED_ROOT" + rm -rf usr/dt usr/openwin usr/X11 + bzcat "$CPIO_DIR/X.cpio.bz2" | cpio -icdmu 2> /dev/null + ) +} + +unpackmedia() +{ + MEDIA="$1" + UNPACKED_ROOT="$2" + + RELEASE=`/bin/ls -d "$MEDIA/Solaris_"*` + RELEASE=`basename "$RELEASE"` + + unarchive_X "$MEDIA" "$UNPACKED_ROOT" + + # unpack package databases + # + ( + cd "$UNPACKED_ROOT" + bzcat "$MEDIA/$RELEASE/Tools/Boot/pkg_db.cpio.bz2" | + cpio -icdmu 2> /dev/null + + # unpack gnome, perl, java and misc + # Remove symlinks left from unpacking x86.miniroot so that + # unpacking subsequent archives will populate appropriately. + # + rm -rf usr/perl5 + rm -rf usr/lib/install/data/wizards + rm -rf usr/lib/lp + + # Gnome list saved off from packmedia + for i in `cat .tmp_proto/gnome_saved` + do + rm -rf $i + done + + bzcat "$MEDIA/$RELEASE/Tools/Boot/gnome.cpio.bz2" | + cpio -icdmu 2>/dev/null + bzcat "$MEDIA/$RELEASE/Tools/Boot/javaui.cpio.bz2" | + cpio -icdmu 2>/dev/null + bzcat "$MEDIA/$RELEASE/Tools/Boot/lpmisc.cpio.bz2" | + cpio -icdmu 2>/dev/null + bzcat "$MEDIA/$RELEASE/Tools/Boot/perl.cpio.bz2" | + cpio -icdmu 2>/dev/null + ) +} + +do_unpack() +{ + rm -rf "$UNPACKED_ROOT" + mkdir -p "$UNPACKED_ROOT" + ( + cd $MNT + find . -print | cpio -pdum "$UNPACKED_ROOT" 2> /dev/null + ) + umount $MNT +} + +unpack() +{ + + if [ ! -f "$MR" ] ; then + usage + exit 1 + fi + + if [ `basename $MR` = x86.miniroot ] ; then + gzcat "$MR" > $TMR + else + REALTHING=true ; export REALTHING + TMR="$MR" + fi + + LOFIDEV=`/usr/sbin/lofiadm -a $TMR` + if [ $? != 0 ] ; then + echo lofi plumb failed + exit 2 + fi + + mkdir -p $MNT + + FSTYP=`fstyp $LOFIDEV` + + if [ "$FSTYP" = ufs ] ; then + /usr/sbin/mount -o ro,nologging $LOFIDEV $MNT + do_unpack + elif [ "$FSTYP" = hsfs ] ; then + /usr/sbin/mount -F hsfs -o ro $LOFIDEV $MNT + do_unpack + else + printf "invalid root archive\n" + fi + + + rmdir $MNT + lofiadm -d $TMR ; LOFIDEV= + if [ "$REALTHING" != true ] ; then + rm $TMR + fi +} + +compress() +{ + SRC=$1 + DST=$2 + + ( + cd $SRC + filelist=`find .` + + for file in $filelist ; do + + file=`echo $file | sed s#^./##` + + # copy all files over to preserve hard links + # + echo $file | cpio -pdum $DST 2> /dev/null + + if [ -f $file ] && [ -s $file ] && [ ! -h $file ] ; then + fiocompress -mc $file $DST/$file & + fi + + done + + # now re-copy a couple of uncompressed files + # + + find kernel platform -name unix | cpio -pdum $DST 2> /dev/null + find kernel platform -name genunix | cpio -pdum $DST \ + 2> /dev/null + find kernel platform -name platmod | cpio -pdum $DST \ + 2> /dev/null + find `find kernel platform -name cpu` | cpio -pdum $DST \ + 2> /dev/null + find `find kernel platform -name kmdb\*` | cpio -pdum $DST \ + 2> /dev/null + find kernel/misc/sparcv9/ctf kernel/fs/sparcv9/dcfs \ + etc/system etc/name_to_major etc/path_to_inst \ + etc/name_to_sysnum | cpio -pdum $DST 2> /dev/null + ) +} + +root_is_ramdisk() +{ + grep -v "set root_is_ramdisk=" "$UNPACKED_ROOT"/etc/system | \ + grep -v "set ramdisk_size=" > /tmp/system.$$ + cat /tmp/system.$$ > "$UNPACKED_ROOT"/etc/system + rm /tmp/system.$$ + + echo set root_is_ramdisk=1 >> "$UNPACKED_ROOT"/etc/system + echo set ramdisk_size=$1 >> "$UNPACKED_ROOT"/etc/system +} + +pack() +{ + if [ ! -d "$UNPACKED_ROOT" -o -z "$MR" ] ; then + usage + exit 1 + fi + + # always compress on sparc if fiocompress exists + # + if [ -d "$UNPACKED_ROOT/kernel/drv/sparcv9" ] && \ + [ -x /usr/sbin/fiocompress ] ; then + COMPRESS=true + fi + + # Estimate image size and add %10 overhead for ufs stuff. + # Note, we can't use du here in case $UNPACKED_ROOT is on a filesystem, + # e.g. zfs, in which the disk usage is less than the sum of the file + # sizes. The nawk code + # + # {t += ($7 % 1024) ? (int($7 / 1024) + 1) * 1024 : $7} + # + # below rounds up the size of a file/directory, in bytes, to the + # next multiple of 1024. This mimics the behavior of ufs especially + # with directories. This results in a total size that's slightly + # bigger than if du was called on a ufs directory. + # + # if the operation in turn is compressing the files the amount + # of typical shrinkage is used to come up with a useful archive + # size + size=$(find "$UNPACKED_ROOT" -ls | nawk ' + {t += ($7 % 1024) ? (int($7 / 1024) + 1) * 1024 : $7} + END {print int(t * 1.10 / 1024)}') + if [ "$COMPRESS" = true ] ; then + size=`echo $size | nawk '{s = $1} END {print int(s * .53)}'` + fi + + /usr/sbin/mkfile ${size}k "$TMR" + + LOFIDEV=`/usr/sbin/lofiadm -a "$TMR"` + if [ $? != 0 ] ; then + echo lofi plumb failed + exit 2 + fi + + RLOFIDEV=`echo $LOFIDEV | sed s/lofi/rlofi/` + newfs $RLOFIDEV < /dev/null 2> /dev/null + mkdir -p $MNT + mount -o nologging $LOFIDEV $MNT + rmdir $MNT/lost+found + + if [ -d "$UNPACKED_ROOT/kernel/drv/sparcv9" ] ; then + root_is_ramdisk $size + fi + + ( + cd "$UNPACKED_ROOT" + if [ "$COMPRESS" = true ] ; then + compress . $MNT + else + find . -print | cpio -pdum $MNT 2> /dev/null + fi + ) + lockfs -f $MNT + umount $MNT + rmdir $MNT + + if [ -d "$UNPACKED_ROOT/kernel/drv/sparcv9" ] ; then + "$UNPACKED_ROOT/usr/sbin/installboot" \ + "$UNPACKED_ROOT/usr/platform/sun4u/lib/fs/ufs/bootblk" \ + $RLOFIDEV + fi + + lofiadm -d $LOFIDEV + LOFIDEV= + + rm -f "$TMR.gz" + + if [ -d "$UNPACKED_ROOT/kernel/drv/sparcv9" ] ; then + mv "$TMR" "$MR" + else + gzip -f "$TMR" + mv "$TMR.gz" "$MR" + fi + + chmod a+r "$MR" +} + +strip_amd64() +{ + find "$UNPACKED_ROOT" -name amd64 -type directory | xargs rm -rf +} + +# main +# + +EXTRA_SPACE=0 +STRIP_AMD64= +COMPRESS= + +PATH=/usr/sbin:/usr/bin:/opt/sfw/bin ; export PATH + +while getopts s:6c opt ; do + case $opt in + s) EXTRA_SPACE="$OPTARG" + ;; + 6) STRIP_AMD64=false + ;; + c) COMPRESS=true + ;; + *) usage + exit 1 + ;; + esac +done +shift `expr $OPTIND - 1` + +if [ $# != 3 ] ; then + usage + exit 1 +fi + +UNPACKED_ROOT="$3" +BASE="`pwd`" +MNT=/tmp/mnt$$ +TMR=/tmp/mr$$ +LOFIDEV= +MR="$2" + +if [ "`dirname $MR`" = . ] ; then + MR="$BASE/$MR" +fi +if [ "`dirname $UNPACKED_ROOT`" = . ] ; then + UNPACKED_ROOT="$BASE/$UNPACKED_ROOT" +fi + + +MEDIA="$MR" + +trap cleanup EXIT + +case $1 in + packmedia) + if [ -d "$UNPACKED_ROOT/kernel/drv/sparcv9" ] ; then + ARCHIVE=sparc.miniroot + else + ARCHIVE=x86.miniroot + fi + MR="$MEDIA/boot/$ARCHIVE" + + packmedia "$MEDIA" "$UNPACKED_ROOT" + pack + + ;; + unpackmedia) + if [ -f "$MEDIA/boot/sparc.miniroot" ] ; then + ARCHIVE=sparc.miniroot + else + ARCHIVE=x86.miniroot + fi + MR="$MEDIA/boot/$ARCHIVE" + unpack + unpackmedia "$MEDIA" "$UNPACKED_ROOT" + ;; + pack) pack + ;; + unpack) unpack + ;; + *) usage + ;; +esac