O que significa '@' na frente do nome do repositório na `lista dnf`?

10

Quando quero listar os pacotes instalados, geralmente o faço de duas maneiras.

O jeito antiquado está usando rpm -qa | grep <whatever I look for>, e é isso.

Mas, recentemente, eu queria uma exibição mais abrangente dos meus pacotes e, a partir de agora, usei dnf list --installed <whatever I look for>.

No entanto, ao olhar para o resultado, há algumas coisas que não entendo.

Considere este exemplo:

# dnf list --installed zsh                  
Last metadata expiration check: 0:13:25 ago on Mon Jul 11 05:48:04 2016.
Installed Packages
zsh.x86_64            5.2-5.fc24            @@commandline

(os espaços na impressão real são maiores)

Portanto, as entradas resultantes são: «pacote» «versão» «repo».

No meu exemplo, isso é:

  • pacote: zsh.x86_64
  • versão: 5.2-5.fc24
  • repo: @@ commandline

Até agora, a tabela resultante é compreensível, mas estou confuso sobre o que os dois '@@' significam na frente do nome do repo.

Além disso, "linha de comando" sugere que o pacote foi instalado a partir da linha de comando (baixando o RPM e executando dnf install whatever.rpm na linha de comando , etc.). No entanto, tenho certeza que instalei zshvia dnf install zsh.

Mas isso não é tudo.

Eu tenho vários pacotes no meu sistema instalado a partir do repo @System, @fedora(no entanto, há também fedorasem a @) e coisas assim @@commandline.

E o que isso @ou @@dizer exatamente na frente do nome do repo?

E como é que eu tenho tantos pacotes importantes instalados, @@commandlineembora eu tenha mais do que certeza de que os instalei dos repositórios?

polemon
fonte

Respostas:

2

Deixe-me jogar um tijolo para atrair um pouco de jade aqui.

dnf list all | lessmostra todos os pacotes (incluindo pacotes instalados e disponíveis). A saída possui duas seções: "Pacotes Instalados" e "Pacotes Disponíveis". Todos os "Pacotes Instalados" são precedidos pelo sinal @, enquanto "Pacotes Disponíveis" não são. Então, acredito que os @sinais mostram que os pacotes estão instalados. Se um pacote estiver instalado, mas seu repositório original foi excluído, acho que @@é dado sinal.

O código-fonte do DNF está hospedado em https://github.com/rpm-software-management/dnf . Depois de baixar o código src, faça a grep commandline -ri .no diretório e ele não retornará nada. No entanto, sua página do github menciona isso,

Faz gerenciamento de pacotes usando as bibliotecas RPM, libsolv e hawkey.

Então, eu olho para o hawkey, que está hospedado no mesmo projeto, em https://github.com/rpm-software-management/hawkey . Examinando seu código grep -ri commandline ., ele mostra alguns resultados.

./src/types.h:#define HY_CMDLINE_REPO_NAME "@commandline"
./hawkey.spec:- fix: commandline RPMs do not provide their files (RhBug:1112810) (Ales Kozumplik)

Então commandlinevem do hawkeypacote. Quanto à pergunta por que @comandlineé mostrada no dnf listcomando, meu palpite é que o dnfcódigo não é usado hawkeycorretamente.

JohnKoch
fonte
Parece que a página de manual dnfé incrivelmente silenciosa sobre isso. Suponha que '@' denota um pacote instalado, '@@' significa que ele é instalado manualmente a partir de uma fonte que não é de repositório, talvez? Eu realmente gostaria que alguém esclarecesse.
Polemon
1
"Deixe-me jogar um tijolo para atrair um pouco de jade aqui." ... Eu não tenho absolutamente nenhuma idéia do que essa expressão incrível e incompreensível significa, e acho que amo isso. 😍 "Expressões idiomáticas!"
FeRD 29/06/19
1

(Isenção de responsabilidade: não posso fornecer fontes para nada disso, porque nunca vi nenhuma documentação que realmente discuta essas coisas. As informações a seguir são meramente as que consegui analisar através de inspeção, experimentação de caixa preta, aleatória de tentativa e erro, e simples conjecturas de idade. Além disso, aviso justo, é overexpository ao ponto de ser waaaay muito tempo.)

DNF adiciona um @ para designar o repo um instalado pacote foi instalado a partir de , no dnf listcontexto. Como você observou:

Eu tenho vários pacotes no meu sistema instalados a partir do repositório @System, @fedora (no entanto, também há o fedora sem o @) e coisas como @@ commandline.

