Tenho um sistema Fedora (A) onde instalei alguns pacotes ao longo do tempo. Agora quero instalar o Fedora em outro computador (B) e quero instalar os mesmos pacotes nele.

Em termos do Debian, quero realizar algo assim:

$ dpkg --get-selections > pkg_sel_host_a # on host_a $ dpkg --set-selections < pkg_sel_host_a # on host_b 

Mas para ser honesto, eu realmente quero um método melhor para selecionar os mesmos pacotes no novo sistema Fedora 19 (B): Eu só quero instalar os pacotes do sistema A que foram mencionados explicitamente em uma linha de comando (ou yum install) – e não aquelas que foram instaladas como dependências!

Por quê? Porque talvez as dependências tenham mudado – e eu não quero instalar dependências desatualizadas no novo sistema. Além disso, quando eu removo pacotes, quero remover as (possivelmente) dependências desnecessárias instaladas automaticamente (ou seja, órfãs) também.

Eu “encontrei dnf list installed – mas ele não mostra se um pacote foi explicitamente selecionado ou apenas instalado devido a uma dependência.

Como faço para obteve essa informação no Fedora?

Qual é a maneira Fedora / dnf de replicar seleções de pacotes?

Resposta

Desde o Fedora 26, o Dnf repoquery suporte ao subcomando tem 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 

Em contraste com 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

Com versões Dnf recentes (por exemplo, Fedora> = 23), o banco de dados de pacotes pode ser consultado por nomes de pacotes instalados pelo usuário por meio 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, aborta se um ou mais pacotes não estiverem mais disponíveis. Alternativamente, dnf pode ser forçado para instalar todos os restantes:

# dnf install --setopt=strict=0 $(cat pkgs_a.lst) # on host_b 

PS: Coloque o código acima e muito mais em user-installed.py que também oferece suporte a outras distribuições.

histórico instalado pelo usuário

No Fedora 23 e posterior, o Dnf fornece o comando

# dnf history userinstalled 

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 imprimir pacotes totalmente qualificados (ou seja, 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 sistemas da era Fedora 23 (por volta de 2015 -11) os seguintes problemas são relevantes):

Repoquery

Em sistemas Fedora mais antigos, onde Dnf, a API Dnf e dnf history userinstalled não estão disponíveis, pode-se usar o repoquery , 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 awk é usada para excluir pacotes que foram instalados pelo instalador. O ID de usuário do instalador foi aparentemente armazenado como 4294967295 – alternativamente, você pode escrever algo como

.

Observe 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 tag %{yumdb_info.reason}.

Comentários

  • Eu ‘ não tenho certeza se essa abordagem vai ajudar, notei isso em meu sistema quando Eu executei repoquery ...: ” yumdb querytag inválido ‘ motivo ‘ para pacote instalado: HandBrake-cli-0.9.5-1.fc14.x86_64 ”
  • @slm, hm, de qual repositório era freio de mão instalado? Talvez a configuração do repositório tenha algo a ver com isso?
  • Acho que pode ter sido um RPM autônomo que instalei usando yum localinstall .... Eu tinha uma boa quantidade de pacotes que caíam nesse campo.
  • repoquery --installed --qf '%{n} - %{yumdb_info.reason}' --all 2>&1|grep -v "user$"|grep -v "dep$" |wc -l devolveu 90 pacotes.

Resposta

A maneira mais fácil e funcionou por muito tempo é:

yum-debug-dump => gives file. yum-debug-restore <file-from-debug-dump> 

… que funciona como o comando get / set selections dpkg, AIUI.Observe também que, se estiver reproduzindo o histórico, você pode usar:

yum history addon-info last saved_tx => gives file yum load-tx <file-from-addon-info> 

… em vez de ter que analisá-lo sozinho.

Resposta

Inspirado em slm “s resposta Eu vim com a seguinte yum history solução baseada:

Obtenha todo o histórico detalhado de todas as transações de instalação do yum (ou seja, sem atualizações) , excluindo aqueles executados como parte das ações iniciais do instalador (transações 1 e 2 em meu sistema, atribuídas ao usuário “Sistema”):

