Home | History | Annotate | Download | only in scripts
      1 #!/bin/ksh -p
      2 #
      3 # CDDL HEADER START
      4 #
      5 # The contents of this file are subject to the terms of the
      6 # Common Development and Distribution License (the "License").
      7 # You may not use this file except in compliance with the License.
      8 #
      9 # You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
     10 # or http://www.opensolaris.org/os/licensing.
     11 # See the License for the specific language governing permissions
     12 # and limitations under the License.
     13 #
     14 # When distributing Covered Code, include this CDDL HEADER in each
     15 # file and include the License file at usr/src/OPENSOLARIS.LICENSE.
     16 # If applicable, add the following below this CDDL HEADER, with the
     17 # fields enclosed by brackets "[]" replaced with your own identifying
     18 # information: Portions Copyright [yyyy] [name of copyright owner]
     19 #
     20 # CDDL HEADER END
     21 #
     22 
     23 # Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
     24 # Use is subject to license terms.
     25 #
     26 
     27 # utility to pack and unpack a boot/root archive
     28 # both ufs and hsfs (iso9660) format archives are unpacked
     29 # only ufs archives are generated
     30 #
     31 # usage: pack   <archive> <root>
     32 #        unpack <archive> <root>
     33 #        packmedia   <solaris_image> <root>
     34 #        unpackmedia <solaris_image> <root>
     35 #
     36 #   Where <root> is the directory to unpack to and will be cleaned out
     37 #   if it exists.
     38 #
     39 #   In the case of (un)packmedia, the image is packed or unpacked to/from
     40 #   Solaris media and all the things that don't go into the ramdisk image
     41 #   are (un)cpio'd as well
     42 #
     43 
     44 usage()
     45 {
     46 	printf "usage: root_archive pack <archive> <root>\n"
     47 	printf "       root_archive unpack <archive> <root>\n"
     48 	printf "       root_archive packmedia   <solaris_image> <root>\n"
     49 	printf "       root_archive unpackmedia <solaris_image> <root>\n"
     50 	exit 1
     51 }
     52 
     53 cleanup()
     54 {
     55 	if [ -d $MNT ] ; then
     56 		umount $MNT 2> /dev/null
     57 		rmdir $MNT
     58 	fi
     59 
     60 	lofiadm -d "$TMR" 2>/dev/null
     61         if [ "$REALTHING" != true ] ; then
     62 		rm -f "$TMR"
     63 	fi
     64 	rm -f "$TMR.gz"
     65 	rm -f /tmp/flist$$
     66 }
     67 
     68 preload_Gnome()
     69 {
     70 	MEDIA="$1"
     71 	MINIROOT="$2"
     72 
     73 	
     74 	(
     75 		# Prepopulate the gconf database. This needs to be done and
     76 		# done first for several reasons. 1) Archiving out the gnome
     77 		# libraries and binaries causes the gconftool-2 to not run
     78 		# appropriately at boot time. 2) The binaries and libraries
     79 		# needed to run this are big and thus we want to archive
     80 		# them separately. 3) Having schemas prepopluated in the
     81 		# miniroot means faster boot times.
     82 		#
     83 
     84 		cd "$MINIROOT"
     85 		HOME="./tmp/root"
     86 		export HOME
     87 		umask 0022
     88 		mumble=.tmp_proto/root/etc/gconf/gconf.xml.defaults
     89 		GCONF_CONFIG_SOURCE="xml:merged:$MINIROOT/$mumble"
     90 		export GCONF_CONFIG_SOURCE
     91 		SCHEMADIR="$MINIROOT/.tmp_proto/root/etc/gconf/schemas"
     92 		export SCHEMADIR
     93 		/usr/bin/gconftool-2 --makefile-install-rule \
     94 		    $SCHEMADIR/*.schemas >/dev/null 2>&1
     95 		echo '
     96 		xml:readwrite:/tmp/root/.gconf
     97 		xml:readonly:/etc/gconf/gconf.xml.defaults
     98 		' > /"$MINIROOT"/.tmp_proto/root/etc/gconf/2/path
     99 	)
    100 }
    101 
    102 archive_Gnome()
    103 {
    104 	MEDIA="$1"
    105 	MINIROOT="$2"
    106 
    107 	RELEASE=`/bin/ls -d "$MEDIA/Solaris_"*`
    108 	RELEASE=`basename "$RELEASE"`
    109 	CPIO_DIR="$MEDIA/$RELEASE/Tools/Boot"
    110 
    111 	# Create the gnome archive
    112 	#
    113 	(
    114 		# usr/share gnome stuff
    115 		cd "$MINIROOT"
    116 		find usr/share/GConf usr/share/application-registry \
    117 		    usr/share/autostart usr/share/dtds \
    118 		    usr/share/emacs usr/share/gnome usr/share/gnome-2.0 \
    119 		    usr/share/gnome-background-properties \
    120 		    usr/share/gtk-engines usr/share/gui-install \
    121 		    usr/share/icon-naming-utils usr/share/control-center \
    122 		    usr/share/icons usr/share/locale usr/share/metacity \
    123 		    usr/share/mime usr/share/mime-info usr/share/pixmaps \
    124 		    usr/share/scrollkeeper usr/share/sgml usr/share/themes \
    125 		    usr/share/xml \
    126 		    -print > /tmp/gnome_share.$$ 2>/dev/null
    127 
    128 		if [ ! -f /tmp/gnome_share.$$ ] ; then
    129 			echo "/tmp/gnome_share.$$ file list not found."
    130 			return
    131 		fi
    132 
    133 		# usr/lib gnome stuff
    134 
    135 		find usr/lib/libgnome*\.so\.* \
    136 		    usr/lib/libgst*\.so\.* usr/lib/libgconf*\.so\.* \
    137 		    usr/lib/libgdk*\.so\.* usr/lib/libgtk*\.so\.* \
    138 		    usr/lib/libglade*\.so\.* usr/lib/libmetacity*\.so\.* \
    139 		    usr/lib/libfontconfig*\.so\.* usr/lib/libgmodule*\.so\.* \
    140 		    usr/lib/libgobject*\.so\.* usr/lib/libgthread*\.so\.* \
    141 		    usr/lib/libpopt*\.so\.* usr/lib/libstartup*\.so\.* \
    142 		    usr/lib/libexif*\.so\.* usr/lib/libtiff*\.so\.* \
    143 		    usr/lib/libstartup*\.so\.* \
    144 		    usr/lib/libexif*\.so\.* usr/lib/libORBit*\.so\.* \
    145 	 	    usr/lib/libmlib*\.so\.* usr/lib/libxsl*\.so\.* \
    146 		    usr/lib/libpango*\.so\.* usr/lib/libpng*\.so\.* \
    147 		    usr/lib/liboil*\.so\.* usr/lib/libbonobo*\.so\.* \
    148 		    usr/lib/libart*\.so\.* usr/lib/libcairo*\.so\.* \
    149 		    usr/lib/libjpeg*\.so\.* \
    150 		    usr/lib/libpolkit*\.so\.* \
    151 			-print | egrep -v '\.so\.[0]$' > \
    152 		       /tmp/gnome_lib.$$ 2>/dev/null
    153 
    154 		find usr/lib/nautilus usr/lib/pango usr/lib/iconv \
    155 		    usr/lib/metacity-dialog usr/lib/window-manager-settings \
    156 		    usr/lib/bonobo-2.0 usr/lib/bononbo usr/lib/gtk-2.0 \
    157 		    usr/lib/GConf usr/lib/bonobo-activation-server \
    158 		    usr/lib/python2.4 usr/lib/gstreamer-0.10 \
    159 		    usr/lib/gconf-sanity-check-2 usr/lib/gconfd \
    160 		    usr/lib/gnome-vfs-2.0 usr/lib/dbus-daemon \
    161 		    usr/lib/gnome-vfs-daemon usr/lib/gnome-settings-daemon \
    162 		    usr/lib/gnome_segv2 usr/lib/orbit-2.0 \
    163 		    usr/lib/libmlib \
    164 		    print > /tmp/gnome_libdir.$$ 2>/dev/null
    165 
    166 		if [ ! -f /tmp/gnome_lib.$$  -a ! -f gnome_libdir.$$ ] ; then
    167 			echo "/tmp/gnome_lib.$$ file list not found."
    168 			return
    169 		fi
    170 
    171 		# /usr/sfw gnome stuff
    172 		find usr/sfw/bin usr/sfw/include usr/sfw/share usr/sfw/src \
    173 		    -print > /tmp/gnome_sfw.$$ 2>/dev/null
    174 
    175 		if [ ! -f /tmp/gnome_sfw.$$ ] ; then
    176 			echo "/tmp/gnome_sfw.$$ file list not found."
    177 			return
    178 		fi
    179 
    180 		# gnome app binaries usr/bin
    181 		find usr/bin/gnome* usr/bin/gui-install usr/bin/bonobo* \
    182 		    usr/bin/gtk-* usr/bin/fax* usr/bin/gdk* usr/bin/gif2tiff \
    183 		    usr/bin/install-lan \
    184 		    usr/bin/metacity* usr/bin/gst-* usr/bin/gconftool-2 \
    185 		    usr/bin/pango* usr/bin/desktop* usr/bin/djpeg \
    186 		    usr/bin/notify-send usr/bin/oil-bugreport \
    187 		    usr/bin/bmp2tiff usr/bin/thembus-theme-applier \
    188 		    usr/bin/thumbnail usr/lib/update-* \
    189 		    usr/bin/ras2tiff usr/bin/raw2tiff usr/bin/rdjpgcom \
    190 		    usr/bin/thumbnail usr/bin/dbus* \
    191 		    usr/bin/tiff* usr/bin/rgb2ycbcr \
    192 		    usr/bin/fc-cache usr/bin/fc-list \
    193 			-print > /tmp/gnome_bin.$$ 2>/dev/null
    194 
    195 		if [ ! -f /tmp/gnome_bin.$$ ] ; then
    196 			echo "/tmp/gnome_bin.$$ file list not found."
    197 			return
    198 		fi
    199 
    200 		# Cat all the files together and create the gnome archive
    201 		#
    202 
    203 		cat /tmp/gnome_libdir.$$ /tmp/gnome_lib.$$ \
    204 		     /tmp/gnome_share.$$ /tmp/gnome_sfw.$$ /tmp/gnome_bin.$$ \
    205 		    > /tmp/gnome.$$
    206 
    207 		if [ ! -f /tmp/gnome.$$ ] ; then
    208 			echo "/tmp/gnome.$$ file not found."
    209 			return
    210 		fi
    211 		# Save off this file in the miniroot for use later
    212 		# when unpacking. Clean up old cruft if there.
    213 		#
    214 
    215 		if [ -f .tmp_proto/gnome_saved ]; then
    216 			rm -f .tmp_proto/gnome_saved
    217 		fi
    218 
    219 		cp /tmp/gnome.$$ .tmp_proto/gnome_saved
    220 
    221 		# Create gnome archive
    222 		#
    223 
    224 		cpio -ocmPuB < /tmp/gnome.$$ 2>/dev/null | bzip2 > \
    225 		    "$CPIO_DIR/gnome.cpio.bz2"
    226 
    227 		# Remove files from miniroot that are in archive.
    228 		# Create symlinks for files in archive
    229 		
    230 		rm -rf `cat /tmp/gnome_share.$$`
    231 
    232 		for i in `cat /tmp/gnome_share.$$`
    233 		do
    234 			ln -s /tmp/root/$i $i 2>/dev/null
    235 		done
    236 
    237 		rm -rf `cat /tmp/gnome_lib.$$`
    238 		for i in `cat /tmp/gnome_lib.$$`
    239 		do	
    240 			ln -s /tmp/root/$i $i 2>/dev/null
    241 		done
    242 
    243 		rm -rf `cat /tmp/gnome_libdir.$$`
    244 		for i in `cat /tmp/gnome_libdir.$$`
    245 		do
    246 			ln -s /tmp/root/$i $i 2>/dev/null
    247 		done
    248 
    249 		rm -rf `cat /tmp/gnome_sfw.$$`
    250 		for i in `cat /tmp/gnome_sfw.$$`
    251 		do
    252 			ln -s /tmp/root/$i $i 2>/dev/null
    253 		done
    254 
    255 		rm -rf `cat /tmp/gnome_bin.$$`
    256 		for i in `cat /tmp/gnome_bin.$$`
    257 		do
    258 			ln -s /tmp/root/$i $i 2>/dev/null
    259 		done
    260 		rm -f /tmp/gnome_share.$$
    261 		rm -f /tmp/gnome_lib.$$
    262 		rm -f /tmp/gnome_libdir.$$
    263 		rm -f /tmp/gnome_bin.$$
    264 	)
    265 }
    266 
    267 archive_JavaGUI()
    268 {
    269 	MEDIA="$1"
    270 	MINIROOT="$2"
    271 
    272 	RELEASE=`/bin/ls -d "$MEDIA/Solaris_"*`
    273 	RELEASE=`basename "$RELEASE"`
    274 
    275 	CPIO_DIR="$MEDIA/$RELEASE/Tools/Boot"
    276 	
    277 	# Archive the java wizard components that are only used in the
    278 	# non developer express path.
    279 	#
    280 	(
    281 		# path is usr/lib/install/data
    282 		cd "$MINIROOT"
    283 		find usr/lib/install/data/wizards \
    284 		    -print > /tmp/java_ui.$$ 2>/dev/null
    285 
    286 		if [ ! -f /tmp/java_ui.$$ ] ; then
    287 			echo "/tmp/java_ui.$$ file list not found."
    288 			return
    289 		fi
    290 
    291 		cpio -ocmPuB < /tmp/java_ui.$$ 2>/dev/null | bzip2 > \
    292 		    "$CPIO_DIR/javaui.cpio.bz2"
    293 
    294 		rm -rf `cat /tmp/java_ui.$$`
    295 		ln -s /tmp/root/usr/lib/install/data/wizards \
    296 		    usr/lib/install/data/wizards 2>/dev/null
    297 
    298 		rm -f /tmp/java_ui.$$
    299 	
    300 	)
    301 }
    302 
    303 archive_Misc()
    304 {
    305 	MEDIA="$1"
    306 	MINIROOT="$2"
    307 
    308 	RELEASE=`/bin/ls -d "$MEDIA/Solaris_"*`
    309 	RELEASE=`basename "$RELEASE"`
    310 
    311 	CPIO_DIR="$MEDIA/$RELEASE/Tools/Boot"
    312 
    313 	# Archive misc stuff that is needed by non devex installer
    314 	#
    315 	(
    316 		# usr/lib stuff
    317 		cd "$MINIROOT"
    318 		find usr/lib/lp -print > /tmp/lp.$$ 2>/dev/null
    319 		if [ ! -f /tmp/lp.$$ ] ; then
    320 			echo "/tmp/lp.$$ file list not found."
    321 			return
    322 		fi
    323 
    324 		cpio -ocmPuB < /tmp/lp.$$ 2>/dev/null | bzip2 > \
    325 		    "$CPIO_DIR/lpmisc.cpio.bz2"
    326 
    327 		rm -rf `cat /tmp/lp.$$`
    328 		ln -s /tmp/root/usr/lib/lp usr/lib/lp 2>/dev/null
    329 		
    330 		rm -f /tmp/lp.$$
    331 	)
    332 
    333 }
    334 
    335 archive_Perl()
    336 {
    337 	MEDIA="$1"
    338 	MINIROOT="$2"
    339 
    340 	RELEASE=`/bin/ls -d "$MEDIA/Solaris_"*`
    341 	RELEASE=`basename "$RELEASE"`
    342 
    343 	CPIO_DIR="$MEDIA/$RELEASE/Tools/Boot"
    344 
    345 	# Archive perl, it is only needed by gnome gui.
    346 	#
    347 	(
    348 		# in usr
    349 		cd "$MINIROOT"
    350 		find usr/perl5 -print > /tmp/perl.$$ 2>/dev/null
    351 
    352 		if [ ! -f /tmp/perl.$$ ] ; then
    353 			echo "/tmp/perl.$$ file list not found."
    354 			return
    355 		fi
    356 		cpio -ocmPuB < /tmp/perl.$$ 2>/dev/null | bzip2 > \
    357 		    "$CPIO_DIR/perl.cpio.bz2"
    358 
    359 		rm -rf `cat /tmp/perl.$$` 2>/dev/null
    360 		ln -s /tmp/root/usr/perl5 usr/perl5 2>/dev/null
    361 
    362 		rm -f /tmp/perl.$$
    363 	)
    364 }
    365 archive_X()
    366 {
    367 	MEDIA="$1"
    368 	MINIROOT="$2"
    369 
    370 	RELEASE=`/bin/ls -d "$MEDIA/Solaris_"*`
    371 	RELEASE=`basename "$RELEASE"`
    372 
    373 	CPIO_DIR="$MEDIA/$RELEASE/Tools/Boot"
    374 
    375 	# create the graphics and non-graphics X archive
    376 	#
    377 	(
    378 		cd "$MINIROOT"
    379 		find usr/openwin usr/dt usr/X11 -print 2> /dev/null |\
    380 		    cpio -ocmPuB 2> /dev/null | bzip2 > "$CPIO_DIR/X.cpio.bz2"
    381 
    382 		find usr/openwin/bin/mkfontdir \
    383 		     usr/openwin/lib/installalias \
    384 		     usr/openwin/server/lib/libfont.so.1 \
    385 		     usr/openwin/server/lib/libtypesclr.so.0 \
    386 			 -print | cpio -ocmPuB 2> /dev/null | bzip2 > \
    387 			 "$CPIO_DIR/X_small.cpio.bz2"
    388 
    389 		rm -rf usr/dt usr/openwin usr/X11
    390 		ln -s /tmp/root/usr/dt usr/dt
    391 		ln -s /tmp/root/usr/openwin usr/openwin
    392 		ln -s /tmp/root/usr/X11 usr/X11
    393 	)
    394 }
    395 
    396 archive_lu()
    397 {
    398 	MEDIA="$1"
    399 	MINIROOT="$2"
    400 
    401 	RELEASE=`/bin/ls -d "$MEDIA/Solaris_"*`
    402 	RELEASE=`basename "$RELEASE"`
    403 
    404 	CPIO_DIR="$MEDIA/$RELEASE/Tools/Boot"
    405 
    406 	(
    407 		cd "$MINIROOT"
    408 		find usr/lib/install usr/snadm usr/sbin usr/lib/locale \
    409 		    boot/grub boot/solaris/bootenv.rc \
    410 		    tmp/root/boot/grub tmp/root/boot/solaris/bootenv.rc \
    411 		    2> /dev/null | cpio -ocmPuB 2> /dev/null | bzip2 \
    412 		    > "$CPIO_DIR"/lu.cpio.bz2
    413 		ls platform > "$CPIO_DIR/lu.platforms"
    414 	)
    415 }
    416 
    417 cleanout_pkgdata()
    418 {
    419 	rm -Rf tmp/root/var/sadm/install tmp/root/var/sadm/pkg
    420 }
    421 
    422 packmedia()
    423 {
    424 	MEDIA="$1"
    425 	MINIROOT="$2"
    426 
    427 	RELEASE=`/bin/ls -d "$MEDIA/Solaris_"*`
    428 	RELEASE=`basename "$RELEASE"`
    429 	ARCHIVES="X X_small perl lpmisc javaui gnome"
    430 
    431 	mkdir -p "$MEDIA/$RELEASE/Tools/Boot"
    432 
    433 	if [ -d "$MINIROOT/platform/i86pc" ] ; then
    434 		mkdir -p "$MEDIA/boot/amd64"
    435 		mkdir -p "$MEDIA/boot/platform/i86pc/kernel"
    436 		mkdir -p "$MEDIA/boot/platform/i86pc/kernel/amd64"
    437 		mkdir -p "$MEDIA/boot/platform/i86xpv/kernel"
    438 		mkdir -p "$MEDIA/boot/platform/i86xpv/kernel/amd64"
    439 		cp "$MINIROOT/platform/i86pc/multiboot" "$MEDIA/boot"
    440 		cp "$MINIROOT/platform/i86pc/kernel/unix" \
    441 		    "$MEDIA/boot/platform/i86pc/kernel/unix"
    442 		cp "$MINIROOT/platform/i86pc/kernel/amd64/unix" \
    443 		    "$MEDIA/boot/platform/i86pc/kernel/amd64/unix"
    444 		cp "$MINIROOT/platform/i86xpv/kernel/unix" \
    445 		    "$MEDIA/boot/platform/i86xpv/kernel/unix"
    446 		cp "$MINIROOT/platform/i86xpv/kernel/amd64/unix" \
    447 		    "$MEDIA/boot/platform/i86xpv/kernel/amd64/unix"
    448 		(
    449 			cd "$MEDIA/$RELEASE/Tools/Boot"
    450 			ln -sf ../../../boot/x86.miniroot
    451 			ln -sf ../../../boot/multiboot
    452 			ln -sf ../../../boot/platform/i86pc/kernel/unix
    453 			ln -sf ../../../boot/platform/i86pc/kernel/amd64/unix
    454 			ln -sf ../../../boot/platform/i86xpv/kernel/unix
    455 			ln -sf ../../../boot/platform/i86xpv/kernel/amd64/unix
    456 			ln -sf ../../../boot/grub/pxegrub
    457 		)
    458 	fi
    459 
    460 	if [ -d "$MINIROOT/platform/sun4u" ] ; then
    461 		mkdir -p "$MEDIA/boot"
    462 		dd if="$MINIROOT/platform/sun4u/lib/fs/hsfs/bootblk" \
    463 		    of="$MEDIA/boot/hsfs.bootblock" \
    464 		    bs=1b oseek=1 count=15 conv=sync 2> /dev/null
    465 	fi
    466 
    467 	for arch in sun4u sun4v ; do
    468 		if [ -d "$MINIROOT/platform/$arch" ] ; then
    469 			archdir="$MEDIA/$RELEASE/Tools/Boot/platform/$arch"
    470 			mkdir -p $archdir
    471 			ln -sf ../../../../../boot/sparc.miniroot \
    472 			    "$archdir/boot_archive"
    473 			cp "$MINIROOT/usr/platform/$arch/lib/fs/nfs/inetboot" \
    474 			    "$archdir"
    475 			cp "$MINIROOT/platform/$arch/wanboot" \
    476 			    "$archdir"
    477 			mkdir -p "$MEDIA/platform/$arch"
    478 			ln -sf ../../boot/sparc.miniroot \
    479 			    "$MEDIA/platform/$arch/boot_archive"
    480 			ln -sf ../../$RELEASE/Tools/Boot/platform/$arch/wanboot \
    481 			    "$MEDIA/platform/$arch/wanboot"
    482 		fi
    483 	done
    484 
    485 	# archive package databases to conserve memory
    486 	#
    487 	(
    488 		cd "$MINIROOT"
    489 		find tmp/root/var/sadm/install tmp/root/var/sadm/pkg -print | \
    490 		    cpio -ocmPuB 2> /dev/null | bzip2 > \
    491 		    "$MEDIA/$RELEASE/Tools/Boot/pkg_db.cpio.bz2"
    492 
    493 		cleanout_pkgdata
    494 	)
    495 
    496 	archive_lu "$MEDIA" "$MINIROOT"
    497 
    498 	archive_X "$MEDIA" "$MINIROOT"
    499 
    500 	# Take out the gnome and java parts of the installer from
    501 	# the miniroot. These are not required to boot the system
    502 	# and start the installers.
    503 
    504 	if [ -d "$MINIROOT/platform/i86pc" ] ; then
    505 		preload_Gnome "$MEDIA" "$MINIROOT"
    506 		archive_Gnome "$MEDIA" "$MINIROOT"
    507 		archive_JavaGUI "$MEDIA" "$MINIROOT"
    508 		archive_Misc "$MEDIA" "$MINIROOT"
    509 		archive_Perl "$MEDIA" "$MINIROOT"
    510 		pack "$MEDIA/boot/amd64/x86.miniroot"
    511 
    512         	# Now that the 64-bit archives & miniroot have been created,
    513         	# restore the files from archives and save the 64-bit
    514         	# archives. Strip the 64-bit objects and create the
    515 		# 32-bit archives and miniroot
    516 
    517 		unpackmedia "$MEDIA" "$MINIROOT"
    518 		cleanout_pkgdata
    519 		mkdir -p "$MEDIA/$RELEASE/Tools/Boot/amd64"
    520 		for i in $ARCHIVES; do
    521 			mv "$MEDIA/$RELEASE/Tools/Boot/${i}.cpio.bz2" \
    522 				"$MEDIA/$RELEASE/Tools/Boot/amd64"
    523 		done
    524 		if [ -z "$STRIP_AMD64" ]; then
    525 			strip_amd64
    526 		fi
    527 
    528 		archive_X "$MEDIA" "$MINIROOT"
    529 		archive_Gnome "$MEDIA" "$MINIROOT"
    530 		archive_JavaGUI "$MEDIA" "$MINIROOT"
    531 		archive_Perl "$MEDIA" "$MINIROOT"
    532 		archive_Misc "$MEDIA" "$MINIROOT"
    533 	fi
    534 
    535 	# copy the install menu to menu.lst so we have a menu
    536 	# on the install media
    537 	#
    538 	if [ -f "$MINIROOT/boot/grub/install_menu" ] ; then
    539 		cp $MINIROOT/boot/grub/install_menu \
    540 		    $MEDIA/boot/grub/menu.lst
    541 	fi
    542 
    543 	#
    544 	# jumpstart utilities in usr/sbin/install.d
    545 	#
    546 	if [ -d "$MINIROOT/usr/sbin/install.d" ] ; then
    547 		(
    548 		cd ${MINIROOT}
    549 		find usr/sbin/install.d/chkprobe \
    550 		    -print | cpio -ocmPuB 2> /dev/null | bzip2 > \
    551 		    ${MEDIA}/${RELEASE}/Tools/Boot/usr_sbin_install_d.cpio.bz2
    552 		)
    553 	fi
    554 }
    555 
    556 unarchive_X()
    557 {
    558 	MEDIA="$1"
    559 	UNPACKED_ROOT="$2"
    560 
    561 	RELEASE=`/bin/ls -d "$MEDIA/Solaris_"*`
    562 	RELEASE=`basename "$RELEASE"`
    563 
    564 	CPIO_DIR="$MEDIA/$RELEASE/Tools/Boot"
    565 
    566 	# unpack X
    567 	#
    568 	(
    569 		cd "$UNPACKED_ROOT"
    570 		rm -rf usr/dt usr/openwin usr/X11
    571 		bzcat "$CPIO_DIR/X.cpio.bz2" | cpio -icdmu 2> /dev/null
    572 	)
    573 }
    574 
    575 unpackmedia()
    576 {
    577 	MEDIA="$1"
    578 	UNPACKED_ROOT="$2"
    579 
    580 	RELEASE=`/bin/ls -d "$MEDIA/Solaris_"*`
    581 	RELEASE=`basename "$RELEASE"`
    582 
    583 	unarchive_X "$MEDIA" "$UNPACKED_ROOT"
    584 
    585 	# unpack package databases
    586 	#
    587 	(
    588 		cd "$UNPACKED_ROOT"
    589 		bzcat "$MEDIA/$RELEASE/Tools/Boot/pkg_db.cpio.bz2" |
    590 		    cpio -icdmu 2> /dev/null
    591 
    592 		if [ -d "$MINIROOT/platform/i86pc" ] ; then
    593 
    594 			# unpack gnome, perl, java and misc
    595 			# Remove symlinks left from unpacking x86.miniroot
    596 			# so that unpacking subsequent archives will populate
    597 			# appropriately.
    598 			#
    599 			rm -rf usr/perl5
    600 			rm -rf usr/lib/install/data/wizards
    601 			rm -rf usr/lib/lp
    602 
    603 			# Gnome list saved off from packmedia
    604 			for i in `cat .tmp_proto/gnome_saved`
    605 			do
    606 				rm -rf $i
    607 			done
    608 			
    609 			bzcat "$MEDIA/$RELEASE/Tools/Boot/gnome.cpio.bz2" |
    610 			    cpio -icdmu 2>/dev/null
    611 			bzcat "$MEDIA/$RELEASE/Tools/Boot/javaui.cpio.bz2" |
    612 			    cpio -icdmu 2>/dev/null
    613 			bzcat "$MEDIA/$RELEASE/Tools/Boot/lpmisc.cpio.bz2" |
    614 			    cpio -icdmu 2>/dev/null
    615 			bzcat "$MEDIA/$RELEASE/Tools/Boot/perl.cpio.bz2" |
    616 			    cpio -icdmu 2>/dev/null
    617 		fi
    618 	)
    619 }
    620 
    621 do_unpack()
    622 {
    623 	(
    624 		cd $MNT
    625 		find . -print | cpio -pdum "$UNPACKED_ROOT" 2> /dev/null
    626 	)
    627 	# increase the chances the unmount will succeed
    628 	umount -f $MNT
    629 }
    630 
    631 unpack()
    632 {
    633 	MR=$1
    634 	if [ ! -f "$MR" ] ; then
    635 		printf "$MR: not found\n"
    636 		usage
    637 	fi
    638 
    639 	if [ `uname -i` = i86pc ] ; then
    640 		gzcat "$MR" > $TMR
    641 	else
    642 		REALTHING=true ; export REALTHING
    643 		TMR="$MR"
    644 	fi
    645 
    646 	LOFIDEV=`/usr/sbin/lofiadm -a $TMR`
    647 	if [ $? != 0 ] ; then
    648 		echo lofi plumb failed
    649 		exit 2
    650 	fi
    651 
    652 	mkdir -p $MNT
    653 
    654 	FSTYP=`fstyp $LOFIDEV`
    655 
    656 	if [ "$FSTYP" = ufs ] ; then
    657 		/usr/sbin/mount -o ro,nologging $LOFIDEV $MNT
    658 		do_unpack
    659 	elif [ "$FSTYP" = hsfs ] ; then
    660 		/usr/sbin/mount -F hsfs -o ro $LOFIDEV $MNT
    661 		do_unpack
    662 	else
    663 		printf "invalid root archive\n"
    664 	fi
    665 
    666 
    667 	rmdir $MNT
    668 	lofiadm -d $TMR ; LOFIDEV=
    669 	if [ "$REALTHING" != true ] ; then
    670 		rm $TMR
    671 	fi
    672 }
    673 
    674 compress()
    675 {
    676 	SRC=$1
    677 	DST=$2
    678 
    679 	(
    680 		cd $SRC
    681 		filelist=`find .`
    682 
    683 		for file in $filelist ; do
    684 
    685 			file=`echo $file | sed s#^./##`
    686 
    687 			# copy all files over to preserve hard links
    688 			#
    689 			echo $file | cpio -pdum $DST 2> /dev/null
    690 
    691 			if [ -f $file ] && [ -s $file ] && [ ! -h $file ] ; then
    692 				fiocompress -mc $file $DST/$file &
    693 			fi
    694 
    695 		done
    696 
    697 		wait `pgrep fiocompress`
    698 
    699 		# now re-copy a couple of uncompressed files
    700 
    701 		if [ -d "$SRC/platform/i86pc" ] ; then
    702 			find `cat boot/solaris/filelist.ramdisk` -type file \
    703 			    -print 2> /dev/null > /tmp/flist$$
    704 			find usr/kernel -type file -print 2> /dev/null \
    705 			    >> /tmp/flist$$
    706 			# some of the files are replaced with links into
    707 			# tmp/root on the miniroot, so find the backing files
    708 			# from there as well and add them to the list ti
    709 			# be copied uncompressed
    710 			(
    711 				cd $SRC/tmp/root
    712 				find `cat ../../boot/solaris/filelist.ramdisk` \
    713 				    -type file -print 2> /dev/null | \
    714 				    sed 's#^#tmp/root/#' >> /tmp/flist$$
    715 			)
    716 			flist=`cat /tmp/flist$$`
    717 			(
    718 				cd $DST
    719 				rm -f $flist
    720 			)
    721 			for file in $flist ; do
    722 				echo $file | cpio -pdum $DST 2> /dev/null
    723 			done
    724 		else
    725 			find kernel platform -name unix | \
    726 			    cpio -pdum $DST 2> /dev/null
    727 			find kernel platform -name genunix | cpio -pdum $DST \
    728 			    2> /dev/null
    729 			find kernel platform -name platmod | cpio -pdum $DST \
    730 			    2> /dev/null
    731 			find `find kernel platform -name cpu` | \
    732 			    cpio -pdum $DST 2> /dev/null
    733 			find `find kernel platform -name kmdb\*` | \
    734 				cpio -pdum $DST 2> /dev/null
    735 			find kernel/misc/sparcv9/ctf kernel/fs/sparcv9/dcfs \
    736 			    kernel/misc/ctf kernel/fs/dcfs \
    737 			    etc/system etc/name_to_major etc/path_to_inst \
    738 			    etc/name_to_sysnum  etc/driver_aliases \
    739 			    etc/driver_classes etc/minor_perm | \
    740 			    cpio -pdum $DST 2> /dev/null
    741 		fi
    742 	)
    743 }
    744 
    745 root_is_ramdisk()
    746 {
    747 	grep -v "set root_is_ramdisk=" "$UNPACKED_ROOT"/etc/system | \
    748 	    grep -v "set ramdisk_size=" > /tmp/system.$$
    749 	cat /tmp/system.$$ > "$UNPACKED_ROOT"/etc/system
    750 	rm /tmp/system.$$
    751 
    752 	echo set root_is_ramdisk=1 >> "$UNPACKED_ROOT"/etc/system
    753 	echo set ramdisk_size=$1 >> "$UNPACKED_ROOT"/etc/system
    754 }
    755 
    756 pack()
    757 {
    758 	MR="$1"
    759 	[ -d "$UNPACKED_ROOT" ] || usage
    760 
    761 	# always compress if fiocompress exists
    762 	#
    763 	if [ -x /usr/sbin/fiocompress ] ; then
    764 		COMPRESS=true
    765 	fi
    766 
    767 	# Estimate image size and add %10 overhead for ufs stuff.
    768 	# Note, we can't use du here in case $UNPACKED_ROOT is on a filesystem,
    769 	# e.g. zfs, in which the disk usage is less than the sum of the file
    770 	# sizes.  The nawk code
    771 	#
    772 	#	{t += ($7 % 1024) ? (int($7 / 1024) + 1) * 1024 : $7}
    773 	#
    774 	# below rounds up the size of a file/directory, in bytes, to the
    775 	# next multiple of 1024.  This mimics the behavior of ufs especially
    776 	# with directories.  This results in a total size that's slightly
    777 	# bigger than if du was called on a ufs directory.
    778 	#
    779 	# if the operation in turn is compressing the files the amount
    780 	# of typical shrinkage is used to come up with a useful archive
    781 	# size
    782 	size=$(find "$UNPACKED_ROOT" -ls | nawk '
    783 	    {t += ($7 % 1024) ? (int($7 / 1024) + 1) * 1024 : $7}
    784 	    END {print int(t * 1.10 / 1024)}')
    785 	if [ "$COMPRESS" = true ] ; then
    786 		size=`echo $size | nawk '{s = $1} END {print int(s * 0.6)}'`
    787 	fi
    788 
    789 	/usr/sbin/mkfile ${size}k "$TMR"
    790 
    791 	LOFIDEV=`/usr/sbin/lofiadm -a "$TMR"`
    792 	if [ $? != 0 ] ; then
    793 		echo lofi plumb failed
    794 		exit 2
    795 	fi
    796 
    797 	RLOFIDEV=`echo $LOFIDEV | sed s/lofi/rlofi/`
    798 	newfs $RLOFIDEV < /dev/null 2> /dev/null
    799 	mkdir -p $MNT
    800 	mount -o nologging $LOFIDEV $MNT
    801 	rmdir $MNT/lost+found
    802 
    803 	if [ -d "$UNPACKED_ROOT/kernel/drv/sparcv9" ] ; then
    804 		root_is_ramdisk $size
    805 	fi
    806 
    807 	(
    808 		cd "$UNPACKED_ROOT"
    809 		if [ "$COMPRESS" = true ] ; then
    810 			compress . $MNT
    811 		else
    812 			find . -print | cpio -pdum $MNT 2> /dev/null
    813 		fi
    814 	)
    815 	lockfs -f $MNT
    816 	umount $MNT
    817 	rmdir $MNT
    818 
    819 	if [ -d "$UNPACKED_ROOT/kernel/drv/sparcv9" ] ; then
    820 		"$UNPACKED_ROOT/usr/sbin/installboot" \
    821 		    "$UNPACKED_ROOT/platform/sun4u/lib/fs/ufs/bootblk" \
    822 		    $RLOFIDEV
    823 	fi
    824 
    825 	lofiadm -d $LOFIDEV
    826 	LOFIDEV=
    827 
    828 	rm -f "$TMR.gz"
    829 
    830 	if [ -d "$UNPACKED_ROOT/kernel/drv/sparcv9" ] ; then
    831 		mv "$TMR" "$MR"
    832 	else
    833 		gzip -f "$TMR"
    834 		mv "$TMR.gz" "$MR"
    835 	fi
    836 
    837 	chmod a+r "$MR"
    838 }
    839 
    840 strip_amd64()
    841 {
    842 	find "$UNPACKED_ROOT" -name amd64 -type directory | xargs rm -rf
    843 }
    844 
    845 # main
    846 #
    847 
    848 EXTRA_SPACE=0
    849 STRIP_AMD64=
    850 COMPRESS=
    851 
    852 PATH=/usr/sbin:/usr/bin:/opt/sfw/bin ; export PATH
    853 
    854 while getopts s:6c opt ; do
    855 	case $opt in
    856 	s)	EXTRA_SPACE="$OPTARG"
    857 		;;
    858 	6)	STRIP_AMD64=false
    859 		;;
    860 	c)	COMPRESS=true
    861 		;;
    862 	*)	usage
    863 		;;
    864 	esac
    865 done
    866 shift `expr $OPTIND - 1`
    867 
    868 [ $# == 3 ] || usage
    869 
    870 UNPACKED_ROOT="$3"
    871 BASE="`pwd`"
    872 MNT=/tmp/mnt$$
    873 TMR=/tmp/mr$$
    874 LOFIDEV=
    875 MR="$2"
    876 
    877 # sanity check
    878 [ "$UNPACKED_ROOT" != "/" ] || usage
    879 
    880 if [ "`dirname $MR`" = . ] ; then
    881 	MR="$BASE/$MR"
    882 fi
    883 if [ "`dirname $UNPACKED_ROOT`" = . ] ; then
    884 	UNPACKED_ROOT="$BASE/$UNPACKED_ROOT"
    885 fi
    886 
    887 
    888 MEDIA="$MR"
    889 
    890 trap cleanup EXIT
    891 
    892 # always unpack into a fresh root
    893 case $1 in
    894 	unpack|unpackmedia)
    895 		rm -rf "$UNPACKED_ROOT"
    896 		mkdir -p "$UNPACKED_ROOT"
    897 		;;
    898 esac
    899 [ -d "$UNPACKED_ROOT" ] || usage
    900 
    901 case $1 in
    902 	packmedia)
    903 		packmedia "$MEDIA" "$UNPACKED_ROOT"
    904 		if [ -d "$UNPACKED_ROOT/kernel/drv/sparcv9" ] ; then
    905 			pack "$MEDIA/boot/sparc.miniroot"
    906 		else
    907 			pack "$MEDIA/boot/x86.miniroot"
    908 		fi
    909 
    910 		;;
    911 	unpackmedia)
    912 		if [ -f "$MEDIA/boot/sparc.miniroot" ] ; then
    913 			unpack "$MEDIA/boot/sparc.miniroot"
    914 		else
    915 			unpack "$MEDIA/boot/x86.miniroot"
    916 			unpack "$MEDIA/boot/amd64/x86.miniroot"
    917 		fi
    918 		unpackmedia "$MEDIA" "$UNPACKED_ROOT"
    919 		;;
    920 	pack)	pack "$MR"
    921 		;;
    922 	unpack)	unpack "$MR"
    923 		;;
    924 	*)	usage
    925 		;;
    926 esac
    927