Что означает «@» перед именем репо в «списке dnf»?

10

Когда я хочу вывести список установленных пакетов, я обычно делаю это одним из двух способов.

Старомодный способ использует rpm -qa | grep <whatever I look for>, и это все.

Но в последнее время я хотел более подробное отображение своих пакетов, и впредь я использовал dnf list --installed <whatever I look for>.

Однако, глядя на результат, есть пара вещей, которые я не понимаю.

Рассмотрим этот пример:

# 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

(пробелы в реальной распечатке шире)

Итак, результирующими записями являются: «пакет», «версия», «репо».

В моем примере это:

  • пакет: zsh.x86_64
  • версия: 5.2-5.fc24
  • репо: @@ командная строка

Пока что итоговая таблица понятна, но я запутался, что означают два «@@» перед именем репо.

Кроме того, «командная строка» предполагает, что пакет был установлен из командной строки (загрузка RPM, а затем выполнение dnf install whatever.rpm в командной строке и т. Д.). Однако я уверен, что установил zshчерез dnf install zsh.

Но это не все.

Я несколько пакетов на моей системе , установленной с репо @System, @fedora(впрочем , есть и fedoraбез @) и тому подобное @@commandline.

Так, что это @или @@точно означает перед названием репо?

И почему у меня установлено так много известных пакетов, @@commandlineхотя я более чем уверен, что установил их из репозиториев?

Полемон
источник

Ответы:

2

Позвольте мне бросить кирпич, чтобы привлечь сюда нефрита.

dnf list all | lessпоказывает все пакеты (включая установленные и доступные пакеты). Вывод имеет два раздела: «Установленные пакеты» и «Доступные пакеты». Всем «Установленным пакетам» предшествует знак @, а «Доступным пакетам» - нет. Поэтому я считаю, что @знаки показывают, что пакеты установлены. Если пакет установлен, но его исходное хранилище было удалено, я думаю, что это @@знак.

Исходный код dnf размещен по адресу https://github.com/rpm-software-management/dnf . После загрузки кода src, выполните grep commandline -ri .в каталоге, и он ничего не возвращает. Тем не менее, его страница GitHub упоминает об этом,

Он выполняет управление пакетами с использованием библиотек RPM, libsolv и hawkey.

Поэтому я смотрю на hawkey, который размещен в рамках того же проекта, на https://github.com/rpm-software-management/hawkey . Глядя на его код grep -ri commandline ., он показывает некоторые результаты.

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

Так commandlineприходит из hawkeyпакета. Что касается вопроса, почему @comandlineэто показано в dnf listкоманде, я предпочитаю предположить, что dnfкод не используется hawkeyдолжным образом.

JohnKoch
источник
Кажется, что страница руководства dnfневероятно молчит об этом. Предположим, «@» обозначает установленный пакет, означает ли «@@», что он установлен вручную из источника без репо, возможно? Я бы очень хотел, чтобы кто-то разъяснил.
Полемон
1
«Позвольте мне бросить кирпич, чтобы привлечь сюда нефрита». ... Я понятия не имею, что означает это удивительное и непостижимое выражение, и я думаю, что мне это нравится. I "Идиомы!"
FERD
1

(Отказ от ответственности: я не могу предоставить источники ни для чего из этого, потому что я никогда не видел никакой документации, которая на самом деле обсуждает эти вещи. Информация, которой я должен следовать, - это просто то, что мне удалось выяснить с помощью осмотра, экспериментов с «черным ящиком», случайных действий. Метод проб и ошибок и простые старые догадки. Кроме того, справедливое предупреждение, это слишком многозначительно до такой степени, что слишком долго.)

DNF добавляет @ для обозначения репо установлен пакет был установлен с , в dnf listконтексте. Как вы заметили:

В моей системе установлено несколько пакетов из репозитория @System, @fedora (однако есть также fedora без @) и таких вещей, как @@ commandline.