Mas, na realidade, você nunca verá nenhum pacote fedorana lista de instaladores , pois cada pacote mostra algum @ -repo como sua origem. (Você pode verificar isso executando sudo dnf list installede inspecionando; não há repositórios listados sem pelo menos um sinal @.) Quando você visualiza as informações de um pacote dnf info, o From repo:campo " " mostrará esse nome de repositório sem o @. (" From repo: fedora" Portanto, é absolutamente possível e equivalente a @fedorana lista instalada.)

Mas alguns repositórios são nomeados com uma @placa na frente. Como JohnKoch descobriu nas fontes do hawkey, "@commandline" é definido como o "nome do repo" para "o repo da linha de comando". Portanto, @@commandlinena dnf listlista simplesmente indica um pacote instalado From repo: @commandline, um repositório que recebeu um nome confuso que começa com seu próprio @ -sign.

dnf infoem qualquer pacote instalado será exibido Repository: @System, que é o outro @repositório virtual nomeado. Parece que @Systemé o repositório virtual que contém o conjunto de pacotes atualmente instalados e @commandlineo repositório de origem virtual de onde veio um pacote, quando não veio de nenhum repositório.

O significado de @commandlinee @System, e seu relacionamento um com o outro, parece ter mudado desde que escrevi esta resposta. De certa forma, é mais consistente e aborda algumas das minhas objeções anteriores sobre como @commandlineé usado. Não vejo mais nenhum pacote instalado listado como sendo de @@System, e as instalações fora da banda serão exibidas agora From repo: @commandline( @@commandlineno contexto da lista). dnf infoem um pacote instalado fora da banda normalmente mostra algo como o seguinte:

$ dnf info remi-release
Installed Packages
Name         : remi-release
---✀---
Repository   : @System
From repo    : @commandline

Se eu fizer um dnf reinstall remi-release(porque o pacote está no remirepositório), ele muda para:

$ dnf info remi-release
Installed Packages
Name         : remi-release
---✀---
Repository   : @System
From repo    : remi

Outra coisa sobre repositórios de origem: os repositórios listados no From repo:campo são sempre repositórios existentes no contexto atual de repositório . Em outras palavras, a fonte de instalação de um pacote não é apenas uma sequência que contém o nome do repo; os pacotes instalados estão vinculados à identidade do repositório de fornecimento como ele existe (ou existia) no sistema.

Como a maioria dos repositórios tem a versão distribuída, eles são redefinidos a cada novo lançamento do Fedora. (Como, por exemplo, o " fedora" repo se torna o conjunto de pacotes que compõem o novo lançamento, um repo completamente " fedora" diferente do que existia no release anterior.) Portanto, sempre que uma atualização do sistema é feita, muitas identidades antigas do repo ser invalidado.

DNF (ou hawkey) usado para relegar pacotes instalados a partir de repositórios que não existem mais @commandlinecomo repositório de origem. Eu digo "costumava", porque isso (felizmente) não é mais feito. Pacotes instalados que vieram de um repositório que não existe mais não mostrarão mais sua origem como @@commandline/ From repo: @commandline. De fato, dnf infomostra que eles não têm mais nenhum repositório de origem. Por exemplo, sitecopyfoi um pacote do Fedora que foi retirado. Eu o instalei a partir das versões 7 ou 8 do orpo, fedoraou updates7 e 8, e ainda o tenho instalado:

$ dnf info sitecopy
Installed Packages
Name         : sitecopy
Version      : 0.16.6
Release      : 14.fc22
Architecture : x86_64
Size         : 373 k
Source       : sitecopy-0.16.6-14.fc22.src.rpm
Repository   : @System

Não há " From repo:" listado.

Isso significa confuso que dnf list installedmostrará esse pacote (e outros semelhantes) com @System(um @) listado ao lado. Portanto, de certa forma, trocamos uma inconsistência por outra, pois essa coluna nem sempre é o repositório de origem com o @prefixo. Ainda assim, prefiro o estado atual das coisas.

Notas de rodapé

  1. "... o que é mostrado ..."
    (Às vezes mostrado. "Pacotes disponíveis" não são necessariamente exibidos a cada dnf listexecução: se a versão instalada de um pacote for a melhor versão disponível, ela será listada em "Pacotes Instalados" portanto, seria redundante listá-lo também em "Pacotes disponíveis". O uso --showduplicatesforçará uma seção "Pacotes disponíveis" que inclui todas as instâncias conhecidas, independentemente da versão, instaladas ou disponíveis para download.)
FeRD
fonte
Atualizei esta resposta com algumas alterações observadas no F30 em comparação com o F28 (quando foi originalmente escrito) e também para abordar as questões levantadas nesta pergunta duplicada .
FeRD 29/06/19