Desde o Fedora 26, o repoquery
subcomando Dnf suporta uma nova opção para listar todos os pacotes instalados pelo usuário:
$ dnf repoquery --qf '%{name}' --userinstalled \
| grep -v -- '-debuginfo$' \
| grep -v '^\(kernel-modules\|kernel\|kernel-core\|kernel-devel\)$' > pkgs_a.lst
Ao contrário de outros métodos, ele também lista todos os pacotes debuginfo. O grep adicional no exemplo acima os filtra.
Para instalar a lista no host B:
$ < pkgs_a.lst xargs dnf -y install
API Dnf
Nas versões recentes do Dnf (por exemplo, Fedora> = 23), o banco de dados do pacote pode ser consultado para nomes de pacotes instalados pelo usuário através da API Dnf Python:
$ python3 -c 'import dnf; b = dnf.Base(); b.fill_sack(); \
l = sorted(set(x.name for x in b.iter_userinstalled() \
if not x.name.endswith("-debuginfo") \
and x.name not in \
["kernel-modules", "kernel", "kernel-core", "kernel-devel"] )); \
print("\n".join(l)) ' > pkgs_a.lst
# dnf install $(cat pkgs_a.lst) # on host_b
Por padrão, dnf install
aborta se um ou mais pacotes não estiverem mais disponíveis. Como alternativa, o dnf pode ser forçado a instalar todos os restantes:
# dnf install --setopt=strict=0 $(cat pkgs_a.lst) # on host_b
PS: Coloque o código acima e mais no user-installed.py
que também suporta outras distribuições.
histórico instalado pelo usuário
No Fedora 23 e posterior, o Dnf fornece o
# dnf history userinstalled
comando que lista todos os pacotes instalados pelo usuário. A partir de 2016-11, sua utilidade é limitada, porque não há como controlar sua saída e ela imprime pacotes totalmente qualificados (por exemplo, incluindo informações de versão).
Limitações instaladas pelo usuário
Observe que a marcação de pacotes como instalados pelo usuário tem algumas limitações em algumas versões do Fedora; para os sistemas da era do Fedora 23 (de cerca de 2015-11), os seguintes problemas são relevantes):
Repoquery
Em sistemas Fedora mais antigos, onde o Dnf, a API do Dnf e dnf history userinstalled
não está disponível, pode-se usar a recomposição , por exemplo:
$ repoquery --installed \
--qf '%{n} | %{yumdb_info.reason} | %{yumdb_info.installed_by}' --all \
| awk -F'|' ' $2 ~ /user/ && ($3 != 4294967295) { print $1 }' \
| sort -u > pkgs_a.lst
A segunda condição do awk é usada para excluir pacotes que foram instalados pelo instalador. O ID do usuário do instalador aparentemente foi armazenado como 4294967295 - como alternativa, você pode escrever algo parecido ($3 == 0 || $3 == your-user-id)
.
Note que este comando funciona no Fedora até a versão 21 - mas, por exemplo, não na versão 23, porque o comando repoquery
foi substituído por dnf repoquery
. E dnf repoquery
não entende a %{yumdb_info.reason}
tag.
repoquery ...
: "Razão da consulta do yumdb inválida 'motivo' do pkg instalado: HandBrake-cli-0.9.5-1.fc14.x86_64"yum localinstall ...
. Eu tinha uma quantidade razoável de pacotes que caíam naquele campo.repoquery --installed --qf '%{n} - %{yumdb_info.reason}' --all 2>&1|grep -v "user$"|grep -v "dep$" |wc -l
devolveu 90 pacotes.A maneira mais fácil e funcionou por um longo tempo é:
... que funciona de maneira semelhante ao comando get / set selections dpkg, AIUI. Observe também que se você estiver reproduzindo o histórico, poderá usar:
... em vez de ter que analisar você mesmo.
fonte
Inspirado pela resposta da slm , eu vim com a seguinte solução baseada:
yum history
Obtenha todo o histórico detalhado de todas as transações de instalação do yum (ou seja, sem atualizações), excluindo as executadas como parte das ações iniciais do instalador (transações 1 e 2 no meu sistema, atribuídas ao usuário 'Sistema'):
Filtre pacotes instalados explicitamente e elimine prefixos de versão.
A expressão regular feia é necessária para que todos os tipos de sufixos de versão sejam correspondidos.
Os resultados parecem muito bons no meu sistema.
Uma comparação com a recomposição ansatz (no meu sistema):
(Eu canalizei os resultados da recombinação por meio de classificação -u)
Por que existem diferenças? Porque repoquery inclui todos os pacotes das transações 1 e 2, ou seja, todos os pacotes que foram instalados pelo instalador do Fedora. Isso explica por que o repoquery inclui os pacotes mencionados xorg-x11-drv-mga e friends.
Comparando repoquery-2nd e yum-history mostra que repoquery-2nd é mais preciso - ele não inclui alguns pacotes já removidos. Além disso, inclui alguns (2 no meu sistema) pacotes das operações 'yum update', ao que parece.
Atenção
O método baseado em histórico acima lista apenas todos os pacotes instalados explicitamente durante toda a vida útil do sistema. Ele não equilibra os pacotes que foram removidos em uma transação posterior. Portanto, esse método precisa de uma curadoria manual dos resultados e deve ser usado apenas em sistemas onde
repoquery
não estiver disponível.fonte
Eu tenho uma versão mais antiga do Fedora (14), então meu yum inclui uma versão menos rica em recursos
yum
, mas você pode dar uma olhada noyum history
recurso. Acredito que você pode obter as informações que procura nesse comando.lista de histórico
Você pode voltar para a primeira transação, passando uma lista de números para
yum history list
:informação da história
A seguir, mostramos o que foi instalado como parte da primeira transação yum:
Observe como o yum relata se um pacote foi instalado ou instalado explicitamente porque era necessário por uma dependência. Você pode analisar essas informações e obter sua lista de pacotes que foram explicitamente instalados.
fonte
yum history
ideia, mas também compara os resultados com orepoquery
método baseado. Como efeito colateral, estendi minha resposta de recomposição.fonte
--userinstalled
opção foi adicionada ao dnf em maio . Eu testei e fornece resultados precisos. Module os pacotes kernel / kernel-core / kernel-modules que não são realmente instalados pelo usuário. Ele também contém todos os*-debuginfo
pacotes - mas eles podem ser facilmente filtrados, se necessário.Para os pacotes da lista que você tenha instalado, tente este one-liner :
Resultado:
PS1: não mostra dependências
PS2: é ordenado alfabeticamente
PS3: não mostra se você removeu o pacote posteriormente
fonte
O que eu fiz (esqueci os detalhes, e eu sou um vagabundo preguiçoso, então ...
Obtenha todos os pacotes instalados:
rpm -qa > file
Use
sed(1)
para se livrar dos números de versão e outros (mantenha a arquitetura, se necessário). Isso exigiu algumas iterações para acertar; você deseja substituir o último trecho-[0-9.]-[0-9].fc23
ou similar por nada, mas também existem "números" engraçados da versão.Após a instalação normal, faça um
yum -y install $(< file)
(oudnf
, conforme necessário).Você obterá algumas consequências dos pacotes que não existem mais ou que mudaram de nome ou foram substituídos por outros.
fonte