xref: /titanic_50/usr/src/cmd/boot/scripts/root_archive.ksh (revision 36e5aa2ab5c51d4747a2470e41ccb782056c90e7)
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 2007 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	rm -f "$TMR" "$TMR.gz"
67}
68
69archive_Gnome()
70{
71	MEDIA="$1"
72	MINIROOT="$2"
73
74	RELEASE=`/bin/ls -d "$MEDIA/Solaris_"*`
75	RELEASE=`basename "$RELEASE"`
76
77	if [ -d "$UNPACKED_ROOT/kernel/drv/sparcv9" ] ; then
78		CPIO_DIR="$MEDIA/$RELEASE/Tools/miniroot_extra"
79		mkdir -p "$CPIO_DIR"
80	else
81		CPIO_DIR="$MEDIA/$RELEASE/Tools/Boot"
82	fi
83
84
85	# Create the gnome archive
86	#
87	(
88		# Prepopulate the gconf database. This needs to be done and
89		# done first for several reasons. 1) Archiving out the gnome
90		# libraries and binaries causes the gconftool-2 to not run
91		# appropriately at boot time. 2) The binaries and libraries
92		# needed to run this are big and thus we want to archive
93		# them separately. 3) Having schemas prepopluated in the
94		# miniroot means faster boot times.
95		#
96
97		cd "$MINIROOT"
98		HOME="./tmp/root"
99		export HOME
100		umask 0022
101		GCONF_CONFIG_SOURCE="xml:merged:"$MINIROOT"/.tmp_proto/root/etc/gconf/gconf.xml.defaults"
102		export GCONF_CONFIG_SOURCE
103		SCHEMADIR="$MINIROOT/.tmp_proto/root/etc/gconf/schemas"
104		export SCHEMADIR
105		/usr/bin/gconftool-2 --makefile-install-rule $SCHEMADIR/*.schemas >/dev/null 2>&1
106		# usr/share gnome stuff
107		cd "$MINIROOT"
108		find usr/share/GConf usr/share/application-registry \
109		    usr/share/autostart usr/share/dbus-1 usr/share/dtds \
110		    usr/share/emacs usr/share/gnome usr/share/gnome-2.0 \
111		    usr/share/gnome-background-properties \
112		    usr/share/gtk-engines usr/share/gui-install \
113		    usr/share/icon-naming-utils usr/share/control-center \
114		    usr/share/icons usr/share/locale usr/share/metacity \
115		    usr/share/mime usr/share/mime-info usr/share/pixmaps \
116		    usr/share/scrollkeeper usr/share/sgml usr/share/themes \
117		    usr/share/xml \
118		    -print > /tmp/gnome_share.$$ 2>/dev/null
119
120		if [ ! -f /tmp/gnome_share.$$ ] ; then
121			echo "/tmp/gnome_share.$$ file list not found."
122			return
123		fi
124
125		# usr/lib gnome stuff
126
127		find usr/lib/libgnome*\.so\.* \
128		    usr/lib/libgst*\.so\.* usr/lib/libgconf*\.so\.* \
129		    usr/lib/libgdk*\.so\.* usr/lib/libgtk*\.so\.* \
130		    usr/lib/libglade*\.so\.* usr/lib/libmetacity*\.so\.* \
131		    usr/lib/libfontconfig*\.so\.* usr/lib/libgmodule*\.so\.* \
132		    usr/lib/libgobject*\.so\.* usr/lib/libgthread*\.so\.* \
133		    usr/lib/libpopt*\.so\.* usr/lib/libstartup*\.so\.* \
134		    usr/lib/libexif*\.so\.* usr/lib/libtiff*\.so\.* \
135		    usr/lib/libdbus*\.so\.* usr/lib/libstartup*\.so\.* \
136		    usr/lib/libexif*\.so\.* usr/lib/libORBit*\.so\.* \
137	 	    usr/lib/libmlib*\.so\.* usr/lib/libxsl*\.so\.* \
138		    usr/lib/libpango*\.so\.* usr/lib/libpng*\.so\.* \
139		    usr/lib/liboil*\.so\.* usr/lib/libbonobo*\.so\.* \
140		    usr/lib/libart*\.so\.* usr/lib/libcairo*\.so\.* \
141		    usr/lib/libjpeg*\.so\.* \
142		    usr/lib/libpolkit*\.so\.* \
143			-print | egrep -v '\.so\.[0]$' > \
144		       /tmp/gnome_lib.$$ 2>/dev/null
145
146		find usr/lib/nautilus usr/lib/pango usr/lib/iconv \
147		    usr/lib/metacity-dialog usr/lib/window-manager-settings \
148		    usr/lib/bonobo-2.0 usr/lib/bononbo usr/lib/gtk-2.0 \
149		    usr/lib/GConf usr/lib/bonobo-activation-server \
150		    usr/lib/python2.4 usr/lib/gstreamer-0.10 \
151		    usr/lib/gconf-sanity-check-2 usr/lib/gconfd \
152		    usr/lib/gnome-vfs-2.0 usr/lib/dbus-daemon \
153		    usr/lib/gnome-vfs-daemon usr/lib/gnome-settings-daemon \
154		    usr/lib/gnome_segv2 usr/lib/orbit-2.0 \
155		    usr/lib/libmlib \
156		    print > /tmp/gnome_libdir.$$ 2>/dev/null
157
158		if [ ! -f /tmp/gnome_lib.$$  -a ! -f gnome_libdir.$$ ] ; then
159			echo "/tmp/gnome_lib.$$ file list not found."
160			return
161		fi
162
163		# /usr/sfw gnome stuff
164		find usr/sfw/bin usr/sfw/include usr/sfw/share usr/sfw/src \
165		    -print > /tmp/gnome_sfw.$$ 2>/dev/null
166
167		if [ ! -f /tmp/gnome_sfw.$$ ] ; then
168			echo "/tmp/gnome_sfw.$$ file list not found."
169			return
170		fi
171
172		# gnome app binaries usr/bin
173		find usr/bin/gnome* usr/bin/gui-install usr/bin/bonobo* \
174		    usr/bin/gtk-* usr/bin/fax* usr/bin/gdk* usr/bin/gif2tiff \
175		    usr/bin/install-lan \
176		    usr/bin/metacity* usr/bin/gst-* usr/bin/gconftool-2 \
177		    usr/bin/pango* usr/bin/desktop* usr/bin/djpeg \
178		    usr/bin/notify-send usr/bin/oil-bugreport \
179		    usr/bin/bmp2tiff usr/bin/thembus-theme-applier \
180		    usr/bin/thumbnail usr/lib/update-* \
181		    usr/bin/ras2tiff usr/bin/raw2tiff usr/bin/rdjpgcom \
182		    usr/bin/thumbnail usr/bin/dbus* \
183		    usr/bin/tiff* usr/bin/rgb2ycbcr \
184		    usr/bin/fc-cache usr/bin/fc-list \
185			-print > /tmp/gnome_bin.$$ 2>/dev/null
186
187		if [ ! -f /tmp/gnome_bin.$$ ] ; then
188			echo "/tmp/gnome_bin.$$ file list not found."
189			return
190		fi
191
192		# Cat all the files together and create the gnome archive
193		#
194
195		cat /tmp/gnome_libdir.$$ /tmp/gnome_lib.$$ \
196		     /tmp/gnome_share.$$ /tmp/gnome_sfw.$$ /tmp/gnome_bin.$$ \
197		    > /tmp/gnome.$$
198
199		if [ ! -f /tmp/gnome.$$ ] ; then
200			echo "/tmp/gnome.$$ file not found."
201			return
202		fi
203		# Save off this file in the miniroot for use later
204		# when unpacking. Clean up old cruft if there.
205		#
206
207		if [ -f .tmp_proto/gnome_saved ]; then
208			rm -f .tmp_proto/gnome_saved
209		fi
210
211		cp /tmp/gnome.$$ .tmp_proto/gnome_saved
212
213		# Create gnome archive
214		#
215
216		cpio -ocmPuB < /tmp/gnome.$$ 2>/dev/null | bzip2 > \
217		    "$CPIO_DIR/gnome.cpio.bz2"
218
219		# Remove files from miniroot that are in archive.
220		# Create symlinks for files in archive
221
222		rm -rf `cat /tmp/gnome_share.$$`
223
224		for i in `cat /tmp/gnome_share.$$`
225		do
226			ln -s /tmp/root/$i $i 2>/dev/null
227		done
228
229		rm -rf `cat /tmp/gnome_lib.$$`
230		for i in `cat /tmp/gnome_lib.$$`
231		do
232			ln -s /tmp/root/$i $i 2>/dev/null
233		done
234
235		rm -rf `cat /tmp/gnome_libdir.$$`
236		for i in `cat /tmp/gnome_libdir.$$`
237		do
238			ln -s /tmp/root/$i $i 2>/dev/null
239		done
240
241		rm -rf `cat /tmp/gnome_sfw.$$`
242		for i in `cat /tmp/gnome_sfw.$$`
243		do
244			ln -s /tmp/root/$i $i 2>/dev/null
245		done
246
247		rm -rf `cat /tmp/gnome_bin.$$`
248		for i in `cat /tmp/gnome_bin.$$`
249		do
250			ln -s /tmp/root/$i $i 2>/dev/null
251		done
252		rm -f /tmp/gnome_share.$$
253		rm -f /tmp/gnome_lib.$$
254		rm -f /tmp/gnome_libdir.$$
255		rm -f /tmp/gnome_bin.$$
256	)
257}
258
259archive_JavaGUI()
260{
261	MEDIA="$1"
262	MINIROOT="$2"
263
264	RELEASE=`/bin/ls -d "$MEDIA/Solaris_"*`
265	RELEASE=`basename "$RELEASE"`
266
267	if [ -d "$UNPACKED_ROOT/kernel/drv/sparcv9" ] ; then
268		CPIO_DIR="$MEDIA/$RELEASE/Tools/miniroot_extra"
269		mkdir -p "$CPIO_DIR"
270	else
271		CPIO_DIR="$MEDIA/$RELEASE/Tools/Boot"
272	fi
273
274	# Archive the java wizard components that are only used in the
275	# non developer express path.
276	#
277	(
278		# path is usr/lib/install/data
279		cd "$MINIROOT"
280		find usr/lib/install/data/wizards \
281		    -print > /tmp/java_ui.$$ 2>/dev/null
282
283		if [ ! -f /tmp/java_ui.$$ ] ; then
284			echo "/tmp/java_ui.$$ file list not found."
285			return
286		fi
287
288		cpio -ocmPuB < /tmp/java_ui.$$ 2>/dev/null | bzip2 > \
289		    "$CPIO_DIR/javaui.cpio.bz2"
290
291		rm -rf `cat /tmp/java_ui.$$`
292		ln -s /tmp/root/usr/lib/install/data/wizards usr/lib/install/data/wizards 2>/dev/null
293
294		rm -f /tmp/java_ui.$$
295
296	)
297}
298
299archive_Misc()
300{
301	MEDIA="$1"
302	MINIROOT="$2"
303
304	RELEASE=`/bin/ls -d "$MEDIA/Solaris_"*`
305	RELEASE=`basename "$RELEASE"`
306
307	if [ -d "$UNPACKED_ROOT/kernel/drv/sparcv9" ] ; then
308		CPIO_DIR="$MEDIA/$RELEASE/Tools/miniroot_extra"
309		mkdir -p "$CPIO_DIR"
310	else
311		CPIO_DIR="$MEDIA/$RELEASE/Tools/Boot"
312	fi
313
314	# Archive misc stuff that is needed by non devex installer
315	#
316	(
317		# usr/lib stuff
318		cd "$MINIROOT"
319		find usr/lib/lp -print > /tmp/lp.$$ 2>/dev/null
320		if [ ! -f /tmp/lp.$$ ] ; then
321			echo "/tmp/lp.$$ file list not found."
322			return
323		fi
324
325		cpio -ocmPuB < /tmp/lp.$$ 2>/dev/null | bzip2 > \
326		    "$CPIO_DIR/lpmisc.cpio.bz2"
327
328		rm -rf `cat /tmp/lp.$$`
329		ln -s /tmp/root/usr/lib/lp usr/lib/lp 2>/dev/null
330
331		rm -f /tmp/lp.$$
332	)
333
334}
335
336archive_Perl()
337{
338	MEDIA="$1"
339	MINIROOT="$2"
340
341	RELEASE=`/bin/ls -d "$MEDIA/Solaris_"*`
342	RELEASE=`basename "$RELEASE"`
343
344	if [ -d "$UNPACKED_ROOT/kernel/drv/sparcv9" ] ; then
345		CPIO_DIR="$MEDIA/$RELEASE/Tools/miniroot_extra"
346		mkdir -p "$CPIO_DIR"
347	else
348		CPIO_DIR="$MEDIA/$RELEASE/Tools/Boot"
349	fi
350
351	# Archive perl, it is only needed by gnome gui.
352	#
353	(
354		# in usr
355		cd "$MINIROOT"
356		find usr/perl5 -print > /tmp/perl.$$ 2>/dev/null
357
358		if [ ! -f /tmp/perl.$$ ] ; then
359			echo "/tmp/perl.$$ file list not found."
360			return
361		fi
362		cpio -ocmPuB < /tmp/perl.$$ 2>/dev/null | bzip2 > \
363		    "$CPIO_DIR/perl.cpio.bz2"
364
365		rm -rf `cat /tmp/perl.$$` 2>/dev/null
366		ln -s /tmp/root/perl5 usr/perl5 2>/dev/null
367
368		rm -f /tmp/perl.$$
369	)
370}
371archive_X()
372{
373	MEDIA="$1"
374	MINIROOT="$2"
375
376	RELEASE=`/bin/ls -d "$MEDIA/Solaris_"*`
377	RELEASE=`basename "$RELEASE"`
378
379	if [ -d "$UNPACKED_ROOT/kernel/drv/sparcv9" ] ; then
380		CPIO_DIR="$MEDIA/$RELEASE/Tools/miniroot_extra"
381		mkdir -p "$CPIO_DIR"
382	else
383		CPIO_DIR="$MEDIA/$RELEASE/Tools/Boot"
384	fi
385
386	# create the graphics and non-graphics X archive
387	#
388	(
389		cd "$MINIROOT"
390		find usr/openwin usr/dt usr/X11 -print 2> /dev/null |\
391		    cpio -ocmPuB 2> /dev/null | bzip2 > "$CPIO_DIR/X.cpio.bz2"
392
393		find usr/openwin/bin/mkfontdir \
394		     usr/openwin/lib/installalias \
395		     usr/openwin/server/lib/libfont.so.1 \
396		     usr/openwin/server/lib/libtypesclr.so.0 \
397			 -print | cpio -ocmPuB 2> /dev/null | bzip2 > \
398			 "$CPIO_DIR/X_small.cpio.bz2"
399
400		rm -rf usr/dt usr/openwin usr/X11
401		ln -s /tmp/root/usr/dt usr/dt
402		ln -s /tmp/root/usr/openwin usr/openwin
403		ln -s /tmp/root/usr/X11 usr/X11
404	)
405}
406
407packmedia()
408{
409	MEDIA="$1"
410	MINIROOT="$2"
411
412	RELEASE=`/bin/ls -d "$MEDIA/Solaris_"*`
413	RELEASE=`basename "$RELEASE"`
414
415	mkdir -p "$MEDIA/$RELEASE/Tools/Boot"
416	mkdir -p "$MEDIA/boot/amd64"
417	mkdir -p "$MEDIA/boot/platform/i86pc/kernel"
418	mkdir -p "$MEDIA/boot/platform/i86pc/kernel/amd64"
419	mkdir -p "$MEDIA/boot/platform/i86xpv/kernel"
420	mkdir -p "$MEDIA/boot/platform/i86xpv/kernel/amd64"
421
422	# archive package databases to conserve memory
423	#
424	(
425		cd "$MINIROOT"
426		find tmp/root/var/sadm/install tmp/root/var/sadm/pkg -print | \
427		    cpio -ocmPuB 2> /dev/null | bzip2 > \
428		    "$MEDIA/$RELEASE/Tools/Boot/pkg_db.cpio.bz2"
429	)
430
431	rm -rf "$MINIROOT/tmp/root/var/sadm/install"
432	rm -rf "$MINIROOT/tmp/root/var/sadm/pkg"
433
434	archive_X "$MEDIA" "$MINIROOT"
435
436	# Take out the gnome and java parts of the installer from
437	# the miniroot. These are not required to boot the system
438	# and start the installers.
439
440	archive_Gnome "$MEDIA" "$MINIROOT"
441	archive_JavaGUI "$MEDIA" "$MINIROOT"
442	archive_Perl "$MEDIA" "$MINIROOT"
443	archive_Misc "$MEDIA" "$MINIROOT"
444
445	cp "$MINIROOT/platform/i86pc/multiboot" "$MEDIA/boot"
446	cp "$MINIROOT/platform/i86pc/kernel/unix" \
447	    "$MEDIA/boot/platform/i86pc/kernel/unix"
448	cp "$MINIROOT/platform/i86pc/kernel/amd64/unix" \
449	    "$MEDIA/boot/platform/i86pc/kernel/amd64/unix"
450	cp "$MINIROOT/platform/i86xpv/kernel/unix" \
451	    "$MEDIA/boot/platform/i86xpv/kernel/unix"
452	cp "$MINIROOT/platform/i86xpv/kernel/amd64/unix" \
453	    "$MEDIA/boot/platform/i86xpv/kernel/amd64/unix"
454
455	# copy the install menu to menu.lst so we have a menu
456	# on the install media
457	#
458	if [ -f "${MINIROOT}/boot/grub/install_menu" ] ; then
459		cp ${MINIROOT}/boot/grub/install_menu \
460		    ${MEDIA}/boot/grub/menu.lst
461	fi
462
463	(
464		cd "$MEDIA/$RELEASE/Tools/Boot"
465		ln -sf ../../../boot/x86.miniroot
466		ln -sf ../../../boot/platform/i86pc/kernel/unix
467		ln -sf ../../../boot/platform/i86pc/kernel/amd64/unix
468		ln -sf ../../../boot/platform/i86xpv/kernel/unix
469		ln -sf ../../../boot/platform/i86xpv/kernel/amd64/unix
470		ln -sf ../../../boot/multiboot
471		ln -sf ../../../boot/grub/pxegrub
472	)
473}
474
475unarchive_X()
476{
477	MEDIA="$1"
478	UNPACKED_ROOT="$2"
479
480	RELEASE=`/bin/ls -d "$MEDIA/Solaris_"*`
481	RELEASE=`basename "$RELEASE"`
482
483	if [ -d "$UNPACKED_ROOT/kernel/drv/sparcv9" ] ; then
484		CPIO_DIR="$MEDIA/$RELEASE/Tools/miniroot_extra"
485	else
486		CPIO_DIR="$MEDIA/$RELEASE/Tools/Boot"
487	fi
488
489	# unpack X
490	#
491	(
492		cd "$UNPACKED_ROOT"
493		rm -rf usr/dt usr/openwin usr/X11
494		bzcat "$CPIO_DIR/X.cpio.bz2" | cpio -icdmu 2> /dev/null
495	)
496}
497
498unpackmedia()
499{
500	MEDIA="$1"
501	UNPACKED_ROOT="$2"
502
503	RELEASE=`/bin/ls -d "$MEDIA/Solaris_"*`
504	RELEASE=`basename "$RELEASE"`
505
506	unarchive_X "$MEDIA" "$UNPACKED_ROOT"
507
508	# unpack package databases
509	#
510	(
511		cd "$UNPACKED_ROOT"
512		bzcat "$MEDIA/$RELEASE/Tools/Boot/pkg_db.cpio.bz2" |
513		    cpio -icdmu 2> /dev/null
514
515		# unpack gnome, perl, java and misc
516		# Remove symlinks left from unpacking x86.miniroot so that
517		# unpacking subsequent archives will populate appropriately.
518		#
519		rm -rf usr/perl5
520		rm -rf usr/lib/install/data/wizards
521		rm -rf usr/lib/lp
522
523		# Gnome list saved off from packmedia
524		for i in `cat .tmp_proto/gnome_saved`
525		do
526			rm -rf $i
527		done
528
529		bzcat "$MEDIA/$RELEASE/Tools/Boot/gnome.cpio.bz2" |
530		    cpio -icdmu 2>/dev/null
531		bzcat "$MEDIA/$RELEASE/Tools/Boot/javaui.cpio.bz2" |
532		    cpio -icdmu 2>/dev/null
533		bzcat "$MEDIA/$RELEASE/Tools/Boot/lpmisc.cpio.bz2" |
534		    cpio -icdmu 2>/dev/null
535		bzcat "$MEDIA/$RELEASE/Tools/Boot/perl.cpio.bz2" |
536		    cpio -icdmu 2>/dev/null
537	)
538}
539
540do_unpack()
541{
542	rm -rf "$UNPACKED_ROOT"
543	mkdir -p "$UNPACKED_ROOT"
544	(
545		cd $MNT
546		find . -print | cpio -pdum "$UNPACKED_ROOT" 2> /dev/null
547	)
548	umount $MNT
549}
550
551unpack()
552{
553
554	if [ ! -f "$MR" ] ; then
555		usage
556		exit 1
557	fi
558
559	gzcat "$MR" > $TMR
560
561	LOFIDEV=`/usr/sbin/lofiadm -a $TMR`
562	if [ $? != 0 ] ; then
563		echo lofi plumb failed
564		exit 2
565	fi
566
567	mkdir -p $MNT
568
569	FSTYP=`fstyp $LOFIDEV`
570
571	if [ "$FSTYP" = ufs ] ; then
572		/usr/sbin/mount -o ro,nologging $LOFIDEV $MNT
573		do_unpack
574	elif [ "$FSTYP" = hsfs ] ; then
575		/usr/sbin/mount -F hsfs -o ro $LOFIDEV $MNT
576		do_unpack
577	else
578		printf "invalid root archive\n"
579	fi
580
581	rmdir $MNT
582	lofiadm -d $TMR ; LOFIDEV=
583	rm $TMR
584}
585
586pack()
587{
588	if [ ! -d "$UNPACKED_ROOT" -o -z "$MR" ] ; then
589		usage
590		exit 1
591	fi
592
593	# Estimate image size and add %10 overhead for ufs stuff.
594	# Note, we can't use du here in case $UNPACKED_ROOT is on a filesystem,
595	# e.g. zfs, in which the disk usage is less than the sum of the file
596	# sizes.  The nawk code
597	#
598	#	{t += ($7 % 1024) ? (int($7 / 1024) + 1) * 1024 : $7}
599	#
600	# below rounds up the size of a file/directory, in bytes, to the
601	# next multiple of 1024.  This mimics the behavior of ufs especially
602	# with directories.  This results in a total size that's slightly
603	# bigger than if du was called on a ufs directory.
604	size=$(find "$UNPACKED_ROOT" -ls | nawk '
605	    {t += ($7 % 1024) ? (int($7 / 1024) + 1) * 1024 : $7}
606	    END {print int(t * 1.10 / 1024)}')
607
608	/usr/sbin/mkfile ${size}k "$TMR"
609
610	LOFIDEV=`/usr/sbin/lofiadm -a "$TMR"`
611	if [ $? != 0 ] ; then
612		echo lofi plumb failed
613		exit 2
614	fi
615
616	RLOFIDEV=`echo $LOFIDEV | sed s/lofi/rlofi/`
617	newfs $RLOFIDEV < /dev/null 2> /dev/null
618	mkdir -p $MNT
619	mount -o nologging $LOFIDEV $MNT
620	rmdir $MNT/lost+found
621	(
622		cd "$UNPACKED_ROOT"
623		find . -print | cpio -pdum $MNT 2> /dev/null
624	)
625	lockfs -f $MNT
626	umount $MNT
627	rmdir $MNT
628	lofiadm -d $LOFIDEV
629	LOFIDEV=
630
631	rm -f "$TMR.gz"
632	gzip -f "$TMR"
633	mv "$TMR.gz" "$MR"
634	chmod a+r "$MR"
635}
636
637# main
638#
639
640EXTRA_SPACE=0
641STRIP_AMD64=
642
643while getopts s:6 opt ; do
644	case $opt in
645	s)	EXTRA_SPACE="$OPTARG"
646		;;
647	6)	STRIP_AMD64=false
648		;;
649	*)	usage
650		exit 1
651		;;
652	esac
653done
654shift `expr $OPTIND - 1`
655
656if [ $# != 3 ] ; then
657	usage
658	exit 1
659fi
660
661UNPACKED_ROOT="$3"
662BASE="`pwd`"
663MNT=/tmp/mnt$$
664TMR=/tmp/mr$$
665LOFIDEV=
666MR="$2"
667
668if [ "`dirname $MR`" = . ] ; then
669	MR="$BASE/$MR"
670fi
671if [ "`dirname $UNPACKED_ROOT`" = . ] ; then
672	UNPACKED_ROOT="$BASE/$UNPACKED_ROOT"
673fi
674
675trap cleanup EXIT
676
677case $1 in
678	packmedia)
679		MEDIA="$MR"
680		MR="$MEDIA/boot/x86.miniroot"
681
682		if [ -d "$UNPACKED_ROOT/kernel/drv/sparcv9" ] ; then
683			archive_X "$MEDIA" "$UNPACKED_ROOT"
684		else
685			packmedia "$MEDIA" "$UNPACKED_ROOT"
686
687			# create the 64-bit miniroot
688			# if the -6 option was passed, don't strip
689			# the 64-bit modules from the 32-bit miniroot
690			MR="$MEDIA/boot/amd64/x86.miniroot"
691			pack
692
693			if [ "$STRIP_AMD64" = false ] ; then
694				ln $MR $MEDIA/boot/x86.miniroot
695			else
696				# create the 32-bit miniroot
697				MR="$MEDIA/boot/x86.miniroot"
698				find "$UNPACKED_ROOT" -name amd64 \
699				    -type directory | xargs rm -rf
700				pack
701			fi
702		fi ;;
703	unpackmedia)
704		MEDIA="$MR"
705		MR="$MR/boot/x86.miniroot"
706
707		if [ -d "$UNPACKED_ROOT/kernel/drv/sparcv9" ] ; then
708			unarchive_X "$MEDIA" "$UNPACKED_ROOT"
709		else
710			unpack
711			unpackmedia "$MEDIA" "$UNPACKED_ROOT"
712		fi ;;
713	pack)	pack ;;
714	unpack)	unpack ;;
715	*)	usage ;;
716esac
717