====== Migration de Maverick vers Precise ====== Je relate ici mon aventure de migration de Maverick (Ubuntu 10.10) vers Precise (12.04.1). En espérant que cela pourra aider quelqu'un... ===== Téléchargement ===== Sur [[http://www.ubuntu.com/download/desktop/alternative-downloads]] j'ai téléchargé par BitTorrent (c'est plus rapide !) la version 12.04.1 Alternate d'Ubuntu pour mon portable 32bits (i386). ===== Transfert de l'image iso sur clé USB ===== J'utilise une clé USB de 2 Go pour faire mes installations. Toutes les données de cette clé USB sont effacées par les manipulations suivantes. Une fois la clé USB branchée, ne pas la démonter. Il faut savoir comment elle est identifiée dans /dev. La commande : sudo fdisk -l indique : [...] Disque /dev/sdd : 2062 Mo, 2062548992 octets 19 têtes, 24 secteurs/piste, 8834 cylindres, total 4028416 secteurs Unités = secteurs de 1 * 512 = 512 octets Taille de secteur (logique / physique) : 512 octets / 512 octets taille d'E/S (minimale / optimale) : 512 octets / 512 octets Identifiant de disque : 0x02aa025f Périphérique Amorce Début Fin Blocs Id Système /dev/sdd1 * 64 1407575 703756 17 HPFS/NTFS masquée Donc ici la clé USB est le périphérique **/dev/sdd** ; elle contient une partition /dev/sdd1. Se placer dans le dossier qui contient l'image iso que l'on vient de télécharger : cd ~/Téléchargements ls -t | head -1 Réponse : ubuntu-12.04.1-alternate-i386.iso C'est bien ça ! Pour vérifier que l'image iso est correcte, chercher sur [[https://help.ubuntu.com/community/UbuntuHashes]] sa clé md5 (md5sum). Hélas, elle ne s'y trouve pas encore ! Tant pis, on lance : md5sum ubuntu-12.04.1-alternate-i386.iso et on obtient : b4512076d85a1056f8a35f91702d81f9 ubuntu-12.04.1-alternate-i386.iso Un moteur de recherche confirme que cette clé md5 est la bonne. Lancer alors la commande qui va transformer ma clé USB en clé bootable d'installation d'Ubuntu 12.04.1 Alternate i386 : sudo dd if=ubuntu-12.04.1-alternate-i386.iso of=/dev/sdd bs=4M && sync Ne pas interrompre cette commande, ni fermer le terminal dans lequel elle s'exécute ; cela peut durer une dizaine de minutes. Inutile d'essayer de vérifier le md5sum de la clé USB. La taille de la clé USB étant plus importante que celle de l'image iso, elles n'auront forcément pas le même md5sum. Vérifier que la clé USB n'est pas montée (elle ne l'est normalement pas) et la retirer de son port. ===== Préparation de la mise à niveau ===== ==== Sauvegarde des données personnelles ==== Cela est indispensable, surtout si /home n'est pas monté dans une partition qui lui est propre. Pour vérifier si /home est monté sur une partition : df -h si une ligne contient /home, c'est OK : [...] /dev/sda4 1,8T 711G 1016G 42% /home [...] ==== Mise à jour de la liste des paquets ==== Vérifier que synaptic et le gestionnaire de mise à jour sont bien fermés, puis : sudo apt-get update (Une erreur survient : le dépôt dl.google.com n'existe plus. J'ouvre synaptic, clique sur Origine, sélectionne "testing/non-free (dl.google.com)" et vois que seul picasa, que je n'ai pas installé, est concerné ; je supprime ce dépôt, ferme synaptic, et relance la commande ci-dessus. Tout est OK.) ==== Mise à jour des paquets et nettoyage ==== sudo apt-get dist-upgrade sudo apt-get autoremove ==== Faire la liste des paquets à réinstaller ==== Voici un script python qui fait la liste des paquets à installer. #!/usr/bin/python # -*- coding: utf-8 -*- import subprocess import os, os.path import re ### Liste des paquets installés automatiquement (i.e non installés manuellement) ### # Sous Maverick (Ubuntu 10.10) apt-mark ne connait pas l'option showmanual. proc = subprocess.Popen(["apt-mark","showauto"], stdout=subprocess.PIPE) autoInstalls,err = proc.communicate() autoInstallsList = [] for autoInstall in str.split(autoInstalls,'\n'): autoInstallsList.append(autoInstall) ## debug: #print "autoInstallsList: %i" %len(autoInstallsList) ### Liste de tous les paquets installés ### # S'il n'existe pas, on crée un script bash qui nous donne cette liste. # (Pas élégant, mais ça fonctionne et c'est rapide !) if not os.path.exists(os.path.abspath('')+'/allpackages.sh'): allpackagescript=open(os.path.abspath('')+'/allpackages.sh', 'w') allpackagescript.write("dpkg --get-selections | grep -v deinstall | awk '{print $1}'") allpackagescript.close() # On utilise ce script : proc=subprocess.Popen(["/bin/sh",os.path.abspath('')+"/allpackages.sh"], stdout=subprocess.PIPE) allInstalls,err = proc.communicate() allInstallsList = [] for allInstall in str.split(allInstalls,'\n'): if not (allInstall.startswith('linux-headers-2.6') or allInstall.startswith('linux-image-2.6')): allInstallsList.append(allInstall) ## debug: #print "allInstallsList: %i" %len(allInstallsList) ### Liste de tous les paquets installés manuellement ### # C'est la différence entre la liste des paquets installés et celle des paquets auto. manualInstallList = filter(lambda x:x not in autoInstallsList,allInstallsList) # Suppression des paquets réinstallés automatiquement dependsList=[] depends=re.compile("Depends: ([^\n/]*)") section=re.compile("Section: ([^\n/]*)") for pkg in manualInstallList: proc=subprocess.Popen(["apt-cache","show",pkg], stdout=subprocess.PIPE) res,err = proc.communicate() """ #1ere idée : Suppression des paquets dont dependent les meta-paquets (tels ubuntu-minimal et ubuntu-desktop) : sct=section.search(res) if sct.group(1).startswith("metapackages"): #print "META : %s" %pkg deps=depends.search(res) deps=deps.group(1).replace("," , "") pkgsList=str.split(deps, " ") dependsList=dependsList + filter(lambda x:x not in dependsList,pkgsList) """ # 2nde idée : Finalement, supprimer tous les paquets qui seront réinstallés automatiquement du fait des dépendances : deps=depends.search(res) if deps is not None: deps=deps.group(1).replace("," , "") pkgsList=str.split(deps, " ") dependsList=dependsList + filter(lambda x:x not in dependsList,pkgsList) # On supprime ces paquets de la liste des paquets installés manuellement : manualInstallList=filter(lambda x:x not in dependsList,manualInstallList) # debug: #print "manualInstallList: %i" %len(manualInstallList) for install in manualInstallList: print install Créer un dossier migration, et s'y rendre : mkdir ~/migration cd ~/migration Enregistrer le script ''listofpackages.py'' ci-dessus : gedit ~/migration/listofpackages.py Fermer gedit puis rendre le script exécutable : chmod +x ~/migration/listofpackages.py L'exécuter en redirigeant sa sortie dans un fichier nommé ''maverick_packages_list.txt'' : ./listofpackages.py > maverick_packages_list.txt ==== Enregistrer les clés GPG de tous les dépôts ==== sudo apt-key exportall > maverick_all_repos.asc