'@' Có nghĩa là gì trước tên repo trong danh sách `dnf`?


10

Khi tôi muốn liệt kê các gói đã cài đặt, tôi thường thực hiện theo một trong hai cách.

Cách thức cũ đang sử dụng rpm -qa | grep <whatever I look for>, và đó là điều đó.

Nhưng gần đây tôi muốn hiển thị toàn diện hơn các gói của mình và từ đó, tôi đã sử dụng dnf list --installed <whatever I look for>.

Tuy nhiên, khi nhìn vào kết quả, có một vài điều tôi không hiểu.

Xem xét ví dụ này:

# 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

(không gian trong bản in thực tế rộng hơn)

Vì vậy, các mục kết quả, là: «gói» «phiên bản» «repo».

Trong ví dụ của tôi đó là:

  • gói: zsh.x86_64
  • phiên bản: 5.2-5.fc24
  • repo: @@ dòng lệnh

Cho đến nay, bảng kết quả có thể hiểu được, nhưng tôi bối rối không biết hai chữ "@@" ở phía trước tên repo là gì.

Ngoài ra, "dòng lệnh" đề xuất gói đã được cài đặt từ dòng lệnh (tải xuống RPM, sau đó thực hiện dnf install whatever.rpm trong dòng lệnh , v.v.). Tuy nhiên tôi khá chắc chắn rằng tôi đã cài đặt zshqua dnf install zsh.

Nhưng đó không phải là tất cả.

Tôi đã cài đặt một số gói trên hệ thống của mình từ repo @System, @fedora(tuy nhiên cũng fedorakhông có @) và những thứ tương tự @@commandline.

Vì vậy, điều đó @hoặc @@chính xác có nghĩa là gì trước tên repo?

Và tại sao tôi lại có rất nhiều gói nổi bật được cài đặt từ @@commandlinemặc dù tôi chắc chắn rằng tôi đã cài đặt chúng từ repos?

Câu trả lời:


2

Hãy để tôi ném một viên gạch để thu hút một số ngọc ở đây.

dnf list all | lesshiển thị tất cả các gói (bao gồm các gói đã cài đặt và có sẵn). Đầu ra có hai phần: "Gói đã cài đặt" và "Gói có sẵn". Tất cả "Gói đã cài đặt" được đặt trước ký hiệu @, trong khi "Gói có sẵn" thì không. Vì vậy, tôi tin rằng @các dấu hiệu cho thấy các gói được cài đặt. Nếu một gói được cài đặt nhưng repo ban đầu của nó đã bị xóa, tôi đoán @@dấu hiệu được đưa ra.

mã nguồn dnf được lưu trữ tại https://github.com/rpm-software-manloyment/dnf . Sau khi tải xuống mã src, hãy thực hiện grep commandline -ri .trong thư mục và nó không trả về gì cả. Tuy nhiên, trang github của nó có đề cập đến điều này,

Nó thực hiện quản lý gói bằng các thư viện RPM, libsolv và hawkey.

Vì vậy, tôi nhìn vào hawkey, được lưu trữ trong cùng một dự án, tại https://github.com/rpm-software-man Quản lý / hawkey . Nhìn vào mã của grep -ri commandline .nó, nó cho thấy một số kết quả.

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

Vì vậy, commandlineđến từ hawkeygói. Đối với câu hỏi tại sao @comandlineđược hiển thị trong dnf listlệnh, phỏng đoán hoang dã của tôi là dnfmã không sử dụng hawkeyđúng cách.


Có vẻ như trang của người đàn ông dnfvô cùng im lặng về điều này. Giả sử '@' biểu thị một gói đã cài đặt, có phải '@@' có nghĩa là nó được cài đặt thủ công từ nguồn không repo, có lẽ? Tôi thực sự muốn ai đó sẽ làm rõ.
Polemon

1
"Hãy để tôi ném một viên gạch để thu hút một số ngọc ở đây." ... Tôi hoàn toàn không biết ý nghĩa tuyệt vời và khó hiểu đó là gì, và tôi nghĩ rằng tôi yêu nó. 😍 "thành ngữ!"
FeRD

1

(Tuyên bố miễn trừ trách nhiệm: Tôi không thể cung cấp nguồn cho bất kỳ vấn đề nào trong số này, vì tôi chưa bao giờ thấy bất kỳ tài liệu nào thực sự thảo luận về những điều này. thử nghiệm và lỗi, và đồng bằng phỏng đoán cũ. Ngoài ra, cảnh báo công bằng, đó là overexpository đến mức là waaaay quá lâu.)

DNF thêm một @ để biểu thị repo một cài đặt gói đã được cài đặt từ , trong dnf listngữ cảnh. Như bạn đã lưu ý:

Tôi đã cài đặt một số gói trên hệ thống của mình từ repo @System, @fedora (tuy nhiên cũng có fedora không có @) và những thứ như dòng lệnh @@.

