Qt 6.8.0 partial upgrade broke graphics?

Hi, today I do apt update && apt dist-upgrade to install some new software. Some qt6 and qml6 packages got upgraded along the way.
Then after a reboot, I got black screen.
I switch to another TTY to find out what was happened.
After digging through a ton of syslog in journalctl -b , it turns out kwin-wayland is crashed due to version mismatch of Qt6 : some package is Qt 6.8.0 and the rest is Qt 6.7.2
I banged my head to the wall then write a fukin long oneliner to loop through all installed packages with version 6.8.0, dig for the exact version string of its 6.7.2 in apt-cache. And finally concatenate them into a single apt install --reinstall
For god sake it works. All Qt6 packages go back to 6.7.2 and plasma works again.
Now I run apt list --upgradable and get the culprit:

$ apt list --upgradable
Listing... Done
libqt6core6t64/noble,noble 6.8.0-0zneon+24.04+noble+release+build8 all [upgradable from: 6.7.2-0zneon+24.04+noble+release+build4]
libqt6dbus6t64/noble,noble 6.8.0-0zneon+24.04+noble+release+build8 all [upgradable from: 6.7.2-0zneon+24.04+noble+release+build4]
libqt6gui6t64/noble,noble 6.8.0-0zneon+24.04+noble+release+build8 all [upgradable from: 6.7.2-0zneon+24.04+noble+release+build4]
libqt6network6t64/noble,noble 6.8.0-0zneon+24.04+noble+release+build8 all [upgradable from: 6.7.2-0zneon+24.04+noble+release+build4]
libqt6printsupport6t64/noble,noble 6.8.0-0zneon+24.04+noble+release+build8 all [upgradable from: 6.7.2-0zneon+24.04+noble+release+build4]
libqt6sql6-sqlite/noble,noble 6.8.0-0zneon+24.04+noble+release+build8 all [upgradable from: 6.7.2-0zneon+24.04+noble+release+build4]
libqt6sql6t64/noble,noble 6.8.0-0zneon+24.04+noble+release+build8 all [upgradable from: 6.7.2-0zneon+24.04+noble+release+build4]
libqt6svg6/noble,noble 6.8.0-0zneon+24.04+noble+release+build3 all [upgradable from: 6.7.2-0zneon+24.04+noble+release+build1]
libqt6widgets6t64/noble,noble 6.8.0-0zneon+24.04+noble+release+build8 all [upgradable from: 6.7.2-0zneon+24.04+noble+release+build4]
libqt6xml6t64/noble,noble 6.8.0-0zneon+24.04+noble+release+build8 all [upgradable from: 6.7.2-0zneon+24.04+noble+release+build4]
qml6-module-qt-labs-folderlistmodel/noble,noble 6.8.0-0zneon+24.04+noble+release+build8 all [upgradable from: 6.7.2-0zneon+24.04+noble+release+build2]
qml6-module-qt-labs-platform/noble,noble 6.8.0-0zneon+24.04+noble+release+build8 all [upgradable from: 6.7.2-0zneon+24.04+noble+release+build2]
qml6-module-qt-labs-qmlmodels/noble,noble 6.8.0-0zneon+24.04+noble+release+build8 all [upgradable from: 6.7.2-0zneon+24.04+noble+release+build2]
qml6-module-qt-labs-settings/noble,noble 6.8.0-0zneon+24.04+noble+release+build8 all [upgradable from: 6.7.2-0zneon+24.04+noble+release+build2]
qml6-module-qtqml-models/noble,noble 6.8.0-0zneon+24.04+noble+release+build8 all [upgradable from: 6.7.2-0zneon+24.04+noble+release+build2]
qml6-module-qtqml/noble,noble 6.8.0-0zneon+24.04+noble+release+build8 all [upgradable from: 6.7.2-0zneon+24.04+noble+release+build2]
qml6-module-qtquick-controls/noble,noble 6.8.0-0zneon+24.04+noble+release+build8 all [upgradable from: 6.7.2-0zneon+24.04+noble+release+build2]
qml6-module-qtquick-dialogs/noble,noble 6.8.0-0zneon+24.04+noble+release+build8 all [upgradable from: 6.7.2-0zneon+24.04+noble+release+build2]
qml6-module-qtquick-layouts/noble,noble 6.8.0-0zneon+24.04+noble+release+build8 all [upgradable from: 6.7.2-0zneon+24.04+noble+release+build2]
qml6-module-qtquick-particles/noble,noble 6.8.0-0zneon+24.04+noble+release+build8 all [upgradable from: 6.7.2-0zneon+24.04+noble+release+build2]
qml6-module-qtquick-templates/noble,noble 6.8.0-0zneon+24.04+noble+release+build8 all [upgradable from: 6.7.2-0zneon+24.04+noble+release+build2]
qml6-module-qtquick-window/noble,noble 6.8.0-0zneon+24.04+noble+release+build8 all [upgradable from: 6.7.2-0zneon+24.04+noble+release+build2]
qml6-module-qtquick/noble,noble 6.8.0-0zneon+24.04+noble+release+build8 all [upgradable from: 6.7.2-0zneon+24.04+noble+release+build2]
qt6-base/noble 6.8.0-0zneon+24.04+noble+release+build8 amd64 [upgradable from: 6.7.2-0zneon+24.04+noble+release+build4]
qt6-declarative/noble 6.8.0-0zneon+24.04+noble+release+build8 amd64 [upgradable from: 6.7.2-0zneon+24.04+noble+release+build2]
qt6-gtk-platformtheme/noble,noble 6.8.0-0zneon+24.04+noble+release+build8 all [upgradable from: 6.7.2-0zneon+24.04+noble+release+build4]
qt6-qpa-plugins/noble,noble 6.8.0-0zneon+24.04+noble+release+build8 all [upgradable from: 6.7.2-0zneon+24.04+noble+release+build4]
qt6-serialport/noble 6.8.0-0zneon+24.04+noble+release+build2 amd64 [upgradable from: 6.7.2-0zneon+24.04+noble+release+build1]
qt6-shadertools/noble 6.8.0-0zneon+24.04+noble+release+build2 amd64 [upgradable from: 6.7.2-0zneon+24.04+noble+release+build1]
qt6-svg/noble 6.8.0-0zneon+24.04+noble+release+build3 amd64 [upgradable from: 6.7.2-0zneon+24.04+noble+release+build1]
qt6-tools/noble 6.8.0-0zneon+24.04+noble+release+build8 amd64 [upgradable from: 6.7.2-0zneon+24.04+noble+release+build1]

