Làm thế nào để bạn theo dõi các gói đã được cài đặt trên Ubuntu (Linux)?


38

(Câu hỏi này rất giống với 10458. Có ý kiến ​​cho rằng Fedora và Ubuntu / Debian đủ khác nhau để đảm bảo các câu trả lời khác nhau.)

Khi tôi sử dụng bất kỳ thiết lập Ubuntu nào, tôi dần dần cài đặt một số gói trên và trên cài đặt cơ bản. Nếu tôi cài đặt lại hoặc nếu tôi cần cài đặt một máy mới, tôi thường muốn cài đặt lại các gói cụ thể đó và tôi muốn thực hiện nhanh để quay lại làm việc với ít rắc rối nhất. Theo như tôi đã nhìn thấy tất cả các nhà quản lý gói ( apt-get, aptitudesynaptic) có thể cho tôi biết những gói được cài đặt, và tất cả họ đều có bản ghi (mặc dù những người khác nhau cho mỗi công cụ, mà là một rắc rối). Nhưng không ai trong số họ có thể cho tôi biết những gói Tôi đãđược cài đặt, trái ngược với sự phụ thuộc hoặc cập nhật hệ thống của họ. Ngay cả nhật ký cũng khó khăn ở chỗ tôi không hoàn toàn chắc chắn những gì tôi nên trích xuất từ ​​chúng hoặc cách tích hợp chúng (trong trường hợp các công cụ gia đình apt khác nhau). Điều này có nghĩa là mỗi lần tôi cài đặt lại, hoặc thậm chí chỉ sao lưu, tôi không chắc chắn cách tạo lại danh sách đó.

Tôi không nhất thiết mong đợi bất kỳ công cụ nào để làm điều này cho tôi, nhưng nếu họ không tìm cách giải quyết. Ngay cả các mẫu để grep cho, quy tắc tốt, hoặc ý tưởng rõ ràng về chính xác những gì đang được ghi lại, sẽ hữu ích. Có thể không có một "câu trả lời tốt nhất" ở đây nhưng những câu trả lời tốt sẽ rất hữu ích.


Hầu hết các câu trả lời dưới đây cung cấp một số xấp xỉ về những gì tôi đang tìm kiếm, và hữu ích ở một mức độ nào đó. Công cụ được chọn là công cụ gần nhất với cách tự động cài đặt lại các công cụ của tôi trên một hệ thống mới, ngay cả với tất cả các cảnh báo của nó.


Bạn không có khả năng nhận được một câu trả lời dễ dàng chia sẻ cho tất cả các bản phân phối Linux. Quản lý gói là một phần lớn của những gì phân biệt các bản phân phối Linux khác nhau.
Telemachus

Telemachus - Đúng. Và nó có thể có ý nghĩa để chia điều này thành hai câu hỏi. Nhưng nó có vẻ là một câu hỏi khá chuyên biệt và tôi sử dụng cả hai hệ thống, vì vậy tôi không muốn thu hẹp nó quá nhiều. Có vẻ như hầu hết các câu trả lời ở đây là dành cho dpkg / apt, vì vậy một câu hỏi riêng cho vòng / phút có thể có ý nghĩa.
quark

Chuyển sang NixOS :) (chỉ trolling).
Alexey

Câu trả lời:


31

Trên bất kỳ máy dựa trên Debian nào, đây là một cách phổ biến để sao chép bộ gói. Trên máy cũ:

dpkg --get-selections "*" > my_favorite_packages

Sao chép tệp my_favorite_packagesvào máy mới (ổ ngón tay cái là một tùy chọn tốt, nhưng scpcũng hoạt động tốt). Sau đó chạy chuỗi này (với quyền root):

apt-get update
dpkg --set-selections < my_favorite_packages
apt-get -u dselect-upgrade

Điều này không giúp bạn chỉ có các gói bạn đã cài đặt. Nó cũng nhận được sự phụ thuộc của họ, v.v. Ngoài ra, nếu kho lưu trữ giữa hai máy khác nhau, tất cả các cược đều bị tắt.

Theo như nhật ký, hãy apt-getgiữ một bản ghi tại /var/log/apt/history.log(cảm ơn Tshepang vì đã cập nhật thông tin này trong một bình luận); dpkgkhông (tại /var/log/dpkg.log), nhưng nó rất khó phân tích và chỉ có thể được đọc với các đặc quyền gốc; aptitudecó một tại /var/log/aptitudevà bạn có thể trang thông qua nó với đặc quyền người dùng thông thường.

Theo như tôi có thể nói, bạn đúng rằng không có nhật ký nào theo dõi cụ thể những gì bạn đã cài đặt trái ngược với các phụ thuộc được cài đặt tự động. Bạn có thể lấy thông tin đó, tuy nhiên, từ một aptitudetìm kiếm. Tìm kiếm tất cả các gói đã cài đặt cũng được cài đặt tự động:

aptitude search '~i ~M'

Nếu bạn chỉ muốn những cái bạn đã cài đặt (không phải phụ thuộc tự động), hãy phủ nhận ~M:

aptitude search '~i !~M'

Nếu bạn muốn định dạng đó để bạn chỉ có tên của các gói và từ "cài đặt", aptitudecũng có thể làm điều đó. Điều này cung cấp cho bạn một danh sách sẵn sàng để cung cấp cho dpkg --get-selections:

aptitude search '~i !~M' -F "%p install"

(Tôi đã có gì trên RedHat hoặc các hệ thống RedHat-based. Xin lỗi. Thật sự không có một câu trả lời cho Linux cho mỗi gia nhập kể từ quản lý gói là một phần quan trọng của những gì làm cho distro khác nhau khác nhau .)


Có vẻ như là sự kết hợp giữa lời khuyên của bạn và Ludwig có thể thực hiện một mẹo nhỏ: aptitude có thể tạo ra một kịch bản để cung cấp cho dpkg để tự động tương thích, đó là một chiến thắng nghiêm trọng. Và nếu một người làm điều đó trên máy vani, sự khác biệt trong danh sách đủ gần với những gì tôi yêu cầu thực sự hữu ích.
quark

3
Lưu ý rằng APT bây giờ giữ một bản ghi trong "/var/log/apt/history.log", và được sử dụng bởi apt-get, synapticaptitude(chừng mực tôi đã nhìn thấy). Đây là từ đầu năm 2010
tshepang

Các dpkg.logtuyên bố dường như không đúng trong Ubuntu 14.04 vì bất kỳ người dùng nào tôi cũng có thể nhận được các lựa chọn của mình một cách dễ dàng, không tầm thường, nhưng không quá khó. awk '$3 != "install" { next } ; { gsub(/:.+/, "", $4) ; print $4 }' /var/log/dpkg.log | sort | uniq
Steve Buzonas

Trên thực tế, tôi nhận ra nó không dễ như tôi nghĩ ban đầu, lỗ hổng trong kịch bản awk trước đó không chú ý đến các gói đã gỡ cài đặt. Sau đây awk '$3 !~ /install|remove|purge/ { next } { gsub(/remove|purge/, "uninstall", $3) ; gsub(/:.+/, "", $4) ; a[$4]=$3 } END { for (p in a) { if (a[p] == "install") { print p } } }' /var/log/dpkg.log | sort -ukhông.
Steve Buzonas

7

Sử dụng dpkg -l '*' > jaunty.originalđể ghi nhớ tất cả các gói đã cài đặt trên một hệ thống mới được cài đặt.

Sau khi bạn đã cài đặt tất cả các gói bổ sung của bạn làm dpkg -l '*' > mysystem.2009017.

Các gói bổ sung chỉ là sự khác biệt: diff jaunty.original mysystem.2009017


3
Ý tưởng cơ bản là mạnh mẽ: sử dụng dòng lệnh để kết xuất danh sách các ứng dụng hiện được cài đặt, sau đó sử dụng dòng lệnh để cài đặt các gói đó trên một máy mới. Bạn có thể nhận được khá sáng tạo và cụ thể với cách tiếp cận.
pcapademia

1
Tôi thích dpkg --get-tuyển chọn
CesarB

Mặc dù điều này không theo dõi các gói tôi đã thêm khác biệt với các phụ thuộc của chúng, nhưng nó chắc chắn tạo ra một danh sách hữu ích.
quark

3

Năng khiếu thực sự khá tốt trong việc này. Aptitude biết khi nào một cái gì đó được cài đặt bằng tay hoặc phụ thuộc và bạn có thể yêu cầu nó loại bỏ những thứ không còn cần thiết và chỉ được cài đặt vì một cái gì đó phụ thuộc vào nó luôn giữ cho hệ thống của bạn nhỏ nhất có thể.

Có một số gói tạo nên một bản cài đặt Ubuntu, tối thiểu Ubuntu, máy tính để bàn, máy chủ Ubuntu, v.v. Nếu bạn yêu cầu Aptitude đánh dấu những thứ đó là cài đặt thủ công và xóa mọi thứ khác, thì bạn sẽ kết thúc với số lượng tối thiểu có thể của các gói.

Tôi giải thích cách thực hiện tất cả những điều đó trong hai bài đăng trên blog của mình: Làm sạch Debian GNU / LinuxLàm sạch Debian GNU / Linux (hoặc Ubuntu), tái bản . Nói tóm lại, câu trả lời bạn đang tìm kiếm là:

aptitude search ~i | grep -v "i A"

Lần cuối cùng tôi làm việc với điều đó, nếu bạn sử dụng apt-get, thì nó không hoạt động. Đó là lý do tại sao tôi luôn đề xuất năng khiếu và theo như tôi biết, Debian không tán thành apt - hãy ủng hộ năng khiếu.

Tôi không biết làm thế nào để làm điều đó trên Fedora và có lẽ bạn nên tách ra thành một câu hỏi khác. Fedora và Ubuntu là các hệ điều hành khác nhau và nên được xử lý như vậy (ngay cả khi chúng chia sẻ kernel và một số thứ khác).


2
Tôi nghĩ rằng bạn có thể có được thông tin đó mà không cần grep: aptitude search '~i !~M'nên thực hiện thủ thuật.
Telemachus

1
Ngoài ra, apt-getkhông được phản đối. Debian khuyên bạn nên aptitudequản lý gói trên dòng lệnh, nhưng điều đó khác xa với việc không dùng nữa apt-get.
Telemachus

Có một cái gì đó tinh tế ở đây. Tìm kiếm "A" trong cột thứ ba dường như đánh dấu các gói mà tôi biết được cài đặt làm phụ thuộc. Nhưng rõ ràng là không bắt được tất cả chúng: hầu hết danh sách chắc chắn không được cài đặt theo yêu cầu rõ ràng của tôi.
quark

@Telemachus. Lệnh của bạn và lệnh có mẫu không thực hiện chính xác cùng một điều: hai danh sách có nội dung khác nhau. Tôi không biết đủ về năng khiếu để nói với bạn tại sao.
quark

@Pablo: Các liên kết đến nhật ký của bạn dường như bị hỏng. Nếu bạn có thể sửa chúng, tôi chắc chắn muốn đọc chúng.
quark

2

Trên debian apt-show-phiên bản hiển thị các phiên bản của các gói đã cài đặt.


Lưu ý Điều này dường như không được cài đặt (theo mặc định) trên Ubuntu.
quark

1

Trên các hệ thống dựa trên apt, hãy xem /var/log/apt/term.log. Đối với tôi, có một dòng khá rõ ràng để vẽ nơi cài đặt kết thúc và nơi cài đặt của tôi bắt đầu.


Ít hữu ích hơn đối với tôi, vì có sự xen kẽ các cài đặt thủ công và cập nhật hệ thống. Ngoài ra, tùy thuộc vào thuật ngữ thiết lập của bạn. Các tệp cuối cùng sẽ bị lỗi thời và bị xóa, vì vậy nó sẽ không quay trở lại khi tôi cần.
quark

Đối với bất kỳ ai đang thử điều này, lưu ý rằng việc lội qua nhật ký của apt dường như là công việc nhiều hơn so với các tùy chọn khác được thảo luận ở đây. Nó chắc chắn không tự động để trích xuất một danh sách gói từ nhật ký.
quark

1

Từ man aptitude-create-state-bundle:

gói aptitude-tạo-trạng thái tạo ra một kho lưu trữ nén lưu trữ các tệp được yêu cầu để sao chép trạng thái lưu trữ gói hiện tại.

Điều này sẽ giữ lại thông tin tương tự aptitudevới các gói đã được cài đặt thủ công.

Nó có nghĩa là được sử dụng với aptitude-run-state-bundle:

aptitude-run-state-bundle giải nén gói trạng thái aptitude đã cho được tạo bởi aptitude-created-state-bundle (1) vào một thư mục tạm thời, gọi nó với thư mục được cung cấp và xóa thư mục tạm thời sau đó.


1

Khi chỉ sử dụng, dpkgbạn không biết liệu gói đó được người dùng cài đặt thủ công hay tự động (dưới dạng phụ thuộc hoặc trong quá trình cài đặt hệ điều hành ban đầu). Nếu bạn muốn giữ lại thông tin đó, bạn cần có một danh sách chỉ các gói được cài đặt thủ công.

Đối với điều đó, bạn có thể sử dụng một trong hai lớp lót này. Cả hai đều mang lại cùng một đầu ra trên máy của tôi và chính xác hơn tất cả các giải pháp được đề xuất cho đến bây giờ trong câu hỏi này. Chúng là sự kết hợp của hai câu trả lời (1)(2) . Lưu ý rằng ban đầu tôi đã đăng câu trả lời này ở đây .

Sử dụng apt-mark:

comm -23 <(apt-mark showmanual | sort -u) <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort -u)

Sử dụng aptitude:

comm -23 <(aptitude search '~i !~M' -F '%p' | sed "s/ *$//" | sort -u) <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort -u)

Rất ít các gói vẫn rơi qua các vết nứt, mặc dù tôi nghi ngờ những đang thực sự được cài đặt bởi người sử dụng, hoặc ngay sau khi quá trình cài đặt thông qua việc thiết lập địa hóa ngôn ngữ hoặc ví dụ như thông qua các Totem giải mã trình cài đặt. Ngoài ra, các phiên bản tiêu đề linux dường như cũng tích lũy, mặc dù tôi chỉ cài đặt siêu dữ liệu không dành riêng cho phiên bản. Ví dụ:

libreoffice-help-en-gb
openoffice.org-hyphenation
gstreamer0.10-fluendo-mp3
linux-headers-3.13.0-29    

Làm thế nào nó hoạt động

  1. Lấy danh sách các gói cài đặt thủ công. Đối với năng khiếu, các seddải bổ sung ra khoảng trắng còn lại ở cuối dòng.
  2. Lấy danh sách các gói được cài đặt ngay sau khi cài đặt mới.
  3. So sánh các tệp, chỉ xuất các dòng trong tệp 1 không có trong tệp 2.

Các khả năng khác cũng không hoạt động:

  • Sử dụng ubuntu-14.04-desktop-amd64.manifesttệp ( ở đây cho Ubuntu 14.04) thay vì /var/log/installer/initial-status.gz. Nhiều gói được hiển thị là cài đặt thủ công mặc dù chúng không phải là.
  • Sử dụng apt-mark showautothay vì /var/log/installer/initial-status.gz. apt-markví dụ không bao gồm gói xserver-xorg, trong khi tệp khác thì có.

Cả hai liệt kê nhiều gói hơn giải pháp trên.


0

Tôi thiên vị, và giải pháp tôi trình bày không phải lúc nào cũng có thể, nhưng tôi cảm thấy mệt mỏi với tình huống này. Kết quả là tôi không cài đặt bất cứ thứ gì nữa với các công cụ quản lý cập nhật / gói.

Tôi đã đi một con đường khá khó khăn (tôi có yêu cầu nghiêm ngặt cho các phiên bản). Tôi đã tạo ra một tệp thực hiện lớn để tải xuống, biên dịch và cài đặt trong thư mục chính của tôi mỗi gói (chương trình, thư viện, bất cứ thứ gì) tôi cần. Tôi đã phát triển nó từng bước, từng mảnh một. Makefile tải xuống và biên dịch mọi thứ, ngay cả các trình biên dịch.

Khi tôi chuyển sang một hệ thống mới hoặc cài đặt lại, tôi chỉ cần sao chép tệp tạo tệp (cộng với một số nội dung hỗ trợ), chạy make world và quay lại vào ngày hôm sau.

Đối với một số chương trình tôi phát triển (vì vậy tôi có quyền kiểm soát), tôi sử dụng một công cụ tôi đã lập trình, trình quản lý gói hạt dẻ . Sắp xếp các thư mục .app trên MacOSX. Mọi thứ đều nằm trong gói, vì vậy tôi biết những gì được cài đặt bất cứ lúc nào và tôi biết nó tự chứa và tự cung cấp (ngoại trừ lib hệ thống)


Bạn chỉ có thể đặt các lệnh cài đặt trình quản lý gói trong một tập lệnh và có tác dụng tương tự; giả sử rằng mã bạn cần được đóng gói. Cách tiếp cận của bạn trông rất giống với gentoo.
wcoenen

Rất vui được biết về. Có vẻ như có rất nhiều công việc phụ ngoài hệ thống Ubuntu / Debian mặc định. Tôi có thể thấy việc duy trì thủ công một số gói, nhưng duy trì tất cả chúng theo cách này là công việc nhiều hơn tôi muốn làm.
quark

Có, nhưng với vấn đề bổ sung rằng công cụ ubfox / fink / darwinports không hoạt động đa nền tảng ở mọi nơi (Tôi đã sử dụng kỹ thuật số và IBM sp4 một lần). Tôi không khẳng định đây là một cách hay để đi. Tôi chỉ nói rằng nó thực hiện công việc, mặc dù theo cách xấu xí, hôi hám và tôi kiểm soát hoàn toàn những gì diễn ra trong hệ thống của mình.
Stefano Borini

Tất nhiên, tôi có thể quyết định một trong những ngày này thực sự có một cái nhìn nghiêm túc để nổi lên và làm lại mọi thứ với nó.
Stefano Borini

Con đường này phổ biến hơn những ngày này khi bạn xem xét các công cụ như đầu bếp và con rối.
Steve Buzonas
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.