#1 Le 03/03/2010, à 11:32
- pipou24
[doc]sauvegarder et restaurer les paquets avec dpkg et diff
J'ai trouvé cette page de doc très intéressante : http://doc.ubuntu-fr.org/tutoriel/comment_sauver_et_restaurer_la_liste_des_paquets
En particulier le passage (incomplet) pour sauvegarder les paquets et les restaurer dans le cadre d'un changement de version. J'aimerais bien completer la doc sur ce point.
Je me suis donc essayé a cette méthode (pour l'instant pour passer de karmic i386 a karmic amd64), seulement je ne comprend pas assez bien la page man de diff.
Mon idée est la suivante : on sauvegarde la selection des paquets installés sur l'ancienne version :
dpkg --get-selections > liste-anciens
On réalise cette même sauvegarde sur une install "fraîche" :
dpkg --get-selections > liste-base
Ensuite, on récupère liste-paquets-anciens sur la nouvelle install et on utilise diff afin de n'obtenir que la liste des paquets supplémentaires :
diff -d liste-base liste-anciens > liste3
Et c'est la que je sèche un peu. A priori, l'option -d marche a peu près (et donne semble-t-il le meme résultat que --suppress-common-lines)
un extrait :
983a1088
> mhwaveedit install
991,993d1095
< mono-2.0-gac install
< mono-gac install
< mono-runtime install
1014a1117
> netpbm install
Je vois donc que dans ma précedent install j'avais installé mhwaveedit (précédé de >) et que j'avais retiré tous les trucs mono (précédé de <), ce qui est correct. Mais je ne comprend pas les lignes "991,993d1095" et je ne sais pas comment les retirer.
Si quelqu'un voit comment faire....
Non geek et fier de l'être. ㋡
Hors ligne
#2 Le 03/03/2010, à 14:48
- manatane44
Re : [doc]sauvegarder et restaurer les paquets avec dpkg et diff
je ne puis malheureusement t'aider mais en tous cas tes recherches m'intéressent beaucoup.
Hors ligne
#3 Le 05/03/2010, à 10:43
- pipou24
Re : [doc]sauvegarder et restaurer les paquets avec dpkg et diff
Merci de ton support
avec cet exemple simple (début de liste) j'ai pu comprendre la numérotation :
liste base :
a2ps install
acpi-support install
acpid install
adduser install
aisleriot install
alacarte install
alsa-base install
alsa-utils install
amsn install
amsn-data install
anacron install
app-install-data install
app-install-data-partner install
apparmor install
apparmor-utils install
apport install
apport-gtk install
apport-symptoms install
apt install
apt-transport-https install
apt-utils install
apt-xapian-index install
aptdaemon install
aptitude install
apturl install
apturl-common install
aspell install
aspell-en install
at install
at-spi install
avahi-autoipd install
avahi-daemon install
base-files install
base-passwd install
bash install
bash-completion install
bc install
bcmwl-modaliases install
bind9-host install
binfmt-support install
binutils install
bluetooth install
bluez install
liste-anciens
a2ps install
acpi-support install
acpid install
adduser install
aisleriot install
alacarte install
alsa-base install
alsa-utils install
amsn install
amsn-data install
anacron install
app-install-data install
app-install-data-partner install
apparmor install
apparmor-utils install
apport install
apport-gtk install
apport-symptoms install
apt install
apt-transport-https install
apt-utils install
apt-xapian-index install
aptdaemon install
aptitude install
apturl install
apturl-common install
aspell install
aspell-en install
at install
at-spi install
autoconf install
automake install
autotools-dev install
avahi-autoipd install
avahi-daemon install
base-files install
base-passwd install
bash install
bash-completion install
bc install
bcmwl-modaliases install
bind9-host install
binfmt-support install
binutils install
birthday install
blender install
liste3
30a31,33
> autoconf install
> automake install
> autotools-dev install
41a45,46
> birthday install
> blender install
le code 30a31,33 signifie : a la ligne 30 de la première liste, ont été ajoutées les lignes 31 a 33 de la deuxième liste qui figurent après.
un grep '>' fait disparaitre ces lignes et donne facilement la liste des paquets a rajouter. Seulement, il reste, a mon goût trop de paquets. Tous les paquets de dépendances sont inscrits et donc il est difficile de faire le tri manuellement.
Or dans le cas d'un changement de version, il peut rester dans cette différence de liste des paquets de base qui ont été remplacés ou sont devenus obsolètes. Donc il faudrait pouvoir faire le tri manuellement.
A moins de remettre en forme la liste pour la passer a aptitude en bloquant tous les cas ou l'installation d'un paquet nécessite la désinstallation d'un autre ?
Non geek et fier de l'être. ㋡
Hors ligne
#4 Le 09/05/2010, à 19:07
- ramseslegrand
Re : [doc]sauvegarder et restaurer les paquets avec dpkg et diff
Bonjour pipou24
Je viens aux nouvelles (si tu suis toujours ce post !).
J'ai le même problème après passage à Lucid, et en plus sur plusieurs ordi.
Pour résumer :
1-récup des fichiers par
dpkg --get-selections > fichier
2-application de diff puis filtrage des lignes avec '>'
diff -d liste-nouvelle liste-origine | grep '>' > liste-a-charger
3-suppression des > avec Remplacer dans Gedit
et là il ne me reste que 824 lignes ! Donc le dpkg --set-selections attendra un peu.
Peux tu me dire si apt-get complète automatiquement les dépendances nécessaires ?
Par exemple si dans le fichier utilisé par dpkg --set-selections, je ne met que "vlc install", alors quand j'éxécuterai "sudo apt-get -u dselect-upgrade" est ce que les 30 ou 40 paquets de dépendance nécessaires seront chargés ?
Si oui c'est gérable à la main, je peux toujours créer un fichier contenant la cinquantaine d'appli dont j'ai besoin.
Merci d'avance.
Asus F7F
Ubuntu 9.04+Windows Vista
Webcam Chicony à l'envers
Hors ligne
#5 Le 10/05/2010, à 00:37
- ramseslegrand
Re : [doc]sauvegarder et restaurer les paquets avec dpkg et diff
Bon je me réponds à moi même.
Sur un Lucid tout neuf, j'ai préparé un fichier install-test ne contenant que 2 lignes "vlc install" et "gramps install".
Puis j'ai lancé(comme indiqué dans http://doc.ubuntu-fr.org/tutoriel/comme … es_paquets )
# sudo apt-get update
# sudo dpkg --set-selections < install-test
# sudo apt-get -u -s dselect-upgrade > result-simu-install
(Dans la dernière ligne j'ai rajouté -s pour ne faire qu'une simu et dirigé la sortie vers un fichier)
L'analyse de ce fichier indique bien que tous les 41 nouveaux paquets nécessaires à Vlc et les 3 pour Gramps sont bien chargés.
En conclusion, on devrait pouvoir faire un fichier contenant autant de lignes "nom-du-programme install" que de programmes à installer et suivre la procédure ci-dessus, à condition d'avoir mis à jour les dépôts-sources nécessaires.
D'ailleurs en traitant le fichier de sortie, on doit pouvoir le comparer à celui obtenu par différence entre l'ancien et le nouveau système, et donc en déduire s'il reste encore quelque chose à rajouter.
Des réactions ?
Asus F7F
Ubuntu 9.04+Windows Vista
Webcam Chicony à l'envers
Hors ligne
#6 Le 10/05/2010, à 23:02
- pipou24
Re : [doc]sauvegarder et restaurer les paquets avec dpkg et diff
Salut.
Je n'avais pas eu le temps de tester plus que ca. J'ai installé virtualbox pour faire des essais mais je ne suis pas allé plus loin.
Ta démarche me parait bonne. En tout cas, bien vu pour l'option -s ! Pour ma part, j'avais aussi procédé de manière similaire : j'ai noté tous les noms de paquets que je reconnaissait (sans les dépendances) que j'ai recopié dans une simple liste, séparés par des espaces, puis j'ai lancé
sudo aptitude install < liste
Puis je recompare la liste des paquets. Du coup, ma diff-liste a beaucoup réduit et j'ai pu identifier les quelques paquets que je n'avais pas pris la première fois.
Non geek et fier de l'être. ㋡
Hors ligne
#7 Le 22/06/2010, à 08:35
- ramseslegrand
Re : [doc]sauvegarder et restaurer les paquets avec dpkg et diff
Mon passage à Lucid m'a forcé à trouver des solutions à la mise à niveau d'un système neuf vers un système avec toutes les applications auxquelles on est habitué.
J'ai développé 2 stratégies:
1) On est capable de retrouver les applications souhaitées et le nom du paquet correspondant (et éventuellement le dépôt). Dans ce cas le mieux est de créer un fichier des install à faire et à l'exploiter avec dpkg puis apt-get. Je joins le fichier qui m'a servi(il n'y a cas l'adapter) et qui contient toutes les remarques nécessaires à son exploitation et aux points à vérifier. Une fois ce fichier crée, un bon principe est de le mettre régulierement à jour pour qu'il soit prét en cas de besoin.
# INSTALLATIONS PERSONNELLES
#sauvegarde de son /home par 'cp -a source destination' sur partition ext3 ou ext4
# tout d'abord bien mettre à jour les dépôts:
# http://packages.medibuntu.org/lucid free non-free (mplayer, libdvdcss2)
# ppa:shutter(universe) ppa:libv4l(main->libv4l-0)
# se mettre dans le repertoire de install-perso(ce fichier)
# obtenir les install déja faites :dpkg --get-selections > install-deja-faites
# sortie sur fichier car longue liste ! ceci permettra une comparaison avant-aprés
# mettre à niveau listes des paquets et les maj: sudo apt-get update
# mise à jour du fichier des selections (install à faire, purge,etc...)par: sudo dpkg --set-selections < install-perso
# effectuer les install(pour une simu remplacer -u par -us ) : sudo apt-get -u dselect-upgrade
#(attention certains paquets demandent une validation pendant l'install(acroread, java)
# obtenir les install demandées et non faites(toutes si simu) pour verif:sudo dpkg --yet-to-unpack
# obtenir les install déja et nouvellement faites : dpkg --get-selections > install-apres-maj
# effectuer une comparaison : diff -d install-apres-maj install-deja-faites | grep '<' > install-nouvelles
# ce fichier doit comprendre les install demandees ET les nouvelles dependances
#
# La suite du fichier comprend la liste des applications que l'on souhaite faire: nom-du-paquet install
# ne pas oublier Java (sun-java6-plugin entraine java6-jre et tout le reste !)
# ni Wine pour charger appli Windows
#avant d'executer une appli pour la 1° fois, migrer(si possible) les config necessaires depuis sauvegarde de /home
acidrip install
acroread install
avidemux install
cups-pdf install
devhelp install
dvdstyler install
filezilla install
foremost install
fotowall install
geany install
gimp install
glade install
gnome-mplayer install
gramps install
#grsync install
gstreamer-tools install
gthumb install
hugin install
idle-python2.6 install
idle-python3.1 install
inkscape install
k9copy install
#kaffeine install
keepassx install
libdvdcss2 install
lock-keys-applet install
#meld install
roxterm install
shutter install
skype install
sun-java6-plugin install
thunderbird install
vlc install
w-scan install
wine install
winff install
xournal install
xsane install
#install annulées pour version + récente: meld(necessite intltool), grsync
#install annulées pour version - récente: kaffeine(disfonct scan chaines sous lucid)
# manquent JAVA: projectx, pdfsam(version +récente) (creer les lanceurs 'java -jar programme.jar')
# manquent Linux: drivers CanonMP640 : imprimante cnijfilter-mp640series,
# pour le scanner scangear-mp640series (a faire apres install de Gimp)
# foremostgui(lucid?->karmic) XnviewMP
A voir:blender xamp/lamp
# firmware DVB dvb-usb-af9015.fw a mettre en /lib/firmware
# manquent Windoxs-Wine: BankPerfect Spotify
2) Un programme génère automatiquement la liste des paquets à installer pour passer d'une situation de départ à une situation d'arrivée.
Si l'on a prévu de prendre une photo de son ancien système juste après son installation, on pourra alors utiliser le programme Python suivant. Il faut le lancer avant d'écraser l'ancien système. Il génère automatiquement un fichier des paquets à installer(ou à purger) pour passer de la situation d'installation à la dernière.
On pourra donc l'utiliser(après quelques contrôles !) pour reconstituer sur le nouveau système vierge une situation(presque) équivalente à celle que l'on quitte.
Les instructions sont dans le corps du programme. Vous DEVEZ modifier dans le corps du programme les chemins des 5 fichiers en fonction de vos propres choix.
Comme indiqué au début du fichier du point 1) n'oubliez pas le /home et les dépôts adéquats !
Si l'on n'a pas la situation de départ de l'ancien système, on peut faire avec la situation juste aprés l'installation du nouveau système. Mais là, le pointage et le nettoyage du fichier des différences sera un peu plus lourd.
# coding: utf-8
import subprocess
# 20010-ramseslegrand
# Création d'un fichier (f5)d'installations et de purges permettant(par l'utilisation de dpkg et apt-get)
# de rétablir les paquets installés entre une situation de départ et la situation actuelle
# La situation de départ peut être l'installation d'une nouvelle version du système
# ou une re-initialisation de celui-ci(il faut la conserver par 'dpkg --get-selections > f3' )
# Les 2 premières étapes prennent environ 30 secondes chacune(si vous n'avez pas chargé des centaines d'appli)
# Principe: création d'une entrée de dictionnaire pour chaque paquet, mise à 0 de la valeur
# puis incrémentation de 1 pour chaque dépendance constatée. Les paquets restés à 0 sont appelés primaires
# Ces paquets primaires, installés(automatiquement avec leurs dépendances) sur l'environnement de départ,
# reconstituent l'environnement d'arrivée
# Usage:vous devez avoir un fichier f3(paquets de la situation précédente),
# renseignez, comme vous le voulez, les noms et chemins de f1,f2,f3,f4 et f5 et exécutez
#
def deppaq(paq):
"""maj du dictionnaire depdic avec les dépendances du paquet paq
si nouvelle dépendance, dictionnaire initialisé au niveau 1, sinon ajoute 1"""
global depdic
cd="apt-cache depends "+paq+" | grep Dépend: | awk -F' ' '{print $2}'"
p=subprocess.Popen([cd] , stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
for s in p.stdout.read().split():
if s in depdic:
depdic[s]+=1
else:
depdic[s]=1
def paqinstall(fichout):
"""crée un fichier de tous les paquets installés sur le système"""
cd="dpkg --get-selections | grep install | awk -F' ' '{print $1}' > "+fichout
p=subprocess.Popen([cd] , shell=True)
def paqprim(finst,fprim):
"""génere un fichier fprim des paquets primaires (sans ascendants)
à partir de la liste des paquets du fichier finst"""
global depdic
finstalles=open(finst)
for p in finstalles: # pour chaque paquet installé
pp=p.rstrip()
if pp in depdic:
depdic[pp]+=1 # incremente l'entree dans dico de 1
else:
depdic[pp]=0 # crée une entrée dans dictionnaire niveau 0
deppaq(pp) # complète le dictionnaire avec les dépendances niveau 1 ou plus
fpaqprim=open(fprim, mode= 'w+')
keys=depdic.keys()
keys.sort()
for k in keys: # pour chaque paquet dans le dictionnaire
if depdic[k]==0: # de niveau 0 (cad appelé par aucun autre paquet)
fpaqprim.write(k+'\n') # crée une ligne dans le fichier fprim
fpaqprim.close()
def paqdif(fd):
cd="diff -d "+f2+" "+f4
p=subprocess.Popen([cd] , stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
fdiff=open(fd, mode= 'w+')
for s in p.stdout.read().splitlines():
if s.startswith('>'):fdiff.write(s.strip('> ') + " purge\n")
elif s.startswith('<'):fdiff.write(s.strip('< ') + " install\n")
fdiff.close()
if __name__ == "__main__":
# avant de démarrer, indiquer pour chaque fichier f1,f2,f3,f4,f5 le nom et chemin souhaité
print "Determination des paquets primaires de l'installation actuelle"
depdic={}
f1="/home/jean/Bureau/paqu-installes" # fichier de tous les paquets installés actuellement
paqinstall(f1) # rempli f1
f2="/home/jean/Bureau/paqu-prim-installes" # fichier des paquets primaires(sans leurs dépendances)
paqprim(f1,f2) # fabrique le fichier f2 des paquets primaires correspondant à f1
print "Determination des paquets primaires d'une installation précédente"
depdic={}
f3="/home/jean/Bureau/install-deja-faites2" # fichier PRé-RENSEIGNé de tous les paquets installés précedement
# par exemple juste aprés une nouvelle installation du système Ce fichier obtenu a partir de
#'dpkg --get-selections' est nettoyé et comprend une ligne par paquet avec UNIQUEMENT le nom du paquet
f4="/home/jean/Bureau/paqu-prim-precedents" # fichier des paquets primaires(sans leurs dépendances)
paqprim(f3,f4) # fabrique le fichier f4 des paquets primaires correspondant à f3
print "Création du fichier des différences entre paquets primaires"
f5="/home/jean/Bureau/diff-paqu-prim" #fichier contenant les différences
#exploitable par 'sudo dpkg --set-selections < f5' suivi de 'sudo apt-get -u dselect-upgrade'
#Vérifier quand même f5 avant !!!
paqdif(f5)
Dans mon cas voila le résultat en chiffres:
Situation de départ: paquets installés 1319 paquets primaires 225
Situation actuelle: paquets installés 1735 paquets primaires: 311
Paquets primaires en différence: 100 (quelques purges et beaucoup d'install)
Ce dernier fichier peut être plus long que le fichier utilisé dans la stratégie n°1, car les applications chargent elles même des paquets complémentaires.
Asus F7F
Ubuntu 9.04+Windows Vista
Webcam Chicony à l'envers
Hors ligne
#8 Le 16/06/2011, à 08:16
- mjwurtz
Re : [doc]sauvegarder et restaurer les paquets avec dpkg et diff
Bonjour pipou24
2-application de diff puis filtrage des lignes avec '>'
diff -d liste-nouvelle liste-origine | grep '>' > liste-a-charger
3-suppression des > avec Remplacer dans Gedit
...
Les listes étant triées, on peut combiner ces deux étapes en une seule avec la commande join :
join -v 2 liste-nouvelle liste-origine > liste-a-charger
Hors ligne
#9 Le 04/01/2013, à 23:25
- TGM
Re : [doc]sauvegarder et restaurer les paquets avec dpkg et diff
Cela fait un peu loin ... mais si ça peut aider.
Il faut que je réinstalle complètement une machine. Comme je l'ai upgradé plusieurs fois, je n'ai plus trop le souvenir de ce que j'ai installé entre deux, en dehors de trucs comme wine, etc.
Après vous avoir lu, j'ai cherché de mon côté.
J'ai trouvé les solutions suivantes qui permettent de n'avoir qu'une liste nette de ce qui est à installer à nouveau :
Avec des expressions régulières :
diff SitNouveau SitAncien | egrep '^> ' | sed 's/^> //' >SitInstaller
SitNouveau : la liste des logiciels installés sur le nouveau système
SitAncien : la liste des logiciels que j'avais sur ma machine AVANT l'installation du nouvel OS
SitInstaller : la liste des logiciels (paquets) à installer sur le nouveau système
egrep et sed permettent d'éliminer les commandes fournies par la commande diff
Exemple :
SitAncien SitNouveau SitInstaller
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
10 10
11 11
12 12
La liste des packages SitAncien est obtenue par la commande :
sudo dpkg --get-selections | grep '[[:space:]]install$'| awk '{print $1}' > SitAncien
Le fichier est sauvegardé sur une clé USB par exemple
Une fois la nouvelle installation effectuée, la même commande est relancée :
sudo dpkg --get-selections | grep '[[:space:]]install$'| awk '{print $1}' > SitNouveau
Le diff ci dessus permet de voir les différences entre les 2 systèmes
Les lignes absentes de SitAncien mais présentes dans SitNouveau ne sont pas affichées.
Si cela est nécessaire, il suffit d'inverser les noms de fichier
Pour les allergiques aux expressions régulières, la solution suivante fonctionne aussi :
diff --old-line-format='' --new-line-format='%l
' --unchanged-line-format='' t.txt t2.txt
La commande est sur 2 lignes, c'est volontaire (insertion du CR).
Rendons à Cesar ... Diff - Developpez.com
Pour les installations, voir dans le Tuto restauration partie 3 . restauration
Rapidement, sur le nouveau système : (SitInstaller = liste-des-paquets du tuto)
# sudo apt-get update
# sudo dpkg --set-selections < SitInstaller
# sudo apt-get -u dselect-upgrade
Bonne année 2013
Nemo me impune lacessit
Hors ligne