Nhưng trong thực tế, bạn sẽ không bao giờ nhìn thấy bất kỳ gói đến từ fedoratrên cài đặt danh sách, như mỗi gói có cho thấy một số @ -repo như nguồn của nó. (Bạn có thể xác minh rằng bằng cách chạy sudo dnf list installedvà kiểm tra; không có repos nào được liệt kê mà không có ít nhất một dấu @.) Khi bạn xem thông tin của gói dnf info, trường " From repo:" sẽ hiển thị tên repo mà không có @. (Vì vậy, " From repo: fedora" là hoàn toàn có thể, và tương đương với @fedoratrong danh sách đã cài đặt.)

Nhưng một số repos được đặt tên với một @dấu hiệu ở phía trước. Như JohnKoch đã phát hiện ra trong các nguồn hawkey, "@commandline" được định nghĩa là "tên repo" cho "repo dòng lệnh". Vì vậy, @@commandlinetrong dnf listdanh sách chỉ đơn giản chỉ ra một gói đã cài đặt From repo: @commandline, một repo gây nhầm lẫn được đặt tên bắt đầu bằng @ -sign của chính nó.

dnf infotrên bất kỳ gói cài đặt nào cũng sẽ hiển thị Repository: @System, đó là @repo ảo có tên khác . Có vẻ như đó @Systemlà repo ảo chứa tập hợp các gói hiện được cài đặt và repo nguồn@commandline ảo từ một gói đến, khi nó không đến từ bất kỳ repo nào.

Ý nghĩa của @commandline@System, và mối quan hệ của họ với nhau, dường như đã thay đổi kể từ lần đầu tiên tôi viết câu trả lời này. Theo một số cách, nó phù hợp hơn và giải quyết một số phản đối trước đây của tôi về cách @commandlinesử dụng. Tôi không còn thấy bất kỳ gói cài đặt nào được liệt kê là từ @@Systemvà các cài đặt ngoài băng sẽ thực sự hiển thị From repo: @commandline( @@commandlinetrong ngữ cảnh danh sách). dnf infotrên gói cài đặt ngoài băng tần thường hiển thị nội dung như sau:

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

Nếu tôi làm một dnf reinstall remi-release(vì gói nằm trong remirepo), nó sẽ thay đổi thành:

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

Một điều khác về repos nguồn: Các repos được liệt kê trong From repo:trường luôn là các repos tồn tại trong bối cảnh repo hiện tại . Nói cách khác, nguồn cài đặt của gói không chỉ là một chuỗi chứa tên repo; các gói đã cài đặt được liên kết với danh tính của repo cung cấp khi nó tồn tại (hoặc tồn tại) trong hệ thống.

Vì hầu hết các repos đều là phiên bản phân phối, chúng được xác định lại với mỗi bản phát hành Fedora mới. (Ví dụ: " fedora" repo trở thành tập hợp các gói tạo nên bản phát hành mới, một bản repo hoàn toàn khác với " fedora" tồn tại trong bản phát hành trước.) Vì vậy, bất cứ khi nào nâng cấp hệ thống được thực hiện, rất nhiều danh tính repo cũ bị vô hiệu

DNF (hoặc hawkey) được sử dụng để loại bỏ các gói được cài đặt từ các repos không còn tồn tại @commandlinenhư là repo nguồn của chúng. Tôi nói "đã từng", vì đó là (rất may) không còn được thực hiện. Các gói đã cài đặt đến từ một repo không còn tồn tại sẽ không còn hiển thị nguồn của chúng là @@commandline/ From repo: @commandline. Trong thực tế, dnf infocho thấy rằng họ không còn có bất kỳ repo nguồn. Ví dụ, sitecopylà một gói Fedora đã bị loại bỏ. Tôi đã cài đặt nó từ fedorahoặc updatesrepo 7 hoặc 8 bản phát hành trước đây và vẫn cài đặt nó:

$ 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

Không có " From repo:" được liệt kê.

Điều này có nghĩa khó hiểu có nghĩa là dnf list installedsẽ hiển thị gói đó (và những người khác thích nó) với @System(một @) được liệt kê bên cạnh nó. Vì vậy, theo một nghĩa nào đó, chúng ta vừa trao đổi một mâu thuẫn cho một cái khác, vì cột đó không còn luôn là repo nguồn với tiền dự phòng @. Tuy nhiên, tôi thích tình trạng hiện tại.

Chú thích

  1. "... gói được hiển thị ..."
    (Đôi khi được hiển thị. "Gói có sẵn" sẽ không nhất thiết phải hiển thị trên mỗi lần dnf listchạy: Nếu phiên bản đã cài đặt của gói là phiên bản khả dụng tốt nhất, thì nó được liệt kê trong "Gói đã cài đặt" do đó, sẽ rất dư thừa khi liệt kê nó trong "Gói có sẵn". Sử dụng --showduplicatessẽ buộc phần "Gói có sẵn" bao gồm tất cả các phiên bản đã biết, bất kể phiên bản, cho dù đã cài đặt hay có thể tải xuống.)

Tôi đã cập nhật câu trả lời này với một số thay đổi được quan sát trong F30 so với F28 (khi nó được viết ban đầu) và cũng để giải quyết những điều được nêu ra trong câu hỏi trùng lặp này .
FeRD
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.