This template is meant to serve as a general upgrade path for any Debian release. This is my standard path and will be adjusted based on the “old” current release installed on the system and the target “new” release the server is being upgraded to.
I will normally create a complete system clone and use this template to work out the entire correct and functional path for the production system in question.
Set maintainance window for upgrade with buffer
Verify the recoverability of system from backup image
Local terminal or SSH access
i.e.: a. Web server delivers correctly b. php scripts execute correctly c. DB runs correctly d. mail works
find NON-Pure Debian packages # apt install aptitude apt-forktracer # aptitude search '~i(!~ODebian)' # apt-forktracer | sort
# aptitude Select GO and review
check /etc/apt/preferences & /etc/apt/preferences.d/ for entries
# dpkg --audit # aptitude search "~ahold" # dpkg --get-selections | grep 'hold$'
To remove a hold on a package: echo package_name install | dpkg --set-selections
3.1. Update current installation
# sudo apt update
3.2. Upgrade current installation
# sudo apt upgrade
3.3. Check functionality
Verify all services required of current host is functioning correctly
3.4. Upgrade current distribution
# sudo apt dist-upgrade
3.5. Check functionality
see 3.3 above
4.1. Adding APT Internet sources
# sudo sed -i 's/CURRENT_RELEASE/TARGET_RELEASE/g' /etc/apt/sources.list # sudo sed -i 's/CURRENT_RELEASE/TARGET_RELEASE/g' /etc/apt/sources.list.d/*
4.2. Adding APT sources for a local mirror
Only required for special in-house software
4.3. Adding APT sources from optical media
Only required for special 3rd party delivered software
Ensure all partition mountpoints are mounted read-write # mount -o remount,rw /mountpoint
5.1. Recording the session
# script -t 2>~/upgrade-TARGET_RELEASEstep.time -a ~/upgrade-TARGET_RELEASEstep.script To replay session use scriptreplay # scriptreplay ~/upgrade-TARGET_RELEASE.time ~/upgrade-TARGET_RELEASE.script
5.2. Updating the package list
# apt-get update
5.3. Make sure you have sufficient space for the upgrade
# apt-get -o APT::Get::Trivial-Only=true dist-upgrade
5.4. Minimal system upgrade
# apt-get upgrade
5.5. Check functionality
See 3.3 above
5.6. Upgrading the system
# apt-get dist-upgrade
5.7. Check functionality
See 3.3 above
6.1. Dist-upgrade fails with “Could not perform immediate configuration”
# apt-get dist-upgrade -o APT::Immediate-Configure=0
6.2. Expected removals 6.3. Conflicts or Pre-Depends loops
use -o APT::Force-LoopBreak=1 with apt-get or # dpkg --remove package_name or # apt-get -f install # dpkg --configure --pending or # dpkg --install /path/to/package_name.deb
6.4. File conflicts
# dpkg -r --force-depends package_name
6.5. Configuration changes
Usually answer "YES" to files in /etc/init.d directory or /etc/manpath.config
6.6. Change of session to console
Ctrl+Alt+F1 should recover the terminal window
7.1. Install any needed kernel metapackage
Check for meta package # dpkg -l "linux-image*" | grep ^ii | grep -i meta if none are installed check which ones are available # apt-cache search linux-image- | grep -i meta | grep -v transition select correct one based on value returned by running "uname -r" eg. kernel “2.6.32-5-amd64” # apt-cache show linux-image-amd64
8.1. Purging removed packages
Remove redundant or obsolete packages. see 5.3 above get list of removed packages # dpkg -l | awk '/^rc/ { print $2 }' remove using # apt-get purge $(dpkg -l | awk '/^rc/ { print $2 }') or use # aptitude search '~c' # aptitude purge '~c'
9.1. Dummy packages