Como replicar a seleção de pacotes instalados de uma instância do Fedora para outra?

12

Eu tenho um sistema Fedora (A) onde eu instalei alguns pacotes ao longo do tempo. Agora eu 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 explicitamente mencionados em um dnf install (ou yum install ) linha de comando - e não aqueles que foram instalados 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 os pacotes, eu quero remover as dependências instaladas (possivelmente) desnecessárias (ou seja, órfãs) também.

Eu encontrei dnf list installed - mas ele não é exibido se um pacote foi explicitamente selecionado ou acabou de ser instalado por causa de uma dependência.

Como obtenho essa informação no Fedora?

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

    
por maxschlepzig 13.07.2013 / 15:16

7 respostas

9

Como o Fedora 26, o subcommando suporte do Dnf repoquery 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 recentes do Dnf (por exemplo, Fedora > = 23), o banco de dados de pacotes 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. Alternativamente, 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 em user-installed.py que também suporta outras distribuições.

história userinstalled

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 (ou seja, incluindo informações de versão).

Limitações instaladas pelo usuário

Note que a marcação de pacotes como instalados pelo usuário tem algumas limitações em algumas versões do Fedora, para sistemas do período Fedora de 23 ish (de 2015 a 2015) os seguintes problemas são relevantes):

Repoquery

Em sistemas antigos do Fedora, onde Dnf, a API Dnf e dnf history userinstalled não estão disponíveis, pode-se usar repoquery em vez disso, 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 de awk é usada para excluir pacotes que foram instalados pelo instalador. O user-id do instalador aparentemente foi armazenado como 4294967295 - como alternativa, você pode escrever algo como ($3 == 0 || $3 == your-user-id) .

Note que este comando funciona no Fedora até o lançamento 21 - mas por exemplo não no release 23, porque o comando repoquery foi substituído por dnf repoquery . E dnf repoquery não entende a tag %{yumdb_info.reason} .

    
por 13.07.2013 / 15:28
6

A maneira mais fácil e trabalhada por um longo tempo é:

yum-debug-dump => gives file.

yum-debug-restore <file-from-debug-dump>

... que funciona muito como o comando get / set selections dpkg, AIUI. Observe também que, se você estiver repetindo o histórico, poderá usar:

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

... em vez de ter que analisá-lo você mesmo.

    
por 15.07.2013 / 18:34
3

Inspirado por slm 's answer Eu criei a seguinte solução baseada em yum history :

Obtenha todo o histórico detalhado em 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'):

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

Filtre pacotes explicitamente instalados e corte os 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 parecem bem no meu sistema.

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

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

(eu cansei os resultados de repoquery através de sort -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. Isto explica porque o repoquery inclui os pacotes mencionados xorg-x11- drv-mga e amigos.

Comparando repoquery-2nd e yum-history mostra que repoquery-2nd é mais preciso - não inclui alguns pacotes já removidos. Além disso, inclui alguns pacotes (2 no meu sistema) de 'yum update'-operations, parece.

Aviso

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

    
por 13.07.2013 / 20:34
2

Eu tenho uma versão mais antiga do Fedora (14), então meu yum inclui uma versão menos rica em recursos de yum , mas você pode querer dar uma olhada no recurso yum history . Eu acredito que você pode obter as informações que você 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 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 da história

O seguinte mostrará o que foi instalado como parte da transação do 1º 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 era necessário por uma dependência. Você poderia analisar essas informações e obter sua lista de pacotes que foram explicitamente instalados.

    
por 13.07.2013 / 16:38
1
dnf repoquery --qf "%{name}" --userinstalled > userinstalled.txt
    
por 21.12.2017 / 19:45
0

Para listar pacotes você instalados, tente este one-liner :

alias yum-userinstall="yumdb search command_line install* | grep command_line\ = | sort | uniq | sed -r -e 's/command_line = (.*)/yum /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: está ordenada alfabeticamente

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

    
por 12.09.2018 / 22:03
-1

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 tal (mantenha a arquitetura, se necessário). Isso exigiu algumas iterações para acertar, você quer substituir o último trecho de -[0-9.]-[0-9].fc23 ou similar por nada, mas também há "números" de versões engraçadas.

Após a instalação normalmente, faça um yum -y install $(< file) (ou dnf , conforme necessário).

Você receberá alguns pacotes que não existem mais ou mudaram de nome ou foram substituídos por outros.

    
por 19.02.2016 / 00:15

Tags