Mahlzeit!
Wir hatten das Thema "Wechsel von Ubuntu zu Debian" schon vereinzelt
hier in der Gruppe angerissen, aber nur auf der Ebene "eigentlich
müsste man mal, hat schon wer?". Hatte aber keiner.
Da meine Ubuntu 20.04 LTSse jetzt offiziell mit dem Update auf 22.04
LTS drohen (das erste Pointrelease ist da), war der ideale Zeitpunkt
gekommen, das einfach mal durchzuziehen. So einen großen "Abstand"
(möglichst alte Ubuntu-Pakete, möglichst neue Debian-Pakete) gibt es
erst wieder, wenn das nächste Debian Stable frisch draußen ist (oder
man schwenkt auf testing oder unstable).
Ergebnis: Es klappt, bisher keine Probleme auf anderhalb¹ migrierten
Systemen.
CAVEAT: YMMV. Das ist eine Bastelei. Wer bei "es bootet nicht mehr"
an Neuinstallation denkt, statt den USB-Stick mit einem Rescue-System
zu zucken, ist hier falsch ;-)
Vorbereitung
------------
1. alle externen Paketquellen deaktivieren (macht das ganze einfacher,
geht vielleicht auch ohne)
2. /etc/apt/sources.list durch die Debian-Paketquellen ersetzen
3. die Debian-Repository-Keys in /etc/apt/trusted.gpg.d ablegen
?? hab ich eigentlich die Ubuntu-Keys gelöscht? lagen die da
einzeln oder in dem großen apt-Keyring?
4. 'apt update' aufrufen
5. apparmor deaktivieren! Das war wohl nur auf einem der beiden
Systeme installiert, aber dort kam es zu lustigen Fehlern², die
sich mit Deinstallation von apparmor gelöst haben.
6. Die Kombination von apt-listchanges mit einem eher langsamen Laptop
ist unerträglich, weil er bei jedem apt-Kommando erstmal die
Changelogs zusammensucht -- und wir rufen apt in einer Schleife
auf. Ich habe kurzerhand in /usr/bin/apt-listchanges hinter die
Zeile 'def main(config):' passend eingerückt ein 'sys.exit(0)'
geschrieben, dann ging's schneller.
7. Wenn man die per ecrypt verschlüsselten Home-Directories von Ubuntu
nutzt, sollte man die Dateien entweder vorher unverschlüsselt
wegschreiben (so habe ich das gemacht, weil ich noch auf ZFS
umstellen wollte, dazu müssen eh alle Daten einmal runter und dann
wieder drauf) oder sicherstellen, dass das Debian-ecrypt das
noch entschlüsseln kann (das habe ich _nicht_ verprobt).
Umstellung
----------
Die läuft grob so:
- man macht ein 'apt dist-upgrade'
- das bricht irgendwann ab
- teilweise kommt man mit 'apt --fix-broken install' weiter
- wenn nicht, muss man selber Hand anlegen
- repeat bis fertig
Da ich faul bin und nicht so viel selber tippen wollte, ist dieses
Shellskript mit dem treffenden Namen install-hard.sh entstanden:
#v+
#!/bin/bash
to_update() {
apt list --upgradable 2>/dev/null | wc -l
}
while true; do
before=$(to_update)
if apt --yes -o Dpkg::Options::=--force-confnew dist-upgrade; then
echo FINISHED
exit 0
fi
apt --yes -o Dpkg::Options::=--force-confnew --fix-broken install
apt --yes autoremove
after=$(to_update)
if [ $before -eq $after ]; then
echo NO PROGRESS, MANUAL ERROR FIX NEEDED
exit 1
fi
done
#v-
Auf beiden Systemen hat er jeweils ca. 2000 Pakete updaten wollen.
Ich wollte mich nicht ständig wegen conffile-Updates fragen lassen und
habe erstmal überall die Maintainer-Version genommen und im Anschluss
einmal mit merge-conffile-updates.sh³ die Änderungen gemerged. Wer
das nicht so will, nimmt das '-o Dpkg::Options::=--force-confnew'
raus.
Das 'apt autoremove' kann auch raus, aber das eine System hatte wenig
Platz, da wollte ich keine volle Platte riskieren.
Wenn das Script mit "NO PROGRESS" aussteigt, muss man selbst basteln.
Das tritt aber erstaunlich selten auf. Meistens handelt es sich um
Dateien, die unter Ubuntu in Paket A liegen, in Debian aber Paket B
gehören, wobei dann 'dpkg --force-depends -r $UBUNTU-PAKET' hilft.
Ich habe die Änderung über SSH durchgeführt, da hatte ich z.B. wenig
Skrupel, dass das System mal kurzzeitig ohne "libxfixes3" dasteht.
Bei anders gearteten Fehlern muss man halt schauen und sich irgendwie
selber helfen :-)
Wenn das durch ist, hat man das gröbste hinter sich.
Nachbereitung:
--------------
1. /etc/profile.d/01-locale-fix.sh löschen. Unter Ubuntu gehörte die
Datei zu base-files, unter Debian nicht mehr - sie ist aber als
conffile markiert und damit nicht gelöscht worden. Solange sie da
noch liegt, meldet jede Login-Shell einmalig '-bash:
/usr/bin/locale-check: No such file or directory' - nervig.
!! Das ist ein Punkt, wo ich noch eine Frage hätte: conffiles
werden ja nicht gelöscht. Wie kriege ich raus, wo im System
noch conffiles liegen, die mal von Ubuntu angelegt wurden und
nicht aus den Debian-Paketen stammen? dpkg merkt sich ja nur
'das ist ein conffile von Paket X', ohne den Unterschied
Ubuntu-X zu Debian-X zu kennen (oder gar Version X+1 vs. X-1),
oder?
2. 'apt dist-upgrade' macht nur Updates, die Downgrades müssen wir
manuell anstoßen. Man findet die Pakete über folgende Suchen und
muss dann manuell eingreifen (ich habe das über die aptitude-UI
erledigt):
- aptitude search ~o ('Local and obsolete Packages')
- aptitude search ~Vubuntu ('Ubuntu' in der Versionsnummer)
- aptitude search ~Vbuild ('build in der Versionsnummer)
- aptitude search '?narrow(?installed, ?not(?origin(Debian)))'
(Tipp von Marc Haber)
- apt list |grep ',local' (Tipp von Marco Moock)
Das sind auch gar nicht so viele Downgrades, wie man initial denkt,
denn es gibt öfter den Fall, dass Ubuntu z.B. 1:1.32-3 hat, Debian
aber 1.38-0. Nach dpkg-Zählung ist das Ubuntu-Paket wegen der
Epoch neuer, aber vom Inhalt des Paketes her bringt Debian ein
neueres Upstream-Release.
3. ggf. apparmor wieder installieren
4. ggf. die Änderung in /usr/bin/apt-listchanges zurücknehmen
5. Damit mein X ordentlich lief und ich wieder mehr als 80x25 Zeichen
auf der Konsole bekam, musste ich auf dem einen System noch
'firmware-amd-graphics' installieren. Bei anderen Grafikkarten
vermutlich was anderes (oder gar nichts).
6. Mein Thunderbird lief danach out-of-the box (aber da ist auch nicht
viel konfiguriert, den nutze ich nur als Fallback).
7. Firefox wird bei der Aktion von 104 auf 91.13esr downgegraded
!! Vorsicht: abweichender Paketname: 'firefox' unbedingt
deinstallieren, der kriegt sonst keine Updates; unter Debian
heißt das Paket 'firefox-esr'.
Beim Start legte Firefox stillschweigend ein neues Profil (bei mir:
'xyz.default-esr' statt wie bisher 'zyx.default') an. Wenn man per
--ProfileManager auf das alte default-Profil wechseln will, lehnt
Firefox das wegen Versionsimkompatibilität ab
Ich habe das wie folgt gelöst (und das ist der Teil von der ganzen
Anleitung, für den ich noch weniger Garantie übernehme also sowieso
schon keine):
- Profilverzeichnis 'xyz.default-esr' komplett löschen (sofern das
wie bei mir neu angelegt wurde; sonst nehmt ein neues Profil)
- kompletten Inhalt von 'zyx.default' dort reinkopieren (oder nicht
alles; da waren 5 Jahre alte Profil-Backups drunter, die paar
hundert MB habe ich gelöscht, als mir das auffiel)
- die Datei 'compatibility.ini' im Profil 'zyx.default-esr' löschen
Jetzt weiß Firefox nicht mehr, dass das Profil mal einer anderen
Firefox-Version gehört hat und lädt es ohne zu Mucken. Bei mir hat
es geklappt, aber ich habe den Browser auch nur 1 Tag benutzt
seitdem. Langzeitschäden unbekannt.
Das war's!
Adé Ubuntu, willkommen Debian.
Ohne Neuinstallation, alles noch da: Mailserver, VPNs, Backup-Skripte,
all das, was ich jahrelang auf den Systemen eingerichtet habe.
Ein weiteres System habe ich noch, falls sich da noch Erkenntnisse
ergeben, melde ich mich.
Guten Abend,
Christian
¹ Das erste System hat schon sauber unter Debian gebootet, dann habe
ich es zusätzlich auf ZFS umgezogen und auf UEFI gewechselt und bei
letzterem habe ich mir in den Fuß geschossen - das muss noch gefixt
werden, dann kann ich weitertesten.
² Wenn man als root 'dhclient eth0' ausführt, um wieder Netzwerk zu
bekommen, und das System das mit 'no permission' quittiert, guckt
man erst einmal sparsam.
³
https://github.com/mmitch/mitchscripts/blob/master/bash/merge-conffile-updates.sh
--
....Christian.Garbs....................................
https://www.cgarbs.de
Same Rei. New Story.
Check out Neon Exodus Evangelion
http://www.eyrie.net/NXE/