Please, could anyone tell me how this partial upgrade got pushed to me and break my desktop ? Itā€™s supposed to have a meta package to force all Qt6 packages to a single version, right ?

Do you have /user or /release channel enabled?

The 6.8.0 release of Qt was pushed to the release channel before all the packages that depend on it were built to match - which will break everything that link to Qt and unfortunately is a common occurrence in Neon.

The problem is that the automated Debian build scripts that KDE Neon uses like to add >= dependencies - for example, the current kwin-wayland package has this dependency: Depends: qt6-base (>= 6.7.2) - but Qt doesnā€™t work that way: when you build against a Qt, only that very specific version that you built again will allow your app to start. If the system has any other version - even a minor change - Qt will reject it and it will not run. The correct dependency should be == and if that were the case - you would not have been able to upgrade to Qt 6.8 until all the required dependent packages got upgrades pushed as well.

I think thereā€™s already an open ticket about this issue on Neon, but Iā€™ll check to make sure.

To recover, do this - in your terminal (run each command, and stop if you get unexpected errors):

mkdir tmp-qt6-downloads && cd tmp-qt6-downloads
dpkg -l '*qt6*' | grep 6.8 | grep ii | awk '{print$2}' | while read pkg; do
  ver="$(apt policy $pkg 2>/dev/null | awk '$1~/6.7.2/{print$1}' | head -n1)";
  [ -n "$ver" ] && apt download "$pkg=$ver";
done
sudo dpkg -i *
sudo apt-mark hold qt6-base

That should fix up your system, and prevent a Qt 6.8 upgrade. You have to monitor the situation and check when Neon has updated with correct builds so you can unhold Qt 6 and get the upgrade running properly.

4 Likes

If I understand it correctly you are using the developer version of KDE Neon, which is the most unstable (developer->unstable->testing->user), you shouldnā€™t use that if you lack the technical skills to get out of a situation not intended for you.

And you should really use the official method for updating your system anyway which is How do I Update to the Latest Software?

Sorry, donā€™t even know what these channels mean. Is that a concept of PackageKit ?

Oh yes, itā€™s just, pkcon bugs me out of joy, the experience is far from what the good ol apt offers. And Neon block apt upgrade so I just do apt dist-upgrade.

This is the solution, also thanks for your explanation :yum: . Anyway, this morning I already got the complete update of Qt 6.8 and it works.

Glad to get community support on this, now the time for confession: I got this Neon desktop not by installing it. Instead, I use a running PopOS system and add Neon apt source to it, for a feature I need.

http://archive.neon.kde.org/release noble InRelease

That time I have had to fight some package conflicts but finally apt get to a consistent state and everything works fine.
So really donā€™t know which Neon version Iā€™m on.

The /release part of the URL means that you are on the ā€œreleaseā€ channel - which is one step less stable than the ā€œuserā€ channel - so pretty alright.

I have used Neon sources on Ubuntu releases a lot, and itā€™s a way to get more features that you donā€™t get in the LTS base, but itā€™s not tested and support for it is basically: if it breaks - you get to keep both parts. :person_shrugging:

1 Like

Then you shouldnā€™t have used the ā€˜Neonā€™ tag, you are basically using and maintaining in a custom way aā€¦ custom Frankenstein OS made by mixing very old (LTS) and very new (still in development) packages -that even Neon users donā€™t use- with each other. You can count on continuing having dependency problems in the future, but Iā€™m not so sure that you can count on community help by lying and stretching it so much.

1 Like

Yes, the /release channel is not guaranteed to have all required and production-ready packages at all times. After some packages are built, they land in the /release repository. However, when new versions of Frameworks, Gear Apps, Plasma, or Qt are released, they contain a large number of packages that are not added to the /release channel all at once. This is why you may occasionally experience a ā€œpartialā€ upgrade, which can potentially break your system.

For daily and production use, stick with the default /user channel, which provides stable updates delivered to all users through regular updates.

1 Like

It is often useful to have the more stable channels listed in your repo file as well, to make sure that apt can fallback to a working stable package if there are packaging inconsistencies in development channels.

My sources file for running on Neon testing looks like this:

X-Repolib-Name: KDE neon noble testing
Types: deb deb-src
URIs: http://archive.neon.kde.org/user http://archive.neon.kde.org/release http://archive.neon.kde.org/testing 
Suites: noble
Components: main
Architectures: amd64
Signed-By: /etc/apt/keyrings/neon-archive-keyring.asc

Nice knowledge, I edited the apt source from /release to /user and got a flawless upgrade.
Guess thatā€™s hard to tell which one is more stable just by looking at their names. Now I understand:

  • /user is for the user, to get the final release
  • /release is the ground for doing the release process itself