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

38

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

Ao usar qualquer configuração do Ubuntu, eu gradualmente instalo vários pacotes além da instalação da linha de base. Se eu reinstalar, ou se precisar instalar uma nova máquina, geralmente quero reinstalar esses pacotes específicos , e quero fazer isso rapidamente para voltar ao trabalho com um mínimo de problemas. Tanto quanto eu vi todos os gerenciadores de pacotes ( apt-get , aptitude e synaptic ) podem me dizer quais pacotes estão instalados, e todos eles têm logs (embora diferentes para cada ferramenta, o que é um incômodo ). Mas nenhum deles pode me dizer quais pacotes eu tenho instalados, ao contrário de suas dependências ou atualizações do sistema. Mesmo os logs são complicados, pois não tenho certeza do que devo extrair deles, ou como integrá-los (no caso das várias ferramentas da família apt). Isso significa que toda vez que eu reinstalo ou apenas faço backup, não sei como recriar essa lista.

Não estou necessariamente esperando que nenhuma das ferramentas faça isso para mim, mas, se isso não acontecer, estou procurando soluções alternativas. Até mesmo padrões a serem usados, boas regras práticas ou uma ideia clara do que exatamente está sendo registrado, seriam úteis. Pode não haver uma "melhor resposta" aqui, mas os bons seriam muito úteis.

A maioria das respostas abaixo fornece alguma aproximação do que estou procurando e é útil em algum grau. 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 advertências.

    
por quark 16.07.2009 / 23:57

8 respostas

31

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

dpkg --get-selections "*" > my_favorite_packages

Copie o arquivo my_favorite_packages para a nova máquina (um pen drive é uma boa opção, mas scp també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 te dá somente 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.

No que diz respeito a logs, apt-get mantém um log em /var/log/apt/history.log (graças à Tshepang por atualizar isso em um comentário); dpkg (em /var/log/dpkg.log ), mas é notoriamente difícil de analisar e só pode ser lido com privilégios de root; aptitude tem um em /var/log/aptitude e você pode paginar com privilégios normais de usuário.

Tanto quanto eu posso dizer, você está certo de que nenhum desses registros rastreiam especificamente o que você instalou, em oposição às dependências instaladas automaticamente. Você pode obter essa informação, no entanto, de uma pesquisa aptitude . Procure todos os pacotes instalados que também foram instalados automaticamente:

aptitude search '~i ~M'

Se você quiser somente aqueles que você instalou (não as auto-dependências), negue o ~M :

aptitude search '~i !~M'

Se você quer que formatado para que você tenha apenas os nomes dos pacotes e a palavra "install", aptitude também pode fazer isso. Isto dá-lhe uma lista pronta para alimentar a dpkg --get-selections :

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

(Eu não tenho nada em sistemas baseados em RedHat ou RedHat. Desculpe. Não existe uma resposta para o Linux per se já que o gerenciamento de pacotes é uma grande parte do que faz diferentes distribuições diferente .

    
por 17.07.2009 / 12:51
7

Use dpkg -l '*' > jaunty.original para lembrar de 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 apenas a diferença: diff jaunty.original mysystem.2009017

    
por 17.07.2009 / 00:04
3

Aptidão é realmente muito bom nisso. 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 foram instaladas apenas porque alguma outra coisa dependia dele, sempre mantendo seu sistema o menor possível.

Há um punhado de pacotes que compõem uma instalação do Ubuntu, ubuntu-minimal, ubuntu-desktop, ubuntu-server e assim por diante. Se você disser ao Aptitude para marcá-los como instalados manualmente e remover todo o resto, você acabará com a quantidade mínima possível de pacotes.

Eu explico como fazer tudo isso em dois posts 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, então não funcionou. É por isso que sempre recomendo o aptitude e, tanto quanto sei, o Debian está depreciando o apt-get em favor do aptitude.

Eu não sei como fazer isso no Fedora e você provavelmente deve se separar do que em uma questão diferente. Fedora e Ubuntu são sistemas operacionais diferentes e devem ser tratados como tal (mesmo que sejam compartilhar seu kernel e algumas outras coisas).

    
por 17.07.2009 / 01:12
2

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

    
por 17.07.2009 / 14:43
1

Em sistemas baseados em apt, veja em /var/log/apt/term.log. Para mim, há uma linha bem clara para desenhar onde a instalação terminou e onde minhas instalações começaram.

    
por 17.07.2009 / 19:58
1

De man aptitude-create-state-bundle :

aptitude-create-state-bundle produces a compressed archive storing the files that are required to replicate the current package archive state.

Isso manterá as mesmas informações que aptitude tem em quais pacotes foram instalados manualmente.

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

aptitude-run-state-bundle unpacks the given aptitude state bundle created by aptitude-create-state-bundle(1) to a temporary directory, invokes on it with the supplied , and removes the temporary directory afterwards.

    
por 15.04.2011 / 19:31
1

Ao usar apenas dpkg , você não sabe se o pacote foi instalado manualmente pelo usuário ou automaticamente (como uma dependência ou durante a instalação inicial do sistema operacional). Se você quiser manter essa informação, você precisa obter uma lista de apenas os pacotes que foram instalados manualmente.

Para isso, você pode usar qualquer 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 estão perdidos, embora eu suspeite que esses sejam realmente instalados pelo usuário, logo após a instalação, por meio da configuração de localização de idioma ou, por exemplo, através do instalador do codec Totem. Além disso, as versões do cabeçalho do 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. Para o aptitude, o sed adicional retira 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 imprima as linhas no arquivo 1 que não estão presentes no arquivo 2.

Outras possibilidades também não funcionam:

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

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

    
por 06.07.2014 / 17:13
0

Eu sou parcial e a solução que apresento nem sempre é possível, mas cansei-me dessa situação. O resultado é que eu não instalo mais nada com as ferramentas update / package manager.

Eu tomei uma rota bastante difícil (eu tinha requisitos rigorosos para versões). Eu criei um makefile enorme que baixa, compila e instala em meu diretório home todo pacote (programa, biblioteca, qualquer que seja) que eu preciso. Eu desenvolvi passo a passo, peça por peça. O makefile baixa e compila tudo, até mesmo os compiladores.

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

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

    
por 17.07.2009 / 00:06