Но на самом деле вы никогда не увидите ни одного пакета, входящего fedoraв установленный список, так как каждый пакет показывает некоторый @ -repo в качестве источника. (Вы можете проверить это, запустив sudo dnf list installedи проверив ; в списке нет репозиториев без хотя бы одного знака @.) Когда вы просматриваете информацию о пакете с помощью dnf info, в From repo:поле « » будет отображаться имя репо без @. (Так что " From repo: fedora" абсолютно возможно, и эквивалентно @fedoraв установленном списке.)

Но некоторые репо названы со @знаком на передней панели. Как обнаружил ДжонКоч в источниках «Ястреба», «@commandline» определяется как «имя репо» для «репо командной строки». Таким образом, @@commandlineв dnf listлистинге просто указывается установленный пакет From repo: @commandline, репо, которому до степени смешения было присвоено имя, начинающееся со своего @ -знака.

dnf infoна любом установленном пакете покажет Repository: @System, какой @виртуальный репозиторий называется другим . Похоже, что @Systemэто виртуальное репо, содержащее набор установленных в данный момент пакетов, и @commandlineвиртуальное репо-источник, откуда поступил пакет, когда он не поступил из какого-либо репо.

Смысл @commandlineи @System, и их отношения друг к другу, похоже, изменились с тех пор, как я впервые написал этот ответ. В некотором смысле он более последовательный и рассматривает некоторые из моих предыдущих возражений о том, как @commandlineэто используется. Я больше не вижу каких - либо установленных пакетов , перечисленных как из @@System, и вне зоны Установок действительно теперь показывают From repo: @commandline( @@commandlineв контексте списка). dnf infoна внешнем установленном пакете обычно отображается что-то вроде следующего:

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

Если я сделаю dnf reinstall remi-release(потому что пакет находится в remiрепо), он изменится на:

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

Еще одна вещь об исходных репо: репо, перечисленные в From repo:поле, всегда являются репо, которые существуют в текущем контексте репо . Другими словами, источник установки пакета - это не просто строка, содержащая имя репозитория; Установленные пакеты связаны с идентификацией репо-провайдера, поскольку он существует (или существовал) в системе.

Поскольку большинство репозиториев имеют дистрибутивную версию, они переопределяются с каждым новым выпуском Fedora. (Как, например, « fedora» репо становится набором пакетов, составляющих новый выпуск, полностью отличным от « fedora» репозитория, существовавшим в предыдущем выпуске.) Таким образом, всякий раз, когда выполняется обновление системы, множество старых идентификаторов репо получить недействительным.

DNF (или hawkey) используется для отправки пакетов, установленных из репозиториев, которые больше не существуют, в @commandlineкачестве их репо-источника. Я говорю "привык", потому что это (к счастью) больше не сделано. Установленные пакеты из репо, который больше не существует, больше не будут показывать свой источник как @@commandline/ From repo: @commandline. На самом деле, dnf infoпоказывает , что они больше не имеют какой - либо источник репо. Например, sitecopyбыл пакет Fedora, который с тех пор был удален. Я установил его из fedoraили updatesрепо 7 или 8 выпусков назад, и все еще установил:

$ 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

Там нет " From repo:" в списке.

Это означает, что этот пакет (и другие подобные) dnf list installedпокажет (один ) рядом с ним. Таким образом, в некотором смысле мы просто обменяли одно несоответствие на другое, так как этот столбец больше не всегда является исходным репо с добавленным. Тем не менее, я предпочитаю текущее положение дел.@System@@

Сноски

  1. «... тот, который показан ...»
    (иногда показывается. «Доступные пакеты» не обязательно будут отображаться при каждом dnf listзапуске: если установленная версия пакета является лучшей доступной версией, она указана в разделе «Установленные пакеты»). поэтому было бы излишним также указывать его в разделе «Доступные пакеты». Использование --showduplicatesприведет к созданию раздела «Доступные пакеты», который включает все известные экземпляры, независимо от версии, установленной или загружаемой.)
FERD
источник
Я обновил этот ответ с некоторыми наблюдаемыми изменениями в F30 по сравнению с F28 (когда он был изначально написан), а также для решения вопросов, поднятых в этом дублирующем вопросе .
FERD