Como você controla quais pacotes foram instalados no Ubuntu (Linux)?

38

(Esta pergunta é muito semelhante à 10458. Foi sugerido que o Fedora e o Ubuntu / Debian são diferentes o suficiente para garantir respostas diferentes.)

Como uso qualquer instalação do Ubuntu, instalo gradualmente vários pacotes além da instalação da linha de base. Se eu reinstalar ou precisar instalar uma nova máquina, geralmente quero reinstalar esses pacotes específicos e quero fazê-lo rapidamente para voltar ao trabalho com o mínimo de problemas. Até onde eu já vi, todos os gerenciadores de pacotes ( apt-get, aptitudee synaptic) podem me dizer quais pacotes estão instalados e todos eles têm logs (embora sejam diferentes para cada ferramenta, o que é um aborrecimento). Mas nenhum deles pode me dizer quais pacotes eu tenhoinstalados, ao contrário de suas dependências ou atualizações do sistema. Até os logs são complicados, pois não tenho muita certeza do que devo extrair deles ou de como integrá-los (no caso das várias ferramentas familiares do apt). Isso significa que, toda vez que eu reinstalar ou apenas fazer backup, não tenho certeza de como recriar essa lista.

Não estou necessariamente esperando que nenhuma das ferramentas faça isso por mim, mas se não o fizerem, estou procurando soluções alternativas. Mesmo padrões para os quais grep, boas regras de ouro ou uma idéia clara do que exatamente está sendo registrado, seriam úteis. Pode não haver uma "melhor resposta" aqui, mas as boas seriam muito úteis.


A maioria das respostas abaixo fornece uma aproximação do que estou procurando e é útil até certo ponto. O escolhido é o que mais se aproxima de uma maneira razoavelmente automática de reinstalar minhas ferramentas em um novo sistema, mesmo com todas as suas ressalvas.

quark
fonte
Não é provável que você obtenha uma resposta facilmente compartilhada para todas as distribuições Linux. O gerenciamento de pacotes é uma grande parte do que distingue diferentes distribuições Linux.
Telemachus
Telêmaco - Verdade. E pode fazer sentido dividir isso em duas perguntas. Mas parecia uma pergunta bastante especializada, e eu uso os dois sistemas, por isso não queria reduzi-la com muita antecedência. Parece que a maioria das respostas aqui são para dpkg / apt, portanto, uma pergunta separada para rpm / yum pode fazer sentido.
quark
Mude para o NixOS :) (apenas corrico).
Alexey #

Respostas:

31

Em qualquer máquina baseada no Debian, esta é uma maneira comum de duplicar um conjunto de pacotes. Na máquina antiga:

dpkg --get-selections "*" > my_favorite_packages

Copie o arquivo my_favorite_packagespara a nova máquina (um pen drive é uma boa opção, mas scptambém funciona bem). Em seguida, execute esta sequência (com privilégios de root):

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

Isso não recebe apenas os pacotes que você instalou. Ele também obtém suas dependências, etc. Além disso, se os repositórios entre as duas máquinas forem diferentes, todas as apostas serão desativadas.

Quanto aos logs, apt-getmantém um log em /var/log/apt/history.log(obrigado a Tshepang por atualizar isso em um comentário); dpkgfaz (at /var/log/dpkg.log), mas é notoriamente difícil de analisar e só pode ser lido com privilégios de root; aptitudetem um em /var/log/aptitudee você pode paginar através dele com privilégios regulares de usuário.

Pelo que sei, você tem razão em que nenhum desses logs rastreia especificamente o que você instalou, em vez de dependências instaladas automaticamente. Você pode obter essas informações, no entanto, em uma aptitudepesquisa. Procure por todos os pacotes instalados que também foram instalados automaticamente:

aptitude search '~i ~M'

Se você deseja apenas os que você instalou (não as auto-dependências), negue o ~M:

aptitude search '~i !~M'

Se você deseja que este seja formatado para ter apenas os nomes dos pacotes e a palavra "instalar", também aptitudepode fazê-lo. Isso fornece uma lista pronta para alimentar dpkg --get-selections:

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

(Eu não tenho nada no RedHat ou sistemas baseados em RedHat. Desculpe. Não há realmente nenhuma uma resposta para Linux per se , desde o gerenciamento de pacotes é uma grande parte do que torna diferentes distros diferentes .)

Telêmaco
fonte
Parece uma combinação de seus conselhos e os de Ludwig podem fazer o truque: o aptitude pode gerar um script para alimentar o dpkg, de modo que seja automatizado o que é uma vitória séria. E se alguém o fizer na máquina de baunilha, a diferença nas listas é próxima o suficiente do que estou pedindo para ser praticamente útil.
quark
3
Note-se que APT agora mantém um log in "/var/log/apt/history.log", e é usado por apt-get, synaptice aptitude(até onde eu vi). Isto é, desde o início de 2010.
tshepang
As dpkg.loginstruções não parecem ser verdadeiras no Ubuntu 14.04, pois qualquer usuário pode obter minhas seleções facilmente, não trivial, mas não muito difícil. awk '$3 != "install" { next } ; { gsub(/:.+/, "", $4) ; print $4 }' /var/log/dpkg.log | sort | uniq
Steve Buzonas
Na verdade, eu sei que não é tão fácil quanto eu pensava inicialmente, a falha no script awk anterior não presta atenção aos pacotes desinstalados. O seguinte 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 -ufaz.
Steve Buzonas
7

Use dpkg -l '*' > jaunty.originalpara lembrar todos os pacotes instalados em um sistema recém-instalado.

Depois de instalar todos os seus pacotes adicionais, faça dpkg -l '*' > mysystem.2009017.

Os pacotes adicionais são exatamente a diferença: diff jaunty.original mysystem.2009017

Ludwig Weinzierl
fonte
3
A idéia básica é forte: use a linha de comando para despejar a lista de aplicativos atualmente instalados e, em seguida, use a linha de comando para instalar esses pacotes em uma nova máquina. Você pode ser bastante criativo e específico com a abordagem.
Pcapademic
1
Eu prefiro o dpkg --get-selections
CesarB
Embora isso não rastreie os pacotes que adicionei distintos de suas dependências, ele definitivamente gera uma lista útil.
quark
3

Aptidão é realmente muito bom nisso. O Aptitude sabe quando algo foi instalado manualmente ou por dependência, e você pode dizer para remover coisas que não são mais necessárias e que foram instaladas apenas porque outra coisa dependia dele, sempre mantendo o sistema o menor possível.

Existem vários pacotes que compõem uma instalação do Ubuntu, ubuntu-minimal, ubuntu-desktop, ubuntu-server e assim por diante. Se você pedir ao Aptitude para marcar esses itens como instalados manualmente e remover todo o resto, você terá a quantidade mínima possível de pacotes.

Explico como fazer tudo isso em duas postagens no meu blog: Limpando um Debian GNU / Linux e Limpando um Debian GNU / Linux (ou Ubuntu), reprise . Em suma, a resposta que você está procurando é:

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

A última vez que trabalhei com isso, se você usou o apt-get, não funcionou. É por isso que eu sempre recomendo o aptitude e, até onde eu sei, o Debian está obsoleto pelo apt-get em favor do aptitude.

Eu não sei como fazê-lo no Fedora e você provavelmente deve separar do que em uma pergunta diferente. O Fedora e o Ubuntu são sistemas operacionais diferentes e devem ser tratados como tal (mesmo que compartilhem seu kernel e outras coisas).

pupeno
fonte
2
Eu acho que você pode obter essas informações sem precisar grep: aptitude search '~i !~M'deve fazer o truque.
Telemachus
1
Além disso, apt-getnão está obsoleto. O Debian recomenda o aptitudegerenciamento de pacotes na linha de comando, mas isso está longe de ser obsoleto apt-get.
Telemachus
Há algo sutil aqui. Procurando por "A" na terceira coluna parece marcar pacotes que eu sei que estão instalados como dependências. Mas claramente não está capturando todos eles: a maior parte da lista definitivamente não foi instalada pelo meu pedido explícito.
quark
@Telemachus. Seu comando e aquele com o padrão não fazem exatamente a mesma coisa: as duas listas têm conteúdos diferentes. Eu não sei o suficiente sobre aptidão para lhe dizer o porquê.
quark
@ Pablo: Os links para o seu log parecem quebrados. Se você puder consertá-los, eu definitivamente gostaria de lê-los.
quark
2

No debian, o apt-show-versions mostra as versões dos pacotes instalados.

seb
fonte
Notado. Isso não parece estar instalado (por padrão) no Ubuntu.
quark
1

Nos sistemas baseados no apt, consulte /var/log/apt/term.log. Para mim, há uma linha bastante clara para definir onde a instalação terminou e onde minhas instalações começaram.

Wade
fonte
Menos útil para mim, porque há uma mistura de instalações manuais e atualizações do sistema. Além disso, dependendo do seu term.logs de configuração, eventualmente, serão desatualizados e excluídos, para que não volte o quanto for necessário.
quark
Para qualquer um que tente isso, observe que percorrer o registro do apt parece ser muito mais trabalhoso do que outras opções discutidas aqui. Certamente não é automático extrair uma lista de pacotes do log.
quark
1

De man aptitude-create-state-bundle:

