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