When there is a need to upgrade an existing Linux installation that has been running for some time, there is always a certain fear of breaking things. Especially if the machine has been doing it’s job fine for a long time. Unfortunately we can’t escape these kind of things and in most cases it’s better to move to a new version before it gets unsupported. Fortunately the procedure and success of this process has been greatly improved with recent versions of (Debian) Linux. This post will take you through the required steps to upgrade an existing Debian 9 to the current stable Debian 10 installation.
YouTube video
If you are interested, I also created a YouTube video from this blogpost. If you prefer classic text, you can just follow the rest of this article:
Introduction
There can be plenty of reasons to upgrade an existing system. For example: You might run into problems with outdated software versions. Getting newer versions would require you to get 3rd party repositories added to stay current, which is not ideal and could cause dependency issues. It could also simply be because the current version went out of support. Or because you don’t want to get behind too far as migration from a very old version tends to be painful.
Debian 9, Stretch, went out of “regular” support since July 2020. At that time, the newer version, Buster, was out for a year. This means that, since then, updates for Stretch are no longer maintained by the Debian security team but by a group of volunteers and companies. This is called LTS (Long Term Support).
Upgrading the Linux distribution itself is very painless. That system comes with a whole set op packages in the repositories though. Because these are largely dependent on each other, there is a good chance that currently installed software will need to be upgraded as well. This is where you can expect most issues. For example, the Apache 2.2 to 2.4 upgrade introduced a complete new format for the configuration files. In some of these cases those configuration files could be automatically migrated but, in any case, it had to be thoroughly tested.
Before we begin, let’s check on which release we are and on which kernel version. There are several ways to do this but I prefer the following method as it works on most Linux distros:
jensd@deb:~$ cat /etc/*version 9.13 jensd@deb:~$ uname -a Linux deb 4.9.0-14-amd64 #1 SMP Debian 4.9.246-2 (2020-12-17) x86_64 GNU/Linux
For this post, this will be my starting point and as you could guess, the goal is to end with Debian version 10.
Just to check what exactly gets upgraded, let’s also record some version of software I have installed under Debian 9:
jensd@deb:~$ apt list apache2 Listing… Done apache2/oldstable,oldstable,now 2.4.25-3+deb9u9 amd64 [installed] jensd@deb:~$ apt list postgresql Listing… Done postgresql/oldstable,oldstable,now 9.6+181+deb9u3 all [installed]
Preparation
Reading
It’s a good practice to have a look at the release notes and press release. In there you can find which are the new versions for a certain release. For Debian 10, you can find this information over here: https://www.debian.org/releases/stable/amd64/release-notes/ch-whats-new.en.html. If we take a few examples: PostgreSQL goes from version 9.6 to 11, PHP goes from 7.0 to 7.3 and Nginx from 1.10 to 1.14. If this software is critical for your system, best is to read yourself into the impact of upgrading and required (manual) changes.
Backup
Before upgrading to a new release, it’s best to take a proper backup of your system. The chance that the package manager, apt, will touch your actual data in /home or /var is rather small but configuration files in /etc or profile settings in /home can be impacted. In most chances the system will not break but it isn’t completely unrealistic either. The easiest way is to take a snapshot, either with a tool like Timeshift or if this is a VM, on your hypervisor.
Downtime, testing and migration
It should be logical but you wouldn’t be the first, myself included, that quickly, before production starts, wants to upgrade a system. Those are moments where you are properly reminded of Murphy’s law.
Keep in mind as well that installing a new version of certain packages might not be enough to complete the upgrade. As mentioned in the introduction, some upgrades come with changes that require manual migration steps. Best is to test this properly beforehand on a clone or test-setup.
Update the old release
Before going to the new release, although not completely mandatory, I believe it is a good idea to update to the latest version of the current release you are on at the moment.
This can simply be done by running the following:
jensd@deb:~$ sudo apt update Get:1 http://security.debian.org/debian-security stretch/updates InRelease [53.0 kB] Ign:2 http://ftp.be.debian.org/debian stretch InRelease Hit:3 http://ftp.be.debian.org/debian stretch-updates InRelease ... Reading state information... Done 2 packages can be upgraded. Run 'apt list --upgradable' to see them. jensd@deb:~$ jensd@deb:~$ sudo apt upgrade Reading package lists... Done ... 2 upgraded, 0 newly installed, 0 to remove and 0 not upgraded. Need to get 2,108 kB of archives. After this operation, 0 B of additional disk space will be used. Do you want to continue? [Y/n] y Get:1 http://security.debian.org/debian-security stretch/updates/main amd64 libssl1.1 amd64 ... Processing triggers for libc-bin (2.24-11+deb9u4) … jensd@deb:~$ jensd@deb:~$ sudo apt full-upgrade Reading package lists… Done Building dependency tree Reading state information… Done Calculating upgrade… Done 0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
Once this step is complete, you can start with the actual upgrade to the new release.
Upgrading
Update sources.list
First step in the upgrade process is to change the source of installation packages to point to the newer release. This is done in /etc/apt/sources.list.
Change the name of your current release (Stretch) here with the new release (Buster). You can also use “stable” instead of the current stable release name. This will always refer to the newest stable version. Only this could lead to a sudden, unplanned, upgrade so I prefer to use the release name specifically instead.
For example for a simple Debian 9 installation:
Before:
jensd@deb:~$ cat /etc/apt/sources.list # # deb cdrom:[Debian GNU/Linux 9.13.0 Stretch - Official amd64 NETINST 20200718-11:07]/ stretch main #deb cdrom:[Debian GNU/Linux 9.13.0 Stretch - Official amd64 NETINST 20200718-11:07]/ stretch main deb http://ftp.be.debian.org/debian/ stretch main deb-src http://ftp.be.debian.org/debian/ stretch main deb http://security.debian.org/debian-security stretch/updates main deb-src http://security.debian.org/debian-security stretch/updates main # stretch-updates, previously known as 'volatile' deb http://ftp.be.debian.org/debian/ stretch-updates main deb-src http://ftp.be.debian.org/debian/ stretch-updates main
After:
jensd@deb:~$ sudo cp /etc/apt/sources.list /etc/apt/source_list_stretch jensd@deb:~$ sudo vi /etc/apt/sources.list jensd@deb:~$ cat /etc/apt/sources.list # deb http://ftp.be.debian.org/debian/ buster main deb-src http://ftp.be.debian.org/debian/ buster main deb http://security.debian.org/debian-security buster/updates main deb-src http://security.debian.org/debian-security buster/updates main deb http://ftp.be.debian.org/debian/ buster-updates main deb-src http://ftp.be.debian.org/debian/ buster-updates main
Once source.list is updated, we need to refresh the package lists:
jensd@deb:~$ sudo apt update Get:1 http://security.debian.org/debian-security buster/updates InRelease [65.4 kB] Get:2 http://security.debian.org/debian-security buster/updates/main Sources [178 kB] Get:3 http://security.debian.org/debian-security buster/updates/main amd64 Packages [267 kB] Get:4 http://ftp.be.debian.org/debian buster InRelease [122 kB] Get:5 http://ftp.be.debian.org/debian buster-updates InRelease [51.9 kB] Get:6 http://security.debian.org/debian-security buster/updates/main Translation-en [142 kB] Get:7 http://ftp.be.debian.org/debian buster/main Sources [7,841 kB] Get:8 http://ftp.be.debian.org/debian buster/main amd64 Packages [7,907 kB] Get:9 http://ftp.be.debian.org/debian buster/main Translation-en [5,969 kB] Get:10 http://ftp.be.debian.org/debian buster-updates/main Sources [4,328 B] Get:11 http://ftp.be.debian.org/debian buster-updates/main amd64 Packages [9,504 B] Get:12 http://ftp.be.debian.org/debian buster-updates/main Translation-en [6,834 B] Fetched 22.6 MB in 6s (3,226 kB/s) Reading package lists… Done Building dependency tree Reading state information… Done 465 packages can be upgraded. Run 'apt list --upgradable' to see them.
Two step upgrade: Step 1: minimal system upgrade
At this point our system is aware of the packages it can upgrade. The best now is to perform the upgrade in two steps. First we perform a so called minimal system upgrade. This only upgrades the packages that can be upgraded without requiring any other packages to be removed or installed.
We can initiate the minimal system upgrade with the following command:
jensd@deb:~$ sudo apt upgrade Reading package lists… Done Building dependency tree Reading state information… Done Calculating upgrade… Done The following packages were automatically installed and are no longer required: libbind9-140 libboost-filesystem1.62.0 libboost-iostreams1.62.0 libboost-system1.62.0 libdbus-glib-1-2 libdns162 libegl-mesa0 libegl1 libegl1-mesa libgbm1 libgl1-mesa-glx libicu57 libisc160 libisccc140 libisccfg140 liblwres141 libperl5.24 libpython3.5 libpython3.5-dev libpython3.5-minimal libpython3.5-stdlib libwayland-egl1-mesa libwayland-server0 libxcb-xfixes0 python3-pyasn1 python3.5 python3.5-dev python3.5-minimal rename sgml-base tcpd xml-core Use 'sudo apt autoremove' to remove them. The following NEW packages will be installed: apparmor binutils-common binutils-x86-64-linux-gnu cpp-8 dbus-user-session e2fsprogs-l10n exim4-base exim4-config exim4-daemon-light fdisk firmware-linux-free gcc-7-base gcc-8 gcc-8-base gnupg-l10n gnupg-utils gpg gpg-agent gpg-wks-client gpg-wks-server gpgconf gpgsm guile-2.2-libs libargon2-1 libasan5 libbind9-161 libbinutils libboost-atomic1.67.0 libboost-chrono1.67.0 libboost-date-time1.67.0 libboost-filesystem1.67.0 libboost-iostreams1.67.0 libboost-regex1.67.0 libboost-system1.67.0 libboost-thread1.67.0 libbrotli1 libcap2-bin libcom-err2 libcryptsetup12 libcurl4 libdns-export1104 libdns1104 libdrm-common libefiboot1 libefivar1 libegl-mesa0 libegl1 libevent-2.1-6 libext2fs2 libfribidi0 libfstrm0 libgc1c2 libgcc-8-dev libgdbm-compat4 libgdbm6 libgdk-pixbuf2.0-bin libgl1 libglvnd0 libglx-mesa0 libglx0 libgnutls-dane0 libgpg-error-l10n libgsasl7 libicu63 libirs161 libisc-export1100 libisc1100 libisccc161 libisccfg163 libisl19 libjansson4 libjson-c3 libkyotocabinet16v5 libllvm7 liblmdb0 libltdl7 liblwres161 liblzo2-2 libmailutils5 libmariadb3 libmpfr6 libncurses6 libncursesw6 libnftables0 libnftnl11 libnss-systemd libntlm0 libpam-cap libpcre2-8-0 libperl5.28 libprocps7 libprotobuf-c1 libpython2-stdlib libpython2.7 libpython3.7 libpython3.7-dev libpython3.7-minimal libpython3.7-stdlib libtinfo6 libubsan1 libuchardet0 libunbound8 libunistring2 libwayland-egl1 libwebp6 libzstd1 linux-image-4.19.0-14-amd64 mailutils mailutils-common mariadb-common mysql-common nftables perl-modules-5.28 pigz postgresql-11 postgresql-client-11 psmisc python2 python2-minimal python3-asn1crypto python3-certifi python3-debconf python3-distutils python3-entrypoints python3-lib2to3 python3.7 python3.7-dev python3.7-minimal usb.ids The following packages have been kept back: build-essential g++ libgl1-mesa-dri libstdc++6 sysstat The following packages will be upgraded: adduser adwaita-icon-theme apache2 apache2-bin apache2-data apache2-utils apt apt-listchanges apt-utils aptitude aptitude-common at-spi2-core base-files base-passwd bash bash-completion bind9-host binutils bsdmainutils bsdutils busybox bzip2 ca-certificates console-setup console-setup-linux coreutils cpio cpp cron dash dbus dconf-gsettings-backend dconf-service debconf debconf-i18n debian-archive-keyring debian-faq debianutils dh-python dictionaries-common diffutils dirmngr discover distro-info-data dmidecode dmsetup dnsutils dpkg dpkg-dev e2fslibs e2fsprogs emacsen-common fakeroot file findutils fontconfig fontconfig-config gcc geoip-database gettext-base gir1.2-glib-2.0 glib-networking glib-networking-common glib-networking-services gnome-icon-theme gnupg gnupg-agent gpgv grep groff-base grub-common grub-pc grub-pc-bin grub2-common gsettings-desktop-schemas gtk-update-icon-cache gzip hdparm hicolor-icon-theme hostname iamerican ibritish ienglish-common ifupdown init init-system-helpers initramfs-tools initramfs-tools-core installation-report iproute2 iptables iputils-ping isc-dhcp-client isc-dhcp-common iso-codes ispell kbd keyboard-configuration klibc-utils kmod krb5-locales laptop-detect less libacl1 libalgorithm-diff-perl libalgorithm-diff-xs-perl libapparmor1 libapr1 libaprutil1 libaprutil1-dbd-sqlite3 libaprutil1-ldap libapt-inst2.0 libapt-pkg5.0 libassuan0 libatk-bridge2.0-0 libatk1.0-0 libatk1.0-data libatomic1 libatspi2.0-0 libattr1 libaudit-common libaudit1 libavahi-client3 libavahi-common-data libavahi-common3 libblkid1 libbsd0 libbz2-1.0 libc-bin libc-dev-bin libc-l10n libc6 libc6-dev libcairo-gobject2 libcairo2 libcap-ng0 libcap2 libcc1-0 libcgi-fast-perl libcgi-pm-perl libcilkrts5 libclass-accessor-perl libclass-isa-perl libcolord2 libcomerr2 libcroco3 libcups2 libcurl3-gnutls libcwidget3v5 libdatrie1 libdb5.3 libdbus-1-3 libdbus-glib-1-2 libdconf1 libdebconfclient0 libdevmapper1.02.1 libdiscover2 libdpkg-perl libdrm-amdgpu1 libdrm-intel1 libdrm-nouveau2 libdrm-radeon1 libdrm2 libedit2 libegl1-mesa libelf1 libepoxy0 libestr0 libexpat1 libexpat1-dev libfakeroot libfastjson4 libfcgi-perl libfdisk1 libffi6 libfile-fcntllock-perl libfontconfig1 libfreetype6 libfuse2 libgail-common libgail18 libgbm1 libgcc1 libgcrypt20 libgdk-pixbuf2.0-0 libgdk-pixbuf2.0-common libgeoip1 libgirepository-1.0-1 libgl1-mesa-glx libglapi-mesa libglib2.0-0 libglib2.0-data libgmp10 libgnutls30 libgomp1 libgpg-error0 libgpm2 libgraphite2-3 libgssapi-krb5-2 libgtk-3-0 libgtk-3-bin libgtk-3-common libgtk2.0-0 libgtk2.0-bin libgtk2.0-common libharfbuzz0b libhogweed4 libhtml-parser-perl libhttp-message-perl libidn11 libidn2-0 libip4tc0 libip6tc0 libiptc0 libitm1 libjpeg62-turbo libjs-jquery libjs-underscore libjson-glib-1.0-0 libjson-glib-1.0-common libk5crypto3 libkeyutils1 libklibc libkmod2 libkrb5-3 libkrb5support0 liblcms2-2 libldap-2.4-2 libldap-common liblocale-gettext-perl liblockfile-bin liblognorm5 liblsan0 liblz4-1 liblzma5 libmagic-mgc libmagic1 libmount1 libmpc3 libmpdec2 libmpx2 libncurses5 libncursesw5 libnetfilter-conntrack3 libnettle6 libnewt0.52 libnfnetlink0 libnghttp2-14 libnotify4 libnpth0 libp11-kit0 libpam-modules libpam-modules-bin libpam-runtime libpam-systemd libpam0g libpango-1.0-0 libpangocairo-1.0-0 libpangoft2-1.0-0 libparse-debianchangelog-perl libpciaccess0 libpcre3 libpipeline1 libpixman-1-0 libpng16-16 libpopt0 libpq5 libproxy1v5 libpsl5 libpython-stdlib libpython2.7-minimal libpython2.7-stdlib libpython3-dev libpython3-stdlib libquadmath0 libreadline7 librest-0.7-0 librsvg2-2 librsvg2-common librtmp1 libsasl2-2 libsasl2-modules libsasl2-modules-db libseccomp2 libselinux1 libsemanage-common libsemanage1 libsepol1 libsigc++-2.0-0v5 libslang2 libsm6 libsmartcols1 libsoup-gnome2.4-1 libsoup2.4-1 libsqlite3-0 libss2 libssh2-1 libssl1.1 libsub-name-perl libsystemd0 libtasn1-6 libtext-charwidth-perl libtext-iconv-perl libthai-data libthai0 libtiff5 libtimedate-perl libtinfo5 libtsan0 libubsan0 libudev1 liburi-perl libusb-0.1-4 libusb-1.0-0 libuuid1 libwayland-client0 libwayland-cursor0 libwayland-egl1-mesa libwayland-server0 libwrap0 libwxbase3.0-0v5 libwxgtk3.0-0v5 libx11-6 libx11-data libx11-xcb1 libxapian30 libxau6 libxcb-dri2-0 libxcb-dri3-0 libxcb-glx0 libxcb-present0 libxcb-render0 libxcb-shm0 libxcb-sync1 libxcb-xfixes0 libxcb1 libxcursor1 libxdamage1 libxinerama1 libxkbcommon0 libxml2 libxmuu1 libxshmfence1 libxslt1.1 libxtables12 linux-base linux-image-amd64 linux-libc-dev locales login logrotate lsb-base lsb-release lsof make man-db manpages manpages-dev mime-support mount multiarch-support nano ncurses-base ncurses-bin ncurses-term netbase netcat-traditional notification-daemon openssh-client openssh-server openssh-sftp-server openssl os-prober passwd patch perl perl-base pgadmin3 pgadmin3-data pgagent pinentry-curses postgresql postgresql-client postgresql-client-common postgresql-common powermgmt-base procps python python-apt python-apt-common python-minimal python-pip-whl python2.7 python2.7-minimal python3 python3-apt python3-cffi-backend python3-chardet python3-crypto python3-cryptography python3-dbus python3-debian python3-debianbts python3-dev python3-gi python3-httplib2 python3-idna python3-keyring python3-keyrings.alt python3-minimal python3-pip python3-pkg-resources python3-pyasn1 python3-pycurl python3-pysimplesoap python3-reportbug python3-requests python3-setuptools python3-six python3-urllib3 python3-wheel python3-xdg readline-common rename reportbug rsyslog sed sensible-utils shared-mime-info sudo systemd systemd-sysv sysvinit-utils tar task-english task-ssh-server tasksel tasksel-data tcpd telnet tzdata ucf udev usbutils util-linux util-linux-locales vim vim-common vim-runtime vim-tiny wamerican wget whiptail xauth xdg-user-dirs xkb-data xml-core xxd xz-utils zlib1g 460 upgraded, 129 newly installed, 0 to remove and 5 not upgraded. Need to get 386 MB of archives. After this operation, 824 MB of additional disk space will be used. Do you want to continue? [Y/n] y Get:1 http://security.debian.org/debian-security buster/updates/main amd64 libssl1.1 amd64 1.1.1d-0+deb10u5 [1,539 kB] Get:2 http://ftp.be.debian.org/debian buster/main amd64 base-files amd64 10.3+deb10u8 [69.9 kB] Get:3 http://ftp.be.debian.org/debian buster/main amd64 libc-l10n all 2.28-10 [847 kB] ... Processing triggers for initramfs-tools (0.133+deb10u1) … update-initramfs: Generating /boot/initrd.img-4.19.0-14-amd64 Processing triggers for libc-bin (2.28-10) … Processing triggers for libgdk-pixbuf2.0-0:amd64 (2.38.1+dfsg-1) … jensd@deb:~$
After some time, you should get a list of changes that need your attention:
apt-listchanges: News --------------------- postgresql-common (200+deb10u1) buster; urgency=high Existing PostgreSQL databases need to be reindexed When upgrading from stretch to buster, the glibc locale data is upgraded. Specifically, this changes how PostgreSQL sorts data in text indexes. To avoid corruption, such indexes need to be REINDEXed immediately after upgrading the locales or locales-all packages, before putting back the database into production. Suggested command: sudo -u postgres reindexdb --all Alternatively, upgrade the databases to PostgreSQL 11 using pg_upgradecluster. (This uses pg_dump by default which will rebuild all indexes. Using -m upgrade or pg_upgrade is not safe because it preserves the now-wrong index ordering.) Refer to the PostgreSQL Wiki for more information: https://wiki.postgresql.org/wiki/Locale_data_changes -- Christoph Berg myon@debian.org Fri, 12 Apr 2019 14:32:52 +0200 apt (1.8.0~alpha3) unstable; urgency=medium The PATH for running dpkg is now configured by the option DPkg::Path, ... debconf (1.5.68) unstable; urgency=low From now on, Kde frontend requires debconf-kde-helper package. libqtcore4-perl and libqtgui4-perl packages can be safely removed. -- Modestas Vainius modax@debian.org Wed, 18 Jul 2018 21:12:23 +0100 (press q to quit)
As you can see this contains a lot of useful information which is ordered by importance. For example, due to the upgrade to PostgreSQL, we need to rebuild the indexes. The message even suggest a proper approach for this and where to find more information. Hence it’s a good idea to read through the messages.
Something else you could also see is about decisions that need input. In most cases you will see a ncurses dialog as the following:
Or another example, to ask if services that need a restart can be restarted automatically:
During the installation, you will see this in the output of apt as well:
Restarting services possibly affected by the upgrade: postgresql: restarting…done. cron: restarting…done. Services restarted successfully.
Two step upgrade: Step 2: full system upgrade
If all goes well, and the minimal system upgrade is complete, we can finally perform the full upgrade:
jensd@deb:~$ sudo apt full-upgrade Reading package lists… Done Building dependency tree Reading state information… Done Calculating upgrade… Done The following packages were automatically installed and are no longer required: g++-6 libbind9-140 libboost-filesystem1.62.0 libboost-iostreams1.62.0 libboost-system1.62.0 libdbus-glib-1-2 libdns162 libegl-mesa0 libegl1 libegl1-mesa libgbm1 libgl1-mesa-glx libicu57 libisc160 libisccc140 libisccfg140 liblwres141 libperl5.24 libpython3.5 libpython3.5-dev libpython3.5-minimal libpython3.5-stdlib libstdc++-6-dev libtxc-dxtn-s2tc libwayland-egl1-mesa libwayland-server0 libxcb-xfixes0 linux-image-4.9.0-13-amd64 python3-pyasn1 python3.5 python3.5-dev python3.5-minimal rename sgml-base tcpd xml-core Use 'sudo apt autoremove' to remove them. The following packages will be REMOVED: libllvm3.9 libsensors4 The following NEW packages will be installed: g++-8 libsensors-config libsensors5 libstdc++-8-dev The following packages will be upgraded: build-essential g++ libgl1-mesa-dri libstdc++6 sysstat 5 upgraded, 4 newly installed, 2 to remove and 0 not upgraded. Need to get 19.0 MB of archives. After this operation, 32.3 MB of additional disk space will be used. Do you want to continue? [Y/n] y Get:1 http://ftp.be.debian.org/debian buster/main amd64 sysstat amd64 12.0.3-2 [562 kB] ... Processing triggers for man-db (2.8.5-2) … Processing triggers for libc-bin (2.28-10) … jensd@deb:~$
Reboot
At this point everything should be upgraded and we are ready to perform a reboot.
jensd@deb:~$ sudo init 6
In GRUB we can already see that the new kernel, as Debian 10 comes with 4.19, is installed:
Once the boot process finished, we can check the same commands as we listed in the beginning and compare the output:
jensd@deb:~$ cat /etc/*version 10.8 jensd@deb:~$ uname -a Linux deb 4.19.0-14-amd64 #1 SMP Debian 4.19.171-2 (2021-01-30) x86_64 GNU/Linux
Same goes for the installed package versions:
jensd@deb:~$ apt list apache2 Listing… Done apache2/stable,stable,now 2.4.38-3+deb10u4 amd64 [installed] jensd@deb:~$ apt list postgresql -a Listing… Done postgresql/stable,now 11+200+deb10u4 all [installed] postgresql/stable 11+200+deb10u3 all
At this point, our system is fully upgraded and is running on the latest Debian stable version: Buster.
Cleanup
As you might have noticed in some of the output of apt, the system still contains some unused packages. After testing if everything works, it’s good practice to clean these to keep the system in good shape.
We can start by cleaning the cached package, which are typically in /var/cache/apt:
jensd@deb:~$ sudo apt clean
Next, we can remove unused packages:
jensd@deb:~$ sudo apt --purge autoremove Reading package lists… Done Building dependency tree Reading state information… Done The following packages will be REMOVED: g++-6* libbind9-140* libboost-filesystem1.62.0* libboost-iostreams1.62.0* libboost-system1.62.0* libdbus-glib-1-2* libdns162* libegl-mesa0* libegl1* libegl1-mesa* libgbm1* libgl1-mesa-glx* libicu57* libisc160* libisccc140* libisccfg140* liblwres141* libperl5.24* libpython3.5* libpython3.5-dev* libpython3.5-minimal* libpython3.5-stdlib* libstdc++-6-dev* libtxc-dxtn-s2tc* libwayland-egl1-mesa* libwayland-server0* libxcb-xfixes0* linux-image-4.9.0-13-amd64* python3-pyasn1* python3.5* python3.5-dev* python3.5-minimal* rename* sgml-base* tcpd* xml-core* 0 upgraded, 0 newly installed, 36 to remove and 0 not upgraded. After this operation, 378 MB disk space will be freed. Do you want to continue? [Y/n] y ... Purging configuration files for sgml-base (1.29) … Purging configuration files for linux-image-4.9.0-13-amd64 (4.9.228-1) … jensd@deb:~$
Now your system is in a tidy, and most of all, upgraded shape.