O aptitude-create-state-bundle produz um archive compactado armazenando os arquivos necessários para replicar o estado atual do archive do pacote.

Isso manterá as mesmas informações que aptitudepossuem sobre quais pacotes foram instalados manualmente.

Ele deve ser usado com aptitude-run-state-bundle:

O aptitude-run-state-bundle descompacta o pacote de estado de aptidão fornecido criado pelo aptitude-create-state-bundle (1) para um diretório temporário, chama-o com o fornecido e remove o diretório temporário posteriormente.

intuído
fonte
1

Ao usá- dpkglo, você não sabe se o pacote foi instalado manualmente ou automaticamente pelo usuário (como uma dependência ou durante a instalação inicial do SO). Se você deseja reter essas informações, é necessário obter uma lista apenas dos pacotes que foram realmente instalados manualmente.

Para isso, você pode usar um desses dois one-liners. Ambos produzem exatamente a mesma saída na minha máquina e são mais precisos do que todas as soluções propostas até agora nesta questão. Eles são uma combinação das duas respostas (1) e (2) . Note que eu originalmente postei esta resposta aqui .

Usando apt-mark:

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

Usando 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)

Pouquíssimos pacotes ainda caem nas falhas, embora eu suspeite que eles sejam realmente instalados pelo usuário, logo após a instalação pela configuração da localização do idioma ou, por exemplo, pelo instalador do codec Totem. Além disso, as versões do cabeçalho linux também parecem se acumular, mesmo que eu tenha instalado apenas o metapacote não específico da versão. Exemplos:

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

Como funciona

  1. Obtenha a lista de pacotes instalados manualmente. Por aptidão, o adicional sedremove os espaços em branco restantes no final da linha.
  2. Obtenha a lista de pacotes instalados logo após uma nova instalação.
  3. Compare os arquivos, apenas produza as linhas no arquivo 1 que não estão presentes no arquivo 2.

Outras possibilidades não funcionam tão bem:

  • Usando o ubuntu-14.04-desktop-amd64.manifestarquivo ( aqui para Ubuntu 14.04) em vez de /var/log/installer/initial-status.gz. Mais pacotes são mostrados como instalados manualmente, mesmo que não sejam.
  • Usando em apt-mark showautovez de /var/log/installer/initial-status.gz. apt-markpor exemplo, não inclui o pacote xserver-xorg, enquanto o outro arquivo inclui.

Ambos listam mais pacotes que a solução acima.

jmiserez
fonte
0

Sou tendenciosa, e a solução que apresento nem sempre é possível, mas me cansei dessa situação. O resultado é que não instalo mais nada com as ferramentas de atualização / gerenciador de pacotes.

Eu segui um caminho bastante difícil (eu tinha requisitos estritos para versões). Criei um enorme makefile que baixa, compila e instala no meu diretório pessoal todos os pacotes (programas, bibliotecas, o que for) que eu precisar. Desenvolvi passo a passo, peça por peça. O makefile baixa e compila tudo, até os compiladores.

Quando mudo para um novo sistema ou reinstalei, apenas copio o makefile (mais algumas coisas de suporte), corro make world e volto no dia seguinte.

Para alguns programas que desenvolvo (para que eu tenha controle), eu uso uma ferramenta que eu programei, gerenciador de pacotes da castanha . Mais ou menos como pastas .app no ​​MacOSX. Tudo está no pacote, então eu sei o que está instalado a qualquer momento e sei que é independente e auto-suficiente (exceto as bibliotecas do sistema)

Stefano Borini
fonte
Você pode simplesmente colocar os comandos de instalação do gerenciador de pacotes em um script e ter o mesmo efeito; assumindo que o código que você precisa está empacotado. Sua abordagem é muito semelhante à do gentoo.
21129 wcoenen
É bom saber sobre. Parece muito trabalho extra além de um sistema Ubuntu / Debian padrão. Consigo ver manualmente a manutenção de alguns pacotes, mas manter todos eles dessa maneira é mais trabalhoso do que eu quero fazer.
quark
Sim, mas com o problema adicional de que as coisas do ubuntu / fink / darwinports não funcionam em várias plataformas em todos os lugares (eu já estive em um digital e um IBM sp4). Não afirmo que este seja um bom caminho a percorrer. Eu apenas digo que ele faz o trabalho, embora de uma maneira feia e fedorenta, e mantenho o controle total do que acontece no meu sistema.
Stefano Borini
Claro, eu poderia decidir um dia desses realmente dar uma olhada séria para emergir e refazer tudo com ele.
22413 Stefano Borini
Esse caminho é mais comum hoje em dia quando você considera ferramentas como chef e fantoche.
Steve Buzonas