$ yum history list all | awk -F"|" \ "$4 ~ /Install/ && $2 !~ /System/ {print $1}" \ | xargs yum history info > yum_history 

Filtrar pacotes explicitamente instalados e cortar prefixos de versão.

$ < yum_history grep "[^-]\<Install\>" | \ awk "{ print $2 }" \ | sed "s/\(-[0-9]\+:\|-[0-9]\+\.[0-9]\|-[0-9]\+-\|-[0-9]\+git\).\+\(\.fc1[1-7]\.\|\.noarch\).*$//" \ | sort > hist_pkg_list 

A expressão regular feia é necessária para que todos os tipos de sufixos de versão sejam correspondidos.

Os resultados parece muito bem no meu sistema.

Uma comparação com o repoquery ansatz (no meu sistema):

 method # packages ――――――――――――――――――――――――― repoquery 569 repoquery-2nd 216 yum history 214 

(Canalizei os resultados do repoquery através de ugh sort -u)

Por que existem diferenças? Porque o 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 porque o repoquery inclui os pacotes mencionados xorg-x11- drv-mga e amigos.

A comparação do repoquery-2nd e do yum-history mostra que o repoquery-2nd é mais preciso – não inclui alguns pacotes já removidos . Além disso, inclui alguns (2 no meu sistema) pacotes de operações “yum update”, ao que parece.

Aviso

O método baseado em histórico acima lista apenas todos explicitamente instalados pacotes durante toda a vida útil do sistema. Ele não equilibra os pacotes que foram removidos em uma transação posterior. Portanto, este método precisa de alguma curadoria manual dos resultados e deve ser usado apenas em sistemas onde repoquery não está disponível.

Comentários

  • Ótima maneira de obter o melhor de nossas respostas! Eu ‘ d daria a você mais do que +1 se pudesse para a solução final + a bela comparação das várias maneiras de fazer isso.

Resposta

Tenho uma versão mais antiga do Fedora (14), então meu yum inclui uma versão menos rica de recursos de yum, mas você pode querer dar uma olhada no recurso yum history. Eu acredito que você pode obter as informações que está procurando a partir desse comando.

lista de histórico

$ sudo yum history list Loaded plugins: langpacks, presto, refresh-packagekit Adding en_US to language list ID | Login user | Date and time | Action(s) | Altered ------------------------------------------------------------------------------- 862 | System <unset> | 2013-07-12 18:00 | Install | 1 861 | System <unset> | 2013-07-09 03:11 | Install | 1 860 | System <unset> | 2013-07-01 13:40 | Install | 1 859 | System <unset> | 2013-06-29 22:07 | Install | 1 858 | System <unset> | 2013-06-25 22:33 | Install | 1 P< 857 | System <unset> | 2013-06-23 22:28 | Update | 1 >E 856 | System <unset> | 2013-06-23 21:33 | Install | 1 ... 

Você pode voltar para o a primeira transação passando uma lista de números para yum history list:

$ sudo yum history list `seq 1 10` Loaded plugins: langpacks, presto, refresh-packagekit Adding en_US to language list ID | Login user | Date and time | Action(s) | Altered ------------------------------------------------------------------------------- 10 | Sam M. (local) <saml> | 2010-12-18 23:23 | Install | 2 9 | Sam M. (local) <saml> | 2010-12-18 23:15 | Install | 38 8 | Sam M. (local) <saml> | 2010-12-18 23:12 | Install | 1 7 | Sam M. (local) <saml> | 2010-12-18 23:09 | Install | 1 < 6 | Sam M. (local) <saml> | 2010-12-18 22:37 | Install | 1 > 5 | Sam M. (local) <saml> | 2010-12-18 21:57 | Install | 1 4 | System <unset> | 2010-12-18 21:21 | Install | 5 3 | System <unset> | 2010-12-18 21:18 | Install | 4 2 | System <unset> | 2010-12-18 21:10 | Install | 3 1 | System <unset> | 2010-12-18 19:14 | Install | 1189 

informações de histórico

O seguinte irá mostrar a você o que foi instalado como parte da primeira transação do yum:

