Upgrading from FreeBSD 7.X to FreeBSD 8.X
=========================================

Author:   Ralf S. Engelschall 
Created:  2009-01-01
Modified: 2011-01-29
Version:  1.4

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 7.3-STABLE to 8.2-STABLE.

---- PREPARE ----------------------------------------------------------------

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 8.X ports cannot be installed under FreeBSD 7.X
  $ url="ftp://ftp.freebsd.org/pub/FreeBSD/ports/`uname -m`/packages-8-stable/All"; \
    ( cd /tmp; for pkg in localedata-5.4.tbz \
      compat6x-`uname -m`-6.4.604000.200810_3.tbz \
      compat7x-`uname -m`-7.3.703000.201008_1.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_8

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        ADAPTIVE_GIANT
  << options        STOP_NMI
  << device         sio
  << device         ugen
  << device         uscanner
  << device         isa
  << device         mem
  << device         io
  << device         sl
  << device         ppp

  >> options        COMPAT_FREEBSD6
  >> options        COMPAT_FREEBSD7
  >> options        P1003_1B_SEMAPHORES
  >> options        PRINTF_BUFR_SIZE=128
  >> options        HWPMC_HOOKS
  >> options        MAC
  >> options        FLOWTABLE
  >> device         acpi
  >> device         uart

o # prepare the upgrade
  # (just to be sure, should be not really necessary this time)
  $ mergemaster -p

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

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

o # workaround 1/3 for "bad system call" during usage of ln(1) in "make etc"
  $ cp -p /bin/ln /bin/ln.old

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

o # workaround 2/3 for "bad system call" during usage of ln(1) in "make etc"
  $ cp -p /bin/ln /bin/ln.new
  $ cp -p /bin/ln.old /bin/ln

o # cleanup system (part 1)
  $ rm -f /etc/rc.d/early.sh /etc/rc.d/idmapd /etc/rc.d/isdnd /etc/rc.d/nfslocking /etc/rc.d/ip6fw
  $ make etc
  $ make clean

o # workaround 3/3 for "bad system call" during usage of ln(1) in "make etc"
  $ cp -p /bin/ln.new /bin/ln
  $ rm -f /bin/ln.old

o # regenerate /etc/localtime
  $ tzsetup

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 /usr/lib32; 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 chflags noschg
  $ 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

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