Comment suivez-vous les paquets installés sur Ubuntu (Linux)?

38

(Cette question est très similaire à 10458. Il a été suggéré que Fedora et Ubuntu / Debian sont suffisamment différents pour justifier des réponses différentes.)

En utilisant n'importe quelle configuration Ubuntu, j'installe progressivement un certain nombre de paquets en plus de l'installation de base. Si je réinstalle ou si je dois installer une nouvelle machine, je souhaite généralement réinstaller ces packages spécifiques , et je veux le faire rapidement pour retourner au travail avec un minimum de tracas. Pour autant que je sache, tous les gestionnaires de paquets ( apt-get, aptitudeet synaptic) peuvent me dire quels paquets sont installés, et ils ont tous des journaux (bien que différents pour chaque outil, ce qui est fastidieux). Mais aucun d’eux ne peut me dire quels paquets j’aiinstallés, par opposition à leurs dépendances ou mises à jour du système. Même les journaux sont délicats en ce que je ne suis pas tout à fait sûr de ce que je devrais en extraire ou de la façon de les intégrer (dans le cas des divers outils de la famille apt). Cela signifie que chaque fois que je réinstalle, ou même que je sauvegarde, je ne sais pas comment recréer cette liste.

Je ne m'attends pas nécessairement à ce que les outils me permettent de le faire, mais sinon, je cherche des solutions de contournement. Même des motifs à rechercher, de bonnes règles empiriques, ou une idée claire de ce qui est en train d’être écrit, seraient utiles. Il n’ya peut-être pas de «meilleure réponse» ici, mais de bonnes réponses seraient très utiles.


La plupart des réponses ci-dessous donnent une idée de ce que je recherche et sont utiles dans une certaine mesure. Le choix est celui qui se rapproche le plus d'une méthode raisonnablement automatique pour réinstaller mes outils sur un nouveau système, même avec toutes ses mises en garde.

quark
la source
Il est peu probable que vous obteniez une réponse facile à partager pour toutes les distributions Linux. La gestion des paquets est une partie importante de ce qui distingue les différentes distributions Linux.
Telemachus
Télémaque - Vrai. Et il peut être judicieux de scinder cette question en deux questions. Mais cela semblait être une question assez spécialisée, et j'utilise les deux systèmes, donc je ne voulais pas la réduire trop à l'avance. Il semble que la plupart des réponses ici concernent dpkg / apt, donc une question distincte pour rpm / yum peut avoir un sens.
Quark
Basculez vers NixOS :) (simplement en traîne).
Alexey

Réponses:

31

Sur tout ordinateur basé sur Debian, il s'agit d'un moyen courant de dupliquer un ensemble de paquets. Sur l'ancienne machine:

dpkg --get-selections "*" > my_favorite_packages

Copiez le fichier my_favorite_packagessur la nouvelle machine (une clé USB est une bonne option, mais scpfonctionne également très bien). Puis exécutez cette séquence (avec les privilèges root):

apt-get update
dpkg --set-selections < my_favorite_packages
apt-get -u dselect-upgrade

Cela ne vous donne pas que les paquets que vous avez installés. Il obtient également leurs dépendances, etc. De plus, si les référentiels entre les deux machines sont différents, tous les paris sont ouverts.

En ce qui concerne les journaux, apt-getconserve un journal à /var/log/apt/history.log(merci à Tshepang pour l’avoir mis à jour dans un commentaire); dpkgfait (à /var/log/dpkg.log), mais il est réputé difficile à analyser et ne peut être lu qu'avec les privilèges root; aptitudeen a un /var/log/aptitudeet vous pouvez le parcourir avec les privilèges d’utilisateur habituels.

Autant que je sache, vous avez raison de dire qu'aucun de ces journaux ne suit spécifiquement ce que vous avez installé, contrairement aux dépendances installées automatiquement. Vous pouvez cependant obtenir cette information à partir d'une aptituderecherche. Recherchez tous les packages installés qui ont également été installés automatiquement:

aptitude search '~i ~M'

Si vous ne voulez que ceux que vous avez installés (pas les dépendances automatiques), annulez les valeurs suivantes ~M:

aptitude search '~i !~M'

Si vous voulez que le formatage soit tel que vous n’ayez que les noms des paquets et le mot "install", vous aptitudepouvez le faire aussi. Cela vous donne une liste prête à alimenter à dpkg --get-selections:

aptitude search '~i !~M' -F "%p install"

(Je n'ai rien sur les systèmes RedHat ou à base de RedHat. Excusez - moi. Il n'y a vraiment pas de réponse pour Linux en tant que telle depuis la gestion des paquets est une grande partie de ce qui fait différentes distributions différentes .)

Télémaque
la source
On dirait qu’une combinaison de vos conseils et de celle de Ludwig pourrait faire l’essentiel: aptitude peut générer un script à alimenter pour dpkg, de sorte qu’il est automatisable, ce qui est une victoire sérieuse. Et si on le faisait sur la machine à vanille, la différence entre les listes est assez proche de ce que je demande pour être pratiquement utile.
Quark
3
Notez que APT conserve maintenant un journal dans « /var/log/apt/history.log » et est utilisé par apt-get, synapticet aptitude(pour autant que je l' ai vu). C’est depuis le début de l’année 2010.
Tshepang
Les dpkg.logdéclarations ne semblent pas être vraies dans Ubuntu 14.04, car tous les utilisateurs sur lesquels je peux obtenir mes sélections sont faciles, pas anodins, mais pas trop difficiles. awk '$3 != "install" { next } ; { gsub(/:.+/, "", $4) ; print $4 }' /var/log/dpkg.log | sort | uniq
Steve Buzonas
En fait, je me rends compte que ce n’est pas aussi facile que je le pensais au départ, la faille dans le script awk précédent ne prête aucune attention aux paquets désinstallés. Ce qui suit awk '$3 !~ /install|remove|purge/ { next } { gsub(/remove|purge/, "uninstall", $3) ; gsub(/:.+/, "", $4) ; a[$4]=$3 } END { for (p in a) { if (a[p] == "install") { print p } } }' /var/log/dpkg.log | sort -ufait.
Steve Buzonas
7

Utilisez-le dpkg -l '*' > jaunty.originalpour enregistrer tous les packages installés sur un système fraîchement installé.

Après avoir installé tous vos paquets supplémentaires, faites-le dpkg -l '*' > mysystem.2009017.

Les forfaits supplémentaires font la différence: diff jaunty.original mysystem.2009017

Ludwig Weinzierl
la source
3
L'idée de base est forte: utilisez la ligne de commande pour vider la liste des applications actuellement installées, puis utilisez la ligne de commande pour installer ces packages sur une nouvelle machine. Vous pouvez être assez créatif et spécifique avec l'approche.
pcapademic
1
Je préfère dpkg --get-selections
CesarB
Bien que cela ne fasse pas le suivi des paquets que j'ai ajoutés indépendamment de leurs dépendances, cela génère une liste utile.
Quark
3

L'aptitude est en fait assez bonne à cela. Aptitude sait quand quelque chose a été installé manuellement ou par dépendance et vous pouvez lui dire de supprimer les choses qui ne sont plus nécessaires et qui n'ont été installées que parce que quelque chose d'autre en dépendait, il fallait toujours garder votre système aussi petit que possible.

Il y a une poignée de paquets qui constituent une installation Ubuntu, ubuntu-minimal, ubuntu-desktop, ubuntu-server, etc. Si vous dites à Aptitude de marquer ceux-ci comme installés manuellement et de supprimer tout le reste, vous vous retrouvez avec le minimum de paquets possible.

J'explique comment faire tout cela dans deux messages de mon blog: Nettoyer une Debian GNU / Linux et Nettoyer une Debian GNU / Linux (ou Ubuntu), reprise . En bref, la réponse que vous recherchez est:

aptitude search ~i | grep -v "i A"

La dernière fois que j'ai travaillé avec ça, si vous utilisiez apt-get, cela ne fonctionnerait pas. C'est pourquoi je recommande toujours aptitude et, autant que je sache, Debian déconseille apt-get en faveur d'aptitude.

Je ne sais pas comment le faire sur Fedora et vous devriez probablement séparer que dans une question différente. Fedora et Ubuntu sont des systèmes d’exploitation différents et doivent être traités comme tels (même s’ils partagent leur noyau et d’autres éléments).

pupeno
la source
2
Je pense que vous pouvez obtenir cette information sans avoir besoin de grep: aptitude search '~i !~M'devrait faire l'affaire.
Telemachus
1
En outre, apt-getn'est pas obsolète. Debian recommande aptitudede gérer les paquets en ligne de commande, mais c'est loin d'être décevant apt-get.
Télémaque le
Il y a quelque chose de subtil ici. La recherche de "A" dans la troisième colonne semble marquer les paquets que je sais sont installés en tant que dépendances. Mais il est clair qu’elles ne sont pas toutes capturées: la plupart de la liste n’a certainement pas été installée à la demande expresse de ma part.
Quark
@Telemachus. Votre commande et celle contenant le motif ne font pas exactement la même chose: les deux listes ont des contenus différents. Je ne connais pas assez d'aptitude pour vous dire pourquoi.
quark
@Pablo: Les liens vers votre journal semblent rompus. Si vous pouvez les réparer, je voudrais certainement les lire.
quark
2

Sur debian, apt-show-versions affiche les versions des packages installés.

Seb
la source
C'est noté. Cela ne semble pas être installé (par défaut) sur Ubuntu.
Quark
1

Sur les systèmes apt, consultez le fichier /var/log/apt/term.log. Pour moi, il y a une ligne assez claire pour tracer où l'installation s'est terminée et où mes installations ont commencé.

Patauger
la source
Moins utile pour moi, car il y a un mélange d’installations manuelles et de mises à jour du système. De plus, en fonction de votre configuration, les journaux seront éventuellement supprimés et obsolètes, ils ne seront donc pas renvoyés aussi loin que nécessaire.
Quark
Pour ceux qui essaient ceci, notez que parcourir le journal d'apt semble être beaucoup plus de travail que les autres options discutées ici. Ce n'est certainement pas automatique d'extraire une liste de paquets du journal.
Quark
1

De man aptitude-create-state-bundle:

aptitude-create-state-bundle génère une archive compressée stockant les fichiers nécessaires à la réplication de l'état actuel de l'archive du package.

Cela conservera les mêmes informations que aptitudesur les paquets qui ont été installés manuellement.

Il est destiné à être utilisé avec aptitude-run-state-bundle:

aptitude-run-state-bundle décompresse le bundle d'aptitude donné créé par aptitude-create-state-bundle (1) dans un répertoire temporaire, l'appelle avec celui fourni et supprime le répertoire temporaire par la suite.

intuitif
la source
1

En utilisant simplement, dpkgvous ne savez pas si le paquet a été installé manuellement par l'utilisateur ou automatiquement (en tant que dépendance ou lors de l'installation initiale du système d'exploitation). Si vous souhaitez conserver ces informations, vous devez obtenir une liste des seuls packages réellement installés manuellement.

Pour cela, vous pouvez utiliser l'une ou l'autre de ces deux lignes. Les deux donnent exactement le même résultat sur ma machine et sont plus précis que toutes les solutions proposées jusqu'à présent dans cette question. Ils sont une combinaison des deux réponses (1) et (2) . Notez que j'ai initialement posté cette réponse ici .

Utilisant apt-mark:

comm -23 <(apt-mark showmanual | sort -u) <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort -u)

Utilisant aptitude:

comm -23 <(aptitude search '~i !~M' -F '%p' | sed "s/ *$//" | sort -u) <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort -u)

Très peu de paquets restent encore entre les mailles du filet, bien que je soupçonne que ceux - ci sont réellement installés par l'utilisateur, soit juste après l'installation via la configuration de la localisation de la langue ou, par exemple, via l'installateur de codecs Totem. En outre, les versions de linux-header semblent également s'accumuler, même si je n'ai installé que le métapaquet non spécifique à la version. Exemples:

libreoffice-help-en-gb
openoffice.org-hyphenation
gstreamer0.10-fluendo-mp3
linux-headers-3.13.0-29    

Comment ça marche

  1. Obtenir la liste des packages installés manuellement. Pour aptitude, les sedbandes supplémentaires éliminent les espaces blancs restants à la fin de la ligne.
  2. Obtenez la liste des paquets installés juste après une nouvelle installation.
  3. Comparez les fichiers, affichez uniquement les lignes du fichier 1 qui ne sont pas présentes dans le fichier 2.

Les autres possibilités ne fonctionnent pas aussi bien:

  • Utiliser le ubuntu-14.04-desktop-amd64.manifestfichier ( ici pour Ubuntu 14.04) au lieu de /var/log/installer/initial-status.gz. Plus de paquets sont montrés comme installés manuellement même s'ils ne le sont pas.
  • Utiliser apt-mark showautoau lieu de /var/log/installer/initial-status.gz. apt-markpar exemple, n'inclut pas le paquet xserver-xorg, contrairement à l'autre fichier.