$ sudo yum history info 1 | less Loaded plugins: langpacks, presto, refresh-packagekit Adding en_US to language list Transaction ID : 1 Begin time : Sat Dec 18 19:14:05 2010 Begin rpmdb : 0:da39a3ee5e6b4b0d3255bfef95601890afd80709 End time : 19:42:43 2010 (1718 seconds) End rpmdb : 1189:8c21e9e377c3ebdee936916208f74232d5d6235f User : System <unset> Return-Code : Success Transaction performed with: Packages Altered: Dep-Install ConsoleKit-0.4.2-3.fc14.x86_64 Dep-Install ConsoleKit-libs-0.4.2-3.fc14.x86_64 Dep-Install ConsoleKit-x11-0.4.2-3.fc14.x86_64 Dep-Install GConf2-2.31.91-1.fc14.x86_64 Dep-Install GConf2-gtk-2.31.91-1.fc14.x86_64 Dep-Install ModemManager-0.4-4.git20100720.fc14.x86_64 Install NetworkManager-1:0.8.1-10.git20100831.fc14.x86_64 Dep-Install NetworkManager-glib-1:0.8.1-10.git20100831.fc14.x86_64 Install NetworkManager-gnome-1:0.8.1-10.git20100831.fc14.x86_64 Install NetworkManager-openconnect-0.8.1-1.fc14.x86_64 

Observe como o yum informa se um pacote foi explicitamente instalado ou instalado porque ele era necessário para uma dependência. Você poderia analisar essas informações e obter sua lista de pacotes que foram explicitamente instalados.

Comentários

  • I ‘ Adicionamos uma resposta com base em sua yum history ideia, ela também compara os resultados com o método baseado em repoquery . Como efeito colateral, ‘ estendi minha resposta ao repoquery.

Resposta

dnf repoquery --qf "%{name}" --userinstalled > userinstalled.txt 

Comentários

  • Conforme você examina as outras 5 respostas aqui, o que você nota de diferente em sua resposta? Não há absolutamente nenhuma explicação de por que ou como sua resposta é melhor ou diferente. Seria bom se você pudesse fornecer alguma descrição de sua resposta que abranja essas coisas.
  • @StephenRauch, este comando não está ‘ incluído nas outras respostas, porque é ‘ uma adição recente de dnf. A --userinstalled opção foi adicionada ao dnf em maio . Eu ‘ testei e ele fornece resultados precisos. Módulo os pacotes kernel / kernel-core / kernel-modules que não são ‘ realmente instalados pelo usuário. Ele também contém todos os pacotes *-debuginfo – mas eles podem ser facilmente filtrados, se necessário.
  • @maxschlepzig, obrigado pelo feedback, mas na verdade foi um uma pergunta retórica, tentando educar / incitar o respondente a explicar isso na resposta.
  • @StephenRauch, justo, alguma edição certamente seria apropriada e me permitiria marcá-la como aceita responda.

Resposta

Para listar os pacotes que você instalou, tente isto one-liner :

alias yum-userinstall="yumdb search command_line install* | grep command_line\ = | sort | uniq | sed -r -e "s/command_line = (.*)/yum \1/g"" 

Resultado:

# yum-userinstall yum install bind-utils yum install http://rpms.remirepo.net/enterprise/remi-release-7.rpm yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm yum install lsof yum install nano yum install nfs-utils libnfsidmap yum install nmap-ncat yum install openscap-scanner yum install open-vm-tools 

PS1: não mostra dependências

PS2: é classificado em ordem alfabética

PS3: não mostra se você removeu o pacote posteriormente

Resposta

O que eu fiz (esqueci os detalhes e 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 (manter a arquitetura, se necessário). Isso exigia um algumas iterações para acertar, você deseja substituir o último trecho de -[0-9.]-[0-9].fc23 ou similar por nada, mas há versões engraçadas “números” também.

Depois instalando normalmente, faça um yum -y install $(< file) (ou dnf, conforme necessário).

Você terá alguns efeitos colaterais de pacotes que não existem e ymais, ou mudou o nome, ou foram substituídos por outros.

Comentários

  • Ok, mas isso irá marcar todos os pacotes instalados anteriormente como instalados pelo usuário em o host de destino. Mesmo que eles tenham sido originalmente instalados apenas como uma dependência.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *