Làm cách nào để sao chép lựa chọn gói đã cài đặt từ phiên bản Fedora này sang phiên bản khác?


16

Tôi có một hệ thống Fedora (A) nơi tôi đã cài đặt một số gói theo thời gian. Bây giờ tôi muốn cài đặt Fedora trên một máy tính khác (B) và tôi muốn cài đặt các gói tương tự trên nó.

Trong thuật ngữ Debian tôi muốn thực hiện một cái gì đó như thế này:

$ dpkg --get-selections > pkg_sel_host_a  # on host_a
$ dpkg --set-selections < pkg_sel_host_a  # on host_b

Nhưng thành thật mà nói, tôi thực sự muốn một phương pháp tốt hơn để chọn các gói tương tự trên hệ thống Fedora 19 mới (B): Tôi chỉ muốn cài đặt các gói từ hệ thống A được đề cập rõ ràng trên dòng lệnh dnf install(hoặc yum install) - chứ không phải những người đã được cài đặt như phụ thuộc!

Tại sao? Bởi vì có lẽ các phụ thuộc đã thay đổi - và tôi không muốn cài đặt các phụ thuộc lỗi thời trên hệ thống mới. Thêm vào đó, khi tôi loại bỏ các gói tôi muốn loại bỏ (có thể) sau đó cũng không cần thiết phải phụ thuộc cài đặt tự động (tức là trẻ mồ côi).

Tôi đã tìm thấy dnf list installed- nhưng nó không hiển thị nếu một gói được chọn rõ ràng hoặc chỉ được cài đặt vì phụ thuộc.

Làm thế nào để tôi có được thông tin đó trên Fedora?

Cách Fedora / dnf để sao chép các lựa chọn gói là gì?

Câu trả lời:


12

Kể từ Fedora 26, các repoquery tiểu ban hỗ trợ của Dnf có một tùy chọn mới để liệt kê tất cả các gói do người dùng cài đặt:

$ dnf repoquery --qf '%{name}' --userinstalled \
 | grep -v -- '-debuginfo$' \
 | grep -v '^\(kernel-modules\|kernel\|kernel-core\|kernel-devel\)$' > pkgs_a.lst

Ngược lại với các phương thức khác, nó cũng liệt kê tất cả các gói debuginfo. Grep bổ sung trong ví dụ trên lọc chúng ra.

Để cài đặt danh sách trên máy chủ B:

$ < pkgs_a.lst xargs dnf -y install

API DNf

Với các phiên bản Dnf gần đây (ví dụ: Fedora> = 23), cơ sở dữ liệu gói có thể được truy vấn đối với tên gói được cài đặt của người dùng thông qua API API của Pythonf:

$ 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

Theo mặc định, dnf installhủy bỏ nếu một hoặc nhiều gói không còn khả dụng nữa. Ngoài ra, dnf có thể bị buộc phải cài đặt tất cả những cái còn lại:

# dnf install --setopt=strict=0 $(cat pkgs_a.lst) # on host_b

PS: Đặt mã ở trên và nhiều hơn nữa vào user-installed.pyđó cũng hỗ trợ các bản phân phối khác.

lịch sử người dùng đã cài đặt

Trên Fedora 23 trở lên, Dnf cung cấp

# dnf history userinstalled

lệnh liệt kê tất cả các gói người dùng cài đặt. Kể từ 2016-11, tính hữu dụng của nó bị hạn chế do không có cách nào để kiểm soát đầu ra của nó và nó in các gói đủ điều kiện (nghĩa là bao gồm thông tin phiên bản).

hạn chế cài đặt của người dùng

Lưu ý rằng việc đánh dấu các gói khi người dùng cài đặt có một số hạn chế đối với một số phiên bản Fedora, đối với các hệ thống thời kỳ 23 của Fedora (từ khoảng 2015-11), các vấn đề sau có liên quan):

Tái chế

Trên các hệ thống Fedora cũ hơn, nơi có Dnf, API Dnf và dnf history userinstalledkhông có sẵn, người ta có thể sử dụng tính năng repoquery thay vào đó, ví dụ:

$ 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

Điều kiện awk thứ hai được sử dụng để loại trừ các gói được cài đặt bởi trình cài đặt. Id người dùng của trình cài đặt rõ ràng được lưu trữ là 4294967295 - ngoài ra, bạn có thể viết một cái gì đó như ($3 == 0 || $3 == your-user-id).

Lưu ý rằng lệnh này hoạt động trên Fedora cho đến khi phát hành 21 - nhưng ví dụ: không phải trên phiên bản 23, vì lệnh repoqueryđã được thay thế bằng dnf repoquery. Và dnf repoquerykhông hiểu %{yumdb_info.reason}thẻ.


Tôi không chắc cách tiếp cận này có nhận được mọi thứ hay không, tôi nhận thấy những điều này trên hệ thống của mình khi tôi chạy repoquery ...: "Lý do 'truy vấn yumdb không hợp lệ' để cài đặt pkg: HandBrake-cli-0.9.5-1.fc14.x86_64"
slm

@slm, hm, từ kho lưu trữ nào đã được cài đặt phanh tay? Có lẽ các thiết lập kho lưu trữ có cái gì đó để làm với nó?
maxschlepzig

Tôi nghĩ rằng nó có thể là một RPM độc lập mà tôi đã cài đặt bằng cách sử dụng yum localinstall .... Tôi đã có một số lượng khá lớn các gói rơi vào trại đó.
slm

repoquery --installed --qf '%{n} - %{yumdb_info.reason}' --all 2>&1|grep -v "user$"|grep -v "dep$" |wc -lTrả lại 90 gói.
slm

6

Cách dễ nhất và nó hoạt động trong một thời gian dài là:

yum-debug-dump => gives file.

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

... Hoạt động giống như lệnh dpkg của get / set, AIUI. Cũng lưu ý rằng nếu bạn đang phát lại lịch sử, bạn có thể sử dụng:

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

... Thay vì phải tự phân tích nó.


3

Lấy cảm hứng từ SLM 's câu trả lời tôi đã đưa ra sau yum historydựa trên giải pháp:

Nhận tất cả lịch sử chi tiết trên tất cả các giao dịch cài đặt yum (nghĩa là không nâng cấp), ngoại trừ các giao dịch được thực thi như một phần của các hành động cài đặt ban đầu (giao dịch 1 và 2 trên hệ thống của tôi, được quy cho người dùng 'Hệ thống'):

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

Lọc các gói được cài đặt rõ ràng và cắt bỏ tiền tố phiên bản.

$ < 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

Biểu thức chính quy xấu xí là cần thiết sao cho tất cả các loại hậu tố phiên bản được khớp.

Kết quả trông khá ổn trên hệ thống của tôi.

Một so sánh với ansatz repoquery (trên hệ thống của tôi):

phương thức # gói
-------------------------
phục hồi 569
repoquery-2nd 216
lịch sử yum 214

(Tôi đã dẫn các kết quả repoquery thông qua sort -u)

Tại sao có sự khác biệt? Bởi vì repoquery bao gồm tất cả các gói từ giao dịch 1 và 2, tức là tất cả các gói được cài đặt bởi trình cài đặt Fedora. Điều này giải thích tại sao repoquery bao gồm các gói được đề cập xorg-x11- drv-mga và bạn bè.

So sánh repoquery-2nd và yum-history cho thấy repoquery-2nd chính xác hơn - nó không bao gồm một số gói đã bị xóa. Ngoài ra, nó bao gồm một vài (2 trên hệ thống của tôi) từ các hoạt động 'cập nhật yum', có vẻ như vậy.

Cảnh báo

Phương pháp dựa trên lịch sử ở trên chỉ liệt kê tất cả các gói được cài đặt rõ ràng trong suốt vòng đời hoàn chỉnh của hệ thống. Nó không cân bằng các gói đã bị xóa trong một giao dịch sau này. Vì vậy, phương pháp này cần một số cách quản lý kết quả thủ công và chỉ nên được sử dụng trên các hệ thống repoquerylà không có sẵn.


Cách tốt đẹp để tận dụng tốt nhất của cả hai câu trả lời của chúng tôi! Tôi sẽ cung cấp cho bạn nhiều hơn +1 nếu tôi có thể cho giải pháp cuối cùng + so sánh tốt đẹp về các cách khác nhau để làm điều đó.
slm

2

Tôi có phiên bản cũ hơn của Fedora (14) vì vậy yum của tôi bao gồm phiên bản ít tính năng phong phú hơn yum, nhưng bạn có thể muốn xem qua yum historytính năng này. Tôi tin rằng bạn có thể nhận được thông tin bạn đang tìm kiếm từ lệnh đó.

danh sách lịch sử

$ 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   
   ...

Bạn có thể quay lại giao dịch đầu tiên bằng cách chuyển danh sách các số tới 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

thông tin lịch sử

Phần sau đây sẽ cho bạn thấy những gì đã được cài đặt như một phần của giao dịch yum đầu tiên:

$ 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

Lưu ý cách yum báo cáo liệu một gói được cài đặt hoặc cài đặt rõ ràng bởi vì nó phụ thuộc vào nó. Bạn có thể phân tích thông tin này và nhận danh sách các gói được cài đặt rõ ràng.


Tôi đã thêm một câu trả lời dựa trên yum historyý tưởng của bạn , nó cũng so sánh kết quả với repoqueryphương pháp dựa trên. Như một tác dụng phụ, tôi đã mở rộng câu trả lời của mình.
maxschlepzig

1
dnf repoquery --qf "%{name}" --userinstalled > userinstalled.txt

1
Khi bạn xem qua 5 câu trả lời khác ở đây, bạn nhận thấy điều gì khác biệt về câu trả lời của bạn? Hoàn toàn không có lời giải thích tại sao hoặc làm thế nào câu trả lời của bạn tốt hơn khác nhau. Sẽ tốt hơn nếu bạn có thể cung cấp một số mô tả về câu trả lời của bạn bao gồm những điều này.
Stephen Rauch

@StephenRauch, lệnh này không được bao gồm trong các câu trả lời khác, vì đó là một bổ sung dnf gần đây. Công --userinstalledtắc vừa được thêm vào dnf vào tháng Năm . Tôi đã thử nó và cho kết quả chính xác. Modulo các gói kernel / kernel-core / kernel-module không thực sự được người dùng cài đặt. Nó cũng chứa tất cả *-debuginfocác gói - nhưng chúng có thể dễ dàng được lọc ra, nếu cần thiết.
maxschlepzig

@maxschlepzig, cảm ơn bạn đã phản hồi, nhưng đây thực sự là một câu hỏi tu từ, cố gắng giáo dục / nhắc câu trả lời để giải thích điều đó trong câu trả lời.
Stephen Rauch

@StephenRauch, đủ công bằng, một số chỉnh sửa chắc chắn sẽ phù hợp và sẽ cho phép tôi đánh dấu nó là câu trả lời được chấp nhận.
maxschlepzig

0

Để liệt kê các gói bạn đã cài đặt, hãy thử một lớp lót này :

alias yum-userinstall="yumdb search command_line install* | grep command_line\ = | sort | uniq | sed -r -e 's/command_line = (.*)/yum \1/g'"

Kết quả:

# 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ó không hiển thị phụ thuộc

PS2: nó được sắp xếp theo thứ tự abc

PS3: nó không hiển thị nếu bạn đã gỡ bỏ gói sau


-1

Những gì tôi đã làm (quên các chi tiết, và tôi là một kẻ lười biếng, vì vậy ...

Nhận tất cả các gói đã cài đặt: rpm -qa > file

Sử dụng sed(1)để loại bỏ số phiên bản và như vậy (giữ kiến ​​trúc, nếu cần). Điều này đòi hỏi một vài lần lặp lại để làm cho đúng, bạn muốn thay thế đoạn cuối cùng -[0-9.]-[0-9].fc23hoặc tương tự bằng cách không có gì, nhưng cũng có những "số" phiên bản vui nhộn.

Sau khi cài đặt như bình thường, làm một yum -y install $(< file)(hoặc dnf, theo yêu cầu).

Bạn sẽ nhận được một số gói không còn tồn tại, hoặc đổi tên hoặc được thay thế bởi các gói khác.


Ok, nhưng điều này sẽ đánh dấu tất cả các gói được cài đặt trước đó là người dùng đặt trong máy chủ đích. Ngay cả khi ban đầu chúng chỉ được cài đặt như một phụ thuộc.
maxschlepzig
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.