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

6

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

A maneira antiga é usar 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, quando observamos 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

(espaços na impressão real são mais amplos)

Portanto, as entradas resultantes são: «package» «version» «repo».

No meu exemplo, isso é:

  • pacote: zsh.x86_64
  • versão: 5.2-5.fc24
  • repo: @@ linha de comando

Até agora, a tabela resultante é compreensível, mas estou confuso com o que os dois significam "@@" na frente do nome do repositório.

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

Mas isso não é tudo.

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

Então, o que significa @ ou @@ exatamente na frente do nome do repositório?

E como é que tenho muitos pacotes proeminentes instalados a partir de @@commandline , apesar de ter mais do que a certeza de os ter instalado a partir dos repositórios?

    
por polemon 11.07.2016 / 06:14

2 respostas

2

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

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

O código-fonte do

dnf está hospedado no link . Depois de baixar o código src, faça um grep commandline -ri . no diretório e ele não retorna nada. No entanto, sua página github menciona isso,

It does package management using RPM, libsolv and hawkey libraries.

Então eu vejo o hawkey, que está hospedado no mesmo projeto, no link . Analisando seu código por 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)

Portanto, commandline vem de hawkey package. Quanto a perguntar por que @comandline é mostrado no comando dnf list , meu palpite é que dnf code não usa hawkey corretamente.

    
por 11.07.2016 / 18:49
0

(Isenção de responsabilidade: Eu não posso fornecer fontes para nada disso, porque eu nunca vi nenhuma documentação que realmente discuta essas coisas. A informação a seguir é meramente o que eu consegui descobrir por meio de inspeção, blackbox experimentação, aleatório tentativa e erro, e adivinhações simples.Também, aviso justo, é superexposição a ponto de ser waaaay por muito tempo.

O DNF usa @ para indicar que o repositório instalado foi instalado de . Como você observou:

I've several packages on my system installed from the repo @System, @fedora (however there's also fedora without the @) and things like @@commandline.

Mas, na realidade, você nunca verá nenhum pacote instalado a partir de fedora , pois cada pacote na lista instalada mostra algum @ -repo como sua origem. (Você pode verificar isso executando sudo dnf list installed e inspecionando; não há repos listados sem pelo menos um sinal @).

Non-@ repos entram em cena na seção "Pacotes disponíveis" de dnf list , o que é mostrado 1 quando você não limita a instalação pacotes. Lá, o dnf lista o local onde cada versão disponível de um pacote pode ser "encontrada". É por isso que, se você ativar --showduplicates , os pacotes de repositório atuais instalados no sistema sempre serão listados duas vezes em "Pacotes disponíveis": A instância instalada ( @somewhere ) conta como uma cópia disponível dessa versão o pacote, separado da cópia do repo para download ( reponame , sem o @) da mesma versão.

Como JohnKoch descobriu nas fontes do hawkey, "@commandline" é definido como o "nome do repositório" para "o repo da linha de comando". Portanto, @@commandline simplesmente indica um pacote instalado que é considerado "instalado a partir de" aquele "repo virtual" especial, que confusamente recebeu um nome que começa com um segundo @ -sign. Como você observou, outros pacotes instalados são listados com @System como sua origem, indicando que são considerados como tendo vindo de um repositório virtual diferente chamado "Sistema".

O propósito de @@commandline em DNF é um pouco estranho, já que não significa o que parece implicar. Executar um manual dnf install zsh a partir da linha de comando não resultará em um pacote @@commandline -sourced, todos os pacotes que o comando instalar serão listados como provenientes de @fedora ou qualquer outro repo extraído.

Na minha experiência, o DNF (ou hawkey) relega os pacotes instalados para o @commandline "repo" quando eles foram instalados de um repositório que era válido no momento, mas que não existe mais no o atual repolista. Em outras palavras, a fonte de instalação do pacote não é meramente uma string contendo o nome do repositório: os pacotes instalados são vinculados à identidade do repositório de fornecimento como existe (ou existia) no sistema. E, como a maioria dos repositórios são distribuídos em versões, eles são redefinidos a cada nova versão do Fedora. (Como, por exemplo, o repo " fedora " torna-se o conjunto de pacotes que compõem o novo lançamento, um repositório completamente diferente do " fedora " que existia no lançamento anterior.)

Assim, a cada atualização do sistema, essas identidades de repositório ficam desatualizadas. É por isso que, se eu executar dnf list installed no meu sistema agora, tudo o que mostra sua origem como @@commandline vem de um dos dois locais. Qualquer um:

  1. É de um repositório padrão ( fedora , updates , rpmfusion-free , o que você tem), mas ele foi instalado antes eu atualizei o sistema para F27, e não foi atualizado durante a atualização do sistema. Então, sua fonte era um repositório que não existe mais, agora que os repositórios foram redefinidos para o F27.
  2. É um pacote de recompra de um repo que eu removi completamente, como um repo COPR que subseqüentemente submeti a sudo dnf copr remove . Mais uma vez, uma fonte de recompra que não existe mais.

Pacotes que foram realmente instalados manualmente na linha de comando, os que nunca tiveram um repositório de origem - quer isso signifique que eu usei rpm -i $localpath , dnf install $localpath , dnf install $URL ou algum outro método fora de banda - esses parecem estar listados com @System como sua origem. É verdade se o pacote estava ou está disponível em algum repositório; se não foi instalado via um caminho de recompra, está listado como tendo vindo de @System .

Você pode argumentar, baseado nisso, que o significado de @@commandline é completamente ass-backwards, e o @System set é o que deveria ser rotulado como "commandline" ... e você não ouviria absolutamente nenhum desacordo de mim.

Notas de rodapé

  1. "... o que foi mostrado ..."
    (Algumas vezes mostrado. "Pacotes disponíveis" não serão necessariamente exibidos cada dnf list run: Se a versão instalada de um pacote é a melhor versão disponível, está listado em "Pacotes Instalados" para que seria redundante também listá-lo em "Pacotes Disponíveis". Usando --showduplicates forçará uma seção "Pacotes disponíveis" que inclui todas as instâncias conhecidas, independentemente da versão, seja instalado ou descarregável.)
por 16.01.2018 / 10:30