Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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 hmm
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

ramseslegrand a écrit :

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