#!/bin/ksh # # 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 2007 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # # ident "%Z%%M% %I% %E% SMI" # # Upgrade a machine from a cpio archive area in about 5 minutes. # By Roger Faulkner and Jeff Bonwick, April 1993. # (bfu == Bonwick/Faulkner Upgrade, a.k.a. Blindingly Fast Upgrade) # # Usage: bfu [-f] [root-dir] # for normal machines # bfu -c [-f] # for diskless clients # # The -f flag is to override the built-in safety check which requires # that the starting-point OS be a least a certain revision. # # You have to be super-user. It's safest to run this from the # system console, although I've run it under OW and even via # remote login with no problems. # # You will have to reboot the system when the upgrade is complete. # # You should add any administrative files you care about to this list. # Warning: there had better be no leading '/' on any of these filenames. # # The CDPATH variable causes ksh's `cd' builtin to emit messages to stdout # under certain circumstances, which can really screw things up; unset it. # unset CDPATH export LC_ALL="C" if [ -z "$GATEPATH" ]; then GATEPATH=/ws/onnv-gate test -d $GATEPATH || GATEPATH=/net/onnv.eng/export/gate fi if [ -z "$ARCHIVEPATH" ]; then ARCHIVEPATH=/ws/onnv-gate test -d $ARCHIVEPATH || ARCHIVEPATH=/net/onnv.eng/export fi export GATE=${GATEPATH} export ARCHIVE=${ARCHIVEPATH} # # NOTE: Entries in *_files must expand to either the exact files required, # or to directories that will be scoured for files. Any directories # (and subdirectories) resulting from a wildcard expansion will be # fully recursed by BFU's searching for files. (E.g. /etc/inet/* will # include all files in any of its directories, as well as any files in # /etc/inet/ itself. # # These lists should really be generated automatically from the # pkgmap(4) metadata. # # # First list: files to be saved in global and non-global zones. # all_zones_files=" etc/.login etc/acct/holidays etc/acctadm.conf etc/auto_* etc/cron.d/at.deny etc/cron.d/cron.deny etc/crypto/pkcs11.conf etc/default/* etc/dfs/dfstab etc/dumpdates etc/ftpd/* etc/ftpusers etc/group etc/gss/gsscred.conf etc/gss/mech etc/gss/qop etc/inet/* etc/init.d/* etc/inittab etc/ipf/ipf.conf etc/iu.ap etc/krb5/kadm5.acl etc/krb5/kdc.conf etc/krb5/kpropd.acl etc/krb5/krb5.conf etc/krb5/warn.conf etc/logadm.conf etc/logindevperm etc/lp/Systems etc/mail/*.cf etc/mail/*.hf etc/mail/*.rc etc/mail/aliases etc/mail/helpfile etc/mail/local-host-names etc/mail/trusted-users etc/named.conf etc/net/*/services etc/netconfig etc/nfs/nfslog.conf etc/nfssec.conf etc/nscd.conf etc/nsswitch.* etc/pam.conf etc/passwd etc/policy.conf etc/printers.conf etc/profile etc/project etc/publickey etc/remote etc/resolv.conf etc/rmmount.conf etc/rpc etc/rpld.conf etc/saf/_sactab etc/saf/_sysconfig etc/saf/zsmon/_pmtab etc/security/audit_class etc/security/audit_control etc/security/audit_event etc/security/audit_startup etc/security/audit_user etc/security/audit_warn etc/security/auth_attr etc/security/crypt.conf etc/security/exec_attr etc/security/policy.conf etc/security/prof_attr etc/sfw/openssl/openssl.cnf etc/shadow etc/skel/.profile etc/skel/local.* etc/smartcard/.keys etc/smartcard/desktop.properties etc/smartcard/ocf.classpath etc/smartcard/opencard.properties etc/ssh/ssh_config etc/ssh/sshd_config etc/syslog.conf etc/ttydefs etc/ttysrch etc/user_attr etc/uucp/[A-Z]* etc/vfstab var/spool/cron/crontabs/* var/yp/Makefile var/yp/aliases var/yp/nicknames " # # Second list: files to be saved in the global zone only. # global_zone_only_files=" boot/grub/menu.lst boot/solaris/bootenv.rc boot/solaris/devicedb/master boot/solaris/filelist.ramdisk etc/aggregation.conf etc/dladm/* etc/bootrc etc/crypto/kcf.conf etc/datalink.conf etc/devlink.tab etc/driver_aliases etc/driver_classes etc/lvm/devpath etc/lvm/lock etc/lvm/md.cf etc/lvm/md.ctlrmap etc/lvm/md.tab etc/lvm/mddb.cf etc/lvm/runtime.cf etc/mach etc/minor_perm etc/name_to_major etc/name_to_sysnum etc/nca/nca.if etc/nca/ncakmod.conf etc/nca/ncalogd.conf etc/nca/ncaport.conf etc/openwin/server/etc/OWconfig etc/path_to_inst etc/power.conf etc/ppp/chap-secrets etc/ppp/options etc/ppp/pap-secrets etc/security/device_policy etc/security/extra_privs etc/system etc/zones/index kernel/drv/elxl.conf kernel/drv/md.conf kernel/drv/options.conf kernel/drv/ra.conf kernel/drv/scsa2usb.conf kernel/drv/scsi_vhci.conf kernel/drv/sd.conf kernel/drv/mpt.conf platform/*/kernel/drv/*ppm.conf platform/i86pc/kernel/drv/aha.conf platform/i86pc/kernel/drv/asy.conf platform/sun4u/boot.conf " # # Third list: files extracted from generic.root but which belong in the global # zone only: they are superfluous (and some even harmful) in nonglobal zones. # # (note: as /etc/init.d scripts are converted to smf(5) "Greenline" services, # they (and their /etc/rc?.d hardlinks) should be removed from this list when # they are added to smf_obsolete_rc_files, below) # superfluous_nonglobal_zone_files=" dev/dsk dev/fd dev/pts dev/rdsk dev/rmt dev/stderr dev/stdin dev/stdout dev/swap dev/term devices etc/dacf.conf etc/dat etc/default/metassist.xml etc/default/power etc/flash/postdeployment/svm.cleanup etc/flash/predeployment/svm.save etc/inet/ipqosconf.1.sample etc/inet/ipqosconf.2.sample etc/inet/ipqosconf.3.sample etc/inet/sock2path etc/init.d/devlinks etc/init.d/dodatadm.udaplt etc/init.d/drvconfig etc/init.d/llc2 etc/init.d/ncakmod etc/init.d/ncalogd etc/init.d/pcmcia etc/init.d/pppd etc/init.d/wrsmcfg etc/llc2 etc/lvm etc/nca etc/openwin etc/ppp etc/rc0.d/K34ncalogd etc/rc0.d/K50pppd etc/rc0.d/K52llc2 etc/rc1.d/K34ncalogd etc/rc1.d/K50pppd etc/rc1.d/K52llc2 etc/rc2.d/S40llc2 etc/rc2.d/S42ncakmod etc/rc2.d/S47pppd etc/rc2.d/S81dodatadm.udaplt etc/rc2.d/S94ncalogd etc/rcS.d/K34ncalogd etc/rcS.d/K44wrsmcfg etc/rcS.d/K50pppd etc/rcS.d/K52llc2 etc/rcS.d/S29wrsmcfg etc/rcm etc/sock2path etc/usb etc/wrsm etc/zones kernel lib/libmeta.so lib/libmeta.so.1 lib/svc/method/sf880dr lib/svc/method/svc-cvcd lib/svc/method/svc-dcs lib/svc/method/svc-drd lib/svc/method/svc-dscp lib/svc/method/svc-dumpadm lib/svc/method/svc-intrd lib/svc/method/svc-hal lib/svc/method/svc-mdmonitor lib/svc/method/svc-metainit lib/svc/method/svc-metasync lib/svc/method/svc-oplhpd lib/svc/method/svc-poold lib/svc/method/svc-pools lib/svc/method/svc-power lib/svc/method/svc-resource-mgmt lib/svc/method/svc-rmvolmgr lib/svc/method/svc-scheduler lib/svc/method/svc-sckmd lib/svc/method/svc-syseventd lib/svc/method/svc-vntsd lib/svc/method/svc-zones platform/*/kernel platform/SUNW,Sun-Fire-15000/lib/cvcd platform/SUNW,Ultra-Enterprise-10000/lib/cvcd platform/i86pc/biosint platform/i86pc/multiboot platform/sun4u/cprboot platform/sun4u/lib/libwrsmconf.so platform/sun4u/lib/libwrsmconf.so.1 platform/sun4u/lib/sparcv9/libwrsmconf.so platform/sun4u/lib/sparcv9/libwrsmconf.so.1 platform/sun4u/sbin platform/sun4u/ufsboot platform/sun4u/wanboot platform/sun4v/ufsboot platform/sun4v/wanboot sbin/metadb sbin/metadevadm sbin/metainit sbin/metarecover sbin/metastat usr/include/sys/dcam usr/lib/devfsadm/linkmod/SUNW_dcam1394_link.so usr/lib/ldoms usr/platform/SUNW,SPARC-Enterprise/lib/dscp.ppp.options usr/platform/SUNW,SPARC-Enterprise/lib/libdscp.so usr/platform/SUNW,SPARC-Enterprise/lib/libdscp.so.1 usr/platform/SUNW,SPARC-Enterprise/lib/llib-ldscp.ln usr/platform/SUNW,SPARC-Enterprise/sbin/prtdscp var/adm/pool var/log/pool var/svc/manifest/network/rpc/mdcomm.xml var/svc/manifest/network/rpc/meta.xml var/svc/manifest/network/rpc/metamed.xml var/svc/manifest/network/rpc/metamh.xml var/svc/manifest/platform/i86pc/eeprom.xml var/svc/manifest/platform/sun4u/dcs.xml var/svc/manifest/platform/sun4u/dscp.xml var/svc/manifest/platform/sun4u/efdaemon.xml var/svc/manifest/platform/sun4u/oplhpd.xml var/svc/manifest/platform/sun4u/sckmd.xml var/svc/manifest/platform/sun4u/sf880drd.xml var/svc/manifest/platform/sun4v var/svc/manifest/system/cvc.xml var/svc/manifest/system/dumpadm.xml var/svc/manifest/system/fmd.xml var/svc/manifest/system/hal.xml var/svc/manifest/system/intrd.xml var/svc/manifest/system/mdmonitor.xml var/svc/manifest/system/metainit.xml var/svc/manifest/system/metasync.xml var/svc/manifest/system/picl.xml var/svc/manifest/system/poold.xml var/svc/manifest/system/pools.xml var/svc/manifest/system/power.xml var/svc/manifest/system/resource-mgmt.xml var/svc/manifest/system/scheduler.xml var/svc/manifest/system/sysevent.xml var/svc/manifest/system/zones.xml var/svc/manifest/system/filesystem/rmvolmgr.xml " # # Fourth list: files to be preserved, ie unconditionally restored to # "child" versions # preserve_files=" kernel/misc/amd64/sysinit kernel/misc/amd64/usbs49_fw kernel/misc/sparcv9/usbs49_fw kernel/misc/sysinit kernel/misc/usbs49_fw var/adm/aculog var/adm/spellhist var/adm/utmpx var/adm/wtmpx var/log/authlog var/log/syslog var/saf/zsmon/log " realmode_files=" boot/solaris/bootenv.rc boot/solaris/devicedb/master " fail() { print "$*" >& 2 print "bfu aborting" >& 2 rm -f "$bfu_zone_list" exit 1 } filelist() { files="$all_zones_files $preserve_files" if [ $1 = "global" ]; then files="$global_zone_only_files $files" fi find $files -depth -type f ! -name core -print 2>/dev/null | sort -u || { # # Force cpio to return non-zero by printing an error message # to stdout that it won't be able to lstat(). # echo 'filelist: sort failed' fail "sort failed" } } realmode_filelist() { find $realmode_files -depth -type f ! -name core -print 2>/dev/null | sort } smf_inetd_conversions=" 100134 100150 100155 100229 100230 100234 100242 100422 chargen comsat daytime discard echo eklogin exec finger ftp gssd klogin krb5_prop kshell ktkt_warnd login metad metamedd metamhd name ocfserv printer rexd rquotad rstatd rusersd shell smserverd sprayd sun-dr talk telnet time uucp walld " enable_next_boot () { if [ -x /tmp/bfubin/svccfg ]; then svcadm disable -t $1 [ $? = 0 ] || echo "warning: unable to temporarily disable $1" svccfg -s $1 setprop general/enabled = true [ $? = 0 ] || echo "warning: unable to enable $1 for next boot" fi } smf_inetd_disable() { inetconf=$rootprefix/etc/inet/inetd.conf inettmp=/tmp/inetd.tmp.$$ sed "$(for i in $smf_inetd_conversions; do echo "s:^[ ]*$i[ /]:#SMFbfu# &:" done)" $inetconf > $inettmp && ! cmp -s $inettmp $inetconf && cp $inettmp $inetconf rm -f -- $inettmp } smf_inetd_reenable() { inetconf=$rootprefix/etc/inet/inetd.conf inettmp=/tmp/inetd.tmp.$$ sed 's/^#SMFbfu# //' $inetconf > $inettmp && cp $inettmp $inetconf rm -f -- $inettmp } smf_tftp_reinstall() { inetconf=$rootprefix/etc/inet/inetd.conf inettmp=/tmp/inetd.tmp.$$ if grep '^#SMFbfu# tftp' $inetconf >/dev/null ; then # BFU previously commented out, put it back in place sed 's/^#SMFbfu# tftp/tftp/' $inetconf > $inettmp && cp $inettmp $inetconf elif ! grep '^[# ]*tftp' $inetconf >/dev/null; then # No entry, append to end cat >>$inetconf < /dev/null ; then # Grab existing rpc entries for rpc.metad # and convert spaces to tabs within the rpc entry, as well as # the transport method; # or add a new entry in case there was none. if grep "^[# ]*100229/1" $inetconf > /dev/null ; then grep "^# METAD - SLVM metadb" $inetconf > $inettmp grep "^[# ]*100229/1" $inetconf | \ sed -e 's/[ ][ ]*/ /g' \ -e 's?100229/1?100229/1-2?' >> $inettmp else echo '# METAD - SVM metadb Daemon' > $inettmp echo "100229/1-2\ttli\trpc/tcp\twait\troot\t/usr/sbin/rpc.metad\trpc.metad" >> $inettmp fi grep -v '^# METAD - SLVM metadb' $inetconf | \ grep -v '^[# ]*100229/1' > $inetnew cat $inettmp >> $inetnew if ! diff $inetnew $inetconf > /dev/null ; then print "Updating inet.conf metad entry ... \c" if cp $inetnew $inetconf ; then print "done." else print "failed." fi fi rm -f $inettmp $inetnew fi # # only change inetd.conf if the rpc.mdcommd entry is out of date # if ! grep "^[# ]*100422/1" $inetconf > /dev/null ; then # Grab existing rpc entries for rpc.mdcommd # and convert spaces to tabs within the rpc entry, # or add a new entry in case there was none. if grep "^[# ]*100422/1" $inetconf > /dev/null ; then grep "^# MDMN_COMMD - SVM Multi node" $inetconf > $inettmp grep "^[# ]*100422/1" $inetconf | \ sed -e 's/[ ][ ]*/ /g' >> $inettmp else echo '# MDMN_COMMD - SVM Multi node communication daemon' >$inettmp echo '100422/1\ttli\trpc/tcp\twait\troot\t/usr/sbin/rpc.mdcommd\trpc.mdcommd' >> $inettmp fi grep -v '^# MDMN_COMMD - SVM Multi node' $inetconf | \ grep -v '^[# ]*100422/1' > $inetnew cat $inettmp >> $inetnew if ! diff $inetnew $inetconf > /dev/null ; then print "Updating inetd.conf rpc.mdcommd entry ... \c" if cp $inetnew $inetconf; then print "done." else print "failed." fi fi rm -f $inettmp $inetnew fi } # update x86 version mpt.conf for property tape mpttapeprop='[ ]*tape[ ]*=[ ]*"sctp"[ ]*;' update_mptconf_i386() { conffile=$rootprefix/kernel/drv/mpt.conf test -f $conffile || return egrep -s "$mpttapeprop" $conffile if [ $? -ne 0 ] ; then echo 'tape="sctp";' >> $conffile fi } update_policy_conf() { # update /etc/security/policy.conf with the default # Solaris crypt(3c) policy. dest=$rootprefix/etc/security/policy.conf grep 'CRYPT_' $dest > /dev/null 2>&1 if [ $? = 1 ] ; then print "Updating entries for crypt(3c), see policy.conf(4)" cat >> $dest </dev/null 2>&1 if [ $? = 1 ]; then echo "Updating entries for privileges(5)," \ "see policy.conf(4) for details." cat >> $dest < ${inetdconf} 2>&1 sed -e "/^#[# ]*NFSv4/d" \ -e "/^[# ]*100166\/1/d" \ ${tmpinetcf} > ${inetdconf} 2>&1 rm -f ${tmpinetcf} tmpservices=/tmp/services.$$ services=$rootprefix/etc/net/ticotsord/services cp -pf ${services} ${tmpservices} cat /dev/null > ${services} 2>&1 sed -e "/^[# ]*nfsmapid/d" \ ${tmpservices} > ${services} 2>&1 rm -f ${tmpservices} services=$rootprefix/etc/net/ticots/services cp -pf ${services} ${tmpservices} cat /dev/null > ${services} 2>&1 sed -e "/^[# ]*nfsmapid/d" \ ${tmpservices} > ${services} 2>&1 rm -f ${tmpservices} services=$rootprefix/etc/net/ticlts/services cp -pf ${services} ${tmpservices} cat /dev/null > ${services} 2>&1 sed -e "/^[# ]*nfsmapid/d" \ ${tmpservices} > ${services} 2>&1 rm -f ${tmpservices} } # # Define global variables # CALL_DEVID_DESTROY="" # # List of SDS commands that must be deleted. # SDSCMDLIST=" growfs metaclear metadb metadetach metahs metainit metaoffline metaonline metaparam metarename metareplace metaroot metaset metastat metasync metattach rpc.metad rpc.metamhd " # # List of SDS configuration files that must be deleted. # SDSCONFIGLIST=" lock md.cf mddb.cf md.tab devpath md.ctlrmap " # # List of rc scripts that must be deleted. # RCLIST=" etc/init.d/SUNWmd.init etc/init.d/SUNWmd.sync etc/init.d/lvm.init etc/init.d/lvm.sync etc/rcS.d/S35SUNWmd.init etc/rcS.d/S35lvm.init etc/rc2.d/S95SUNWmd.sync etc/rc2.d/S95lvm.sync etc/rcS.d/S35slvm.init etc/rc2.d/S95slvm.sync etc/init.d/slvm.init etc/init.d/slvm.sync etc/init.d/init.mdlogd etc/rc3.d/S25mdlogd " # # List of flashprom-related files that must be deleted. # FLASHPROMLIST=" etc/rc2.d/S75flashprom etc/init.d/flashprom usr/platform/SUNW,Ultra-2/lib/flash-update.sh usr/platform/SUNW,Ultra-4/lib/flash-update.sh usr/platform/SUNW,Ultra-Enterprise/lib/flash-update.sh usr/platform/sun4u/doc/flashupdate.txt usr/platform/sun4u/lib/flash-update.sh usr/platform/sun4u/lib/prom/SUNW,Ultra-2 usr/platform/sun4u/lib/prom/SUNW,Ultra-4 usr/platform/sun4u/lib/prom/SUNW,Ultra-Enterprise " # # delete the entries associated with bootlist from /etc/system # delete_system_bootlist() { sed -e /"Begin MDD database info"/,/"End MDD database info"/d \ < ${SYSTEM_FILE} > /tmp/system.$$ cp /tmp/system.$$ ${SYSTEM_FILE} || \ echo "copy error: /tmp/system.$$ to ${SYSTEM_FILE}" } # # Add entries in md.conf for bootlist # fix_mdconf() { cp ${mdconf} /tmp/md.conf.$$ echo >> /tmp/md.conf.$$ echo "# Begin MDD database info (do not edit)" >> /tmp/md.conf.$$ sed -e 's/^set md://' -e 's/$/;/' ${SYSTEM_FILE} | \ grep mddb_bootlist >> /tmp/md.conf.$$ echo "# End MDD database info (do not edit)" >> /tmp/md.conf.$$ cp /tmp/md.conf.$$ ${mdconf} || \ echo "copy error: /tmp/md.conf.$$ to ${mdconf}" } # # add_devid_destroy(filename) # returns contents in filename # md_devid_destroy property is required when upgrading # from pre SVM to SVM releases or when the device ID returned from # the driver changes. # It is specifically placed between # # Begin MDD database info and # End MDD database info because # on the subsequent reboot, this line will be removed automatically when # metadevadm is run in rc2.d. # add_devid_destroy() { cat $1 | awk '{ if ( $2 == "End" && $4 == "database") { print "md_devid_destroy=1;" } print $0 }' >> /tmp/t$$ mv /tmp/t$$ $1 } # # Reads existing configuration values in /etc/rcap.conf and puts # them in repository upon reboot(via /var/svc/profile/upgrade). # migrate_rcap_conf() { RCAP_CONF="${rootprefix}/etc/rcap.conf" PROFILE_UPGRADE="${rootprefix}/var/svc/profile/upgrade" SVCCFG="/usr/sbin/svccfg" RCAP_FMRI="svc:/system/rcap:default" PG="config" pressure=`awk '$1 == "RCAPD_MEMORY_CAP_ENFORCEMENT_PRESSURE" \ && NF == 3 {print $3}' $RCAP_CONF` reconfig_int=`awk '$1 == "RCAPD_RECONFIGURATION_INTERVAL" \ && NF == 3 {print $3}' $RCAP_CONF` walk_int=`awk '$1 == "RCAPD_PROC_WALK_INTERVAL" && \ NF == 3 {print $3}' $RCAP_CONF` report_int=`awk '$1 == "RCAPD_REPORT_INTERVAL" && \ NF == 3 {print $3}' $RCAP_CONF` rss_sample_int=`awk '$1 == "RCAPD_RSS_SAMPLE_INTERVAL" && \ NF == 3 {print $3}' $RCAP_CONF` # Blindly update default configuration values with # pre-existing values # echo "# Migrating pre-existing rcap configuration" >> \ $PROFILE_UPGRADE echo "$SVCCFG -s $RCAP_FMRI setprop ${PG}/pressure = " \ "$pressure" >> $PROFILE_UPGRADE echo "$SVCCFG -s $RCAP_FMRI " \ "setprop ${PG}/reconfig_interval = $reconfig_int" >> \ $PROFILE_UPGRADE echo "$SVCCFG -s $RCAP_FMRI " \ "setprop ${PG}/walk_interval = $walk_int" >> \ $PROFILE_UPGRADE echo "$SVCCFG -s $RCAP_FMRI " \ "setprop ${PG}/report_interval = $report_int" >> \ $PROFILE_UPGRADE echo "$SVCCFG -s $RCAP_FMRI " \ "setprop ${PG}/rss_sample_interval = $rss_sample_int" >> \ $PROFILE_UPGRADE echo "/usr/sbin/svcadm refresh $RCAP_FMRI" >> \ $PROFILE_UPGRADE echo "rm /etc/rcap.conf" >> \ $PROFILE_UPGRADE } # # smf(5) "Greenline" doesn't install the init.d or rc*.d scripts for # converted services. Clean up previous scripts for such services. # smf_obsolete_rc_files=" etc/init.d/ANNOUNCE etc/init.d/MOUNTFSYS etc/init.d/RMTMPFILES etc/init.d/audit etc/init.d/autofs etc/init.d/coreadm etc/init.d/cron etc/init.d/cryptosvc etc/init.d/cvc etc/init.d/devfsadm etc/init.d/dhcp etc/init.d/dhcpagent etc/init.d/domainname etc/init.d/efcode etc/init.d/inetd etc/init.d/inetinit etc/init.d/inetsvc etc/init.d/initboot etc/init.d/ipfboot etc/init.d/kdc etc/init.d/kdc.master etc/init.d/keymap etc/init.d/ldap.client etc/init.d/libc.mount etc/init.d/network etc/init.d/nfs.client etc/init.d/nodename etc/init.d/nscd etc/init.d/perf etc/init.d/picld etc/init.d/power etc/init.d/rcapd etc/init.d/rootusr etc/init.d/rpc etc/init.d/savecore etc/init.d/sckm etc/init.d/sf880dr etc/init.d/slpd etc/init.d/sshd etc/init.d/standardmounts etc/init.d/svm.init etc/init.d/svm.sync etc/init.d/sysid.net etc/init.d/sysid.sys etc/init.d/syslog etc/init.d/utmpd etc/init.d/volmgt etc/init.d/xntpd etc/init.d/zones etc/rc0.d/K00ANNOUNCE etc/rc0.d/K01zones etc/rc0.d/K03sshd etc/rc0.d/K05volmgt etc/rc0.d/K07snmpdx etc/rc0.d/K10rcapd etc/rc0.d/K21dhcp etc/rc0.d/K28kdc etc/rc0.d/K28kdc.master etc/rc0.d/K28nfs.server etc/rc0.d/K32cryptosvc etc/rc0.d/K33audit etc/rc0.d/K33efcode etc/rc0.d/K34svm.sync etc/rc0.d/K36sendmail etc/rc0.d/K36utmpd etc/rc0.d/K37power etc/rc0.d/K40cron etc/rc0.d/K40inetd etc/rc0.d/K40nscd etc/rc0.d/K40sf880dr etc/rc0.d/K40slpd etc/rc0.d/K40syslog etc/rc0.d/K40xntpd etc/rc0.d/K41autofs etc/rc0.d/K41ldap.client etc/rc0.d/K41nfs.client etc/rc0.d/K41rpc etc/rc0.d/K42sckm etc/rc0.d/K43inet etc/rc0.d/K68picld etc/rc0.d/K83devfsadm etc/rc0.d/K90dhcpagent etc/rc1.d/K00ANNOUNCE etc/rc1.d/K01zones etc/rc1.d/K03sshd etc/rc1.d/K05volmgt etc/rc1.d/K07snmpdx etc/rc1.d/K10rcapd etc/rc1.d/K21dhcp etc/rc1.d/K28kdc etc/rc1.d/K28kdc.master etc/rc1.d/K28nfs.server etc/rc1.d/K33audit etc/rc1.d/K33efcode etc/rc1.d/K34svm.sync etc/rc1.d/K36sendmail etc/rc1.d/K36utmpd etc/rc1.d/K37power etc/rc1.d/K40cron etc/rc1.d/K40inetd etc/rc1.d/K40nscd etc/rc1.d/K40sf880dr etc/rc1.d/K40slpd etc/rc1.d/K40syslog etc/rc1.d/K40xntpd etc/rc1.d/K41autofs etc/rc1.d/K41ldap.client etc/rc1.d/K41rpc etc/rc1.d/K42sckm etc/rc1.d/K43inet etc/rc1.d/K99libc.mount etc/rc1.d/S01MOUNTFSYS etc/rc2.d/K01zones etc/rc2.d/K03sshd etc/rc2.d/K05volmgt etc/rc2.d/K07snmpdx etc/rc2.d/K21dhcp etc/rc2.d/K28kdc etc/rc2.d/K28kdc.master etc/rc2.d/K28nfs.server etc/rc2.d/S01MOUNTFSYS etc/rc2.d/S05RMTMPFILES etc/rc2.d/S21perf etc/rc2.d/S30sysid.net etc/rc2.d/S65ipfboot etc/rc2.d/S69domainname etc/rc2.d/S69inet etc/rc2.d/S70sckm etc/rc2.d/S71ldap.client etc/rc2.d/S71rpc etc/rc2.d/S71sysid.sys etc/rc2.d/S72inetsvc etc/rc2.d/S72slpd etc/rc2.d/S73nfs.client etc/rc2.d/S74autofs etc/rc2.d/S74syslog etc/rc2.d/S74xntpd etc/rc2.d/S75cron etc/rc2.d/S75savecore etc/rc2.d/S76nscd etc/rc2.d/S77inetd etc/rc2.d/S77sf880dr etc/rc2.d/S85power etc/rc2.d/S88sendmail etc/rc2.d/S88utmpd etc/rc2.d/S95svm.sync etc/rc2.d/S98efcode etc/rc2.d/S98libc.mount etc/rc2.d/S99audit etc/rc2.d/S99rcapd etc/rc3.d/S13kdc.master etc/rc3.d/S14kdc etc/rc3.d/S15nfs.server etc/rc3.d/S34dhcp etc/rc3.d/S76snmpdx etc/rc3.d/S81volmgt etc/rc3.d/S89sshd etc/rc3.d/S99zones etc/rcS.d/K01zones etc/rcS.d/K03sshd etc/rcS.d/K05volmgt etc/rcS.d/K07snmpdx etc/rcS.d/K10rcapd etc/rcS.d/K21dhcp etc/rcS.d/K28kdc etc/rcS.d/K28kdc.master etc/rcS.d/K28nfs.server etc/rcS.d/K33audit etc/rcS.d/K33efcode etc/rcS.d/K34svm.sync etc/rcS.d/K36sendmail etc/rcS.d/K36utmpd etc/rcS.d/K37power etc/rcS.d/K40cron etc/rcS.d/K40inetd etc/rcS.d/K40nscd etc/rcS.d/K40sf880dr etc/rcS.d/K40slpd etc/rcS.d/K40syslog etc/rcS.d/K40xntpd etc/rcS.d/K41autofs etc/rcS.d/K41ldap.client etc/rcS.d/K41rpc etc/rcS.d/K42sckm etc/rcS.d/K43inet etc/rcS.d/K99libc.mount etc/rcS.d/S10cvc etc/rcS.d/S28network.sh etc/rcS.d/S29nodename.sh etc/rcS.d/S30rootusr.sh etc/rcS.d/S33keymap.sh etc/rcS.d/S35svm.init etc/rcS.d/S40standardmounts.sh etc/rcS.d/S42coreadm etc/rcS.d/S45initboot etc/rcS.d/S50devfsadm etc/rcS.d/S72cryptosvc etc/rcS.d/S95picld " # Obsolete smf manifests smf_obsolete_manifests=" var/svc/manifest/application/print/cleanup.xml var/svc/manifest/network/tftp.xml var/svc/manifest/network/lp.xml var/svc/manifest/system/filesystem/volfs.xml var/svc/manifest/network/pfil.xml var/svc/manifest/platform/sun4u/mpxio-upgrade.xml var/svc/manifest/network/tname.xml " # smf services whose manifests have been renamed smf_renamed_manifests=" var/svc/manifest/milestone/name-service.xml var/svc/manifest/system/filesystem/boot-archive.xml " # Obsolete smf methods smf_obsolete_methods=" lib/svc/method/print-cleanup lib/svc/method/print-server lib/svc/method/svc-volfs lib/svc/method/pfil " smf_cleanup () { ( cd $root; print "Removing obsolete rc.d scripts ... \c" rm -f $smf_obsolete_rc_files print "done." ) } smf_new_profiles () { [[ "$bfu_isa" = "sparc" ]] || return 0 [[ -x /tmp/bfubin/svccfg ]] || return 0 print "Clearing platform profile hash ..." # platform_SUNW,Sun-Fire.xml (and other new and # corrected platforms) were delivered in Build 68. if [ ! -f \ $rootprefix/var/svc/profile/platform_SUNW,Sun-Fire.xml \ ]; then for pfx in " " "v"; do for plname in \ none \ SUNW_Sun_Fire_880 \ SUNW_Sun_Fire_V890 \ SUNW_Sun_Fire_15000 \ SUNW_UltraEnterprise_10000; do svccfg -f - <> \ $rootprefix/var/svc/profile/upgrade fi if [[ $zone = global && ! -f $rootprefix/var/svc/manifest/system/intrd.xml ]]; then echo /usr/sbin/svcadm enable system/intrd >> \ $rootprefix/var/svc/profile/upgrade fi if [[ $zone = global && ! -f $rootprefix/var/svc/manifest/system/scheduler.xml ]]; then echo /usr/sbin/svcadm enable system/scheduler >> \ $rootprefix/var/svc/profile/upgrade fi if [[ $zone = global && ! -f $rootprefix/var/svc/manifest/system/hal.xml ]]; then echo /usr/sbin/svcadm enable system/hal >> \ $rootprefix/var/svc/profile/upgrade fi if [[ $zone = global && ! -f $rootprefix/var/svc/manifest/system/filesystem/rmvolmgr.xml ]]; then echo /usr/sbin/svcadm enable system/filesystem/rmvolmgr >> \ $rootprefix/var/svc/profile/upgrade fi if [[ $zone = global && ! -f $rootprefix/var/svc/manifest/network/ipsec/manual-key.xml && -f $rootprefix/etc/inet/secret/ipseckeys ]]; then smf_enable svc:/network/ipsec/manual-key:default fi if [[ $zone = global && ! -f $rootprefix/var/svc/manifest/network/ipsec/ike.xml && -f $rootprefix/etc/inet/ike/config ]]; then smf_enable svc:/network/ipsec/ike:default fi } smf_copy_manifest() { mfstbase=`basename $1` mymfs=$rootprefix/var/svc/manifest/$2/$mfstbase if [[ ! -f $mymfs ]] || ! cmp -s $manifest_src/$1 $mymfs ; then cp $manifest_src/$1 $mymfs || echo "bfu: could not copy $manifest_src/$1" fi } smf_copy_method() { cp $manifest_src/$1 $rootprefix/lib/svc/method || echo "bfu: could not copy $manifest_src/$1" } smf_cleanup_initd() { rm -f $rootprefix/etc/rc?.d/[SK]??$1 } smf_delete_manifest() { ( mfst=$1 cd $root [ -f $mfst ] || return; if [ -r /etc/svc/volatile/repository_door ]; then ENTITIES=`/tmp/bfubin/svccfg inventory $mfst` for fmri in $ENTITIES; do /tmp/bfubin/svccfg delete -f $fmri done fi rm $mfst ) } smf_delete_methods() { ( cd $root; rm -f $smf_obsolete_methods ) } smf_delete_renamed_manifests() { ( cd $root; rm -f $smf_renamed_manifests ) } smf_gldv3_manifests=" var/svc/manifest/network/aggregation.xml var/svc/manifest/network/datalink.xml var/svc/manifest/network/datalink-init.xml " smf_gldv3_methods=" lib/svc/method/aggregation lib/svc/method/datalink lib/svc/method/datalink-init " smf_cleanup_gldv3() { ( for f in $smf_gldv3_manifests; do smf_delete_manifest $f done cd $root; rm -f $smf_gldv3_methods ) } old_mfst_dir="var/svc/manifest.orig" new_mfst_dir="var/svc/manifest" smf_enable() { echo "svcadm enable $*" >> $rootprefix/var/svc/profile/upgrade } smf_check_repository() { repository=etc/svc/repository.db [[ -f $rootprefix/$repository ]] || return print -n "$rootprefix/$repository: " >&2 sqlite="${SQLITEBIN-$GATE/public/bin/$bfu_isa/sqlite}" [[ -x $sqlite ]] || sqlite=/lib/svc/bin/sqlite if [[ ! -x $sqlite ]]; then echo "no sqlite binary: skipped integrity check" >&2 return fi rm -f /tmp/bfurepo.db; cp $rootprefix/$repository /tmp/bfurepo.db bad_errors=`echo "PRAGMA integrity_check;" | $sqlite /tmp/bfurepo.db 2>&1 | grep -v '^ok$'` if [[ $? -eq 0 ]]; then echo "integrity check failed:" >&2 echo "$bad_errors" >&2 echo >&2 if [[ $force_override = no ]]; then cat >&2 <&2 exit 2; else echo "driving on anyway" >&2 fi else echo "passed integrity check" >&2; fi } smf_bkbfu_warning() { print "" print "*************************************************************" print " WARNING: BFU'ing $1 backwards across 5090532." print " Fixes have been made but the services cannot be refreshed" print " on the $1's inactive repository. Next boot for the" print " $1 will probably result in maintenance mode due to" print " dependency cycles. If so, at the $1's console, run:" print "" print " /usr/sbin/svcadm refresh system/sysidtool:system" print " /usr/sbin/svcadm refresh system/sysidtool:net" print " /usr/sbin/svcadm clear milestone/single-user" print " /usr/sbin/svcadm clear system/sysidtool:system" print " /usr/sbin/svcadm clear system/sysidtool:net" print "" print " to resolve." print " To avoid these problems, reseed the zone's repository." print " See http://greenline.eng/quickstart.shtml#newrep ." print " Note: Re-seeding will lose all smf(5) customization." print "*************************************************************" print "" } smf_is_sysconfig() { # # Return success if going to post-5090532, i.e. post-sysconfig bits # # By now, we're going to post-smf bits - so multi-user.xml must # exist (since it was introduced by first SMF putback). # # Function return status is return status of last command executed. # So, no need to check return status from grep below. grep sysconfig $rootprefix/var/svc/manifest/milestone/multi-user.xml \ >/dev/null 2>&1 } smf_bkbfu_past_sysconfig() { # # Check if bfu'ing back from post-5090532 to pre-5090532 bits. # if [[ -f $rootprefix/var/svc/manifest/milestone/sysconfig.xml ]] && ! smf_is_sysconfig ; then return 0 fi return 1 } smf_bkbfu_repair_sysconfig() { # # Perform the necessary corrections when bfu'ing backwards # from post-5090532 to pre-5090532 bits. # # Get the pre-5090532 non-ON manifests, and issue minimal fixes # to the repository, to enable re-boot. # smf_copy_manifest pre-5090532/sysidtool.xml system if [[ $zone = global && $karch = i86pc ]]; then smf_copy_manifest pre-5090532/kdmconfig.xml platform/i86pc fi # # Now, remove sysidtool:{system, net}'s dependency on # single-user and filesystem-local. # # If $rootprefix is not empty, this could be the global zone, # with an alternate root BFU, or a non-global zone. For either # case, the repository to be updated is not the live one: use # SVCCFG_REPOSITORY to point to the repository to be updated. # # Note that in the alternate-root case, doing this seems better # than forcing the user to re-seed, or to dis-allow it. The # issue of svccfg and the repository not matching seems remote, # given that from initial SMF integration (on10_64) to on10_74, # there was no mismatch. In the remote possibility that there is a # mis-match (in the future) causing these calls to be suspect, # the user is already being advised, via the warning message, to # reseed the repository in case of trouble. If a mis-match is ever # introduced, code such as this would have to be fixed, so this # aspect of the warning is useful only during the interim period. # # NOTE that this is not an issue for non-global zones' # repositories - they couldn't be out-of-sync with # /tmp/bfubin/svccfg. # if [[ -n $rootprefix ]]; then export SVCCFG_REPOSITORY=$rootprefix/etc/svc/repository.db if [[ $zone = global ]]; then smf_bkbfu_warning "alternate root" else smf_bkbfu_warning "zone" fi fi # # Using the newer "-s" option to svccfg in the following is OK # since its introduction preceded 5090532 (and this routine wouldn't # be called unless the machine is running post-5090532 bits). # /tmp/bfubin/svccfg -s system/sysidtool:net delpg single-user /tmp/bfubin/svccfg -s system/sysidtool:system delpg single-user /tmp/bfubin/svccfg -s system/sysidtool:net delpg filesystem_local /tmp/bfubin/svccfg -s system/sysidtool:system delpg filesystem_local # # On a live system, issue the refresh; For alternate root or non-global # zone, the user was asked to issue the refreshes and "clear"s in the # message above after a post-bfu reboot. # if [[ -z $rootprefix ]]; then /tmp/bfubin/svcadm refresh system/sysidtool:system \ system/sysidtool:net fi # # Now, reset SVCCFG_REPOSITORY, if it was set # [[ -n $rootprefix ]] && unset SVCCFG_REPOSITORY # # Remove the sysconfig.xml manifest when going back. So backward # bfu check continues to work, and all manifests are correct. # cat >> $rootprefix/var/svc/profile/upgrade <<-EOF rm -f /var/svc/manifest/milestone/sysconfig.xml EOF } # # Return true if $file exists in $archive. $file may also be a pattern. # archive_file_exists() { archive=$1 file=$2 $ZCAT $cpiodir/${archive}${ZFIX} | cpio -it 2>/dev/null | \ egrep -s "$file" } # # If we're no longer delivering the eeprom service, remove it from the system, # as eeprom -I is removed as well. # smf_fix_i86pc_profile () { mfst="var/svc/manifest/platform/i86pc/eeprom.xml" profile="var/svc/profile/platform_i86pc.xml" if [ ! "$karch" = "i86pc" ]; then return fi if ! archive_file_exists generic.root "^$profile"; then rm -f $rootprefix/$profile rm -f $rootprefix/var/svc/profile/platform.xml fi if [ ! -f $rootprefix/$mfst ]; then return fi if archive_file_exists generic.root "^$mfst"; then return fi rm -f $rootprefix/$mfst # # we must disable via svccfg directly, as manifest-import runs after # this service tries to run # [[ -n "$rootprefix" ]] && export SVCCFG_REPOSITORY=$rootprefix/etc/svc/repository.db /tmp/bfubin/svccfg delete -f platform/i86pc/eeprom [[ -n "$rootprefix" ]] && unset SVCCFG_REPOSITORY } smf_apply_conf () { # # Go thru the original manifests and move any that were unchanged # (or are not system-provided) back to their proper location. This # will avoid superfluous re-import on reboot, as the inode and mtime # are both part of the hash. # if [ -d $rootprefix/$old_mfst_dir ]; then for f in `cd $rootprefix/$old_mfst_dir ; find . -type f` do old=$rootprefix/$old_mfst_dir/$f new=$rootprefix/$new_mfst_dir/$f if [ ! -f $new ]; then mkdir -m 0755 -p `dirname $new` mv $old $new continue fi cmp -s $old $new && mv $old $new done rm -rf $rootprefix/$old_mfst_dir fi if [ -f $rootprefix/etc/init.d/inetd ]; then # # BFUing to non-SMF system -- undo our previous changes, # run an old hack, and skip the remainder of this function. # smf_inetd_reenable smf_tftp_reinstall # Update inetd.conf only if we find rpc.metad file. [ -f $usr/sbin/rpc.metad ] && inetd_conf_svm_hack return fi # # At this point, the archive in question is a SMF version. If # the smf(5) repository does not yet exist, create it by copying # the appropriate seed repository. Since updating of non-global # zones only occurs when the live system is bfu'ed, the # appropriate seed is guaranteed to exist under the /lib # directory. # repository=$rootprefix/etc/svc/repository.db if [ ! -f $repository ]; then print "Initializing service configuration repository ..." if [ $zone = global ]; then cp $rootprefix/lib/svc/seed/global.db $repository else cp /lib/svc/seed/nonglobal.db $repository fi chmod 0600 $repository chown root:sys $repository fi print "Removing obsolete smf services ..." for f in $smf_obsolete_manifests; do smf_delete_manifest $f done smf_delete_methods smf_delete_renamed_manifests if [ $need_datalink = no ]; then smf_cleanup_gldv3 fi print "Disabling unneeded inetd.conf entries ..." smf_inetd_disable smf_tftp_reinstall print "Connecting platform and name service profiles ..." rm -f $rootprefix/var/svc/profile/name_service.xml grep ldap $rootprefix/etc/nsswitch.conf >/dev/null 2>&1 is_ldap=$? grep nisplus $rootprefix/etc/nsswitch.conf >/dev/null 2>&1 is_nisplus=$? grep nis $rootprefix/etc/nsswitch.conf >/dev/null 2>&1 is_nis=$? if [ $is_ldap = 0 ]; then ns_profile=ns_ldap.xml elif [ $is_nisplus = 0 ]; then ns_profile=ns_nisplus.xml elif [ $is_nis = 0 ]; then ns_profile=ns_nis.xml else ns_profile=ns_files.xml fi ln -s $ns_profile $rootprefix/var/svc/profile/name_service.xml rm -f $rootprefix/var/svc/profile/inetd_services.xml ln -s inetd_upgrade.xml $rootprefix/var/svc/profile/inetd_services.xml print "Marking converted services as enabled ..." [ -f $rootprefix/etc/resolv.conf ] && smf_enable network/dns/client [ -f $rootprefix/etc/inet/dhcpsvc.conf ] && \ smf_enable network/dhcp-server # Not concerned about enabling/disabling rcap but will migrate # configuration parameters if rcap.conf exists # if [ -f $rootprefix/etc/rcap.conf ]; then migrate_rcap_conf fi if [ $zone = global ]; then if [ -f $rootprefix/etc/dfs/dfstab ] && grep '^[ ]*[^# ]' $rootprefix/etc/dfs/dfstab \ > /dev/null; then smf_enable network/nfs/server fi else echo "/usr/sbin/svcadm disable network/nfs/server" >> \ $rootprefix/var/svc/profile/upgrade fi [ -f $rootprefix/etc/inet/ntp.conf ] && smf_enable network/ntp domainname=`cat $rootprefix/etc/defaultdomain 2>/dev/null` if [ ! -z "$domainname" -a -d $rootprefix/var/yp/$domainname ]; then smf_enable network/nis/server # Determining whether we're a NIS master requires # looking through the maps. cat >>$rootprefix/var/svc/profile/upgrade <<\_EOF # Determine whether we are a YP master. domain=`/usr/bin/domainname` hostname=`uname -n | cut -d. -f1 | tr '[A-Z]' '[a-z]'` if [ -x /usr/sbin/makedbm ]; then if [ -f /var/yp/NISLDAPmapping ]; then master=`/usr/sbin/makedbm -u /var/yp/\$domain/LDAP_passwd.byname | grep YP_MASTER_NAME | nawk '{ print $2 }'` else master=`/usr/sbin/makedbm -u /var/yp/\$domain/passwd.byname | grep YP_MASTER_NAME | nawk '{ print $2 }'` fi fi # If we are the master server, enable appropriate services. if [ "$master" = "$hostname" -a "$YP_SERVER" = "TRUE" ]; then /usr/sbin/svcadm enable network/nis/xfr /usr/sbin/svcadm enable network/nis/passwd if [ ! -f /var/yp/NISLDAPmapping ]; then [ -f /var/yp/updaters ] && \ /usr/svc/svcadm enable network/nis/update fi fi _EOF fi # Check if mddbs don't exist on the image. If so, disable SVM services. MDDB_STATUS=1 if [ -f $rootprefix/kernel/drv/md.conf ]; then sed -e 's/#.*$//' $rootprefix/kernel/drv/md.conf | \ egrep '^[ ]*mddb_bootlist' >/dev/null 2>&1 MDDB_STATUS=$? fi if [ $MDDB_STATUS -ne 0 ]; then for svc in metainit mdmonitor; do echo "/usr/sbin/svcadm disable system/$svc:default" >> \ $rootprefix/var/svc/profile/upgrade done for svc in meta mdcomm metamed metamh; do echo "/usr/sbin/svcadm disable network/rpc/$svc:default" \ >> $rootprefix/var/svc/profile/upgrade done fi # Workaround inetd's handling of "tcp6/udp6" when no IPv6 interfaces # are configured. for svc in meta mdcomm metamed metamh; do echo "/usr/sbin/inetadm -m network/rpc/$svc:default proto=tcp" \ ">/dev/null 2>&1" >> $rootprefix/var/svc/profile/upgrade done manifest_src=${MANIFEST_SRC-$GATE/public/smf} [[ -d $manifest_src ]] || manifest_src=/net/onnv.eng/export/gate/public/smf [[ -d $manifest_src ]] || manifest_src=/net/greenline.eng/meta0/smf if smf_bkbfu_past_sysconfig ; then echo "BFU'ing backwards across 5090532! Now repairing..." smf_bkbfu_repair_sysconfig fi # # If bfu'ing milestone/sysconfig bits or onwards, update the # corresponding non-ON manifests - sysidtool and kdmconfig. # sysidmfst=$rootprefix/var/svc/manifest/system/sysidtool.xml kdmmfst=$rootprefix/var/svc/manifest/platform/i86pc/kdmconfig.xml if smf_is_sysconfig ; then if [[ ! -f $sysidmfst ]]; then # # if WOS build on machine is pre-greenline, and # we're bfu'ing to the sysconfig bits. # smf_copy_manifest post-5090532/sysidtool.xml system if [[ $zone = global ]]; then smf_copy_method sysidtool-net smf_copy_method sysidtool-system fi echo "Converted system/sysidtool (post-5090532)" else # # If sysidtool.xml already exists, update it # if necessary. Future updates of sysidtool.xml # must occur in the dir: $manifest_src/post-5090532 # smf_copy_manifest post-5090532/sysidtool.xml system fi if [[ $zone = global && $karch = i86pc ]]; then if [[ ! -f $kdmmfst ]]; then # # if WOS build on machine is pre-greenline, and # we're bfu'ing to the sysconfig bits. # smf_copy_manifest post-5090532/kdmconfig.xml \ platform/i86pc smf_copy_method svc-kdmconfig smf_cleanup_initd kdmconfig echo "Converted platform/i86pc/kdmconfig" echo "(post-5090532)" else # # If kdmconfig.xml already exists, update # it if necessary. Future updates of # kdmconfig.xml must occur in the dir: # $manifest_src/post-5090532 # smf_copy_manifest post-5090532/kdmconfig.xml \ platform/i86pc fi fi else if [[ ! -f $sysidmfst ]]; then smf_copy_manifest pre-5090532/sysidtool.xml system if [[ $zone = global ]]; then smf_copy_method sysidtool-net smf_copy_method sysidtool-system fi echo "Converted system/sysidtool" fi if [[ $zone = global && $karch = i86pc && ! -f $kdmmfst ]]; then smf_copy_manifest pre-5090532/kdmconfig.xml \ platform/i86pc smf_copy_method svc-kdmconfig smf_cleanup_initd kdmconfig echo "Converted platform/i86pc/kdmconfig" fi fi # If we've still got the old dtlogin manifest delivered by earlier # versions of bfu, delete it, as it was broken and should have # never been delivered. A new version delivered by the CDE # consolidation should be left alone. if [[ -f $rootprefix/var/svc/manifest/application/dtlogin.xml && `grep -c GLXXX \ $rootprefix/var/svc/manifest/application/dtlogin.xml` -gt 0 && -x /tmp/bfubin/svccfg ]]; then # Delete the obsolete manifest. rm -f $rootprefix/var/svc/manifest/application/dtlogin.xml # Delete the service from repository, then use dtconfig -e to # revert to whatever the WOS bits are using if dtlogin was # enabled. cat >> $rootprefix/var/svc/profile/upgrade <<-EOFA if /usr/bin/svcprop -q application/cde-login; then if [ \`/usr/bin/svcprop -p general/enabled \ application/cde-login:default\` = "true" ]; then do_dtconfig=1; else do_dtconfig=0; fi /usr/sbin/svccfg delete -f application/cde-login type instance_refresh 2>&1 > /dev/null if [ \$? = 0 ]; then instance_refresh system/console-login else /usr/sbin/svcadm refresh system/console-login fi if [ \$do_dtconfig -eq 1 -a -x /usr/dt/bin/dtconfig ]; then /usr/dt/bin/dtconfig -e fi fi EOFA fi # Enable the inetd-upgrade service to convert any changes to inetd.conf smf_enable network/inetd-upgrade # If global zone, and bfu'ing from smf, and the inetd-upgrade # service has an obsolete dependency, then add a clear of inetd # and inetd-upgrade to the upgrade file as either may drop into # maintenance due to a dependency loop resulting from the new # inetd manifest if [[ $zone = global && -x /tmp/bfubin/svccfg ]]; then /tmp/bfubin/svcprop -q -p network/entities network/inetd-upgrade if [[ $? = 0 ]]; then echo "/usr/sbin/svcadm clear network/inetd" >> \ $rootprefix/var/svc/profile/upgrade echo "/usr/sbin/svcadm clear network/inetd-upgrade" >> \ $rootprefix/var/svc/profile/upgrade fi fi # If we're in the global zone, and using an alternate root, see if # we are in an smf root. If so, import name-service-cache. If we're # not bfu'ing an alternate root, and we're post-smf, import # name-service-cache. This is to get name-service-cache(with correct # dependencies) in the repository before reboot. If we're bfu'ing # from pre-smf, this isn't an issue, as name-service-cache will be # installed with correct dependencies. if [[ $zone = global && -f $rootprefix/var/svc/manifest/system/name-service-cache.xml ]]; then if [[ -n $rootprefix ]]; then if [ -x /usr/sbin/svccfg ]; then SVCCFG_REPOSITORY=$rootprefix/etc/svc/repository.db /usr/sbin/svccfg import \ $rootprefix/var/svc/manifest/system/name-service-cache.xml else echo "Warning: This system does not have SMF, so I " echo "cannot ensure the pre-import of " echo "name-service-cache. If name-service-cache does " echo "not work, reboot your alternate root to fix it." fi elif [ -x /tmp/bfubin/svccfg ]; then /tmp/bfubin/svccfg import \ /var/svc/manifest/system/name-service-cache.xml fi fi # If we're in the global zone, and using an alternate root, see if # we are in an smf root. If so, import datalink and aggregation svcs. # If we're not bfu'ing an alternate root, and we're post-smf, # import datalink and aggregation. This is to get them # in the repository before reboot. If we're bfu'ing from pre-smf, # this isn't an issue, as they are in the seed repository. if [[ $zone = global && -f $rootprefix/var/svc/manifest/network/datalink.xml ]]; then if [[ -n $rootprefix ]]; then if [ -x /usr/sbin/svccfg ]; then SVCCFG_REPOSITORY=$rootprefix/etc/svc/repository.db sed -e "s/enabled='true'/enabled='false'/" \ $rootprefix/var/svc/manifest/network/aggregation.xml \ | svccfg import - sed -e "s/enabled='true'/enabled='false'/" \ $rootprefix/var/svc/manifest/network/datalink.xml \ | svccfg import - sed -e "s/enabled='true'/enabled='false'/" \ $rootprefix/var/svc/manifest/network/datalink-init.xml \ | svccfg import - else echo "Warning: This system does not have SMF, so I" echo "cannot ensure the pre-import of datalink and" echo "network aggregation. If they do not work" echo "reboot your alternate root to fix it." fi elif [ -x /tmp/bfubin/svccfg ]; then sed -e "s/enabled='true'/enabled='false'/" \ /var/svc/manifest/network/aggregation.xml | \ svccfg import - sed -e "s/enabled='true'/enabled='false'/" \ /var/svc/manifest/network/datalink.xml | \ svccfg import - sed -e "s/enabled='true'/enabled='false'/" \ /var/svc/manifest/network/datalink-init.xml | \ svccfg import - fi # # Make sure the services are enabled after reboot. # enable_next_boot svc:/network/aggregation:default enable_next_boot svc:/network/datalink:default enable_next_boot svc:/network/datalink-init:default fi # Enable new NFS status and nlockmgr services if client is enabled cat >> $rootprefix/var/svc/profile/upgrade <<-EOF cl="svc:/network/nfs/client:default" if [ \`/usr/bin/svcprop -p general/enabled \$cl\` = "true" ]; then /usr/sbin/svcadm enable svc:/network/nfs/status:default /usr/sbin/svcadm enable svc:/network/nfs/nlockmgr:default fi EOF kpmani="$rootprefix/var/svc/manifest/network/security/krb5_prop.xml" if grep svc-kdc.slave $kpmani > /dev/null 2>&1; then cat >> $rootprefix/var/svc/profile/upgrade <&1\` case \$restarter in *network/inetd:default) kken=\`svcprop -c -p general/enabled \$kkfmri\` svccfg delete -f \$kpfmri svccfg import \$lkpmani # Enable kpropd if krb5kdc is enabled, since # krb5kdc would have run kpropd if [ \$kken = "true" ]; then svcadm enable \$kpfmri fi ;; esac EOF fi # Enable print server if there are local queues queues=`echo $rootprefix/etc/lp/printers/*/configuration` if [ "$queues" != "$rootprefix/etc/lp/printers/*/configuration" ]; then smf_enable application/print/server fi # Enable rarpd and bootparamd if they would have been running pre-SMF if [ -d $rootprefix/tftpboot ] || [ -d $rootprefix/rplboot ]; then smf_enable network/rarp smf_enable network/rpc/bootparams fi # To handle the transition from pre-smf ipfilter to smf-aware ipfilter, # check if ipfilter had been enabled with at least one rule, and if so # enable the smf instance. if grep '^[ \t]*[^# \t]' $rootprefix/etc/ipf/ipf.conf >/dev/null 2>&1 && [[ $zone = global ]]; then smf_enable network/ipfilter fi touch $rootprefix/var/svc/profile/.upgrade_prophist cat >> $rootprefix/var/svc/profile/upgrade <&1\` case \$restarter in *network/inetd:default) en=\`svcprop -c -p general/enabled \$dcsfmri\` svccfg delete -f \$dcsfmri svccfg import \$dcsmani if [ \$en = "true" ]; then svcadm enable \$dcsfmri fi ;; esac EOF smf_fix_i86pc_profile } # # The directboot putback moved the console property from # /boot/solaris/bootenv.rc to /boot/grub/menu.lst. It should be kept in both. # cleanup_eeprom_console() { bootenvrc="$root/boot/solaris/bootenv.rc" menu_console=`eeprom console 2>/dev/null | \ grep -v 'data not available' | cut -d= -f2-` bootenv_console=`grep '^setprop[ ]\{1,\}console\>' $bootenvrc` if [ -n "$menu_console" ] && [ -z "$bootenv_console" ]; then echo "setprop console '$menu_console'" >> $bootenvrc fi } EXTRACT_LOG=/tmp/bfu-extract-log.$$ rm -f $EXTRACT_LOG extraction_error() { echo error $* >> $EXTRACT_LOG } # # Make a local copy of bfu in /tmp and execute that instead. # This makes us immune to loss of networking and/or changes # to the original copy that might occur during execution. # cd . abspath=`[[ $0 = /* ]] && print $0 || print $PWD/$0` if [[ $abspath != /tmp/* ]]; then localpath=/tmp/bfu.$$ print "Copying $abspath to $localpath" cp $abspath $localpath chmod +x $localpath print "Executing $localpath $*\n" exec $localpath $* fi export PATH=/usr/bin:/usr/sbin:/sbin usage() { echo "Usage:" echo " bfu [-fh] [root-dir]" echo "\tUpdate a single machine by loading archives on root-dir." echo "\troot-dir defaults to / (a live bfu).\n" echo " bfu -c [-fh] " echo "\tUpdate all diskless clients by loading archives on each client" echo "\tthat mounts exec-dir as /usr. must start with" echo "\t/export/exec and each client's root must be in /export/root.\n" echo "\t-f force bfu to continue even if it doesn't seem safe" fail "\t-h|-help print this usage message and exit\n" } diskless=no force_override=no while [ $# -gt 0 ]; do case $1 in -c) diskless=yes;; -f) force_override=yes;; -h|-help) usage;; *) break;; esac shift done # Variables for x86 platforms boot_is_pcfs=no have_realmode=no is_pcfs_boot=no need_datalink=no new_dladm=no # Set when moving to either directboot or multiboot multi_or_direct=no # # Shows which type of archives we have, which type of system we are # running on (before the bfu), and what the failsafe archives are # (again, before the bfu). failsafe_type is only needed on diskful # bfu's, so it's not set in the diskless case. # Possible values: unknown, dca, multiboot, directboot # archive_type=unknown system_type=unknown failsafe_type=unknown test $# -ge 1 || usage if [ -x /usr/bin/ppriv ]; then # We prefer to use ppriv, as it is a more accurate test, and also # has the benefit of preventing use from within a nonglobal zone. ppriv $$ | grep -w "E: all" > /dev/null 2>&1 || \ fail "bfu requires all privileges" else # Fall back to old id check if system does not yet have ppriv. uid=`id | nawk '{print $1}'` [ "$uid" = "uid=0(root)" ] || \ fail "You must be super-user to run this script." fi bfu_isa=`uname -p` target_isa=$bfu_isa karch=`uname -m` plat=`uname -i` cpiodir=$1 if [ "$cpiodir" = again ]; then cpiodir=`nawk '/^bfu.ed from / { print $3; exit }' /etc/motd` fi [[ "$cpiodir" = */* ]] || cpiodir=$ARCHIVE/archives/$target_isa/$1 [[ "$cpiodir" = /* ]] || fail "archive-dir must be an absolute path" cd $cpiodir case `echo generic.root*` in generic.root) ZFIX=""; ZCAT="cat";; generic.root.gz) ZFIX=".gz"; ZCAT="gzip -d -c";; generic.root.Z) ZFIX=".Z"; ZCAT="zcat";; *) fail "generic.root missing or in unknown compression format";; esac # # Determine what kind of archives we're installing, using the following rules: # # 1. If strap.com is present, the archives are pre-multiboot # 2. If symdef is present, the archives are directboot # 3. Otherwise, the archives are multiboot # if [ $target_isa = i386 ]; then if [ -f $cpiodir/i86pc.boot$ZFIX ] && \ archive_file_exists i86pc.boot "strap.com"; then archive_type=dca elif [ -f $cpiodir/i86pc.root$ZFIX ] && \ archive_file_exists i86pc.boot symdef; then archive_type=directboot multi_or_direct=yes else archive_type=multiboot multi_or_direct=yes fi fi if [ $diskless = no ]; then root=${2:-/} [[ "$root" = /* ]] || fail "root-dir must be an absolute path" usrroot=$root usr=${usrroot%/}/usr rootlist=$root [[ -f $root/etc/system ]] || \ fail "$root/etc/system not found; nonglobal zone target not allowed" # Make sure we extract the sun4u-us3 libc_psr.so.1 if [ -d $root/platform/sun4u -a \ ! -d $root/platform/sun4u-us3 ] then mkdir $root/platform/sun4u-us3 chmod 755 $root/platform/sun4u-us3 chown root $root/platform/sun4u-us3 chgrp sys $root/platform/sun4u-us3 fi if [ $karch != $plat -a -f ${cpiodir}/${plat}.usr$ZFIX ]; then usrarchs="$karch $plat" else usrarchs="$karch" fi if [ $karch != $plat -a -f ${cpiodir}/${plat}.root$ZFIX ]; then rootarchs="$karch $plat" else rootarchs="$karch" fi if [ -h ${root}/platform/${plat} ]; then rm -f ${root}/platform/${plat} fi if [ -h ${usr}/platform/${plat} ]; then rm -f ${usr}/platform/${plat} fi if [ $plat != $karch -a -f ${cpiodir}/${plat}.root$ZFIX \ -a -f ${cpiodir}/${plat}.usr$ZFIX ] then cd $cpiodir # # Look through all the archives we build and match # the names of built archives with the names of # directories installed on this machine. We assume # here that we can get the names of all architectures # by pattern matching the names of .root archives - so # if we ever had a case where we had only a .usr archive # we wouldn't find that archive. # for i in *.root* do platname=${i%.root*} if [ -z "${platname}" -o ${platname} = $karch -o \ $platname = generic -o ${platname} = $plat ]; then continue; fi if [ -d ${root}/platform/${platname} -o \ -h ${root}/platform/${platname} ]; then rootarchs="${rootarchs} ${platname}" fi if [ -d ${usr}/platform/${platname} -o \ -h ${usr}/platform/${platname} ]; then usrarchs="${usrarchs} ${platname}" fi if [ -h ${root}/platform/${platname} ]; then rm -f ${root}/platform/${platname} fi if [ -h ${usr}/platform/${platname} ]; then rm -f ${usr}/platform/${platname} fi done fi rootslice=`df -k $root | nawk 'NR > 1 { print $1 }' | sed s/dsk/rdsk/` print "Loading $cpiodir on $root" else usrroot=$2 usr=$2/usr [[ "$usr" = /export/exec/* ]] || fail "exec-dir $usrroot sounds bogus" case $2 in *sparc*) target_isa=sparc ;; *i386*) target_isa=i386 ;; esac cd $cpiodir test -f generic.root$ZFIX || fail "$cpiodir/generic.root$ZFIX missing" allarchs=$(echo $(ls *.root$ZFIX | grep -v generic.root$ZFIX | \ sed -e 's/.root.*//')) # XXX Pick karch as last available root arch karch=${allarchs##* } # XXX Pick plat as first available root arch plat=${allarchs%% *} rootlist="" for root in /export/root/* do test -f $root/etc/vfstab && egrep -s $usrroot $root/etc/vfstab && rootlist="$rootlist $root" done test -n "$rootlist" || fail "no clients to upgrade" print "Loading $cpiodir usr archives on:\n\t$usr\n" print "Loading $cpiodir root archives on:" for root in $rootlist do print "\t$root" done fi if grep '^[ ]*zfsroot:' $root/etc/system >/dev/null && \ archive_file_exists i86pc.boot boot/grub/zfs_stage1_5; then echo "Cannot BFU a system with the mountroot version"\ "of zfs boot support." echo "For information on how to transition this system to the new" echo "zfs boot support, see:" echo "http://www.opensolaris.org/os/community/zfs/boot/zfsboot-manual/mntroot-transition/" fail "" fi nss_lib="$usr/lib/mps/libnss3.so" nss_lib64="$usr/lib/mps/64/libnss3.so" valid_rpath="\$ORIGIN:/usr/lib/mps/secv1:/usr/lib/mps" rpath_msg="R(UN)?PATH from file ${nss_lib}\)" if [ ! -x /usr/bin/ldd ]; then if [ "$force_override" = yes ]; then echo "/usr/bin/ldd is missing but -f is set; continuing." else echo "/usr/bin/ldd is missing." fail "Install the SUNWtoo package." fi fi nss_rpath=`ldd -s $nss_lib | egrep "$rpath_msg" | head -1 | cut -d'=' -f2 | \ awk '{print $1}'` update_script="/ws/onnv-gate/public/bin/update_nsspkgs" if [ $valid_rpath != "$nss_rpath" ]; then if [ "$force_override" = yes ]; then echo "$nss_lib is not valid but -f is set; continuing." else echo "$nss_lib is not valid." fail "Run $update_script to update the SUNWtls package." fi fi if [ $target_isa = i386 -a ! -f $nss_lib64 ]; then echo "$nss_lib64 does not exist." fail "Run $update_script to update the NSS packages." fi update_script="/ws/onnv-gate/public/bin/migrate_bind9" if [[ ! -f $usr/lib/dns/libdns.so ]] && ! $ZCAT $cpiodir/generic.usr$ZFIX | \ cpio -it 2>/dev/null | egrep -s '^usr/sbin/ndc' ; then if [ "$force_override" = yes ]; then echo "BIND 9 has not been installed, but -f is set; continuing." else echo "BIND 8 has been removed from ON; BIND 9 is available from SFW." fail "Run $update_script to migrate to BIND 9." fi fi update_script="/ws/onnv-gate/public/bin/update_ce" if ifconfig -a | egrep '^ce' >/dev/null 2>/dev/null; then # CE version 1.148 or later is required cever=`modinfo | grep 'CE Ethernet' | sed 's/.*v1\.//' | tr -d ')' | \ nawk '{ if ($1 < 148) print "BAD"; else print $1 }'` if [ "$cever" = "BAD" ]; then fail "You must run $update_script to upgrade your ce driver." fi fi update_script="/ws/onnv-gate/public/bin/update_dbus" if [ ! -x $usr/lib/dbus-daemon ]; then fail "Run $update_script to update D-Bus." fi # # We need biosdev if we're moving from pre-multiboot to multiboot or directboot # kernels. # if [ $target_isa = i386 ] && [ $multi_or_direct = yes ] && [ $diskless = no ] then prtconf -v | grep biosdev >/dev/null 2>&1 if [ $? -ne 0 ] && [ ! -f $rootprefix/platform/i86pc/multiboot ]; then echo "biosdev cannot be run on this machine." echo "Transitioning from classic to multiboot requires a" echo "bootconf which is compatible with biosdev." echo "bfu to onnv_12 first, then to a build with multiboot." fail "" fi fi if $ZCAT $cpiodir/generic.root$ZFIX | cpio -it 2>/dev/null | \ grep datalink.conf > /dev/null 2>&1 ; then need_datalink=yes fi # # Check whether the archives have an etc/dladm directory; this is # later used to determine if aggregation.conf needs to be moved. # if $ZCAT $cpiodir/generic.root$ZFIX | cpio -it 2>/dev/null | \ grep etc/dladm > /dev/null 2>&1 ; then new_dladm=yes fi time_ref=/tmp/bfu.time_ref.$$ rm -f $time_ref touch $time_ref || fail "$time_ref: Unable to create time reference." time_ref_seconds=$SECONDS print "\nCreating bfu execution environment ..." # # Save off a few critical libraries and commands, so that bfu will # continue to function properly even in the face of major # kernel/library/command incompatibilities during a live upgrade. # bfucmd=" /usr/bin/awk /usr/bin/cat /usr/bin/chgrp /usr/bin/chmod /usr/bin/chown /usr/bin/cmp /usr/bin/cp /usr/bin/cpio /usr/bin/csh /usr/bin/cut /usr/bin/date /usr/bin/dd /usr/bin/df /usr/bin/diff /usr/bin/du /usr/bin/echo /usr/bin/ed /usr/bin/egrep /usr/bin/env /usr/bin/ex /usr/bin/expr /usr/bin/false /usr/bin/fgrep /usr/bin/file /usr/bin/find /usr/bin/gettext /usr/bin/grep /usr/bin/head /usr/bin/id /usr/bin/ksh /usr/bin/line /usr/bin/ln /usr/bin/ls /usr/bin/mkdir /usr/bin/mktemp /usr/bin/more /usr/bin/mv /usr/bin/nawk /usr/bin/pgrep /usr/bin/pkginfo /usr/bin/pkill /usr/bin/printf /usr/bin/ps /usr/bin/ptree /usr/bin/rm /usr/bin/rmdir /usr/bin/sed /usr/bin/sh /usr/bin/sleep /usr/bin/sort /usr/bin/strings /usr/bin/stty /usr/bin/su /usr/bin/sum /usr/bin/tail /usr/bin/tee /usr/bin/touch /usr/bin/tr /usr/bin/true /usr/bin/truss /usr/bin/tty /usr/bin/uname /usr/bin/uniq /usr/bin/uptime /usr/bin/vi /usr/bin/w /usr/bin/wc /usr/bin/xargs /usr/bin/zcat /usr/sbin/add_drv /usr/sbin/chroot /usr/sbin/halt /usr/sbin/lockfs /usr/sbin/lofiadm /usr/sbin/mkfile /usr/sbin/mkfs /usr/sbin/mknod /usr/sbin/mount /usr/sbin/newfs /usr/sbin/pkgrm /usr/sbin/prtconf /usr/sbin/reboot /usr/sbin/sync /usr/sbin/tar /usr/sbin/uadmin /usr/sbin/umount /usr/sbin/wall /usr/sbin/zonecfg ${FASTFS-$GATE/public/bin/$bfu_isa/fastfs} ${GZIPBIN-$GATE/public/bin/$bfu_isa/gzip} " # # Scripts needed by BFU. These must be modified to use the interpreters in # /tmp/bfubin. The interpreters in /usr/bin may not be compatible with the # libraries in the archives being extracted. # bfuscr=" ${ACR-${GATE}/public/bin/acr} " # # basename and dirname may be ELF executables, not shell scripts; # make sure they go into the right list. # if `file /usr/bin/basename | grep ELF >/dev/null` then bfucmd="$bfucmd /usr/bin/basename" else bfuscr="$bfuscr /usr/bin/basename" fi if `file /usr/bin/dirname | grep ELF >/dev/null` then bfucmd="$bfucmd /usr/bin/dirname" else bfuscr="$bfuscr /usr/bin/dirname" fi rm -rf /tmp/bfubin mkdir /tmp/bfubin set $bfucmd isalist=`isalist` while [ $# -gt 0 ] do dir=${1%/*} cmd=${1##*/} cd $dir isacmd=`(find $isalist -name $cmd 2>/dev/null; echo $cmd) | head -1` cp $dir/$isacmd /tmp/bfubin || fail "cannot copy $dir/$isacmd" shift done # # Optional commands. We warn, but do not abort, if we are crossing a # feature boundary (where a command is not present in the parent). # Clauses requiring these commands must explicitly test for their # presence in /tmp/bfubin. # bfuoptcmd=" /sbin/biosdev /sbin/bootadm /sbin/installgrub /usr/sbin/fdisk /usr/sbin/metastat /usr/bin/mkisofs /usr/sbin/svcadm /usr/sbin/svccfg /usr/bin/svcprop " set $bfuoptcmd isalist=`isalist` while [ $# -gt 0 ] do dir=${1%/*} cmd=${1##*/} cd $dir isacmd=`(find $isalist -name $cmd 2>/dev/null; echo $cmd) | head -1` cp $dir/$isacmd /tmp/bfubin 2>/dev/null shift done # # set up installgrub and friends if transitioning to multiboot or directboot # do this now so ldd can determine library dependencies # # We split the binaries into two groups: the type where we want to make any # effort to get the newest version (like symdef and bootadm), and the type # where any old version will do (like installgrub and biosdev). # # If we're bfu'ing across the directboot/multiboot boundary, we need the new # bootadm and symdef to properly handle menu.lst changes. If the system is # directboot, we can use the local copies. If the system is multiboot but # the archives are directboot, we extract the binaries early. Otherwise, # we're not crossing the boundary, and which one we use doesn't matter. # # NB - if bootadm or symdef is ever changed to require a new library, the # early extraction will blow up horribly. # # For testing purposes, a user can set DIRECTBOOT_BIN_DIR in the environment, # and we'll use that instead. # MULTIBOOT_BIN_DIR=${MULTIBOOT_BIN_DIR:=${GATE}/public/multiboot} have_new_bootadm=unknown if [ -x $root/boot/solaris/bin/symdef ] && \ $root/boot/solaris/bin/symdef $root/platform/i86pc/kernel/unix dboot_image then root_is_directboot=yes else root_is_directboot=no fi # # A comma-separated list of the command and the archive it's in # multiboot_new_cmds=" sbin/bootadm,generic.sbin boot/solaris/bin/symdef,i86pc.boot " if [ $multi_or_direct = yes ]; then for line in $multiboot_new_cmds do cmd=${line%,*} file=${cmd##*/} archive=${line#*,} if [ -n "$DIRECTBOOT_BIN_DIR" ] && \ [ -f $DIRECTBOOT_BIN_DIR/$file ]; then cp $DIRECTBOOT_BIN_DIR/$file /tmp/bfubin/ else if [ $root_is_directboot = yes ]; then cp $root/$cmd /tmp/bfubin/ have_new_bootadm=yes elif [ $archive_type = directboot ]; then DBOOT_TMPDIR=/tmp/dboot.$$ trap "rm -rf $DBOOT_TMPDIR" EXIT OLD_PWD=$(pwd) rm -rf $DBOOT_TMPDIR mkdir $DBOOT_TMPDIR cd $DBOOT_TMPDIR $ZCAT $cpiodir/${archive}$ZFIX | \ cpio -id "$cmd" 2>/dev/null if [ -x $cmd ]; then cp $cmd /tmp/bfubin/ have_new_bootadm=yes fi cd $OLD_PWD rm -rf $DBOOT_TMPDIR trap - EXIT fi fi # # If all else fails, grab the local version # if [ ! -x /tmp/bfubin/$file ]; then [ -x /$cmd ] && cp /$cmd /tmp/bfubin fi done if [ $archive_type = directboot ] && [ $root_is_directboot = yes ]; then cleanup_eeprom_console fi fi multiboot_cmds=" /sbin/biosdev /sbin/installgrub " copying_mboot_cmds=no if [ $multi_or_direct = yes ]; then for cmd in $multiboot_cmds do file=`basename $cmd` if [ -f $cmd ]; then cp $cmd /tmp/bfubin elif [ -n "$DIRECTBOOT_BIN_DIR" ] && [ -d $DIRECTBOOT_BIN_DIR ] && [ -x $DIRECTBOOT_BIN_DIR/$file ]; then cp $DIRECTBOOT_BIN_DIR/$file /tmp/bfubin/ else if [ ! -d $MULTIBOOT_BIN_DIR ]; then echo "$MULTIBOOT_BIN_DIR: not found" elif [ ! -f $MULTIBOOT_BIN_DIR/$file ]; then echo "$MULTIBOOT_BIN_DIR/$file: not found" fi if [ $copying_mboot_cmds = no ]; then echo "installing files from $MULTIBOOT_BIN_DIR" copying_mboot_cmds=yes fi cp $MULTIBOOT_BIN_DIR/$file /tmp/bfubin fi done fi # # If available, use ldd to determine which libraries bfu depends on. # Otherwise, just make an educated guess. # if [ -x /usr/bin/ldd ]; then bfulib="`ldd /tmp/bfubin/* | nawk '$3 ~ /lib/ { print $3 }' | sort -u`" else bfulib=" /lib/libc.so.1 /lib/libm.so.2 /lib/libdoor.so.1 /lib/libm.so.2 /lib/libmd.so.1 /lib/libmd5.so.1 /lib/libnvpair.so.1 /lib/libscf.so.1 /lib/libuutil.so.1 /usr/lib/libbsm.so.1 /usr/lib/libc2.so /usr/lib/libdl.so.1 /usr/lib/libelf.so.1 /usr/lib/libkstat.so.1 /usr/lib/libmapmalloc.so.1 /usr/lib/libmp.so.1 /usr/lib/libnsl.so.1 /usr/lib/libpam.so.1 /usr/lib/libsec.so.1 /usr/lib/libsocket.so.1 /usr/lib/libtecla.so.1 " fi # add dlopen()'ed stuff bfulib=" $bfulib /lib/ld.so.1 /usr/lib/nss_* " # add libc_psr.so.1, if available and not empty if [ -s /platform/`uname -i`/lib/libc_psr.so.1 ]; then bfulib=" $bfulib /platform/`uname -i`/lib/libc_psr.so.1 " fi rm -rf /tmp/bfulib /tmp/bl mkdir /tmp/bfulib /tmp/bl # # Create 64 bit directory structure and determine 64 bit arch name. # if [ -h /usr/lib/64 ] then link=`ls -dl /usr/lib/64 | awk '{print $NF}'` ln -s $link /tmp/bfulib/64 ln -s $link /tmp/bl/64 mkdir /tmp/bfulib/$link /tmp/bl/$link bfulib="$bfulib /usr/lib/64/nss_*" # # Copy libraries to proper directories # for lib in $bfulib do case $lib in */64/* | */$link/*) cp $lib /tmp/bfulib/64;; *) cp $lib /tmp/bfulib;; esac done # # Private 64 bit runtime linker. # cp /lib/64/ld.so.1 /tmp/bfulib/64/bf.1 cp /lib/64/ld.so.1 /tmp/bl/64/bf.1 else cp $bfulib /tmp/bfulib fi cp /lib/ld.so.1 /tmp/bfulib/bf.1 # bfu's private runtime linker cp /lib/ld.so.1 /tmp/bl/bf.1 ${BFULD-$GATE/public/bin/$bfu_isa/bfuld} /tmp/bfubin/* || fail "bfuld failed" for x in $bfuscr do sed -e 's/\/usr\/bin\//\/tmp\/bfubin\//g' \ -e 's/\/bin\//\/tmp\/bfubin\//g' < $x > /tmp/bfubin/`basename $x` chmod +x /tmp/bfubin/`basename $x` done # # scripts used together with multiboot # multiboot_scr=" /boot/solaris/bin/create_ramdisk /boot/solaris/bin/create_diskmap /boot/solaris/bin/root_archive " if [ $multi_or_direct = yes ]; then for cmd in $multiboot_scr do file=`basename $cmd` if [ -f $cmd ]; then cp $cmd /tmp/bfubin else if [ ! -d $MULTIBOOT_BIN_DIR ]; then echo "$MULTIBOOT_BIN_DIR: not found" fail "" fi if [ ! -f $MULTIBOOT_BIN_DIR/$file ]; then echo "$MULTIBOOT_BIN_DIR/$file: not found" fail "" fi echo "copying $file from $MULTIBOOT_BIN_DIR" cp $MULTIBOOT_BIN_DIR/$file /tmp/bfubin fi # # We do two substitutions here to replace references to # both /usr/bin/ and /bin/ with /tmp/bfubin/ # mv /tmp/bfubin/${file} /tmp/bfubin/${file}- sed -e 's/\/usr\/bin\//\/tmp\/bfubin\//g' \ -e 's/\/bin\//\/tmp\/bfubin\//g' \ < /tmp/bfubin/${file}- > /tmp/bfubin/${file} chmod +x /tmp/bfubin/${file} done fi # # For directboot archives, /boot/platform/i86pc/kernel/unix will be # overwritten, which could cause a mis-match with the failsafe # miniroot. Extract unix from the miniroot and save it off for now. # if [ $archive_type = directboot ] && [ $diskless = no ]; then if gunzip -c "$root/boot/x86.miniroot-safe" \ >/tmp/bfubin/miniroot-unzipped; then lofifile=/tmp/bfubin/miniroot-unzipped else # Shouldn't happen? See if someone already unzipped it. lofifile="$root/boot/x86.miniroot-safe" fi lofidev=`lofiadm -a $lofifile 2>/dev/null` if [ -n "$lofidev" ]; then mkdir /tmp/bfubin/mnt mount -r $lofidev /tmp/bfubin/mnt unix=/tmp/bfubin/mnt/boot/platform/i86pc/kernel/unix if [ -f $unix ]; then cp $unix /tmp/bfubin/unix failsafe_type=directboot elif [ -f /tmp/bfubin/mnt/platform/i86pc/multiboot ] then failsafe_type=multiboot fi umount /tmp/bfubin/mnt rmdir /tmp/bfubin/mnt lofiadm -d $lofidev fi rm -f /tmp/bfubin/miniroot-unzipped fi create_datalink_conf() { # /etc/datalink.conf needs to be populated. drivers="bge rge xge" conf=$rootprefix/etc/datalink.conf if [ ! -f $conf ]; then # nothing to do if we bfu'ed from an archive that doesn't # provide /etc/datalink.conf return fi ls -1 $rootprefix/etc | egrep -e '^hostname.|^hostname6.|^dhcp.' | \ cut -d . -f2 | sort -u > /tmp/ifnames.$$ for driver in $drivers do grep $driver /tmp/ifnames.$$ | \ while read ifname do devnum=`echo $ifname | sed "s/$driver//g"` if [ "$driver$devnum" != $ifname -o \ -n "`echo $devnum | tr -d '[0-9]'`" ]; then echo "skipping invalid interface $ifname" continue fi vid=`expr $devnum / 1000` inst=`expr $devnum % 1000` awk '{ print $1 }' $conf | grep $ifname > /dev/null if [ $? -ne 0 ]; then # An entry for that interface does not exist printf \ "$ifname\t$driver$inst\t0\t$vid\n" \ >> $conf fi done done rm -f /tmp/ifnames.$$ } revert_aggregation_conf() { aggrconf=$rootprefix/etc/aggregation.conf nawk ' /^[ \t]*#/ || /^[ \t]*$/ || $4 ~ "/0" { print; next; } { OFS="\t"; gsub(/[^,]*/, "&/0", $4); print; }' $aggrconf > $aggrconf.bfutmp mv -f $aggrconf.bfutmp $aggrconf } remove_initd_links() { # If we're delivering a new version of an existing /etc/init.d script, # remove all hard links to the existing file in /etc/rc?.d whose # names begin with [SK][0-9][0-9]. Additionally, in case an S or K # file was previously delivered as a symbolic link or the hard link # was broken, remove any file in /etc/rc?.d whose name is # [SK][0-9][0-9] followed by the basename of the file we're going # to update in /etc/init.d. print "Removing init.d links ... \c" scripts=`$ZCAT $cpiodir/generic.root$ZFIX | cpio -it 2>/dev/null | grep '^etc/init\.d/'` if [ -n "$scripts" ]; then inodes=`ls -li $scripts 2>/dev/null | \ nawk '{ print "-inum " $1 " -o " }'` names=`ls -1 $scripts 2>/dev/null | \ nawk -F/ '{ print "-name [SK][0-9][0-9]" $NF }'` find etc/rc?.d \( $inodes $names \) -print | xargs rm -f fi print "done." } # # Remove the old 5.005_03 version of perl. # remove_perl_500503() { # Packages to remove. typeset -r perl_pkgs='SUNWopl5m SUNWopl5p SUNWopl5u' typeset -r pkgroot=${rootprefix:+-R $rootprefix} typeset pkg # # First, attempt to remove the packages cleanly if possible. # printf 'Removing perl 5.005_03 packages' for pkg in $perl_pkgs do if pkginfo $pkgroot -q $pkg; then printf ' %s' $pkg pkgrm $pkgroot -n $pkg >/dev/null 2>&1 fi done printf '\n' # # In case that didn't work, do it manually. # printf 'Removing perl 5.005_03 from %s/var/sadm/install/contents' \ $rootprefix for pkg in $PKGS do printf ' %s' $pkg if [ -d $rootprefix/var/sadm/pkg/$pkg ]; then rm -rf $rootprefix/var/sadm/pkg/$pkg grep -vw $pkg $rootprefix/var/sadm/install/contents > \ /tmp/contents.$$ cp /tmp/contents.$$ /var/sadm/install/contents.$$ rm /tmp/contents.$$ fi done printf '\n' # # Remove any remaining 5.005_03 files, # printf 'Removing perl 5.005_03 from %s/perl5\n' $usr # Directories. rm -rf $usr/perl5/5.00503 rm -rf $usr/perl5/site_perl/5.005 } # # Remove ASET # remove_eof_aset() { # Packages to remove typeset -r aset_pkgs='SUNWast' typeset -r pkgroot=${rootprefix:+-R $rootprefix} typeset pkg printf 'Removing ASET... ' # # First, attempt to remove the packages cleanly if possible. # for pkg in $aset_pkgs do if pkginfo $pkgroot -q $pkg; then printf ' %s' $pkg pkgrm $pkgroot -n $pkg >/dev/null 2>&1 fi done printf '\n' # # In case that didn't work, do it manually. # Remove ASET from $rootprefix/var/sadm/install/contents # for pkg in $aset_pkgs do if [ -d $rootprefix/var/sadm/pkg/$pkg ]; then rm -rf $rootprefix/var/sadm/pkg/$pkg grep -vw $pkg $rootprefix/var/sadm/install/contents > \ /tmp/contents.$$ cp /tmp/contents.$$ $rootprefix/var/sadm/install/contents.$$ rm /tmp/contents.$$ fi done # # Cleanup any remaining ASET files, symlinks, and directories. # rm -rf $usr/aset } # # Remove BIND 8 named server/tools packages # remove_eof_bind8() { # Packages to remove typeset -r bind8_pkg='SUNWinamd' typeset -r pkgroot=${rootprefix:+-R $rootprefix} typeset pkg printf 'Removing BIND 8 named server/tools... ' # # We cann't pkgrm SUNWinamd at this time as the BIND 9 binaries are # already in /usr/sbin. # Remove BIND 8 packages from $rootprefix/var/sadm/install/contents # for pkg in $bind8_pkgs do if [ -d $rootprefix/var/sadm/pkg/$pkg ]; then rm -rf $rootprefix/var/sadm/pkg/$pkg grep -vw $pkg $rootprefix/var/sadm/install/contents > \ /tmp/contents.$$ cp /tmp/contents.$$ /var/sadm/install/contents.$$ rm /tmp/contents.$$ fi done # # Cleanup any BIND 8 specific files, symlinks. # # files and symlinks. rm -f $usr/sbin/named-xfer rm -f $usr/lib/nslookup.help rm -f $usr/sbin/dnskeygen rm -f $usr/sbin/named-bootconf rm -f $usr/sbin/nstest rm -rf $rootprefix/var/run/ndc.d printf 'done.\n' } # # Remove the 5.8.3 version of perl. # remove_perl_583() { # # Copy perl 5.8.3 into the new 5.8.4 locations. This will preserve # any add-on modules that might have been installed, and any 5.8.3 # core files that get copied over will be replaced by the new 5.8.4 # versions when the cpio archives are subsequently extracted. # printf 'Preserving user-installed perl modules...\n' mkdir -p $usr/perl5/5.8.4 cp -rp $usr/perl5/5.8.3/* \ $usr/perl5/5.8.4 mkdir -p $usr/perl5/site_perl/5.8.4 cp -rp $usr/perl5/site_perl/5.8.3/* \ $usr/perl5/site_perl/5.8.4 mkdir -p $usr/perl5/vendor_perl/5.8.4 cp -rp $usr/perl5/vendor_perl/5.8.3/* \ $usr/perl5/vendor_perl/5.8.4 # # Update the #! lines in any scripts in /usr/perl5/5.8.4/bin to refer # to 5.8.4 instead of 5.8.3. Take care to edit only scripts. # typeset bindir="$usr/perl5/5.8.4/bin" typeset script for script in $(ls $bindir); do script="$bindir/$script" if [[ $script = "$usr/perl5/5.8.4/bin/perl5.8.3" ]]; then rm -f $script elif file $script | \ egrep -s 'executable .*perl .*script'; then sed -e \ 's!/usr/perl5/5.8.3/bin/perl!/usr/perl5/5.8.4/bin/perl!g' \ < $script > $script.tmp mv -f $script.tmp $script fi done # # Packages to remove. # typeset -r perl_pkgs='SUNWperl583man SUNWperl583usr SUNWperl583root' typeset -r pkgroot=${rootprefix:+-R $rootprefix} # # First, attempt to remove the packages cleanly if possible. # typeset pkg printf 'Removing perl 5.8.3 packages' for pkg in $perl_pkgs do if pkginfo $pkgroot -q $pkg; then printf ' %s' $pkg pkgrm $pkgroot -n $pkg >/dev/null 2>&1 fi done printf '\n' # # In case that didn't work, do it manually. # printf 'Removing perl 5.8.3 from %s/var/sadm/install/contents' \ $rootprefix for pkg in $PKGS do printf ' %s' $pkg if [ -d $rootprefix/var/sadm/pkg/$pkg ]; then rm -rf $rootprefix/var/sadm/pkg/$pkg grep -vw $pkg $rootprefix/var/sadm/install/contents > \ /tmp/contents.$$ cp /tmp/contents.$$ /var/sadm/install/contents.$$ rm /tmp/contents.$$ fi done printf '\n' # # Remove any remaining 5.8.3 files, # and fix up the symlinks if necessary. # printf 'Removing perl 5.8.3 from %s/perl5\n' $usr # Directories. rm -rf $usr/perl5/5.8.3 rm -rf $usr/perl5/site_perl/5.8.3 rm -rf $usr/perl5/vendor_perl/5.8.3 # bin symlink. rm -f $usr/perl5/bin ln -s ./5.8.4/bin $usr/perl5/bin # pod symlink. rm -f $usr/perl5/pod ln -s ./5.8.4/lib/pod $usr/perl5/pod # # man symlink. In earlier S10 builds the man symlink mistakenly points # to the 5.6.1 manpages, instead of 5.8.3. Fix to point to 5.8.4. # rm -f $usr/perl5/man ln -s ./5.8.4/man $usr/perl5/man # Symlink /bin/perl to 5.8.4. rm -f $usr/bin/perl ln -s ../perl5/5.8.4/bin/perl $usr/bin/perl } # # Remove FNS/XFN packages # remove_eof_fns() { # Packages to remove typeset -r fns_pkgs='SUNWfnx5x SUNWfnsx5 SUNWfnsx SUNWfns' typeset -r pkgroot=${rootprefix:+-R $rootprefix} typeset pkg printf 'Removing FNS/XFN ... ' # # First, attempt to remove the packages cleanly if possible. # for pkg in $fns_pkgs do if pkginfo $pkgroot -q $pkg; then printf ' %s' $pkg pkgrm $pkgroot -n $pkg >/dev/null 2>&1 fi done printf '\n' # # In case that didn't work, do it manually. # Remove FNS/XFN from $rootprefix/var/sadm/install/contents # for pkg in $fns_pkgs do if [ -d $rootprefix/var/sadm/pkg/$pkg ]; then rm -rf $rootprefix/var/sadm/pkg/$pkg grep -vw $pkg $rootprefix/var/sadm/install/contents > \ /tmp/contents.$$ cp /tmp/contents.$$ $rootprefix/var/sadm/install/contents.$$ rm /tmp/contents.$$ fi done # # Cleanup if any remaining FNS/XFN files, symlinks, and directories. # # directories. rm -rf $rootprefix/etc/fn rm -rf $usr/include/xfn rm -rf $usr/lib/fn rm -rf $rootprefix/var/fn # files and symlinks. rm -f $rootprefix/etc/fn.conf rm -f $usr/bin/fnattr rm -f $usr/bin/fnbind rm -f $usr/bin/fncreate_printer rm -f $usr/bin/fnlist rm -f $usr/bin/fnlookup rm -f $usr/bin/fnrename rm -f $usr/bin/fnsearch rm -f $usr/bin/fnunbind rm -f $usr/sbin/fncheck rm -f $usr/sbin/fncopy rm -f $usr/sbin/fncreate rm -f $usr/sbin/fncreate_fs rm -f $usr/sbin/fndestroy rm -f $usr/sbin/fnselect rm -f $usr/sbin/fnsypd rm -f $usr/lib/libfn_p.so rm -f $usr/lib/libfn_p.so.1 rm -f $usr/lib/libfn_spf.so rm -f $usr/lib/libfn_spf.so.1 rm -f $usr/lib/libxfn.so rm -f $usr/lib/libxfn.so.1 rm -f $usr/lib/libxfn.so.2 rm -f $usr/lib/sparcv9/libfn_p.so rm -f $usr/lib/sparcv9/libfn_p.so.1 rm -f $usr/lib/sparcv9/libfn_spf.so rm -f $usr/lib/sparcv9/libfn_spf.so.1 rm -f $usr/lib/sparcv9/libxfn.so rm -f $usr/lib/sparcv9/libxfn.so.1 rm -f $usr/lib/sparcv9/libxfn.so.2 } remove_eof_face() { # Packages to remove typeset -r face_pkgs='SUNWfac' typeset -r pkgroot=${rootprefix:+-R $rootprefix} typeset pkg printf 'Removing AT&T FACE... ' # # First, attempt to remove the packages cleanly if possible. # for pkg in $face_pkgs do if pkginfo $pkgroot -q $pkg; then printf ' %s' $pkg pkgrm $pkgroot -n $pkg >/dev/null 2>&1 fi done printf '\n' # # In case that didn't work, do it manually. # Remove FACE from $rootprefix/var/sadm/install/contents # for pkg in $face_pkgs do if [ -d $rootprefix/var/sadm/pkg/$pkg ]; then rm -rf $rootprefix/var/sadm/pkg/$pkg grep -vw $pkg $rootprefix/var/sadm/install/contents > \ /tmp/contents.$$ cp /tmp/contents.$$ $rootprefix/var/sadm/install/contents.$$ rm /tmp/contents.$$ fi done # # Cleanup any remaining FACE files, symlinks, and directories. # rm -rf $usr/oasys rm -rf $usr/vmsys } remove_eof_dmi() { # Packages to remove typeset -r dmi_pkgs='SUNWsadmi' typeset -r pkgroot=${rootprefix:+-R $rootprefix} typeset pkg printf 'Removing DMI... ' # # First, attempt to remove the packages cleanly if possible. # for pkg in $dmi_pkgs do if pkginfo $pkgroot -q $pkg; then printf ' %s' $pkg pkgrm $pkgroot -n $pkg >/dev/null 2>&1 fi done printf '\n' # # In case that didn't work, do it manually. # Remove DMI from $rootprefix/var/sadm/install/contents # for pkg in $dmi_pkgs do if [ -d $rootprefix/var/sadm/pkg/$pkg ]; then rm -rf $rootprefix/var/sadm/pkg/$pkg grep -vw $pkg $rootprefix/var/sadm/install/contents > \ /tmp/contents.$$ cp /tmp/contents.$$ $rootprefix/var/sadm/install/contents.$$ rm /tmp/contents.$$ fi done # # Cleanup any remaining DMI files, symlinks, and directories. # rm -rf $usr/lib/dmi rm -rf $rootprefix/var/dmi rm -rf $rootprefix/etc/dmi rm -f $usr/lib/libdmi.so rm -f $usr/lib/libdmici.so rm -f $usr/lib/libdmimi.so rm -f $usr/lib/libdmi.so.1 rm -f $usr/lib/libdmici.so.1 rm -f $usr/lib/libdmimi.so.1 rm -f $usr/lib/sparcv9/libdmi.so rm -f $usr/lib/sparcv9/libdmici.so rm -f $usr/lib/sparcv9/libdmimi.so rm -f $usr/lib/sparcv9/libdmi.so.1 rm -f $usr/lib/sparcv9/libdmici.so.1 rm -f $usr/lib/sparcv9/libdmimi.so.1 rm -f $usr/lib/amd64/libdmi.so rm -f $usr/lib/amd64/libdmici.so rm -f $usr/lib/amd64/libdmimi.so rm -f $usr/lib/amd64/libdmi.so.1 rm -f $usr/lib/amd64/libdmici.so.1 rm -f $usr/lib/amd64/libdmimi.so.1 rm -f $usr/sbin/dmi_cmd rm -f $usr/sbin/dmiget rm -f $rootprefix/etc/init.d/init.dmi rm -f $rootprefix/etc/rc0.d/K07dmi rm -f $rootprefix/etc/rc1.d/K07dmi rm -f $rootprefix/etc/rc2.d/K07dmi rm -f $rootprefix/etc/rcS.d/K07dmi rm -f $rootprefix/etc/rc3.d/S77dmi } # # Remove vold # remove_eof_vold() { printf 'Removing vold... ' rm -rf $usr/lib/vold rm -rf $usr/lib/rmmount rm -f $usr/lib/fs/hsfs/ident_hsfs.so.1 rm -f $usr/lib/fs/pcfs/ident_pcfs.so.1 rm -f $usr/lib/fs/udfs/ident_udfs.so.1 rm -f $usr/lib/fs/ufs/ident_ufs.so.1 rm -f $usr/sbin/vold rm -f $usr/kernel/drv/vol rm -f $usr/kernel/drv/amd64/vol rm -f $usr/kernel/drv/sparcv9/vol rm -f $usr/include/rmmount.h rm -f $usr/include/vol.h rm -f $rootprefix/etc/vold.conf rm -f $rootprefix/etc/rmmount.conf printf '\n' } remove_properties() { # # Remove obsolete smartii setprop from bootenv.rc # srcbootenvrc=$root/boot/solaris/bootenv.rc tmpbootenvrc=/tmp/tmp.bootenvrc.$$ # Don't touch bootenv.rc unless it contains obsolete property egrep -s 'target-driver-for-smartii' $srcbootenvrc 2>/dev/null res=$? if [ -f $srcbootenvrc -a $res -eq 0 ]; then egrep -v "target-driver-for-smartii"\ $srcbootenvrc > $tmpbootenvrc 2>/dev/null cp $tmpbootenvrc $srcbootenvrc fi rm -f $tmpbootenvrc } enable_crypto_unlimited() { # This is a "copy" of the SUNWcry* postinstall scripts. # We enable the encryption kit aes256, arcfour2048, and blowfish448 modules. # This is needed to ensure bfu users continue to have the full strength of # cryptographic algorithms they use. print "Simulating SUNWcry* installation...\c" kcfconf=$rootprefix/etc/crypto/kcf.conf ipsecalgs=$rootprefix/etc/inet/ipsecalgs cp $kcfconf ${kcfconf}.tmp sed -e 's/^aes:/aes256:/' -e 's/^blowfish:/blowfish448:/' -e \ 's/^arcfour:/arcfour2048:/'\ $kcfconf > ${kcfconf}.tmp mv -f ${kcfconf}.tmp $kcfconf cp $ipsecalgs ${ipsecalgs}.tmp sed -e 's/_CBC|128\/32-128,8/_CBC|128\/32-448,8/' \ -e 's/AES_CBC|128|/AES_CBC|128\/128-256,64|/' \ $ipsecalgs > ${ipsecalgs}.tmp mv -f ${ipsecalgs}.tmp $ipsecalgs # Since we do that for the kernel we do it for userland as well. # "Clone" the policy for pkcs11_softtoken to the encryption kit version # and "disable" pkcs11_softoken. pkcs11conf=$rootprefix/etc/crypto/pkcs11.conf cp $pkcs11conf ${pkcs11conf}.tmp sed 's/pkcs11_softtoken\.so/pkcs11_softtoken_extra.so/' \ $pkcs11conf > ${pkcs11conf}.tmp mv -f ${pkcs11conf}.tmp $pkcs11conf print "\n" } # # Add metaslot configuration to pkcs11.conf if it doesn't already exist # enable_crypto_metaslot() { pkcs11conf=$rootprefix/etc/crypto/pkcs11.conf egrep '^metaslot' ${pkcs11conf} > /dev/null 2>& 1 if [ $? != 0 ] ; then print "Adding cryptographic framework's meta slot feature" cp $pkcs11conf ${pkcs11conf}.tmp export metaslot_config=\ "metaslot:metaslot_status=enabled;metaslot_auto_key_migrate=enabled;"\ "metaslot_token=Sun Software PKCS#11 softtoken;"\ "metaslot_slot=Sun Crypto Softtoken" nawk '/^# End SUNWcsr/ \ { print ENVIRON["metaslot_config"] } \ { print } \ ' ${pkcs11conf} > ${pkcs11conf}.tmp mv -f ${pkcs11conf}.tmp $pkcs11conf print "\n" fi } cleanup_kerberos_mechanisms() { # # This checks to see if the old 'gl' and 'do' directories # for the Kerberos GSS-API mechanisms can be deleted. # If the mechanism exists in /usr/lib/gss, then the old # subdirs may be deleted. # print "Cleaning up old Kerberos GSS-API mechanisms...\c" kerneldir=kernel/misc/kgss kerneldir_sparc=kernel/misc/kgss/sparcv9 newmech=no; if [ -f $usr/lib/gss/mech_krb5.so.1 ]; then # # There is a mech in the "new" location, so # the old stuff can be deleted. # if [ -d $usr/lib/gss/gl ]; then rm -rf $usr/lib/gss/gl fi if [ -d $usr/lib/gss/do ]; then rm -rf $usr/lib/gss/do fi newmech=yes; fi if [ -f $usr/lib/sparcv9/gss/mech_krb5.so.1 ]; then if [ -d $usr/lib/sparcv9/gss/gl ]; then rm -rf $usr/lib/sparcv9/gss/gl fi if [ -d $usr/lib/sparcv9/gss/do ]; then rm -rf $usr/lib/sparcv9/gss/do fi fi # # Cleanup kernel mechanisms from default location # if [ -f $rootprefix/$kerneldir/kmech_krb5 ]; then if [ -f $rootprefix/$kerneldir/gl_kmech_krb5 ]; then rm -f $rootprefix/$kerneldir/gl_kmech_krb5 fi if [ -f $rootprefix/$kerneldir/do_kmech_krb5 ]; then rm -f $rootprefix/$kerneldir/do_kmech_krb5 fi fi # # For SPARC, cleanup from 2 locations. # # 1. /kernel/misc/kgss/sparcv9 # if [ -f $rootprefix/$kerneldir_sparc/kmech_krb5 ]; then if [ -f $rootprefix/$kerneldir_sparc/gl_kmech_krb5 ]; then rm -f $rootprefix/$kerneldir_sparc/gl_kmech_krb5 fi if [ -f $rootprefix/$kerneldir_sparc/do_kmech_krb5 ]; then rm -f $rootprefix/$kerneldir_sparc/do_kmech_krb5 fi fi # # 2. /platform/sun4u/kernel/misc/kgss/sparcv9 # kerneldir_sparc=platform/$karch/$kerneldir_sparc if [ -f $rootprefix/$kerneldir_sparc/kmech_krb5 ]; then if [ -f $rootprefix/$kerneldir_sparc/gl_kmech_krb5 ]; then rm -f $rootprefix/$kerneldir_sparc/gl_kmech_krb5 fi if [ -f $rootprefix/$kerneldir_sparc/do_kmech_krb5 ]; then rm -f $rootprefix/$kerneldir_sparc/do_kmech_krb5 fi fi # # Make sure the GSS mechanism configuration file is correct # if [ "$newmech" = "yes" ]; then gssmechconf=$rootprefix/etc/gss/mech sed -e 's/gl\/mech_krb5\.so/mech_krb5\.so/' \ -e 's/do\/mech_krb5\.so/mech_krb5\.so/' \ -e 's/gl_kmech_krb5/kmech_krb5/' \ -e 's/do_kmech_krb5/kmech_krb5/'\ $gssmechconf > ${gssmechconf}.tmp if [ $? -eq 0 ]; then mv -f ${gssmechconf}.tmp $gssmechconf else echo "WARNING: update of $gssmechconf failed." return 1 fi fi print "\n" } mpxiodisableno='^[ ]*mpxio-disable[ ]*=[ ]*"no"[ ]*;' mpxiodisableyes='^[ ]*mpxio-disable[ ]*=[ ]*"yes"[ ]*;' # # fix up audit permissions # fix_up_audit() { chmod 644 $root/etc/security/audit_control chmod 644 $root/etc/security/audit_user } # # disable mpxio on fp(7D) ports using fp.conf # disable_mpxio_using_fpconf() { conffile=$rootprefix/kernel/drv/fp.conf test -f $conffile || return egrep -s "$mpxiodisableyes" $conffile && return print "To preserve device names, disabled mpxio on fp(7D) ports by" if egrep -s "$mpxiodisableno" $conffile; then tmpfile=/tmp/fp.conf.$$ sed "s/$mpxiodisableno/mpxio-disable=\"yes\";/" $conffile \ > $tmpfile cp $tmpfile $conffile rm -f $tmpfile print "changing the value of mpxio-disable to \"yes\" in" \ "$conffile" else echo 'mpxio-disable="yes";' >> $conffile print "adding mpxio-disable=\"yes\" entry to $conffile" fi } # # enable mpxio in scsi_vhci # enable_mpxio_using_scsivhciconf() { # # depending on whether the bfu restored the child's or parent's version # of scsi_vhci.conf file, we may already have the file with the change # we need in place. So make the change only if necessary. # conffile=$rootprefix/kernel/drv/scsi_vhci.conf egrep -s "$mpxiodisableno" $conffile && return print "To preserve device names, restored your current mpxio" \ "configuration by" if egrep -s "$mpxiodisableyes" $conffile; then tmpfile=/tmp/scsi_vhci.conf.$$ sed "s/$mpxiodisableyes/mpxio-disable=\"no\";/" $conffile \ > $tmpfile cp $tmpfile $conffile rm -f $tmpfile print "changing the value of mpxio-disable to \"no\" in" \ "$conffile" else echo 'mpxio-disable="no";' >> $conffile print "adding mpxio-disable=\"no\" entry to $conffile" fi } # # restore the pre-bfu MPxIO on/off setting to the post-bfued configuration # fixup_mpxio() { conffile=$rootprefix/kernel/drv/scsi_vhci.conf parentconffile=$rootprefix/bfu.parent/kernel/drv/scsi_vhci.conf childconffile=$rootprefix/bfu.child/kernel/drv/scsi_vhci.conf ancestorconffile=$rootprefix/bfu.ancestor/kernel/drv/scsi_vhci.conf # if scsi_vhci.conf doesn't exist return test -f $conffile || return # # Determine the mpxio setting in the child. If the system was bfued # before and running with mpxio on by deafult bits, can't rely on the # mpxio-disable entry in the child's scsi_vhci.conf file as it may # contain stale left over entries. # mpxio_child=1 if [ -f $ancestorconffile ]; then if egrep -s "$mpxiodisableyes" $ancestorconffile; then # # prior to the bfu the system was running with # mpxio off by default bits. # mpxio_child=0 egrep -s "$mpxiodisableno" $childconffile && \ mpxio_child=1 fi else egrep -s "$mpxiodisableyes" $childconffile && mpxio_child=0 fi if egrep -s "$mpxiodisableyes" $parentconffile; then # these bits require explicit enabling of mpxio at in scsi_vhci if [ $mpxio_child -eq 1 ]; then egrep -s "$mpxiodisableyes" \ $rootprefix/kernel/drv/fp.conf || \ enable_mpxio_using_scsivhciconf fi else # # these bits have mpxio enabled by default in scsi_vhci. # if mpxio is disabled in the child, disable mpxio on all # fp(7D) ports using fp.conf. # [ $mpxio_child -eq 0 ] && disable_mpxio_using_fpconf fi } # # Check to see if root in $1 has a mounted boot, and that # it's mounted at the right place for bfu to handle it. # # Returns 0 (true) if bfu can handle the upgrade; fails if not # boot_is_upgradeable() { ROOT=$1 if [ "$ROOT" = "/" ] ; then ROOT=""; fi BOOTPARTDEV="$(grep -s -v '^#' ${ROOT}/etc/vfstab | \ grep "[ ]/boot[ ]*pcfs[ ]" | \ awk '{print $1}')" # find out if, and where, boot is mounted if [ -n "$BOOTPARTDEV" ] ; then if [ -n "$ROOT" ] ; then BOOTMNT=$(mount | grep "$BOOTPARTDEV" | \ awk '{print $1}') else BOOTMNT="/boot" fi if [ "$BOOTMNT" != ${ROOT}/boot ] ; then cat << BOOTMOUNTERR ${ROOT} refers to an x86 boot partition, but it's not mounted at ${ROOT}/boot. BOOTMOUNTERR fail "Mount ${ROOT}s bootpart at ${ROOT}/boot.\n\n" fi fi return 0 } # update the realmode boot programs at $1 (root) # from classic boot psm/stand/bootblks/ufs/i386/installboot.sh install_boot_i386() { PBOOT=$1 BOOTBLK=$2 DEVICE=$3 if [ ! -f $PBOOT ]; then echo "$PBOOT: File not found" return 1 fi if [ ! -f $BOOTBLK ]; then echo "$BOOTBLK: File not found" return 1 fi if [ ! -c $DEVICE ]; then echo "$DEVICE: Not a character device" return 1 fi if [ ! -w $DEVICE ]; then echo "$DEVICE: Not writeable" return 1 fi # pboot at block 0, label at blocks 1 and 2, bootblk from block 3 on dd if=$PBOOT of=$DEVICE bs=1b count=1 conv=sync >/dev/null 2>&1 dd if=$BOOTBLK of=$DEVICE bs=1b oseek=3 conv=sync >/dev/null 2>&1 return 0 } update_realmode_booters() { ROOT=$1 TMPDIR=/tmp/rmupdate.$$ trap "rm -rf $TMPDIR" EXIT # go get new versions of boot files into TMPDIR OLD_PWD=$(pwd) mkdir $TMPDIR cd $TMPDIR # i86pc.boot archive REQFILES="boot/mdboot boot/strap.com" $ZCAT $cpiodir/i86pc.boot$ZFIX | cpio -id $REQFILES 2>/dev/null mv $REQFILES $TMPDIR # i86pc.usr archive REQFILES="usr/platform/i86pc/lib/fs/ufs/pboot" REQFILES="$REQFILES usr/platform/i86pc/lib/fs/ufs/bootblk" $ZCAT $cpiodir/i86pc.usr$ZFIX | cpio -id $REQFILES 2>/dev/null mv $REQFILES $TMPDIR cd $OLD_PWD grep -s -v '^#' ${ROOT}/etc/vfstab | \ grep "[ ]/boot[ ]*pcfs[ ]" >/dev/null if [ $? -eq 0 ] ; then echo 'Updating /boot on x86 boot partition.' REQFILES="mdboot strap.com" for f in ${REQFILES}; do if [ ! -f ${TMPDIR}/$f ]; then fail "Missing $f, aborting." fi done MDBOOT=${TMPDIR}/mdboot STRAP=${TMPDIR}/strap.com LUBIN=/usr/lib/lu TMP_FDFILE1=${TMPDIR}/fdfile1.$$ LOGFILE=${TMPDIR}/mkfs.log.$$ DDCOPY=${TMPDIR}/.dd_x86_boot_copy DISKID="$(grep -s -v '^#' ${ROOT}/etc/vfstab | \ grep "[ ]/boot[ ]*pcfs[ ]" |\ awk '{print $1}' | sed -e 's:p0\:boot::g')" DISKID="$(basename ${DISKID})" # Obtain the disk table; it will look something like the following: # # * Id Act Bhead Bsect Bcyl Ehead Esect Ecyl Rsect Numsect # 130 128 27 28 0 242 9 553 1728 8897472 # # Delete all blank lines, and all lines that begin with *, # leaving only actual fdisk entries that we can scan # looking for the X86BOOT partition fdisk -W - /dev/rdsk/${DISKID}p0 | \ grep -v '^*' | grep -v '^$' > ${TMP_FDFILE1} num=1 while read id act bhead bcyl ehead ecyl rsect numsect do # Ignore entry if not X86 /boot partition # ID '190' is the X86BOOT partition (see man fdisk(1M)) if [ $id -ne "190" ] ; then num=$(expr $num + 1) continue fi # Found X86 boot partition - save contents to $DDCOPY BOOTPART=/dev/rdsk/${DISKID}p${num} echo "Boot device is <${BOOTPART}>" ERRMSG="$(dd if=${BOOTPART} of=${DDCOPY} 2>&1)" if [ $? -ne 0 ] ; then [ -n "${ERRMSG}" ] && echo "${ERRMSG}" fail "Unable to save copy of <${BOOTPART}>." fi # mount copy of old /boot partition LOBOOTDEV=$(lofiadm -a ${DDCOPY} 2>&1) if [ $? -ne 0 ] ; then [ -n "${LOBOOTDEV}" ] && echo "${LOBOOTDEV}" fail "Unable to make lo-device <${DDCOPY}>" fi SOURCE_BOOT_DEV="${TMPDIR}/tmpbootdev.$$" mkdir ${SOURCE_BOOT_DEV} ERRMSG=$(mount -F pcfs ${LOBOOTDEV} \ ${SOURCE_BOOT_DEV}) if [ $? -ne 0 ] ; then [ -n "${ERRMSG}" ] && echo "${ERRMSG}" fail "Unable to mount lo-device <${LOBOOTDEV}>." fi # recreate existing boot partition with updated # boot files # umount ${ROOT}'s /boot if mounted BOOTMOUNTPT=$(mount | grep ${DISKID}p0:boot 2>&1 | \ awk '{print $1;}') if [ -n "${BOOTMOUNTPT}" ] ; then echo "unmounting /dev/dsk/${DISKID}p0:boot" ERRMSG=$(umount \ /dev/dsk/${DISKID}p0:boot 2>&1) if [ $? -ne 0 ] ; then [ -n "${ERRMSG}" ] && echo "${ERRMSG}" fail "Unable to umount X86 boot device." fi fi echo "Making new pcfs file system on ${DISKID}" echo y | /usr/lib/fs/pcfs/mkfs -F pcfs \ -o S,s,B=$MDBOOT,b=BOOT,i=$STRAP \ /dev/rdsk/${DISKID}p0:boot >> ${LOGFILE} 2>&1 if [ $? -ne 0 ] ; then echo "Unable to make pcfs:" cat ${LOGFILE} fail "" fi echo "Copying x86 boot partition contents back\c" echo " to new /boot fs." OLD_PWD=$(pwd) echo "Remounting freshened /boot partition" if [ -z "${BOOTMOUNTPT}" ] ; then # boot ptn wasn't mounted BOOTMOUNT="/tmp/bootpart" mkdir ${BOOTMOUNT} else BOOTMOUNT=${BOOTMOUNTPT} fi ERRMSG=$(mount -F pcfs \ /dev/dsk/${DISKID}p0:boot ${BOOTMOUNT} 2>&1) if [ $? -ne 0 ] ; then [ -n "${ERRMSG}" ] && echo "${ERRMSG}" fail "Unable to mount X86 boot device." fi # copy old /boot contents cd ${SOURCE_BOOT_DEV} find . -mount \! -type s -print | \ cpio -pcdum ${BOOTMOUNT} 2>&1 | \ ${LUBIN}/lustripcpioerr if [ $? -ne 0 ] ; then fail "Unable to copy boot partition contents." fi cd ${OLD_PWD} # unmount and rm our boot mount, if we created it if [ -z "${BOOTMOUNTPT}" ] ; then ERRMSG=$(umount ${BOOTMOUNT} 2>&1) if [ $? -ne 0 ] ; then [ -n "${ERRMSG}" ] && echo "${ERRMSG}" fail "Unable to umount <$BOOTMOUNT>." fi rm -rf ${BOOTMOUNT} fi # unmount, un-lofi, and rm SOURCE_BOOT_DEV ERRMSG=$(umount ${SOURCE_BOOT_DEV} 2>&1) if [ $? -ne 0 ] ; then [ -n "${ERRMSG}" ] && echo "${ERRMSG}" fail "Cannot umount lo-device <${LOBOOTDEV}>." fi ERRMSG=$(lofiadm -d ${DDCOPY} 2>&1) if [ $? -ne 0 ] ; then [ -n "${ERRMSG}" ] && echo "${ERRMSG}" fail "Cannot remove lo-device <${LOBOOTDEV}>." fi rm -rf ${SOURCE_BOOT_DEV} done < ${TMP_FDFILE1} rm ${TMP_FDFILE1} ${LOGFILE} ${DDCOPY} else # non boot-partition: use installboot to get pboot and bootblk echo "Updating /boot on Solaris partition." if [ -z "${ROOT}" ] ; then SEARCH="/"; else SEARCH="${ROOT}"; fi ROOTRAWDEV=$(mount | grep "^${SEARCH} on " | \ awk '{print $3}' | sed 's;/dsk;/rdsk;') if [ -z "${ROOTRAWDEV}" ] ; then [ -n "${ROOTRAWDEV}" && echo "${ROOTRAWDEV}" ] fail "${SEARCH} must be a mounted filesystem" fi echo "Updating Solaris partition ${ROOTRAWDEV} with installboot" REQFILES="pboot bootblk" for f in ${REQFILES}; do if [ ! -f ${TMPDIR}/$f ]; then fail "Missing $f, aborting." fi done PBOOT=${TMPDIR}/pboot BOOTBLK=${TMPDIR}/bootblk install_boot_i386 $PBOOT $BOOTBLK ${ROOTRAWDEV} if [ $? -ne 0 ] ; then fail "Unable to installboot to <${ROOTRAWDEV}>." fi fi } print "Verifying archives ..." for a in generic $allarchs $rootarchs do test -r $cpiodir/$a.root$ZFIX || fail "bfu archive $cpiodir/$a.root$ZFIX missing" done if [ ! -r $cpiodir/generic.lib$ZFIX -o ! -r $cpiodir/generic.kernel$ZFIX -o \ ! -r $cpiodir/generic.sbin$ZFIX ]; then old_style_archives="true" $ZCAT $cpiodir/generic.root$ZFIX | cpio -it 2>/dev/null | \ egrep -s '^etc/zones' && \ fail "bfu archive $cpiodir/generic.{kernel,lib,sbin}$ZFIX" \ "missing;\npossible mkbfu version mismatch: pre-zones" \ "style archives with zones files." fi for a in generic $allarchs $usrarchs do test -r $cpiodir/$a.usr$ZFIX || fail "bfu archive $cpiodir/$a.usr$ZFIX missing" done for root in $rootlist do cd $root || fail "Cannot cd $root" prologue=${root%/}/bfu.prologue if [ -f $prologue ]; then print "Executing $prologue" $prologue || fail "$prologue failed with code $?" fi done print "Performing basic sanity checks ..." for dir in $usr $rootlist do test -d $dir || fail "$dir does not exist" test -w $dir || fail "$dir is not writable" cd $dir || fail "Cannot cd $dir" done RM_32BIT_KERNEL=0; if [ "$karch" = "sun4u" ] && ($ZCAT $cpiodir/sun4u.root$ZFIX | cpio -itv 2>&1 | grep "^l.*platform/sun4u/kernel/unix -> sparcv9/unix$" > /dev/null); then RM_32BIT_KERNEL=1; if [ "$force_override" = "no" ] && (prtconf -F 2>&1 | egrep '(cgthree|bwtwo)' > /dev/null); then print "\n\nERROR: You are upgrading to a 64-bit-only OS. " \ "Your frame buffer does not have a 64-bit driver and " \ "will not work after reboot. To proceed you must run " \ "bfu with the -f flag."; exit; fi; fi; if [ $plat = "SUNW,Ultra-1" ] && [ ! -f $cpiodir/SUNW,Ultra-1.root$ZFIX ] && [ "$force_override" = "no" ]; then print "\nERROR: These archives do not have Ultra-1 platform support." \ "\nProceeding with this BFU may render this machine unbootable." \ "\nTo proceed anyway, you must run bfu with the -f flag.\n"; exit; fi; for root in $rootlist do rootprefix=${root%/} smf_check_repository done MINIMUM_OS_REV=10 # # Perform additional sanity checks if we are upgrading the live system. # if [ "$rootlist" = "/" ] then # # Disallow from older releases # os_rev=`uname -r | sed -e s/5.//` if [ $os_rev -lt $MINIMUM_OS_REV -a "$force_override" = "no" ]; then fail "Cannot bfu from pre-Solaris $MINIMUM_OS_REV" fi if [ ! -x /usr/sbin/svcadm ]; then fail "This version of bfu cannot run on pre-Greenline " \ "(s10_64) systems" fi # # Filesystem space checks # set $root 4 $usr 6 while [ $# -gt 0 ] do test "`df -b $1 | tail -1 | nawk '{ print $2 }'`" -ge ${2}000 || fail "Less than $2 MB free on $1 -- bfu not safe." shift 2 done # # Disable kernel module unloading # print "Disabling kernel module unloading ... \c" test -x /usr/bin/adb || fail "/usr/bin/adb not found: bfu not safe." echo "moddebug/W20000" | adb -kw /dev/ksyms /dev/mem | grep moddebug # # Load modules and drivers here not to reload them when you access # /devices or its subdirectories later. # nawk '$1 !~ /^#|^$/ {print $1}' /etc/name_to_major | \ sed -e 's/#.*$//' | while read driver do modload -p drv/${driver} >/dev/null 2>&1 done ls $cpiodir >>/dev/null # loads elfexec and networking # exec/intpexec and sys/kaio are needed by lofi modload -p exec/intpexec >/dev/null 2>&1 modload -p sys/kaio >/dev/null 2>&1 # umount /lib/libc.so.1 if necessary if [ -n "`mount | grep '^/lib/libc.so.1'`" ] then print "Unmounting /lib/libc.so.1 ..." umount /lib/libc.so.1 fi PLAT=`/usr/bin/uname -i` ARCH=`/usr/bin/uname -m` # umount /platform/$PLAT/lib/libc_psr.so.1 if necessary if [ -n "`mount | grep "^/platform/$PLAT/lib/libc_psr.so.1"`" ] then print "Unmounting /platform/$PLAT/lib/libc_psr.so.1 ..." umount /platform/$PLAT/lib/libc_psr.so.1 else # umount /platform/$ARCH/lib/libc_psr.so.1 if necessary if [ -n "`mount | grep "^/platform/$ARCH/lib/libc_psr.so.1"`" ] then print "Unmounting /platform/$ARCH/lib/libc_psr.so.1 ..." umount /platform/$ARCH/lib/libc_psr.so.1 fi fi # umount /platform/$PLAT/lib/sparcv9/libc_psr.so.1 if necessary if [ -n "`mount | grep "^/platform/$PLAT/lib/sparcv9/libc_psr.so.1"`" ] then print "Unmounting /platform/$PLAT/lib/sparcv9/libc_psr.so.1 ..." umount /platform/$PLAT/lib/sparcv9/libc_psr.so.1 else # umount /platform/$ARCH/lib/sparcv9/libc_psr.so.1 if necessary if [ -n "`mount | grep \ "^/platform/$ARCH/lib/sparcv9/libc_psr.so.1"`" ] then print "Unmounting \c" print "/platform/$ARCH/lib/sparcv9/libc_psr.so.1 ..." umount /platform/$ARCH/lib/sparcv9/libc_psr.so.1 fi fi # umount /platform/sun4u-us3/lib/libc_psr.so.1 if necessary if [ -n "`mount | grep '^/platform/sun4u-us3/lib/libc_psr.so.1'`" ] then print "Unmounting /platform/sun4u-us3/lib/libc_psr.so.1 ..." umount /platform/sun4u-us3/lib/libc_psr.so.1 fi # umount /platform/sun4u-us3/lib/sparcv9/libc_psr.so.1 if necessary if [ -n "`mount | grep '^/platform/sun4u-us3/lib/sparcv9/libc_psr.so.1'`" ] then print "Unmounting /platform/sun4u-us3/lib/sparcv9/libc_psr.so.1 ..." umount /platform/sun4u-us3/lib/sparcv9/libc_psr.so.1 fi if [ -x /usr/sbin/zoneadm ]; then # # Stop any running zones: the init script will print a # message if needed. # if [ -x /etc/init.d/zones ]; then /etc/init.d/zones stop elif [ -x /lib/svc/method/svc-zones ]; then # # We need all zones to be down before proceeding. # We can't accomplish this by just disabling the # zones service, since it might already be disabled. # So we pretend to be SMF, and invoke the stop method. # # When zones are someday independently managed as # service instances, this will need to be revised. # export SMF_FMRI="svc:/system/zones:default" /lib/svc/method/svc-zones stop unset SMF_FMRI fi [ -z `zoneadm list | grep -v global` ] || \ fail "zone(s) failed to halt" # # Determine the installed zones, which we will want to do # after we're done with the global zone. This is done now # rather than later in case bfu'ing the global zone causes # the zone configuration to become unreadable (e.g., via a # DTD flag day). # bfu_zone_list=$root/.bfu_zone_list rm -f $bfu_zone_list zoneadm list -pi | nawk -F: '{ if ($3 == "installed" && ($6 == "native" || $6 == "" || $6 == "sn1")) { printf "%s %s\n", $2, $4 } }' > $bfu_zone_list fi # # Stop sendmail so that mail doesn't bounce during the interval # where /etc/mail/aliases is (effectively) empty. # # (note that unlike other services here, /etc/init.d/sendmail # remains post-smf(5) because it is a public interface.) # if [ -r /etc/svc/volatile/repository_door ]; then print "Disabling sendmail temporarily ..." svcadm disable -t network/smtp else print "Killing sendmail ..." /etc/init.d/sendmail stop fi print "Disabling remote logins ..." echo "bfu in progress -- remote logins disabled" >/etc/nologin # # Stop syslogd so it doesn't interfere with saving preserved files. # if [ -f /etc/init.d/syslog ]; then print "Killing syslogd ..." /etc/init.d/syslog stop elif [ -r /etc/svc/volatile/repository_door ]; then print "Disabling syslog temporarily ..." svcadm disable -t system/system-log fi # # Stop apache so it doesn't get upset when the entire world changes # out from underneath it. # if [ -f /etc/init.d/apache ]; then print "Killing httpd ..." /etc/init.d/apache stop elif [ -r /etc/svc/volatile/repository_door ]; then print "Disabling httpd temporarily ..." svcadm disable -t network/http fi # # Kill off fmd so it doesn't get upset when the entire world changes # out from underneath it. # if [ -f /etc/init.d/savecore ]; then print "Killing fmd ..." pkill -x fmd elif [ -r /etc/svc/volatile/repository_door ]; then print "Disabling fmd temporarily ..." svcadm disable -t system/fmd fi # # Stop nscd so it doesn't interfere with stuff. # if [ -x /etc/init.d/nscd ]; then print "Killing nscd ..." /etc/init.d/nscd stop elif [ -r /etc/svc/volatile/repository_door ]; then print "Disabling nscd temporarily ..." svcadm disable -t system/name-service-cache:default fi if grep -v "^#" $rootprefix/etc/vfstab | grep boot | \ grep "[ ]pcfs[ ]" >/dev/null 2>&1 then boot_is_pcfs=yes fi smf_new_profiles else # # Check ${root}/etc/motd for SunOS value to get `uname -r` # os_rev=`head -1 ${root}/etc/motd | sed -e 's/^.*SunOS //' | \ awk '{print $1}' | sed -e s/5.//` if [ $os_rev -lt $MINIMUM_OS_REV -a "$force_override" = "no" ]; then fail "Cannot bfu from pre-Solaris $MINIMUM_OS_REV" fi if [ ! -x /usr/sbin/svcadm ]; then fail "This version of bfu cannot run on pre-Greenline " \ "(s10_64) systems" fi fi export PATH=/tmp/bfubin:$PATH export LD_LIBRARY_PATH=/tmp/bfulib if [ -h /tmp/bfulib/64 ] then ldlib64="LD_LIBRARY_PATH_64=/tmp/bfulib/64" export LD_LIBRARY_PATH_64=/tmp/bfulib/64 fi # turn off auxiliary filters, since they can cause objects to be loaded # from outside of the protected environment. export LD_NOAUXFLTR=1 # # Since we've turned off auxiliary filters, libc_psr will normally not # be loaded at all. But libc_psr was overriding broken code in libc # for over a week before the fix for 6324631, so we need to explicitly # LD_PRELOAD it to allow users to bfu from the broken libc. This can be # removed once there are no sun4u machines bfued to Nevada bits between # 9/7/2005 and 9/15/2005. # if [ -f /tmp/bfulib/libc_psr.so.1 ]; then export LD_PRELOAD_32=/tmp/bfulib/libc_psr.so.1 fi print "Turning on delayed i/o ..." fastfs -f $rootlist $usr fastfs $rootlist $usr # # The "| tee -a $EXTRACT_LOG" following do_extraction() is not pulled into the # function itself because it interferes with the cpio exit status detection. # pcfs boot is an exception, since its cpio exit status is expected to be bad, # so a heuristic must be employed to infer whether or not any errors occurred. # do_extraction() { compressed_archive=$1 shift $ZCAT $compressed_archive | cpio -idmucB $* 2>&1 \ || extraction_error "extracting archive $1" } do_pcfs_boot_extraction() { PCFS_BOOT_LOG=/tmp/bfu-pcfs-boot-log.$$ $ZCAT $1 | cpio -idmucB 2>&1 | grep -v "error.s" | \ grep -v "cpio: Cannot chown()" | \ grep -v "cpio: Error during chown()" | tee $PCFS_BOOT_LOG cat $PCFS_BOOT_LOG >> $EXTRACT_LOG egrep -s -v blocks $PCFS_BOOT_LOG if [ $? -eq 0 ]; then extraction_error "extracting archive $1 ... see $PCFS_BOOT_LOG" else rm -f $PCFS_BOOT_LOG fi } # # Usage: extract_archives (root|usr|lib|sbin|kernel) arch-list # extract_archives() { base=$1 shift test $base = usr && cd $usrroot || cd $root for archive in $* do print "Extracting $archive.$base$ZFIX ... \c" \ | tee -a $EXTRACT_LOG test -h platform/$archive && rm platform/$archive if [ $base = root ]; then exclude="-f dev/fd home proc etc/mnttab" # # We don't want to overwrite the sharetab if # it is a mount-point. We assume it is a # mount-point if it is not writable. # if [ -f etc/dfs/sharetab ]; then if [ ! -w etc/dfs/sharetab ]; then exclude="$exclude etc/dfs/sharetab" fi fi [ -d system/contract ] && exclude="$exclude system/contract" [ -d system/object ] && exclude="$exclude system/object" [ -f etc/svc/repository.db ] && exclude="$exclude etc/svc/repository.db" [ -e etc/repository_door ] && exclude="$exclude etc/repository_door" [ -f etc/svc/volatile ] && exclude="$exclude etc/svc/volatile" do_extraction $cpiodir/$archive.$base$ZFIX $exclude | tee -a $EXTRACT_LOG elif [ $base = usr ]; then do_extraction $cpiodir/$archive.$base$ZFIX \ -f "usr/openwin" | tee -a $EXTRACT_LOG else do_extraction $cpiodir/$archive.$base$ZFIX \ | tee -a $EXTRACT_LOG fi done cd $root } extract_boot_archives() { base=$1 shift cd $root for archive in $* do if [ ! -f $cpiodir/$archive.$base$ZFIX ]; then continue fi print "Extracting $archive.$base$ZFIX ... \c" \ | tee -a $EXTRACT_LOG if [ $boot_is_pcfs = yes ]; then do_pcfs_boot_extraction $cpiodir/$archive.$base$ZFIX else do_extraction $cpiodir/$archive.$base$ZFIX | \ tee -a $EXTRACT_LOG fi $ZCAT $cpiodir/$archive.$base$ZFIX | cpio -it 2>&1 | \ grep "boot/solaris/devicedb/master" >/dev/null 2>&1 if [ "$?" = "0" ]; then have_realmode=yes fi done cd $root } # # Classic boot pboot and bootblk compatibility with old archives # setup_pboot() { NEWPBOOTDIR=$GATE/public/pboot NEWPBOOT=${NEWPBOOTDIR}/pboot NEWBOOTBLK=${NEWPBOOTDIR}/bootblk PBOOTDIR=$usr/platform/$karch/lib/fs/ufs PBOOT=${PBOOTDIR}/pboot BOOTBLK=${PBOOTDIR}/bootblk # they should already be there, but... if [ -f $NEWPBOOT -a ! -f $PBOOT ]; then print "Installing pboot from $NEWPBOOTDIR" cp $NEWPBOOT $PBOOT fi if [ -f $NEWBOOTBLK -a ! -f $BOOTBLK ]; then print "Installing bootblk from $NEWPBOOTDIR" cp $NEWBOOTBLK $BOOTBLK fi if [ -f $NEWPBOOT -a -f $PBOOT ]; then LATEST=`ls -Lt $PBOOT $NEWPBOOT | head -1` if [ "$LATEST" = "$NEWPBOOT" ]; then print "Updating pboot from $NEWPBOOT" cp $NEWPBOOT $PBOOT fi fi if [ -f $NEWBOOTBLK -a -f $BOOTBLK ]; then LATEST=`ls -Lt $BOOTBLK $NEWBOOTBLK | head -1` if [ "$LATEST" = "$NEWBOOTBLK" ]; then print "Updating bootblk from $NEWBOOTBLK" cp $NEWBOOTBLK $BOOTBLK fi fi if [[ "$rootslice" = /dev/rdsk/* ]]; then print "Installing boot block." ( cd $PBOOTDIR ; install_boot_i386 ./pboot ./bootblk ${rootslice%??}s2 ) fi # # Since /platform/i86pc/boot/solaris/boot.bin is moved # to /boot/solaris, remove the old one if it really # exists. # OLDBOOTDIR=${root}/platform/i86pc/boot/solaris OLDBOOTBIN=${OLDBOOTDIR}/boot.bin if [ ! -h ${OLDBOOTDIR} -a -f ${OLDBOOTBIN} ] ; then print "Removing old boot.bin." rm -rf ${OLDBOOTBIN} fi } # # Multiboot support # saved_boot_files=" solaris/bootenv.rc solaris/devicedb/master " # # transition from multiboot to dca # check_multi_to_dca_boot() { bootdev=`grep p0:boot $rootprefix/etc/vfstab | \ grep pcfs | nawk '{print $1}'` if [ "$bootdev" != "" ]; then is_pcfs_boot=yes fi if [ $is_pcfs_boot = yes ]; then df -h | grep stubboot >/dev/null 2>&1 if [ $? -eq 0 ]; then # save configurable files from /boot # before remounting /stubboot. # files are relative to /boot. for file in $saved_boot_files do dir="`dirname $rootprefix/stubboot/$file`" mkdir -p $dir cp $rootprefix/boot/$file $dir done echo "unmount $bootdev at $rootprefix/stubboot" ERRMSG=$(umount $bootdev 2>&1) if [ $? -ne 0 ] ; then [ -n "${ERRMSG}" ] && echo "${ERRMSG}" fail "Unable to umount $bootdev on $rootprefix/stubboot." fi # adjust vfstab sed -e "s/[ ]\/stubboot[ ]/ \/boot /" \ <$rootprefix/etc/vfstab >$rootprefix/etc/vfstab+ mv $rootprefix/etc/vfstab $rootprefix/etc/vfstab- mv $rootprefix/etc/vfstab+ $rootprefix/etc/vfstab ERRMSG=$(mount -F pcfs $bootdev $rootprefix/boot 2>&1) if [ $? -ne 0 ] ; then [ -n "${ERRMSG}" ] && echo "${ERRMSG}" fail "Unable to mount $bootdev on $rootprefix/boot." fi fi fi } check_dca_to_multiboot() { bootdev=`grep p0:boot $rootprefix/etc/vfstab | \ grep pcfs | nawk '{print $1}'` if [ "$bootdev" != "" ]; then is_pcfs_boot=yes fi if [ $system_type != dca ]; then return fi # ensure bootpath is in $rootprefix/boot/solaris/bootenv.rc # It's ok to put a meta device path in there bootenvrc=$rootprefix/boot/solaris/bootenv.rc grep "^setprop[ ]*bootpath[ ]" $bootenvrc > /dev/null if [ $? != 0 ]; then rootdev=`grep -v "^#" $rootprefix/etc/vfstab | \ grep "[ ]/[ ]" | nawk '{print $1}'` bootpath=`ls -l $rootdev | nawk '{ print $NF }' |\ sed "s#../../devices##"` echo "setprop bootpath '$bootpath'" >> $bootenvrc fi rm -f $rootprefix/boot/mdboot } # # Figure out the boot architecture of the current system: # 1. If dboot_image is in unix, it's a dboot system # 2. Otherwise, if multiboot is present, it's a multiboot system # 3. Otherwise, it's a pre-multiboot system # # This is called before we lay down the new archives. # check_system_type() { if [ -x $root/boot/solaris/bin/symdef ] && \ $root/boot/solaris/bin/symdef $root/platform/i86pc/kernel/unix \ dboot_image; then system_type=directboot elif [ -x $root/platform/i86pc/multiboot ]; then system_type=multiboot else system_type=dca fi } # # Detect SVM root and return the list of raw devices under the mirror # get_rootdev_list() { if [ -f $rootprefix/etc/lu/GRUB_slice ]; then grep '^PHYS_SLICE' $rootprefix/etc/lu/GRUB_slice | cut -d= -f2 else metadev=`grep -v "^#" $rootprefix/etc/vfstab | \ grep "[ ]/[ ]" | nawk '{print $2}'` if [[ $metadev = /dev/rdsk/* ]]; then rootdevlist=`echo "$metadev" | sed -e "s#/dev/rdsk/##"` elif [[ $metadev = /dev/md/rdsk/* ]]; then metavol=`echo "$metadev" | sed -e "s#/dev/md/rdsk/##"` rootdevlist=`metastat -p $metavol |\ grep -v "^$metavol[ ]" | nawk '{print $4}'` fi for rootdev in $rootdevlist do echo /dev/rdsk/$rootdev done fi } # # Done once per transition from classic (dca) to multi boot # setup_stubboot() { bootdev=`grep -v "^#" $rootprefix/etc/vfstab | grep pcfs | \ grep "[ ]/boot[ ]"` if [[ -n $bootdev ]] ; then bootdev=`echo "$bootdev" | nawk '{print $1}'` rbootdev=`echo "$bootdev" | sed -e "s/dev\/dsk/dev\/rdsk/"` # Remount boot partition as /stubboot, set up new /boot mkdir -p $rootprefix/stubboot ERRMSG=$(umount $bootdev 2>&1) if [ $? -ne 0 ] ; then [ -n "${ERRMSG}" ] && echo "${ERRMSG}" fail "Unable to umount $bootdev." fi ERRMSG=$(mount -F pcfs $bootdev $rootprefix/stubboot 2>&1) if [ $? -ne 0 ] ; then [ -n "${ERRMSG}" ] && echo "${ERRMSG}" fail "Unable to mount $bootdev on $rootprefix/stubboot." fi mkdir -p $rootprefix/boot cp -r $rootprefix/stubboot/* $rootprefix/boot # adjust /etc/vfstab sed <$rootprefix/etc/vfstab \ -e "s/[ ]\/boot[ ]/ \/stubboot /" | \ sed -n >$rootprefix/etc/vfstab+ ' /p0:boot/ { s/[ ]no/ yes/ } p ' mv $rootprefix/etc/vfstab $rootprefix/etc/vfstab- mv $rootprefix/etc/vfstab+ $rootprefix/etc/vfstab fi } # # multiboot: install grub on the boot slice # install_grub() { STAGE1=$rootprefix/boot/grub/stage1 STAGE2=$rootprefix/boot/grub/stage2 if [ -x $rootprefix/boot/solaris/bin/update_grub ]; then /tmp/bfubin/ksh $rootprefix/boot/solaris/bin/update_grub \ -R $root elif [ $is_pcfs_boot = no ]; then get_rootdev_list | while read rootdev do print "Install grub on $rootdev" PATH=/tmp/bfubin /tmp/bfubin/installgrub \ $STAGE1 $STAGE2 $rootdev done else # copy /boot grub & solaris to /stubboot cp -r $rootprefix/boot/grub $rootprefix/stubboot/grub cp -r $rootprefix/boot/solaris $rootprefix/stubboot/solaris # Adjust grub paths relative to pcfs filesystem rm -rf $rootprefix/stubboot/boot mkdir -p $rootprefix/stubboot/boot mv $rootprefix/stubboot/grub $rootprefix/stubboot/boot mv $rootprefix/stubboot/solaris $rootprefix/stubboot/boot # # Run installgrub after copying stubboot to avoid overwriting # /stubboot/boot/grub/stage2, which must stay untouched. # bootdev=`grep -v "^#" $rootprefix/etc/vfstab | grep pcfs | \ grep "[ ]/stubboot[ ]" | nawk '{print $1}'` rbootdev=`echo "$bootdev" | sed -e "s/dev\/dsk/dev\/rdsk/"` if [ "$rbootdev" != "" ]; then print "Install grub on $rbootdev" PATH=/tmp/bfubin /tmp/bfubin/installgrub $STAGE1 $STAGE2 $rbootdev fi fi } # # We check for several possibilites of a bootenv.rc line: # # 1. setprop name 'value' # 2. setprop name "value" # 3. setprop name value # parse_bootenv_line() { line=$1 value=`echo $line | grep "'" | cut -d\' -f2` if [ -z "$value" ]; then value=`echo $line | grep "\"" | cut -d\" -f2` if [ -z "$value" ]; then value=`echo $line | cut -d' ' -f3-` fi fi echo $value } update_bootenv() { bootenvrc=$rootprefix/boot/solaris/bootenv.rc bootenvrc_updated=0 # Note: the big space below is actually a space and tab boot_file=`grep '^setprop[ ]\{1,\}boot-file\>' $bootenvrc` if [ -n "$boot_file" ]; then file=`parse_bootenv_line "$boot_file"` if [ -n "$file" ]; then PATH=/tmp/bfubin /tmp/bfubin/bootadm set-menu kernel="$file" bootenvrc_updated=1 fi fi console=`grep '^setprop[ ]\{1,\}console\>' $bootenvrc` if [ -z "$console" ]; then console=`grep '^setprop[ ]\{1,\}input-device\>' \ $bootenvrc` fi if [ -n "$console" ]; then cons=`parse_bootenv_line "$console"` fi boot_args=`grep '^setprop[ ]\{1,\}boot-args\>' $bootenvrc` if [ -n "boot_args" ]; then args=`parse_bootenv_line "$boot_args"` fi if [ -n "$cons" ] && [ -n "$args" ]; then # If args starts with a -B, remove it and add a comma instead if echo $args | grep '^-B ' >/dev/null; then new_args=`echo $args | sed 's/^-B //'` args_line="-B console=$cons,$new_args" else args_line="-B console=$cons $args" fi elif [ -n "$cons" ]; then args_line="-B console=$cons" elif [ -n "$args" ]; then args_line="$args" else args_line="" fi if [ -n "$args_line" ]; then PATH=/tmp/bfubin /tmp/bfubin/bootadm set-menu args="$args_line" bootenvrc_updated=1 fi if [ $bootenvrc_updated = 1 ]; then egrep -v '^setprop[ ]+(boot-file|boot-args)[ ]' $bootenvrc > ${bootenvrc}.new [ -s ${bootenvrc}.new ] && mv ${bootenvrc}.new $bootenvrc fi } get_biosdisk() { rootdev=$1 rootphys=`ls -l $rootdev | nawk '{ print $NF }' | \ sed -e "s/\.\.\/\.\.\/devices//" -e "s/:[abcdefgh],raw//"` rbootdev=`echo "$rootdev" | sed -e "s/s[0-7]/p0/"` # # Use biosdev to get the bios disk number # biosdisk=`biosdev | grep $rootphys | \ nawk '{print $1}' | sed -e "s/0x8//"` } # # multiboot: set up initial grub menu # update_grub_menu() { MENU=$rootprefix/boot/grub/menu.lst grubhd=$1 if [ $archive_type = multiboot ]; then BOOT_PROG="kernel /platform/i86pc/multiboot" BOOT_ARCHIVE="module /platform/i86pc/boot_archive" else # # directboot archives # BOOT_PROG="kernel\$ /platform/i86pc/kernel/\$ISADIR/unix" BOOT_ARCHIVE="module\$ /platform/i86pc/\$ISADIR/boot_archive" fi # # The failsafe archives may be different than the boot archives # if [ -x /boot/platform/i86pc/kernel/unix ]; then BOOT_FAILSAFE_FILE="/boot/platform/i86pc/kernel/unix" BOOT_FAILSAFE_SUFFIX="" else BOOT_FAILSAFE_FILE="/boot/multiboot" BOOT_FAILSAFE_SUFFIX="kernel/unix" fi # # Append some useful entries to the existing menu # echo "Update GRUB menu $MENU with entries for $grubhd" grep ^default $MENU > /dev/null [ $? = 0 ] || echo "default=0" >> $MENU grep ^timeout $MENU > /dev/null [ $? = 0 ] || echo "timeout=10" >> $MENU echo "#serial --unit=0 --speed=9600" >> $MENU echo "#terminal serial" >> $MENU echo "#splashimage=$grubhd/boot/grub/splash.xpm.gz" >> $MENU echo "title Solaris" >> $MENU echo " root $grubhd" >> $MENU echo " ${BOOT_PROG}" >> $MENU echo " ${BOOT_ARCHIVE}" >> $MENU echo "GRUB menu entry 'Solaris' boots to eeprom(1m) settings" if [ -f ${rootprefix}/$BOOT_FAILSAFE_FILE ] && [ -f ${rootprefix}/boot/x86.miniroot-safe ] ; then TTY=`grep "^setprop input-device" \ ${rootprefix}/boot/solaris/bootenv.rc | cut -f 2 -d \'` if [ -z "${TTY}" ] ; then TTY=`grep "^setprop console" \ ${rootprefix}/boot/solaris/bootenv.rc | \ cut -f 2 -d \'` fi if [ "${TTY}" = "ttya" ] || [ "${TTY}" = "ttyb" ] ; then FS_CONSOLE="-B console=${TTY}" fi cat >>$MENU </dev/null 2>&1 if [ $? -eq 1 ]; then update_grub_menu $grubhd fi else update_grub_menu $grubhd fi done } # # Build the multiboot boot archive # build_boot_archive() { # # We should be able to run bootadm here but that's a # little more complicated than one would think #bootadm_args=${rootprefix:+-R $rootprefix} #PATH=/tmp/bfubin /tmp/bfubin/bootadm update $bootadm_args cr_args=${rootprefix:+ -R $rootprefix} LD_LIBRARY_PATH=/tmp/bfulib PATH=/tmp/bfubin \ /tmp/bfubin/ksh $rootprefix/boot/solaris/bin/create_ramdisk $cr_args # # Disable the boot-archive service on the first boot # to silence complaints about new files # svccfg -s system/boot-archive setprop start/exec = true mkdir -p $rootprefix/bfu.conflicts/lib/svc/method cp $rootprefix/lib/svc/method/boot-archive \ $rootprefix/bfu.conflicts/lib/svc/method/boot-archive cat >$rootprefix/lib/svc/method/boot-archive <<"EOF" #!/sbin/sh exit 0 EOF cat >$rootprefix/etc/rc2.d/S99postbfu <$rootprefix/lib/svc/method/boot-archive <&2 <6 STREAMS modules; these no longer exist (and # should never have existed in the first place). # rm -f $root/kernel/strmod/icmp6 \ $root/kernel/strmod/ip6 \ $root/kernel/strmod/tcp6 \ $root/kernel/strmod/udp6 \ rm -f $root/kernel/strmod/sparcv9/icmp6 \ $root/kernel/strmod/sparcv9/ip6 \ $root/kernel/strmod/sparcv9/tcp6 \ $root/kernel/strmod/sparcv9/udp6 \ # # Remove old ZFS binaries (back when it was three modules) # find $root/kernel/drv -name zpool 2> /dev/null | xargs rm -f rm -f $root/kernel/drv/zpool.conf rm -f $root/kernel/drv/zpool.cache find $root/kernel/drv -name zvol 2> /dev/null | xargs rm -f rm -f $root/kernel/drv/zvol.conf # # Remove /usr/lib/old_libthread since support for it has # been removed from the kernel in Solaris 10. If this is # a backwards BFU, it will all be extracted again by cpio. rm -rf $usr/lib/old_libthread # Remove libconfig rm -f $usr/lib/drv/config_md.so.1 rm -f $usr/include/config_md.h # remove libssd rm -f $usr/lib/libssd.a rm -f $usr/lib/libssd.so rm -f $usr/lib/libssd.so.1 # remove libap rm -f $usr/lib/libap_dmd.a rm -f $usr/lib/libap_dmd.so.1 # remove libintpos rm -f $usr/lib/libintpos.a rm -f $usr/lib/libintpos.so.1 # Remove obsolete abi subdirectories if [ -d $usr/platform/*/lib/abi ]; then rm -rf $usr/platform/*/lib/abi fi rm -rf $usr/lib/gss/abi rm -rf $usr/lib/krb5/abi rm -rf $usr/xpg4/lib/abi rm -rf $usr/ucblib/abi # # Remove old stuff related to libthread now that libthread has # been folded into libc and libthread_db has been renamed libc_db. # In addition, all the apptrace's tracing libraries (i.e., abi_*.so*), # spec2map and spec2trace are no longer needed, should be removed. rm -f \ $usr/lib/mdb/proc/libthread.so \ $usr/lib/mdb/proc/sparcv9/libthread.so \ $usr/lib/abi/spec2map \ $usr/lib/abi/spec2trace \ $usr/lib/abi/abi_*.so* \ $usr/lib/abi/sparcv9/abi_*.so* # # Remove the old symlink /lib => usr/lib, if necessary. # /lib is now a real directory in the root filesystem. # Remove all of the old static libraries and commands now # that we no longer build them. If this is a backwards # BFU, all this will all be extracted again by cpio. rm $root/lib 2>/dev/null rm -rf $usr/lib/pics rm -rf $usr/sbin/static rm -f \ $usr/ccs/lib/libcurses.a \ $usr/ccs/lib/libform.a \ $usr/ccs/lib/libgen.a \ $usr/ccs/lib/libl.a \ $usr/ccs/lib/libmalloc.a \ $usr/ccs/lib/libmenu.a \ $usr/ccs/lib/libpanel.a \ $usr/ccs/lib/libtermcap.a \ $usr/ccs/lib/libtermlib.a \ $usr/ccs/lib/liby.a \ $usr/lib/lib300.a \ $usr/lib/lib300s.a \ $usr/lib/lib4014.a \ $usr/lib/lib450.a \ $usr/lib/libTL.a \ $usr/lib/libadm.a \ $usr/lib/libadt_jni.a \ $usr/lib/libbsdmalloc.a \ $usr/lib/libbsm.a \ $usr/lib/libc.a \ $usr/lib/libc2.a \ $usr/lib/libc2stubs.a \ $usr/lib/libcmd.a \ $usr/lib/libcrypt.a \ $usr/lib/libcrypt_d.a \ $usr/lib/libcrypt_i.a \ $usr/lib/libcurses.a \ $usr/lib/libdevid.a \ $usr/lib/libdevinfo.a \ $usr/lib/libdhcpagent.a \ $usr/lib/libdhcputil.a \ $usr/lib/libdl_stubs.a \ $usr/lib/libefi.a \ $usr/lib/libelf.a \ $usr/lib/libform.a \ $usr/lib/libgen.a \ $usr/lib/libgenIO.a \ $usr/lib/libike.a \ $usr/lib/libinetcfg.a \ $usr/lib/libinetutil.a \ $usr/lib/libintl.a \ $usr/lib/libkstat.a \ $usr/lib/libl.a \ $usr/lib/libldfeature.a \ $usr/lib/libmail.a \ $usr/lib/libmalloc.a \ $usr/lib/libmapmalloc.a \ $usr/lib/libmenu.a \ $usr/lib/libmeta.a \ $usr/lib/libmp.a \ $usr/lib/libnisdb.a \ $usr/lib/libnls.a \ $usr/lib/libnsl.a \ $usr/lib/libnss_compat.a \ $usr/lib/libnss_dns.a \ $usr/lib/libnss_files.a \ $usr/lib/libnss_nis.a \ $usr/lib/libnss_nisplus.a \ $usr/lib/libp/libc.a \ $usr/lib/libpam.a \ $usr/lib/libpanel.a \ $usr/lib/libplot.a \ $usr/lib/librac.a \ $usr/lib/libresolv.a \ $usr/lib/librpcsvc.a \ $usr/lib/libsec.a \ $usr/lib/libsendfile.a \ $usr/lib/libsocket.a \ $usr/lib/libstraddr.a \ $usr/lib/libtermcap.a \ $usr/lib/libtermlib.a \ $usr/lib/libuuid.a \ $usr/lib/libvolmgt.a \ $usr/lib/libvt0.a \ $usr/lib/libw.a \ $usr/lib/liby.a \ $usr/lib/null.a \ $usr/lib/sparcv9/libadt_jni.a \ $usr/lib/sparcv9/libinetutil.a \ $usr/lib/sparcv9/libldfeature.a \ $usr/lib/sparcv9/libsendfile.a \ $usr/platform/sun4u/lib/libwrsmconf.a \ $usr/ucblib/libcurses.a \ $usr/ucblib/libdbm.a \ $usr/ucblib/libtermcap.a \ $usr/ucblib/libucb.a # # Remove other obsolete files, too rm -f \ $usr/include/table.h \ $usr/include/libgenIO.h \ $usr/lib/llib-lTL \ $usr/lib/llib-lTL.ln # # libc_psr.so.1 and libmd5_psr.so.1 have been moved # from /usr/platform/*/lib to /platform/*/lib. # Remove the old files and their containing directories rm -f $usr/platform/*/lib/libc_psr.so.1 rm -f $usr/platform/*/lib/sparcv9/libc_psr.so.1 rm -f $usr/platform/*/lib/libmd5_psr.so.1 rm -f $usr/platform/*/lib/sparcv9/libmd5_psr.so.1 rmdir $usr/platform/*/lib/sparcv9 2>/dev/null rmdir $usr/platform/*/lib 2>/dev/null # # libmd5_psr.so.1 and symlinks to it have been replaced # by libmd_psr.so.1 and thus need to be removed rm -f $root/platform/*/lib/libmd5_psr.so.1 rm -f $root/platform/*/lib/sparcv9/libmd5_psr.so.1 # # Remove obsolete profile libc symlinks rm -f $usr/lib/libp/libc.so rm -f $usr/lib/libp/sparcv9/libc.so # # Remove Legacy DR files, now obsolete due to NGDR Phase II putback # STARFIRE_PLAT=platform/SUNW,Ultra-Enterprise-10000 rm -f \ $root/$STARFIRE_PLAT/kernel/drv/dr \ $root/$STARFIRE_PLAT/kernel/drv/dr.conf \ $root/$STARFIRE_PLAT/kernel/misc/drmach \ $root/$STARFIRE_PLAT/kernel/drv/sparcv9/dr \ $root/$STARFIRE_PLAT/kernel/misc/sparcv9/drmach \ $root/$STARFIRE_PLAT/lib/dr_daemon \ $usr/platform/sun4u/include/sys/dr.h \ $usr/platform/sun4u/include/sys/sfdr.h # Remove obsolete OPL platform links. rm -f $root/platform/FJSV,SPARC-Enterprise rm -f $root/platform/SUNW,OPL-Enterprise rm -f $usr/platform/FJSV,SPARC-Enterprise rm -f $usr/platform/SUNW,OPL-Enterprise # Solstice Enterprise Agent(SEA) : mib-II subagent mibiisa # needs to be disabled during startup. SMA(System Management Agent) # has the capability to support mib-II requests. # The correct ones will be extracted from # the archives whether bfu'ing backwards or forwards. # # old: need to remove going forwards: rm -f $root/etc/snmp/conf/mibiisa.rsrc # # new: need to remove going backwards: rm -f $root/etc/snmp/conf/mibiisa.rsrc- # remove old terminal emulator module: # (renamed from 'terminal-emulator' to 'tem') # # old: need to remove going forwards: rm -f $root/kernel/misc/terminal-emulator rm -f $root/kernel/misc/amd64/terminal-emulator # # new: need to remove going backwards: rm -f $root/kernel/misc/tem rm -f $root/kernel/misc/amd64/tem rm -f $root/kernel/misc/sparcv9/tem # # Remove /dev/mc symlink and /platform/sun4u/kernel/drv/mc-us3.conf # if any. # if [ -h $root/dev/mc ]; then rm -f $root/dev/mc fi if [ -f $root/platform/sun4u/kernel/drv/mc-us3.conf ]; then rm -f $root/platform/sun4u/kernel/drv/mc-us3.conf fi # # Remove the snowbird sbin and include symlinks # if [[ -h $usr/platform/SUNW,Netra-CP2300/sbin ]] ; then rm -f $usr/platform/SUNW,Netra-CP2300/sbin fi if [[ -h $usr/platform/SUNW,Netra-CP2300/include ]] ; then rm -f $usr/platform/SUNW,Netra-CP2300/include fi # If we still have the old lp(7D) driver, remove it and its symlinks # and header file. (If driver already gone, don't trample new symlinks.) # if [ -f $root/platform/i86pc/kernel/drv/lp -a \ -h $root/dev/lp[012] ]; then rm -f $root/dev/lp[012] fi rm -f $root/platform/i86pc/kernel/drv/lp.conf rm -f $root/platform/i86pc/kernel/drv/lp rm -f $root/usr/include/sys/lp.h # # Remove V880 CPU DR files, program cancelled # DAKTARI_PLAT=platform/SUNW,Sun-Fire-880 rm -f \ $root/$DAKTARI_PLAT/kernel/drv/gptwo.conf \ $root/$DAKTARI_PLAT/kernel/drv/sparcv9/bbc \ $root/$DAKTARI_PLAT/kernel/drv/sparcv9/gptwo \ $root/$DAKTARI_PLAT/kernel/misc/sparcv9/sbdp \ $usr/platform/sun4u/include/sys/sbdp.h # # Remove crash(1M), now obsoleted by mdb(1). If this is a backwards # BFU, it will be extracted again by cpio. # rm -f $root/etc/crash $usr/sbin/crash $usr/sbin/i86/crash \ $usr/sbin/sparcv7/crash $usr/sbin/sparcv9/crash # # Remove kadb(1M), now obsoleted by kmdb(1M) # rm -f $root/platform/*/kadb # # Remove old platform dmod symlinks # for dir in $usr/platform/*/lib/mdb ; do [[ -h $dir ]] && rm -f $dir done # # Remove ADB macros # rm -fr $usr/lib/adb for dir in $usr/platform/*/lib/adb ; do rm -fr $dir done # # Remove the SGENV driver from the Sun-Fire directory structure. # If this is a backwards BFU, it will be extracted again by cpio. # SERENGETI_PLAT=platform/SUNW,Sun-Fire rm -f $root/$SERENGETI_PLAT/kernel/drv/sgenv.conf \ $root/$SERENGETI_PLAT/kernel/drv/sparcv9/sgenv # # Remove sun4m # rm -rf $root/platform/sun4m rm -rf $usr/platform/sun4m if [ $target_isa = sparc ]; then rm -f $root/kernel/genunix fi rm -f $root/kernel/drv/xbox rm -f $usr/include/sys/comvec.h rm -f $usr/include/sys/openprom.h rm -f $usr/include/sys/cg14io.h rm -f $usr/include/sys/cg14reg.h rm -f $usr/include/sys/cg8reg.h rm -f $usr/include/sys/cg8var.h # # Remove perl 5.005_03. If this is a backwards bfu, # it will be extracted again by cpio. # if [[ -d $usr/perl5/5.00503 ]]; then remove_perl_500503 fi # # Remove perl 5.8.3, but only if the generic.usr archive contains 5.8.4. # If this is a backwards bfu, 5.8.3 will be extracted again by cpio. # if [[ -d $usr/perl5/5.8.3 ]] && $ZCAT $cpiodir/generic.usr$ZFIX | \ cpio -it 2>/dev/null | egrep -s '^usr/perl5/5.8.4/'; then remove_perl_583 fi # # Clean up legacy versions of the FMA CPU/Mem DE which may be still # be laying around. This check may be removed when a sufficient time # has lapsed between the FMA putback as to ensure that no test machines # still have development FMA bits. # for platdir in $usr/platform/SUNW,* ; do [[ -h $platdir ]] && continue rm -f $platdir/lib/fm/fmd/plugins/cpumem-diagnosis.so rm -f $platdir/lib/fm/fmd/plugins/cpumem-diagnosis.conf done # Remove pam_unix # rm -f $usr/lib/security/pam_unix.so.1 rm -f $usr/lib/security/pam_unix.so rm -f $usr/lib/security/sparcv9/pam_unix.so.1 rm -f $usr/lib/security/sparcv9/pam_unix.so # # Remove pam_projects rm -f $usr/lib/security/pam_projects.so.1 rm -f $usr/lib/security/pam_projects.so rm -f $usr/lib/security/64/pam_projects.so.1 rm -f $usr/lib/security/64/pam_projects.so # # Remove libldap.so.3 # rm -f $usr/lib/libldap.so.3 rm -f $usr/lib/sparcv9/libldap.so.3 # # Remove nss XFN support no longer used by printing # sed -e '/printers:/s/xfn[ ]*//' \ $rootprefix/bfu.child/etc/nsswitch.conf > /tmp/nssw.$$ cp /tmp/nssw.$$ $rootprefix/bfu.child/etc/nsswitch.conf rm -f /tmp/nssw.$$ rm -f $usr/lib/nss_xfn.so.1 rm -f $usr/lib/sparcv9/nss_xfn.so.1 # # Remove FNS/XFN. # if [ -d $rootprefix/etc/fn -o \ -d $usr/include/xfn -o \ -d $usr/lib/fn -o \ -d $rootprefix/var/fn ]; then remove_eof_fns fi # # Remove AT&T FACE # if [ -d $usr/oasys -o -d $usr/vmsys ]; then remove_eof_face fi # # Remove DMI # if [ -d $usr/lib/dmi -o \ -d $rootprefix/etc/dmi -o \ -d $rootprefix/var/dmi ]; then remove_eof_dmi fi # # Remove ASET # if [ -d $usr/aset ]; then remove_eof_aset fi # # Remove BIND 8, but only if the generic.usr archive doesn't contains # BIND 8 named server/tools. If this is a backwards bfu, BIND 8 will # be extracted again by cpio. # if [[ -f $usr/sbin/dnskeygen ]] && ! $ZCAT $cpiodir/generic.usr$ZFIX \ | cpio -it 2>/dev/null | egrep -s '^usr/sbin/ndc' ; then remove_eof_bind8 fi # # Remove any sendmailvars: line from /etc/nsswitch.conf # sed -e '/^sendmailvars:/d' $rootprefix/bfu.child/etc/nsswitch.conf > \ /tmp/nssw.$$ cp /tmp/nssw.$$ $rootprefix/bfu.child/etc/nsswitch.conf rm -f /tmp/nssw.$$ # # Remove vold # if [ -f $rootprefix/etc/vold.conf -o -d $usr/lib/vold ]; then remove_eof_vold fi # # Remove SUNWcoff package # pkgroot=${rootprefix:+-R $rootprefix} pkg=SUNWcoff if [ $target_isa = i386 ]; then if pkginfo $pkgroot -q $pkg; then pkgrm $pkgroot -n $pkg >/dev/null 2>&1 fi # In case that did not work, do it manually. if [ -d $rootprefix/var/sadm/pkg/$pkg ]; then rm -rf $rootprefix/var/sadm/pkg/$pkg rm $rootprefix/kernel/exec/coffexec fi fi # # Remove GMT* zoneinfo files # rm -f $usr/share/lib/zoneinfo/GMT-12 rm -f $usr/share/lib/zoneinfo/GMT-11 rm -f $usr/share/lib/zoneinfo/GMT-10 rm -f $usr/share/lib/zoneinfo/GMT-9 rm -f $usr/share/lib/zoneinfo/GMT-8 rm -f $usr/share/lib/zoneinfo/GMT-7 rm -f $usr/share/lib/zoneinfo/GMT-6 rm -f $usr/share/lib/zoneinfo/GMT-5 rm -f $usr/share/lib/zoneinfo/GMT-4 rm -f $usr/share/lib/zoneinfo/GMT-3 rm -f $usr/share/lib/zoneinfo/GMT-2 rm -f $usr/share/lib/zoneinfo/GMT-1 rm -f $usr/share/lib/zoneinfo/GMT+1 rm -f $usr/share/lib/zoneinfo/GMT+2 rm -f $usr/share/lib/zoneinfo/GMT+3 rm -f $usr/share/lib/zoneinfo/GMT+4 rm -f $usr/share/lib/zoneinfo/GMT+5 rm -f $usr/share/lib/zoneinfo/GMT+6 rm -f $usr/share/lib/zoneinfo/GMT+7 rm -f $usr/share/lib/zoneinfo/GMT+8 rm -f $usr/share/lib/zoneinfo/GMT+9 rm -f $usr/share/lib/zoneinfo/GMT+10 rm -f $usr/share/lib/zoneinfo/GMT+11 rm -f $usr/share/lib/zoneinfo/GMT+12 rm -f $usr/share/lib/zoneinfo/GMT+13 # Remove stc(7d)-related files rm -f $usr/include/sys/stcio.h rm -f $usr/include/sys/stcvar.h rm -f $usr/include/sys/stcreg.h rm -f $usr/include/sys/stcconf.h SUN4U_DRV=platform/sun4u/kernel/drv rm -f $rootprefix/$SUN4U_DRV/stc.conf rm -f $rootprefix/$SUN4U_DRV/stc rm -f $rootprefix/$SUN4U_DRV/sparcv9/stc # Remove old CPC adb macros. rm -f $usr/lib/adb/cpc_ctx rm -f $usr/lib/adb/cpc_event if [ $target_isa = sparc ]; then rm -f $usr/lib/adb/sparcv9/cpc_ctx rm -f $usr/lib/adb/sparcv9/cpc_event fi; # Remove obsolete DTrace demos rm -f $usr/demo/dtrace/cputick.d # Remove flashprom-related files. if [ $target_isa = sparc ]; then for x in $FLASHPROMLIST do rm -f $root/$x; done fi; # Remove pt_chmod - obsoleted by new /dev filesystem if [ $zone = global ]; then rm -f $usr/lib/pt_chmod fi if [ $RM_32BIT_KERNEL -eq 1 -a $zone = global ]; then print "Removing 32-bit commands and kernel binaries ... \c"; rm -rf \ $usr/bin/sparcv7/amt \ $usr/bin/sparcv7/cputrack \ $usr/bin/sparcv7/newtask \ $usr/bin/sparcv7/nohup \ $usr/bin/sparcv7/pargs \ $usr/bin/sparcv7/pcred \ $usr/bin/sparcv7/pfiles \ $usr/bin/sparcv7/pflags \ $usr/bin/sparcv7/pldd \ $usr/bin/sparcv7/plimit \ $usr/bin/sparcv7/pmap \ $usr/bin/sparcv7/ppgsz \ $usr/bin/sparcv7/ppriv \ $usr/bin/sparcv7/prctl \ $usr/bin/sparcv7/preap \ $usr/bin/sparcv7/prex \ $usr/bin/sparcv7/prstat \ $usr/bin/sparcv7/prun \ $usr/bin/sparcv7/ps \ $usr/bin/sparcv7/psig \ $usr/bin/sparcv7/pstack \ $usr/bin/sparcv7/pstop \ $usr/bin/sparcv7/ptime \ $usr/bin/sparcv7/ptree \ $usr/bin/sparcv7/pwait \ $usr/bin/sparcv7/pwdx \ $usr/bin/sparcv7/setuname \ $usr/bin/sparcv7/sort \ $usr/bin/sparcv7/tnfxtract \ $usr/bin/sparcv7/uptime \ $usr/bin/sparcv7/w \ $usr/sbin/sparcv7/intrstat \ $usr/sbin/sparcv7/lockstat \ $usr/sbin/sparcv7/prtconf \ $usr/sbin/sparcv7/swap \ $usr/sbin/sparcv7/sysdef \ $usr/sbin/sparcv7/whodo \ $root/kernel/dacf/consconfig_dacf \ $root/kernel/drv/arp \ $root/kernel/drv/audiocs \ $root/kernel/drv/audioens \ $root/kernel/drv/bofi \ $root/kernel/drv/bpp \ $root/kernel/drv/clone \ $root/kernel/drv/cn \ $root/kernel/drv/conskbd \ $root/kernel/drv/consms \ $root/kernel/drv/dad \ $root/kernel/drv/devinfo \ $root/kernel/drv/ecpp \ $root/kernel/drv/ehci \ $root/kernel/drv/esp \ $root/kernel/drv/fas \ $root/kernel/drv/fcip \ $root/kernel/drv/fcp \ $root/kernel/drv/fp \ $root/kernel/drv/glm \ $root/kernel/drv/hid \ $root/kernel/drv/hme \ $root/kernel/drv/hubd \ $root/kernel/drv/icmp \ $root/kernel/drv/icmp6 \ $root/kernel/drv/ifp \ $root/kernel/drv/ip \ $root/kernel/drv/ip6 \ $root/kernel/drv/ippctl \ $root/kernel/drv/ipsecah \ $root/kernel/drv/ipsecesp \ $root/kernel/drv/isp \ $root/kernel/drv/iwscn \ $root/kernel/drv/keysock \ $root/kernel/drv/le \ $root/kernel/drv/lebuffer \ $root/kernel/drv/llc1 \ $root/kernel/drv/lofi \ $root/kernel/drv/log \ $root/kernel/drv/md \ $root/kernel/drv/mm \ $root/kernel/drv/mpt \ $root/kernel/drv/nca \ $root/kernel/drv/ohci \ $root/kernel/drv/openeepr \ $root/kernel/drv/options \ $root/kernel/drv/pcata \ $root/kernel/drv/pcelx \ $root/kernel/drv/pcic \ $root/kernel/drv/pcmem \ $root/kernel/drv/pcram \ $root/kernel/drv/pcs \ $root/kernel/drv/pcser \ $root/kernel/drv/pem \ $root/kernel/drv/pln \ $root/kernel/drv/poll \ $root/kernel/drv/pseudo \ $root/kernel/drv/ptc \ $root/kernel/drv/ptsl \ $root/kernel/drv/qlc \ $root/kernel/drv/random \ $root/kernel/drv/rts \ $root/kernel/drv/sad \ $root/kernel/drv/scsa2usb \ $root/kernel/drv/scsi_vhci \ $root/kernel/drv/sd \ $root/kernel/drv/se \ $root/kernel/drv/ses \ $root/kernel/drv/sgen \ $root/kernel/drv/soc \ $root/kernel/drv/socal \ $root/kernel/drv/spdsock \ $root/kernel/drv/ssd \ $root/kernel/drv/st \ $root/kernel/drv/stp4020 \ $root/kernel/drv/sy \ $root/kernel/drv/sysmsg \ $root/kernel/drv/tcp \ $root/kernel/drv/tcp6 \ $root/kernel/drv/tl \ $root/kernel/drv/uata \ $root/kernel/drv/udp \ $root/kernel/drv/udp6 \ $root/kernel/drv/ugen \ $root/kernel/drv/usb_ac \ $root/kernel/drv/usb_as \ $root/kernel/drv/usb_mid \ $root/kernel/drv/usbprn \ $root/kernel/drv/usbser_edge \ $root/kernel/drv/usoc \ $root/kernel/drv/wc \ $root/kernel/exec/aoutexec \ $root/kernel/exec/elfexec \ $root/kernel/exec/intpexec \ $root/kernel/fs/autofs \ $root/kernel/fs/cachefs \ $root/kernel/fs/devfs \ $root/kernel/fs/fifofs \ $root/kernel/fs/hsfs \ $root/kernel/fs/lofs \ $root/kernel/fs/mntfs \ $root/kernel/fs/nfs \ $root/kernel/fs/procfs \ $root/kernel/fs/sockfs \ $root/kernel/fs/specfs \ $root/kernel/fs/tmpfs \ $root/kernel/fs/udfs \ $root/kernel/fs/ufs \ $root/kernel/ipp/dlcosmk \ $root/kernel/ipp/dscpmk \ $root/kernel/ipp/flowacct \ $root/kernel/ipp/ipgpc \ $root/kernel/ipp/tokenmt \ $root/kernel/ipp/tswtclmt \ $root/kernel/misc/amsrc1 \ $root/kernel/misc/audiosup \ $root/kernel/misc/busra \ $root/kernel/misc/consconfig \ $root/kernel/misc/dada \ $root/kernel/misc/des \ $root/kernel/misc/diaudio \ $root/kernel/misc/fctl \ $root/kernel/misc/fssnap_if \ $root/kernel/misc/gld \ $root/kernel/misc/hidparser \ $root/kernel/misc/hpcsvc \ $root/kernel/misc/ipc \ $root/kernel/misc/kbtrans \ $root/kernel/misc/kgss/do_kmech_krb5 \ $root/kernel/misc/kgss/gl_kmech_krb5 \ $root/kernel/misc/kgssapi \ $root/kernel/misc/klmmod \ $root/kernel/misc/klmops \ $root/kernel/misc/krtld \ $root/kernel/misc/md5 \ $root/kernel/misc/md_hotspares \ $root/kernel/misc/md_mirror \ $root/kernel/misc/md_notify \ $root/kernel/misc/md_raid \ $root/kernel/misc/md_sp \ $root/kernel/misc/md_stripe \ $root/kernel/misc/md_trans \ $root/kernel/misc/mixer \ $root/kernel/misc/mpxio \ $root/kernel/misc/nfs_dlboot \ $root/kernel/misc/nfssrv \ $root/kernel/misc/pcicfg \ $root/kernel/misc/pcihp \ $root/kernel/misc/phx \ $root/kernel/misc/rpcsec \ $root/kernel/misc/rpcsec_gss \ $root/kernel/misc/rsmops \ $root/kernel/misc/scsi \ $root/kernel/misc/seg_drv \ $root/kernel/misc/seg_mapdev \ $root/kernel/misc/sha1 \ $root/kernel/misc/strplumb \ $root/kernel/misc/swapgeneric \ $root/kernel/misc/tlimod \ $root/kernel/misc/ufs_log \ $root/kernel/misc/usba \ $root/kernel/misc/usbser \ $root/kernel/sched/TS \ $root/kernel/sched/TS_DPTBL \ $root/kernel/strmod/6to4tun \ $root/kernel/strmod/arp \ $root/kernel/strmod/atun \ $root/kernel/strmod/authmd5h \ $root/kernel/strmod/authsha1 \ $root/kernel/strmod/bufmod \ $root/kernel/strmod/connld \ $root/kernel/strmod/dedump \ $root/kernel/strmod/drcompat \ $root/kernel/strmod/encr3des \ $root/kernel/strmod/encraes \ $root/kernel/strmod/encrbfsh \ $root/kernel/strmod/encrdes \ $root/kernel/strmod/icmp \ $root/kernel/strmod/ip \ $root/kernel/strmod/ipsecah \ $root/kernel/strmod/ipsecesp \ $root/kernel/strmod/keysock \ $root/kernel/strmod/ldterm \ $root/kernel/strmod/ms \ $root/kernel/strmod/nca \ $root/kernel/strmod/pckt \ $root/kernel/strmod/pfmod \ $root/kernel/strmod/pipemod \ $root/kernel/strmod/ptem \ $root/kernel/strmod/redirmod \ $root/kernel/strmod/rpcmod \ $root/kernel/strmod/rts \ $root/kernel/strmod/tcp \ $root/kernel/strmod/timod \ $root/kernel/strmod/tirdwr \ $root/kernel/strmod/ttcompat \ $root/kernel/strmod/tun \ $root/kernel/strmod/udp \ $root/kernel/strmod/usb_ah \ $root/kernel/strmod/usbkbm \ $root/kernel/strmod/usbms \ $root/kernel/sys/c2audit \ $root/kernel/sys/doorfs \ $root/kernel/sys/inst_sync \ $root/kernel/sys/kaio \ $root/kernel/sys/msgsys \ $root/kernel/sys/nfs \ $root/kernel/sys/pipe \ $root/kernel/sys/pset \ $root/kernel/sys/rpcmod \ $root/kernel/sys/semsys \ $root/kernel/sys/shmsys \ $root/platform/SUNW,Ultra-250/kernel/drv/envctrltwo \ $root/platform/SUNW,Ultra-250/kernel/misc/platmod \ $root/platform/SUNW,Ultra-4/kernel/drv/envctrl \ $root/platform/SUNW,Ultra-4/kernel/misc/platmod \ $root/platform/SUNW,Ultra-5_10/kernel/misc/platmod \ $root/platform/SUNW,Ultra-80/kernel/misc/platmod \ $root/platform/SUNW,Ultra-Enterprise-10000/kernel/cpu/SUNW,UltraSPARC \ $root/platform/SUNW,Ultra-Enterprise-10000/kernel/cpu/SUNW,UltraSPARC-II \ $root/platform/SUNW,Ultra-Enterprise-10000/kernel/drv/cvc \ $root/platform/SUNW,Ultra-Enterprise-10000/kernel/drv/cvcredir \ $root/platform/SUNW,Ultra-Enterprise-10000/kernel/drv/idn \ $root/platform/SUNW,Ultra-Enterprise-10000/kernel/drv/ngdr \ $root/platform/SUNW,Ultra-Enterprise-10000/kernel/drv/pcipsy \ $root/platform/SUNW,Ultra-Enterprise-10000/kernel/drv/rootnex \ $root/platform/SUNW,Ultra-Enterprise-10000/kernel/drv/sbus \ $root/platform/SUNW,Ultra-Enterprise-10000/kernel/misc/ngdrmach \ $root/platform/SUNW,Ultra-Enterprise-10000/kernel/misc/platmod \ $root/platform/SUNW,Ultra-Enterprise-10000/kernel/unix \ $root/platform/SUNW,Ultra-Enterprise/kernel/drv/ac \ $root/platform/SUNW,Ultra-Enterprise/kernel/drv/central \ $root/platform/SUNW,Ultra-Enterprise/kernel/drv/environ \ $root/platform/SUNW,Ultra-Enterprise/kernel/drv/fhc \ $root/platform/SUNW,Ultra-Enterprise/kernel/drv/simmstat \ $root/platform/SUNW,Ultra-Enterprise/kernel/drv/sram \ $root/platform/SUNW,Ultra-Enterprise/kernel/drv/sysctrl \ $root/platform/SUNW,Ultra-Enterprise/kernel/misc/platmod \ $root/platform/sun4u/boot.conf \ $root/platform/sun4u/kernel/cpu/SUNW,UltraSPARC \ $root/platform/sun4u/kernel/cpu/SUNW,UltraSPARC-II \ $root/platform/sun4u/kernel/cpu/SUNW,UltraSPARC-III \ $root/platform/sun4u/kernel/cpu/SUNW,UltraSPARC-III+ \ $root/platform/sun4u/kernel/cpu/SUNW,UltraSPARC-IIIi \ $root/platform/sun4u/kernel/cpu/SUNW,UltraSPARC-IIe \ $root/platform/sun4u/kernel/cpu/SUNW,UltraSPARC-IIi \ $root/platform/sun4u/kernel/cpu/SUNW,UltraSPARC-IV \ $root/platform/sun4u/kernel/drv/bwtwo \ $root/platform/sun4u/kernel/drv/cgsix \ $root/platform/sun4u/kernel/drv/cgthree \ $root/platform/sun4u/kernel/drv/cpc \ $root/platform/sun4u/kernel/drv/db21554 \ $root/platform/sun4u/kernel/drv/dma \ $root/platform/sun4u/kernel/drv/ebus \ $root/platform/sun4u/kernel/drv/fd \ $root/platform/sun4u/kernel/drv/ledma \ $root/platform/sun4u/kernel/drv/memtest \ $root/platform/sun4u/kernel/drv/pci_pci \ $root/platform/sun4u/kernel/drv/pcipsy \ $root/platform/sun4u/kernel/drv/power \ $root/platform/sun4u/kernel/drv/rootnex \ $root/platform/sun4u/kernel/drv/sbbc \ $root/platform/sun4u/kernel/drv/sbus \ $root/platform/sun4u/kernel/drv/sbusmem \ $root/platform/sun4u/kernel/drv/sf \ $root/platform/sun4u/kernel/drv/simba \ $root/platform/sun4u/kernel/drv/su \ $root/platform/sun4u/kernel/drv/tod \ $root/platform/sun4u/kernel/drv/trapstat \ $root/platform/sun4u/kernel/drv/zs \ $root/platform/sun4u/kernel/drv/zsh \ $root/platform/sun4u/kernel/genunix \ $root/platform/sun4u/kernel/misc/bootdev \ $root/platform/sun4u/kernel/misc/cpr \ $root/platform/sun4u/kernel/misc/forthdebug \ $root/platform/sun4u/kernel/misc/kgss/do_kmech_krb5 \ $root/platform/sun4u/kernel/misc/kgss/gl_kmech_krb5 \ $root/platform/sun4u/kernel/misc/md5 \ $root/platform/sun4u/kernel/misc/obpsym \ $root/platform/sun4u/kernel/misc/pcmcia \ $root/platform/sun4u/kernel/misc/platmod \ $root/platform/sun4u/kernel/misc/vis \ $root/platform/sun4u/kernel/strmod/kb \ $root/platform/sun4u/kernel/sys/cpc \ $root/platform/sun4u/kernel/tod/todmostek \ $root/platform/sun4u/kernel/tod/todstarfire \ $usr/include/v7/sys/mon_clock.h \ $usr/kernel/drv/dump \ $usr/kernel/drv/fssnap \ $usr/kernel/drv/gen_drv \ $usr/kernel/drv/kstat \ $usr/kernel/drv/ksyms \ $usr/kernel/drv/llc2 \ $usr/kernel/drv/lo \ $usr/kernel/drv/lockstat \ $usr/kernel/drv/logindmux \ $usr/kernel/drv/pm \ $usr/kernel/drv/pshot \ $usr/kernel/drv/ptm \ $usr/kernel/drv/pts \ $usr/kernel/drv/rsm \ $usr/kernel/drv/sppp \ $usr/kernel/drv/sppptun \ $usr/kernel/drv/sysevent \ $usr/kernel/drv/tidg \ $usr/kernel/drv/tivc \ $usr/kernel/drv/tmux \ $usr/kernel/drv/tnf \ $usr/kernel/drv/vol \ $usr/kernel/drv/winlock \ $usr/kernel/exec/javaexec \ $usr/kernel/fs/fdfs \ $usr/kernel/fs/namefs \ $usr/kernel/fs/pcfs \ $usr/kernel/sched/FSS \ $usr/kernel/sched/FX \ $usr/kernel/sched/FX_DPTBL \ $usr/kernel/sched/IA \ $usr/kernel/sched/RT \ $usr/kernel/sched/RT_DPTBL \ $usr/kernel/strmod/cryptmod \ $usr/kernel/strmod/lmodb \ $usr/kernel/strmod/lmode \ $usr/kernel/strmod/lmodr \ $usr/kernel/strmod/lmodt \ $usr/kernel/strmod/rlmod \ $usr/kernel/strmod/spppasyn \ $usr/kernel/strmod/spppcomp \ $usr/kernel/strmod/sppptun \ $usr/kernel/strmod/telmod \ $usr/kernel/sys/acctctl \ $usr/kernel/sys/exacctsys \ $usr/kernel/sys/sysacct \ $usr/lib/gss/mech_spnego.so \ $usr/lib/gss/mech_spnego.so.1 \ $usr/lib/mdb/kvm/cpc.so \ $usr/lib/mdb/kvm/genunix.so \ $usr/lib/mdb/kvm/ip.so \ $usr/lib/mdb/kvm/ipc.so \ $usr/lib/mdb/kvm/ipp.so \ $usr/lib/mdb/kvm/isp.so \ $usr/lib/mdb/kvm/krtld.so \ $usr/lib/mdb/kvm/lofs.so \ $usr/lib/mdb/kvm/logindmux.so \ $usr/lib/mdb/kvm/mdb_ks.so \ $usr/lib/mdb/kvm/nca.so \ $usr/lib/mdb/kvm/nfs.so \ $usr/lib/mdb/kvm/ptm.so \ $usr/lib/mdb/kvm/random.so \ $usr/lib/mdb/kvm/sd.so \ $usr/lib/mdb/kvm/sppp.so \ $usr/lib/mdb/kvm/ssd.so \ $usr/lib/mdb/kvm/ufs_log.so \ $usr/lib/mdb/kvm/usba.so \ $usr/lib/sparcv9/gss/mech_spnego.so \ $usr/lib/sparcv9/gss/mech_spnego.so.1 \ $usr/platform/SUNW,Ultra-1 \ $usr/platform/SUNW,Ultra-250/doc \ $usr/platform/SUNW,Ultra-250/lib/flash-update.sh \ $usr/platform/SUNW,Ultra-250/lib/prom \ $usr/platform/SUNW,Ultra-Enterprise-10000/doc \ $usr/platform/SUNW,Ultra-Enterprise-10000/lib/flash-update.sh \ $usr/platform/SUNW,Ultra-Enterprise-10000/lib/prom \ $usr/platform/sun4u/lib/mdb/kvm/unix.so \ $usr/platform/sun4u/lib/prom/SUNW,Ultra-1 > /dev/null 2>&1; print "done."; fi; # # Remove kmdbmod from /kernel # rm -f $root/kernel/misc/sparcv9/kmdbmod # # Remove obsolete drivers/header files as a result of sun4v source # code reorg # rm -f $root/platform/sun4u/kernel/drv/sparcv9/pci_pci rm -f $root/platform/sun4u/kernel/misc/sparcv9/pcmcia rm -f $usr/include/v9/sys/traptrace.h rm -f $usr/platform/sun4u/include/sys/spitasi.h rm -f $usr/kernel/pcbe/sparcv9/pcbe.SUNW,UltraSPARC-T1 # # Remove the IPsec encryption and authentication modules. # IPsec now uses the Kernel Crypto Framework for crypto. # rm -f $rootprefix/kernel/strmod/encr3des rm -f $rootprefix/kernel/strmod/encrdes rm -f $rootprefix/kernel/strmod/encrbfsh rm -f $rootprefix/kernel/strmod/encraes rm -f $rootprefix/kernel/strmod/authmd5h rm -f $rootprefix/kernel/strmod/authsha1 rm -f $rootprefix/kernel/strmod/sparcv9/encr3des rm -f $rootprefix/kernel/strmod/sparcv9/encrdes rm -f $rootprefix/kernel/strmod/sparcv9/encrbfsh rm -f $rootprefix/kernel/strmod/sparcv9/encraes rm -f $rootprefix/kernel/strmod/sparcv9/authmd5h rm -f $rootprefix/kernel/strmod/sparcv9/authsha1 # # Remove obsolete SSA utility, firmware and fcode. # usr/lib/firmware/ssa contains ssafirmware # rm -rf $usr/lib/firmware/ssa rm -f $usr/lib/firmware/fc_s/fc_s_fcode rm -f $usr/sbin/ssaadm # # Remove seg_drv, seg_mapdev driver # rm -f $root/kernel/misc/seg_drv rm -f $root/kernel/misc/sparcv9/seg_drv rm -f $usr/include/sys/seg_drv.h rm -f $root/kernel/misc/seg_mapdev rm -f $root/kernel/misc/sparcv9/seg_mapdev # # Remove mpxio module # rm -f $root/kernel/misc/sparcv9/mpxio # # Remove mpxio/vhci adb macros. # if [ $target_isa = sparc -a $zone = global ]; then rm -f $usr/lib/adb/mdi_client rm -f $usr/lib/adb/sparcv9/mdi_client rm -f $usr/lib/adb/mdi_pathinfo rm -f $usr/lib/adb/sparcv9/mdi_pathinfo rm -f $usr/lib/adb/mdi_phci rm -f $usr/lib/adb/sparcv9/mdi_phci rm -f $usr/lib/adb/mdi_vhci rm -f $usr/lib/adb/sparcv9/mdi_vhci rm -f $usr/lib/adb/scsi_vhci_pkt rm -f $usr/lib/adb/sparcv9/scsi_vhci_pkt rm -f $usr/lib/adb/scsi_vhci_softstate rm -f $usr/lib/adb/sparcv9/scsi_vhci_softstate fi # # Diskless clients have already extracted /usr so don't delete this # Non-global zones never extracts /usr so don't delete these # if [ $diskless = no -a $zone = global ]; then rm -f $usr/sbin/stmsboot rm -f $usr/lib/mdb/kvm/mpxio.so rm -f $usr/lib/mdb/kvm/sparcv9/mpxio.so rm -f $usr/lib/mdb/kvm/amd64/mpxio.so rm -f $usr/lib/mdb/kvm/scsi_vhci.so rm -f $usr/lib/mdb/kvm/sparcv9/scsi_vhci.so rm -f $usr/lib/mdb/kvm/amd64/scsi_vhci.so fi rm -f $root/lib/mpxio/mpxio rm -f $root/lib/mpxio/stmsboot_util rm -f $root/kernel/kmdb/mpxio rm -f $root/kernel/kmdb/sparcv9/mpxio rm -f $root/kernel/kmdb/amd64/mpxio rm -f $root/kernel/kmdb/scsi_vhci rm -f $root/kernel/kmdb/sparcv9/scsi_vhci rm -f $root/kernel/kmdb/amd64/scsi_vhci # # Remove rpcib misc module (converted to driver) # rm -f $root/kernel/misc/sparcv9/rpcib rm -f $root/kernel/drv/sparcv9/rpcib # # Remove old smartcard header files # rm -f \ $usr/include/smartcard.h \ $usr/include/smartcard/ocf_authenticate.h \ $usr/include/smartcard/ocf_core.h \ $usr/include/smartcard/ocf_core_cardservices.h # # Remove smartcard libraries that should not have been shipped. # rm -rf $usr/lib/smartcard/sparcv9/ \ $usr/share/lib/smartcard/scmtester.jar # # Remove external smartcard reader driver # rm -f $usr/share/lib/smartcard/scmrsr3.jar # # Remove old internal smartcard reader driver # rm -f $usr/share/lib/smartcard/scmiscr.jar rm -f $usr/lib/smartcard/libSCMI2CNative.so rm -f $usr/lib/smartcard/libSCMI2CNative.so.1 # # Remove Smart OS # rm -f $usr/share/lib/smartcard/smartos.jar # # Remove drivers & header files for EOL of soc & pln drivers # as per PSARC/2003/233 # rm -f $root/kernel/drv/pln.conf rm -f $root/kernel/drv/sparcv9/pln rm -f $root/kernel/drv/sparcv9/soc rm -f $usr/include/sys/socvar.h rm -f $usr/include/sys/socmap.h rm -f $usr/include/sys/soc_cq_defs.h rm -f $usr/include/sys/socreg.h rm -f $usr/include/sys/scsi/adapters/plndef.h rm -f $usr/include/sys/scsi/adapters/plnvar.h rm -f $usr/include/sys/scsi/adapters/ssaisp.h rm -f $usr/include/sys/scsi/targets/pln_ctlr.h rm -f $usr/include/sys/scsi/targets/osesio.h # # PSARC/2003/629 Common Solaris Target Disk Driver # remove adb macro "scsi_disk" for the x86 platform # if [ $target_isa = i386 ]; then rm -f $usr/lib/adb/scsi_disk fi # Remove CPCv1 API header per PSARC/2004/648 rm -f $usr/include/sys/cpc_event.h # Remove headers per PSARC/2005/561 rm -f $usr/include/sys/nexusintr.h rm -f $usr/platform/sun4u/include/sys/nexusintr_impl.h rm -f $usr/platform/sun4v/include/sys/nexusintr_impl.h # Remove usr/lib/mail which has moved to etc/mail/cf, but first, # attempt to migrate any user-added files, which primarily live # under usr/lib/mail/cf . Blow away the seven files which we # ship under that directory, then move any that remain to the # new location, which we will `mkdir -p` just to be safe. # If the zone in question is non-global, then skip all this. # if [ $zone = "global" ]; then # -d follow sym-links: make sure it's not a link. if [ -d $usr/lib/mail -a ! -h $usr/lib/mail ]; then # Only do this if usr/lib/mail is still a directory; # bfu'ing backwards does not merit such migration. rm -f $usr/lib/mail/cf/Makefile rm -f $usr/lib/mail/cf/main.cf rm -f $usr/lib/mail/cf/main.mc rm -f $usr/lib/mail/cf/submit.cf rm -f $usr/lib/mail/cf/submit.mc rm -f $usr/lib/mail/cf/subsidiary.cf rm -f $usr/lib/mail/cf/subsidiary.mc mkdir -p -m 0755 $root/etc/mail/cf/cf mv $usr/lib/mail/cf/* $root/etc/mail/cf/cf >/dev/null 2>&1 fi rm -rf $usr/lib/mail fi # # Remove drivers and header files for EOF of Lance Ethernet # driver(le) as per PSARC/2003/335. # rm -f $root/kernel/drv/le rm -f $root/kernel/drv/sparcv9/le rm -f $root/kernel/drv/lebuffer rm -f $root/kernel/drv/sparcv9/lebuffer rm -f $root/platform/sun4u/kernel/drv/ledma rm -f $root/platform/sun4u/kernel/drv/sparcv9/ledma rm -f $usr/include/sys/le.h rm -f $usr/include/sys/lance.h rm -f $usr/lib/adb/le rm -f $usr/lib/adb/lestr # # Remove drivers and header files for EOF of ieef driver as # per PSARC/2003/009 # rm -f $root/kernel/drv/ieef rm -f $root/kernel/drv/ieef.conf rm -f $usr/include/sys/ieef.h rm -f $root/boot/solaris/drivers/notisa.010/ieef.bef # # Remove drivers and header files for EOF of elx driver as # per PSARC/2003/770 # rm -f $root/platform/i86pc/kernel/drv/elx rm -f $root/platform/i86pc/kernel/drv/elx.conf rm -f $usr/include/sys/elx.h rm -f $root/boot/solaris/drivers/isa.175/elx.bef # # Remove drivers for EOF of pe driver as per PSARC/2004/051 # rm -f $root/kernel/drv/pe rm -f $root/kernel/drv/pe.conf rm -f $root/boot/solaris/drivers/isa.125/pe3.bef # # Remove drivers for EOF of Compaq NCR, Compaq SMART2, AMI Mega # card and /usr/bin/smart2cfg as per PSARC/2003/701 and # PSARC/2004/207 # rm -f $root/kernel/drv/cpqncr rm -f $root/kernel/drv/cpqncr.conf rm -f $root/boot/solaris/drivers/notisa.020/cpqncr.bef rm -f $root/platform/i86pc/kernel/drv/smartii rm -f $root/platform/i86pc/kernel/drv/smartii.conf rm -f $usr/bin/smart2cfg rm -f $root/kernel/drv/mega rm -f $root/kernel/drv/mega.conf rm -f $root/boot/solaris/drivers/notisa.010/mega.bef rm -f $root/kernel/mach/compaq rm -f $root/kernel/mach/corollary # # Remove eisa nexus driver and header files for EOF of EISA # support as per PSARC/2003/650 # rm -f $root/platform/i86pc/kernel/drv/eisa rm -f $usr/platform/i86pc/include/sys/eisarom.h rm -f $usr/platform/i86pc/include/sys/nvm.h # # Remove xmem headers (they moved back to usr/include/sys/fs) # rm -f $usr/include/ia32/sys/fs/xmem.h rm -f $usr/include/ia32/sys/fs/seg_xmem.h rm -rf $usr/include/ia32/sys/fs # # Remove junk headers # rm -f $usr/platform/i86pc/include/sys/mcdma.h rm -f $usr/platform/i86pc/include/sys/xque.h # # Remove obsolete x86 hat layer and associated adb scripts # rm -f $root/platform/i86pc/kernel/mmu/mmu32 rm -f $root/platform/i86pc/kernel/mmu/mmu36 rm -rf $root/platform/i86pc/kernel/mmu rm -f $usr/lib/adb/hwpp rm -f $usr/lib/adb/hatppp rm -f $usr/lib/adb/hat.nxt rm -f $usr/lib/adb/hwpp.nxt # # Remove drivers for EOF of chs as per PSARC/2005/581 # rm -f $root/kernel/drv/chs rm -f $root/kernel/drv/chs.conf rm -f $root/boot/solaris/drivers/notisa.020/chs.bef # # Remove drivers & header files for EOF of dbri as per PSARC 2005/582 # rm -f $root/kernel/drv/sparcv9/dbri rm -f $root/usr/include/sys/dbriio.h rm -f $root/usr/include/sys/mmcodecreg.h # # Remove drivers for EOF of pcscsi as per PSARC/2005/003 # rm -f $root/kernel/drv/pcscsi rm -f $root/kernel/drv/pcscsi.conf rm -f $root/boot/solaris/drivers/notisa.010/pcscsi.bef # # Remove drivers for EOF of dpt as per PSARC/2003/701 # rm -f $root/boot/solaris/drivers/isa.125/dpt.bef rm -f $root/platform/i86pc/kernel/drv/dpt rm -f $root/platform/i86pc/kernel/drv/dpt.conf rm -rf $usr/include/sys/dktp/dpt # # Remove drivers for EOF of mlx driver as per PSARC/2003/701 # rm -f $root/boot/solaris/drivers/notisa.010/mlx.bef rm -f $root/platform/i86pc/kernel/drv/mlx rm -f $root/platform/i86pc/kernel/drv/mlx.conf rm -rf $usr/include/sys/dktp/mlx # # Remove snlb # rm -f $root/kernel/misc/snlb rm -f $root/kernel/misc/amd64/snlb rm -f $root/usr/include/sys/dktp/dklb.h rm -f $root/usr/include/sys/dktp/snlb.h # # Remove objmgr # rm -f $root/kernel/drv/objmgr.conf rm -f $root/kernel/drv/objmgr rm -f $root/kernel/drv/amd64/objmgr rm -f $root/usr/include/sys/dktp/objmgr.h # # Remove other unused headers # rm -f $root/usr/include/sys/scsi/impl/pkt_wrapper.h rm -f $root/usr/include/sys/dktp/hba.h rm -f $root/usr/include/sys/dktp/cdtypes.h rm -f $root/usr/include/sys/dktp/scdk.h rm -f $root/usr/include/sys/dktp/scdkwatch.h rm -f $root/usr/include/sys/dktp/sctarget.h rm -f $root/usr/include/sys/dktp/tgcd.h rm -f $root/usr/include/sys/dktp/tgpassthru.h # # Remove Floating Point Emulator for EOF as per PSARC/2003/651 # rm -f $root/platform/i86pc/kernel/misc/emul_80387 # # Remove 64-bit adp, cadp and cpqhpc # rm -f $root/kernel/drv/amd64/adp rm -f $root/kernel/drv/amd64/cadp rm -f $root/kernel/drv/amd64/cpqhpc # # Remove 64-bit i2o_bs, i2o_msg, i2o_scsi, pci_to_i2o, mscsi, ncrs, # msm, spwr, bscv, bscbus # rm -f $root/kernel/drv/amd64/i2o_bs rm -f $root/kernel/misc/amd64/i2o_msg rm -f $root/kernel/drv/amd64/i2o_scsi rm -f $root/kernel/drv/amd64/pci_to_i2o rm -f $root/platform/i86pc/kernel/drv/amd64/mscsi rm -f $root/kernel/drv/amd64/ncrs rm -f $root/platform/i86pc/kernel/drv/amd64/msm rm -f $root/kernel/drv/amd64/spwr rm -f $root/platform/i86pc/kernel/drv/amd64/bscv rm -f $root/platform/i86pc/kernel/drv/amd64/bscbus # Remove obsolete pfil modules, binaries, and configuration files rm -f $root/kernel/drv/pfil rm -f $root/kernel/drv/pfil.conf rm -f $root/kernel/drv/sparcv9/pfil rm -f $root/kernel/drv/amd64/pfil rm -f $root/kernel/strmod/pfil rm -f $root/kernel/strmod/sparcv9/pfil rm -f $root/kernel/strmod/amd64/pfil rm -f $root/usr/sbin/pfild # Remove obsolete atomic_prim.h file. rm -f $usr/include/v9/sys/atomic_prim.h # # Remove sc_nct binary and the corresponding symlink to sc_nct from the # Montecarlo platform specific directories (Reference: PSARC 2003/606). # To be specific, the following binary will be removed. # /platform/SUNW,UltraSPARC-IIe-NetraCT-40/kernel/drv/sparcv9/sc_nct # Also, the following symlink will be removed. # /platform/SUNW,UltraSPARC-IIe-NetraCT-60/kernel/drv/sparcv9/sc_nct # if [ -f $root/platform/SUNW,UltraSPARC-IIe-NetraCT-40/kernel/drv/sparcv9/sc_nct ]; then rm -f $root/platform/SUNW,UltraSPARC-IIe-NetraCT-40/kernel/drv/sparcv9/sc_nct rm -f $root/platform/SUNW,UltraSPARC-IIe-NetraCT-60/kernel/drv/sparcv9/sc_nct fi # # In case of bfu to an older release, remove traces of "new" # Kerberos mechanisms. Kerberos libraries and paths are corrected # after extraction is complete. # rm -f $root/kernel/misc/kgss/kmech_krb5 rm -f $root/kernel/misc/kgss/sparcv9/kmech_krb5 rm -f $root/platform/$karch/kernel/misc/kgss/sparcv9/kmech_krb5 # # Diskless clients have already extracted /usr so don't delete these # Non-global zones never extracts /usr so don't delete these # if [ $diskless = no -a $zone = global ]; then rm -f $usr/lib/gss/mech_krb5.so rm -f $usr/lib/gss/mech_krb5.so.1 rm -f $usr/lib/sparcv9/gss/mech_krb5.so rm -f $usr/lib/sparcv9/gss/mech_krb5.so.1 fi # Remove old OpenSSL stuff from SUNWwbint rm -rf $usr/include/openssl rm -rf $usr/lib/openssl #Remove ufs logging module - now merged into ufs module rm -f $rootprefix/kernel/misc/ufs_log rm -f $rootprefix/kernel/misc/sparcv9/ufs_log #Remove ufs_log mdb/kmdb modules - now merged in to ufs module rm -f $rootprefix/kernel/kmdb/ufs_log rm -f $rootprefix/kernel/kmdb/sparcv9/ufs_log rm -f $rootprefix/kernel/kmdb/amd64/ufs_log rm -f $rootprefix/usr/lib/mdb/kvm/ufs_log.so rm -f $rootprefix/usr/lib/mdb/kvm/sparcv9/ufs_log.so rm -f $rootprefix/usr/lib/mdb/kvm/amd64/ufs_log.so #Remove diskmgtd. If backward BFU, will get re-installed from #archive. rm -f $usr/lib/diskmgtd # # Remove old ia64 cruft # if [ $target_isa = i386 ]; then rm -f $usr/include/sys/ia64_archext.h rm -f $usr/include/sys/sysia64.h rm -rf $usr/include/ia64 fi # # Remove machpage-related stuff # rm -f $usr/platform/*/include/vm/mach_page.h rm -f $usr/lib/adb/machpp # # Remove old cacheos # rm -f $root/etc/init.d/cacheos rm -f $root/etc/init.d/cacheos.finish rm -f $root/etc/init.d/cachefs.root rm -f $root/etc/rcS.d/S35cacheos.sh rm -f $root/etc/rc2.d/S93cacheos.finish rm -f $root/etc/rcS.d/S41cachefs.root # # Remove unneeded nfsmapid entries # nfsmapid_cfg # # Nuke the nfsauth headers when we're working with the 'global' # or a fully populated nonglobal zone. The cpio archive will lay the # right one to match mountd(1m)'s comm method w/the kernel (via # kRPC or Doors/XDR). # dir_is_inherited usr 2>/dev/null; if [ $? = 1 -o $zone = global ]; then rm -f ${rootprefix}/usr/include/rpcsvc/nfsauth_prot.x rm -f ${rootprefix}/usr/include/rpcsvc/nfsauth_prot.h rm -f ${rootprefix}/usr/include/nfs/auth.h fi # # Move the original manifests aside; later we will restore # unchanged originals to avoid superfluous re-import on reboot. # (First blow away the old dir path just to be safe.) # rm -rf $root/$old_mfst_dir [ -d $root/$new_mfst_dir ] && mv $root/$new_mfst_dir $root/$old_mfst_dir # # Remove obsolete sum.h # rm -f $usr/include/sum.h # # Remove obsolete std.h # rm -f $usr/include/std.h # # Remove obsolete rpc/trace.h # rm -f $usr/include/rpc/trace.h # # Remove acpi_intp module # if [ $target_isa = i386 ]; then rm -f $root/kernel/misc/acpi_intp rm -f $root/kernel/misc/amd64/acpi_intp fi # # Remove obsolete librac # rm -f $usr/include/rpc/rac.h rm -f $usr/lib/llib-lrac rm -f $usr/lib/llib-lrac.ln rm -f $usr/lib/amd64/llib-lrac.ln rm -f $usr/lib/sparcv9/llib-lrac.ln rm -f $usr/lib/librac.so rm -f $usr/lib/librac.so.1 rm -f $usr/lib/amd64/librac.so rm -f $usr/lib/amd64/librac.so.1 rm -f $usr/lib/sparcv9/librac.so rm -f $usr/lib/sparcv9/librac.so.1 # # Remove /kernel/mac. This directory was introduced by # PSARC/2006/248, and along with this came a syntax change to the # /etc/aggregation.conf file. After archives have been extracted, # we check for the existance of the /kernel/mac directory to see if # we're doing a backward bfu and need to convert the syntax of the # /etc/aggregation.conf file to its old format. # if [ -d $root/kernel/mac ]; then from_new_aggrconf=1 rm -rf $root/kernel/mac else from_new_aggrconf=0 fi # Remove libcmd from $root/lib. It has moved back to $usr/lib. rm -f $root/lib/libcmd.so rm -f $root/lib/libcmd.so.1 rm -f $root/lib/amd64/libcmd.so rm -f $root/lib/amd64/libcmd.so.1 rm -f $root/lib/sparcv9/libcmd.so rm -f $root/lib/sparcv9/libcmd.so.1 rm -f $root/lib/llib-lcmd rm -f $root/lib/llib-lcmd.ln rm -f $root/lib/amd64/llib-lcmd.ln rm -f $root/lib/sparcv9/llib-lcmd.ln # Remove audit_record_attr. Moved to /usr/lib/security rm -f $root/etc/security/audit_record_attr # # Remove xmemfs altogether. # rm -f $usr/include/sys/fs/xmem.h rm -f $usr/include/sys/fs/seg_xmem.h rm -f $usr/kernel/fs/xmemfs rm -f $usr/kernel/fs/amd64/xmemfs rm -rf $usr/lib/fs/xmemfs # # Remove obsolete libmacadm, liblaadm and libwladm. If this is # a backwards BFU, they will be extracted by cpio. # rm -f $root/lib/libmacadm.so.1 rm -f $root/lib/liblaadm.so.1 rm -f $root/lib/libwladm.so.1 # # Remove PCI hotplug devlinks. Their format has changed, # and the old devlinks will interfere with the new ones. # rm -f $root/dev/cfg/*pci* # # remove the architecture-specific sn1_brand module since it's being # replaced with platform-specific modules. # rm -f $root/kernel/brand/sparcv9/sn1_brand # # Remove I2O. # rm -f $root/kernel/drv/i2o_bs rm -f $root/kernel/drv/i2o_bs.conf rm -f $root/kernel/drv/i2o_scsi rm -f $root/kernel/drv/i2o_scsi.conf rm -f $root/kernel/drv/pci_to_i2o rm -f $root/kernel/drv/pci_to_i2o.conf rm -f $root/kernel/misc/i2o_msg rm -f $root/usr/include/sys/i2o/* rmdir $root/usr/include/sys/i2o/ 2>/dev/null # End of pre-archive extraction hacks. if [ $diskless = no -a $zone = global ]; then print "Extracting ufs modules for boot block ... \c" | \ tee -a $EXTRACT_LOG do_extraction $cpiodir/$karch.usr$ZFIX \ 'usr/platform/'$karch'/lib/fs/ufs/*' | \ tee -a $EXTRACT_LOG case $target_isa in sparc) if [[ "$rootslice" = /dev/rdsk/* ]]; then print "Installing boot block on $rootslice." cd $usr/platform/$karch/lib/fs/ufs installboot ./bootblk $rootslice fi ;; i386) ;; *) ;; # unknown ISA esac fi if [ $diskless = yes ]; then node=${root##*/} archlist="" for arch in $allarchs do egrep -s '/export/exec/.*'$arch'/usr/kvm' \ $root/etc/vfstab || test -d $root/platform/$arch && archlist="$archlist $arch" done if [ -z "$old_style_archives" ]; then extract_archives lib generic extract_archives sbin generic extract_archives kernel generic fi extract_archives root generic $archlist if [ $target_isa = i386 ]; then extract_boot_archives boot $archlist fi else export PATH=/tmp/bfubin node=`uname -n` if [ $zone = global ]; then extract_archives usr generic $usrarchs if [ -z "$old_style_archives" ]; then extract_archives lib generic extract_archives sbin generic extract_archives kernel generic fi extract_archives root generic $rootarchs if [ $target_isa = i386 ]; then # # The assumption here is that if boot # archives exist at all, they only exist # for architectures where we also have # .root archives. # extract_boot_archives boot $rootarchs fi else dir_is_inherited usr || extract_archives usr generic $usrarchs dir_is_inherited lib || extract_archives lib generic dir_is_inherited sbin || extract_archives sbin generic dir_is_inherited platform && extract_archives root generic || extract_archives root generic $rootarchs fi fi touch reconfigure # # UltraSparc III platforms have aes module in platform directory # if [ ! -f $root/platform/$plat/kernel/crypto/sparcv9/aes ]; then rm -f $root/platform/sun4u-us3/kernel/crypto/sparcv9/aes rm -f $root/platform/sun4u-us3/kernel/crypto/sparcv9/aes256 fi if [ $zone = global ]; then print "\nRemoving duplicate kernel binaries ..." # # First, find all regular files underneath the */kernel # directories we extracted, and mark them as older or newer # than our reference file -- if newer, they were extracted # during the bfu. # # We then split out the pre-/kernel part from the post-/kernel # part, sort by post-/kernel part and age (new first), and # delete old files which have new counterparts. # dirs="$rootprefix/kernel $usr/kernel" for plat in $archlist $rootarchs $usrarchs; do dir=$rootprefix/platform/$plat/kernel [[ -d $dir ]] && dirs="$dirs $dir" done age=new ls -ct $time_ref `find $dirs -type f 2>/dev/null` | uniq | while read f; do if [[ $f = $time_ref ]] then age=old else echo $age $f fi done | sed 's@\(.*/kernel\)/@\1 @' | sort -k 3 -k 1 | nawk ' /^new/ { lastname = $3 } /^old/ { if (lastname == $3) { print $2 "/" $3 } } ' | while read x; do echo rm $x rm $x done fi echo # Simulate installation of SUNWcry* - these are in the bfu archives. if [ -f $rootprefix/etc/crypto/kcf.conf -a \ -f $rootprefix/etc/crypto/pkcs11.conf ]; then enable_crypto_unlimited fi # Add uCF's metaslot feature if [ -f $rootprefix/etc/crypto/pkcs11.conf ] ; then enable_crypto_metaslot fi # Cleanup old Kerberos mechanisms cleanup_kerberos_mechanisms # Fix network datalink configuration if [ $zone = global -a $need_datalink = yes ]; then create_datalink_conf fi print "\nRestoring configuration files.\n" cd $root rm -rf bfu.ancestor test -d bfu.parent && mv bfu.parent bfu.ancestor mkdir bfu.parent print "Restoring configuration files ... \c" >> $EXTRACT_LOG filelist $zone | cpio -pdmu bfu.parent 2>>$EXTRACT_LOG || \ extraction_error "restoring configuration files" if [ $multi_or_direct = no ]; then if [ $have_realmode = yes ]; then if [ -d bfu.realmode ]; then ( cd bfu.realmode ; realmode_filelist | \ cpio -pdmu ../bfu.ancestor 2>/dev/null ) rm -rf bfu.realmode fi mkdir bfu.realmode ( cd bfu.parent ; realmode_filelist | \ cpio -pdmu ../bfu.realmode 2>/dev/null ) else for file in $realmode_files do rm -rf bfu.parent/$file done fi fi cd bfu.child for file in `filelist $zone` do # parent: freshly-BFUed version # child: pre-BFU version # ancestor: installed from archives the last time you BFUed # actual: in the root filesystem at this moment (same as parent) parent=$rootprefix/bfu.parent/$file child=$rootprefix/bfu.child/$file ancestor=$rootprefix/bfu.ancestor/$file conflicts=$rootprefix/bfu.conflicts/$file actual=$rootprefix/$file # if a superfluous-to-local-zones file was blown away, skip it [ -f $actual ] || continue # if there's been no change by the BFU, skip it cmp -s $child $actual && continue # if the file was not installed by the BFU, skip it [ -f $parent ] || continue # if this is a file which should never be updated by BFU, # preserve the original (child) version if (echo $preserve_files | grep $file >/dev/null 2>&1) then print " preserve: $file" cp -p $child $actual continue fi # if the file was accepted from the parent on the last BFU, # then accept it again this time without argument. Or, if # this is the first bfu after an standard Solaris install # or upgrade, compare the file to one installed from packages. # If it hasn't been modified since installation, accept # the file from the parent. if [ -f $ancestor ] ; then if cmp -s $child $ancestor; then print " update: $file" continue fi elif [ "$firstbfu" = "yes" ] ; then installedsum=$(grep "^/$file " \ $rootprefix/var/sadm/install/contents | awk '{ print $8 }') if [ -n "$installedsum" ] ; then actualsum=`sum $child | sed 's/ .*//'` if [ "$installedsum" -eq "$actualsum" ] ; then print " update: $file" continue fi fi fi # if the BFU'ed file is the same as the beginning of the # pre-BFUed file, assume the user has added lines to the # end, and restore the pre-BFUed version if (cmp $child $parent 2>&1) | egrep -s 'EOF on '$parent; then print " restore: $file" cp -p $child $actual continue fi # if the new version is the same as it was the last time # BFU was run, but still different than the pre-BFU version, # this is an "old" conflict; otherwise, it's a "NEW" # conflict. Old conflicts can usually be safely ignored. if cmp -s $parent $ancestor; then print "old \c" else print "NEW \c" print $file >>$rootprefix/bfu.conflicts/NEW fi print "conflict: $file" (cd $root; print $file | cpio -pdmu bfu.conflicts 2>/dev/null) # for all conflicts, restore the pre-BFU version and let # the user decide what to do. cp -p $child $actual done if [ $zone = global ]; then # # correct permissions using /etc/minor_perm from the parent and # child, prefer parent. # mperm=$rootprefix/etc/minor_perm pmperm=$rootprefix/bfu.parent/etc/minor_perm if [ -f $pmperm ] then mperm="$pmperm $mperm" fi # # Devices with changed permissions should be added here much # like in i.minorperm. The "ssm" devices are special in that # they have no /dev links associated with them. # while read minor dev do ( set -- `fgrep -h "$minor" $mperm` ""; if [ ! -z "$2" ] then chmod $2 $rootprefix/dev/$dev 2>/dev/null chown $3:$4 $rootprefix/dev/$dev 2>/dev/null fi ) done <<-EOF ssm:* ../devices/ssm*:* cpc:shared ../devices/pseudo/cpc* icmp:icmp icmp icmp6:icmp6 icmp6 ip:ip ip ip6:ip6 ip6 rts:rts rts keysock:keysock keysock ipsecah:ipsecah ipsecah ipsecesp:ipsecesp ipsecesp spdsock:spdsock spdsock sad:admin sad/admin fssnap:ctl fssnapctl fssnap:* fssnap/* clone:ce ce clone:eri eri clone:ge ge clone:hme hme clone:le le clone:qfe qfe clone:bge bge bge:* bge* clone:dmfe dmfe dmfe:* dmfe* clone:pcelx pcelx pcelx:* pcelx* clone:dnet dnet dnet:* dnet* clone:elxl elxl elxl:* elxl* clone:iprb iprb iprb:* iprb* clone:spwr spwr spwr:* spwr* EOF if [ $target_isa = i386 ] && [[ $rootslice = /dev/rdsk/* || \ $rootslice = /dev/md/rdsk/* ]]; then check_boot_env fi # Check for damage due to CR 6379341. This was actually fixed # back in snv_24, but users BFUing from an S10 build up to # Nevada can still encounter it. rzi=$root/etc/zones/index if [ -f $rzi ]; then # Look for duplicated UUIDs. If there are any, then # just wipe them out. if nawk -F: ' /^\#/ || NF != 4 { print $0; next; } { if (flags[$4]) sub(/:[-0-9a-z]*$/,":"); print $0; flags[$4]=1; } ' < $rzi > ${rzi}.bfu.$$; then if cmp -s $rzi ${rzi}.bfu.$$; then rm -f ${rzi}.bfu.$$ else chown root:sys ${rzi}.bfu.$$ chmod 644 ${rzi}.bfu.$$ mv ${rzi}.bfu.$$ $rzi fi else rm -f ${rzi}.bfu.$$ fi fi # Move existing /etc/aggregation.conf entries to # /etc/dladm/aggregation.conf; or, if bfu'ing # backwards, move aggregation.conf back to /etc aggr_old=$rootprefix/etc/aggregation.conf aggr_new=$rootprefix/etc/dladm/aggregation.conf if [ $new_dladm = yes ]; then if [ -f $aggr_old ]; then # use cat instead of cp/mv to keep # owner+group of dest cat $aggr_old > $aggr_new rm -f $aggr_old fi else if [ -f $aggr_new ]; then cp $aggr_new $aggr_old chgrp sys $aggr_old rm -rf $rootprefix/etc/dladm fi fi fi # Fix up audit permissions fix_up_audit print "\nFor each file in conflict, your version has been restored." print "The new versions are under $rootprefix/bfu.conflicts." print "\nMAKE SURE YOU RESOLVE ALL CONFLICTS BEFORE REBOOTING.\n" if [ $multi_or_direct = yes ]; then print "To install resolved changes required for reboot in the boot" print "archive, invoke 'bootadm update-archive${cr_args}'\n" fi if [ $zone != global ]; then print "Resolve conflicts in the global zone first. Many of" print "the conflicts in non-global zones can be resolved by" print "copying the corresponding file from the global zone.\n" else fixup_mpxio # # If we're bfuing backward across PSARC/2006/248, then # revert the /etc/aggregation.conf to its old format. # if [ -f $rootprefix/etc/aggregation.conf -a \ ! -d $rootprefix/kernel/mac -a \ $from_new_aggrconf = 1 ]; then revert_aggregation_conf fi fi cd $root smf_apply_conf update_policy_conf if [ $target_isa = i386 ]; then update_mptconf_i386 fi if [ $zone != global ]; then rm -rf $global_zone_only_files $superfluous_nonglobal_zone_files fi print "bfu'ed from $cpiodir on `date +%Y-%m-%d`" >>etc/motd tail +`nawk '/bfu.ed from/ { x=NR }; END { print x+1 }' \ etc/motd.old` etc/motd.old >> etc/motd # # Hacks to work around minor annoyances and make life more pleasant. # Part 2 of 2: post-archive-extraction stuff # rm -f var/statmon/state # to prevent lockd/statd hangs for f in etc/auto_* # to make autofs happy do file $f | grep executable >/dev/null || chmod -x $f done epilogue=$rootprefix/bfu.epilogue if [ -f $epilogue ]; then print "Executing $epilogue" $epilogue || print "WARNING: $epilogue failed with code $?" fi ((seconds = SECONDS)) ((min = seconds / 60)) ((sec = seconds % 60)) if [ $zone = global ]; then target=$node else target=$zone fi printf "Upgrade of $target took ${min}:%02d.\n" $sec # # Do logging in the background so that if the automounter is gone, # bfu doesn't wedge at this point. # log=$GATE/public/bfu.log (test -w $log && printf \ "`date +%Y'%'m%d` $node `uname -rv` $karch $cpiodir ${min}:%02d\n" \ $sec >>$log) & } # # make sure the time reference is older than anything extracted # test $time_ref_seconds -eq $SECONDS && sleep 1 test $diskless = yes && extract_archives usr generic $allarchs for root in $rootlist do mondo_loop $root global lastroot=$root done if [ -s "$bfu_zone_list" ]; then cat "$bfu_zone_list" | while read zone zonepath; do print "\nNow for zone $zone..." mondo_loop $zonepath/root $zone done # # Normally we would clean up $bfu_zone_list but instead we leave it # behind for ACR to locate and use inside the BFU alternate reality. # fi print "Turning off delayed i/o and syncing filesystems ..." sync fastfs -s $rootlist $usr fastfs $rootlist $usr sync lockfs -f $rootlist $usr egrep -s "^error " $EXTRACT_LOG if [ $? -eq 0 ]; then print "\nWARNING: archive extraction errors occurred.\n" print "See $EXTRACT_LOG for details.\n" fi lastrootprefix=${lastroot%/} if [ -t 0 -a -t 1 -a -t 2 ]; then print "\nEntering post-bfu protected environment (shell: ksh)." print "Edit configuration files as necessary, then reboot.\n" cd $lastrootprefix/bfu.conflicts PS1='bfu# ' ksh -ip fi print "Exiting post-bfu protected environment. To reenter, type:" print LD_NOAUXFLTR=1 LD_LIBRARY_PATH=/tmp/bfulib $ldlib64 PATH=/tmp/bfubin \ /tmp/bfubin/ksh exit 0