Les deux listes plus de paquets que la solution ci-dessus.

jmiserez
la source
0

Je suis partial et la solution que je présente n'est pas toujours possible, mais j'en ai eu marre de cette situation. Le résultat est que je n’installe plus rien avec les outils de gestion des mises à jour / packages.

J'ai pris un itinéraire assez difficile cependant (j'avais des exigences strictes pour les versions). J'ai créé un énorme fichier makefile qui télécharge, compile et installe dans mon répertoire personnel tous les paquets (programme, bibliothèque, etc.) dont j'ai besoin. Je l'ai développé par étapes, pièce par pièce. Le makefile télécharge et compile tout, même les compilateurs.

Lorsque je passe à un nouveau système ou que je réinstalle, je copie simplement le fichier makefile (ainsi que des éléments de support), puis lance make et je reviens le lendemain.

Pour certains programmes que je développe (pour que je puisse les contrôler), j'utilise un outil que j'ai programmé, le gestionnaire de paquets Châtaignier . Un peu comme les dossiers .app sur MacOSX. Tout est dans le paquet, donc je sais ce qui est installé à tout moment, et je sais que c'est autonome et autosuffisant (sauf pour les bibliothèques système)

Stefano Borini
la source
Vous pouvez simplement mettre les commandes d'installation du gestionnaire de paquets dans un script et avoir le même effet; en supposant que le code dont vous avez besoin est emballé. Votre approche ressemble beaucoup à celle de gentoo.
Wcoenen
Bon à savoir sur. Cela ressemble à beaucoup de travail supplémentaire au-delà d'un système Ubuntu / Debian par défaut. Je peux voir manuellement maintenir certains paquets, mais les conserver tous de cette manière représente plus de travail que je ne le souhaite.
Quark
Oui, mais avec le problème supplémentaire que les logiciels ubuntu / fink / darwinports ne fonctionnent pas partout entre plates-formes (j’étais sur une plateforme numérique et une fois sur IBM sp4). Je ne prétends pas que c'est une bonne façon de faire. Je dis simplement que cela fait le travail, bien que de manière laide et malodorante, et je garde le plein contrôle de ce qui se passe sur mon système.
Stefano Borini
Bien sûr, je pourrais décider un de ces jours de regarder sérieusement pour émerger et de tout retravailler avec.
Stefano Borini
Ce chemin est plus courant de nos jours lorsque vous considérez des outils comme le chef et la marionnette.
Steve Buzonas