Fixing Fedora distro-sync upgrade

It can happen to anyone. You went with yum distro-sync transaction that got interrupted and your system is broken. And you want to know how to fix it.

The most obvious step to try is to tell yum to finish what it started:

# yum-complete-transaction

or try to roll-back with:

# # See the ID of the distro-sync
# yum history list
# yum history undo ID

If that does not take you to the happy end or you suspect something is still wrong, keep on reading.

When you do a Fedora upgrade, yum wants to replace all your packages from the old version to the new one. And when you interrupt the transaction, your system ends in a mixed state having the packages from both version. The idea how to fix that is simple.

First you want yum to know the right $releasever. Know that even if newer fedora-release packages are installed and system show the right (desired) version when you run:

$ cat /etc/redhat-release

yum might still think you are on the old one. You need to delete any fedora-release packages that does not come from your disired Fedora version.

For instead imagine a broken update from f20 to f21:

$ rpm -qa *release*

As you can see you need to yum remove the old fedora-release packages. Once that is done, you don’t need to supply --releasever option to yum and yum should still correctly determine the version you are running.

And since it is more than likely that they are more duplicate packages like that, you want to remove them to:

# package-cleanup --cleandupes

If that fails you, install yum-utils first.

Afterwards you should be able to do yum distro-sync and yum update just fine.

But what about the kernel you ask? Chances are you still run the old one:

$ rpm -qa kernel
$ uname -r

In my example we have 3 kernels installed and the latest kernel for f20 running. That is certainly not what we want.

If you need to tell grub to use different kernel, look at the approved answer by Jamie Nguyen on Ask Fedora. I am including the answer here for convenience:

Open /etc/default/grub and ensure this line exists:


Apply the change to grub.cfg by running:

$ grub2-mkconfig -o /boot/grub2/grub.cfg

List all possible menu entries:

$ grep ^menuentry /boot/grub2/grub.cfg | cut -d "'" -f2

Set the desired default menu entry:

$ grub2-set-default <menu entry title>

Verify the default menu entry:

$ grub2-editenv list

At this point most of the things should be in order and if you hit a problem with a broken package, just reinstall it.


I wrote a complete guide on web application deployment. Ruby with Puma, Python with Gunicorn, NGINX, PostgreSQL, Redis, networking, processes, systemd, backups, and all your usual suspects.

More →