Author:   Ralf S. Engelschall 
Created:  2007-05-24
Modified: 2009-08-01
Version:  1.3

ATTENTION: THIS UPGRADE PROCEDURE MIGHT NOT WORK FOR YOU AS YOUR
ENVIRONMENT IS DIFFERENT. ALSO, THIS UPGRADE PROCEDURES MIGHT DESTROY
YOUR SYSTEM AND YOU POTENTIALLY MIGHT LOOSE DATA. NO WARRANTY AT ALL.
USE IT AT YOUR OWN RISK!

This upgrades from FreeBSD 6.4-STABLE to 7.2-STABLE.

---- PROLOG -----------------------------------------------------------------

o # reboot once to make sure OLD system is at least
  # able to still successfully reboot autonomous at all
  # SORRY, THIS IS _NOT_ A JOKE -- THIS IS A VERY SERIOUS ISSUE!
  $ shutdown -r now

---- BUILD ------------------------------------------------------------------

o # switch to a reasonable run-time environment
  $ cd /; exec `/usr/bin/which bash sh | head -1`
  $ PATH=/bin:/usr/bin:/sbin:/usr/sbin; umask 022; unset TMOUT

o # install backward compatibility files 
  # ("locale data" to /usr/local/share/compat/, "libraries" to /usr/local/lib/compat/)
  # notice: via binary packages as FreeBSD 7.x ports cannot be installed under FreeBSD 6.X
  $ url="ftp://ftp.freebsd.org/pub/FreeBSD/ports/`uname -m`/packages-7-stable/All"; \
    ( cd /tmp; for pkg in localedata-5.4.tbz compat6x-`uname -m`-6.4.604000.200810.tbz; do \
        fetch -p $url/$pkg; pkg_add $pkg; rm -f $pkg; \
    done )

o # install latest FreeBSD Upgrade Toolkit
  $ cd /usr; \
    fetch http://people.freebsd.org/~rse/dist/freebsd-adm-1.2.2.tar.gz; \
    rm -rf adm; gunzip > RELENG_7

o # upgrade /usr/src (already required for "mergemaster -p" below!)
  $ (cd /usr/src && make cleandir); \
    (cd /usr/adm && make update)

o # upgrade kernel configuration
  $ vi /sys/`uname -m`/conf/`hostname -s | tr 'a-z' 'A-Z'`

  >> options        COMPAT_FREEBSD6
  >> options        SCTP            # Stream Transmission Control Protocol
  >> options        UFS_GJOURNAL    # Enable gjournal-based UFS
  >> options        STOP_NMI        # Stop CPUS using NMI instead of IPI
  >> options        AUDIT           # Security event auditing
  >> options        GEOM_LABEL      # Provides labelization

  << options        GEOM_GPT        # GUID Partition Tables.
  >> options        GEOM_PART_GPT   # GUID Partition Tables.

  << options        COMPAT_43       # Compatible with BSD 4.3 [KEEP THIS!]
  >> options        COMPAT_43TTY    # BSD 4.3 TTY compat [KEEP THIS!]

  << options        NTFS

  >> options        STACK           # stack(9) support

  >> device         uart            # Generic UART driver

  << device         lnc             # NE2100, NE32-VL Lance Ethernet cards
  >> device         le              # AMD Am7900 LANCE and Am79C9xx PCnet

  >> device         firmware        # firmware assist module

  >> device         dcons           # Dumb console driver
  >> device         dcons_crom      # Configuration ROM for dcons

  << device         rr232x          # Highpoint RocketRAID 232x

o # prepare the upgrade
  # (mainly create "ftp" group)
  $ mergemaster -p

o # build new system
  $ cd /usr/adm && make world-build kernel-build

---- INSTALL ----------------------------------------------------------------

o # upgrade system 
  $ make world-install kernel-install

o # cleanup system (part 1)
  $ rm -f /etc/rc.d/ike /etc/rc.d/pccard /etc/rc.d/pcvt /etc/rc.d/ramdisk
  $ rm -f /etc/rc.d/ramdisk-own /etc/rc.d/usbd /etc/rc.d/nfslocking
  $ make etc
  $ make clean

o # reboot into upgraded system
  $ shutdown -r now

---- CLEANUP ----------------------------------------------------------------

o # switch to a reasonable run-time environment
  $ cd /; exec `/usr/bin/which bash sh | head -1`
  $ PATH=/bin:/usr/bin:/sbin:/usr/sbin; umask 022; unset TMOUT

o # cleanup system (part 2)
  $ ( for dir in /bin /sbin /usr/bin /usr/sbin /usr/libexec /usr/libdata; do \
      find $dir -mtime +2 -type f -xdev -print; \
      find $dir -mtime +2 -type l -xdev -print; \
      done ) >/tmp/remove
  $ vi /tmp/remove
  # REVIEW FILES TO REMOVE MANUALLY
  $ cat /tmp/remove | xargs rm -f
  $ ( for dir in /lib /usr/lib; do \
      find $dir -mtime +2 -type f -xdev -print; \
      find $dir -mtime +2 -type l -xdev -print; \
      done ) | grep -v /usr/lib/compat >/tmp/move
  $ vi /tmp/move
  # REVIEW FILES TO MOVE MANUALLY
  $ for x in `cat /tmp/move`; do chflags noschg $x; mv $x /usr/lib/compat/; done
  $ cd /usr/src; make BATCH_DELETE_OLD_FILES=YES delete-old delete-old-libs

---- EPILOG ----------------------------------------------------------------

o # reboot into cleaned system
  # (mainly to reload the shared library cache and to
  # make sure everything really still works fine)
  $ shutdown -r now