Câu hỏi Làm thế nào để cài đặt các gói Ubuntu cụ thể, với phiên bản chính xác?


Tôi muốn thiết lập một máy ảo mới với một số gói được chỉ định (tên và phiên bản), được cung cấp.

Ví dụ apache2 trong phiên bản 2.2.20-1ubuntu1 với tất cả các phụ thuộc. Thậm chí nếu có một phiên bản mới của gói này trên các máy chủ thì bạn nên cài đặt phiên bản này.

Giải pháp phải làm việc / quy mô với nhiều (n) "thiết lập". Một máy ảo khác có thể cần một phiên bản cũ hơn của apache2.

Tôi hiện đang biết một số khả năng cài đặt các gói chính xác, nhưng không quy mô tốt:

  1. Sao chép tất cả các yêu cầu *.deb cho mọi máy ảo theo cách thủ công và nhập: dpkg -i ... -> Có thể hoạt động, nhưng rất dễ xảy ra lỗi. (Tập lệnh thủ công, v.v.)
  2. Tạo và sử dụng kho lưu trữ Ubuntu mới cho mỗi thiết lập. -> Không hoạt động bởi vì tôi cần n kho.
  3. Thiết lập máy một lần và sao chép máy ảo / tạo một ảnh chụp nhanh. -> Không hoạt động vì tôi cần lưu trữ n máy ảo.

Vấn đề của tôi có thể được dán nhãn là quản lý bản vá, nhưng tôi không muốn cập nhật các gói của mình lên phiên bản hiện tại. Mục tiêu của tôi là cài đặt các gói cũ.


188
2018-01-01 20:39


gốc




Các câu trả lời:


Bạn có thể dùng apt-get để cài đặt một phiên bản cụ thể của gói miễn là nó nằm trong kho lưu trữ mà apt biết. Từ apt-get manpage:

Một phiên bản cụ thể của một gói có thể được chọn để cài đặt bằng cách làm theo tên gói với một bằng và phiên bản của gói để chọn. Điều này sẽ khiến phiên bản đó được định vị và được chọn để cài đặt. Ngoài ra, có thể chọn phân phối cụ thể bằng cách làm theo tên gói với dấu gạch chéo và phiên bản phân phối hoặc tên Lưu trữ (ổn định, cố định, không ổn định).

Ví dụ, bạn có thể làm:

sudo apt-get install apache2=2.2.20-1ubuntu1

Lưu ý rằng bạn có thể cần phải thực hiện một số giải pháp phụ thuộc của riêng bạn trong trường hợp này, nhưng nếu có bất kỳ vấn đề nào apt-get sẽ cho bạn biết điều gì đang gây ra chúng. Trên hệ thống 11.10 của tôi, tôi sẽ cần phải làm như sau để có được điều này để làm việc:

sudo apt-get install apache2=2.2.20-1ubuntu1 \
                     apache2.2-common=2.2.20-1ubuntu1 \
                     apache2.2-bin=2.2.20-1ubuntu1 \
                     apache2-mpm-worker=2.2.20-1ubuntu1

190
2018-01-01 20:57



làm cách nào để biết phiên bản nào có sẵn? - Rodrigo Gurgel
@Rodrigo Gurgel, "phiên bản aptitude apache2" - user169015
Phiên bản "user169015" tồn tại "! =" được đóng gói cho Ubuntu và có sẵn với apt" - Kyle Strand
Hi Kyle, tôi đã không nhận được bình luận của bạn, mặc dù có, gói có thể được cài đặt bằng cách sử dụng apt là tốt. Tôi chỉ gắn bó với aptitude vì tôi đã sử dụng nó trong một thời gian dài ... :) - user169015
@ user169015 Tôi nghĩ rằng bạn đang thiếu điểm của bình luận của Kyle ,. Hãy xem câu trả lời của psusi dưới đây. Rõ ràng kho lưu trữ Ubuntu APT không tiếp tục lưu trữ các phiên bản cũ của các gói! Vì vậy, không giống như các trình quản lý gói thời gian chạy (pip, gem, maven, v.v.), bạn không thể dựa vào kho lưu trữ Ubuntu APT nếu bạn muốn cấu hình lại một cấu hình cũ đã biết. Tôi đã rất ngạc nhiên và thất vọng khi nhận ra điều này. Có lẽ Arch xử lý điều này tốt hơn? ( askubuntu.com/questions/728439/… ) - algal


Để kiểm tra phiên bản nào có sẵn, bạn có thể kiểm tra qua:

sudo apt-cache madison ^apache2

Nếu không hoạt động, hãy cân nhắc việc chạy sudo apt-get update trước để cập nhật danh sách gói.

Sau đó sao chép phiên bản hoặc sử dụng cú pháp sau:

sudo apt-get install apache2=2.2\*

Để kiểm tra phiên bản bạn đã cài đặt, hãy chạy:

dpkg -l 'apache2*' | grep ^i

51
2018-04-01 12:44



Cảm ơn rất nhiều vì đã chỉ ra =2.2\* tùy chọn như một cách để sử dụng ký tự đại diện để chọn bất kỳ phiên bản phụ có sẵn nào. Đó là những gì tôi muốn biết nhưng không biết hỏi :) - aexl
Khi liệt kê các phiên bản sử dụng dpkg -l <packageName>, số phiên bản đôi khi bị cắt bớt. Để tránh điều này, hãy sử dụng COLUMNS=100 dpkg -l <packageName> - CJBS
Trên Yakkety, lệnh đầu tiên chỉ cho tôi: N: Unable to locate package ^apache2 - Jesse Glick
@JesseGlick Run sudo apt-get update Đầu tiên. Đảm bảo bạn đã định cấu hình đúng các nguồn Apt. - kenorb
N: Không thể định vị gói ^ apache2 sau khi cập nhật $ sudo apt-get nhưng sudo apt-get install apache2 = 2.2 * hoạt động cho tôi - Braian Mellor


Tôi sẽ mở rộng các câu trả lời trước đó với các lệnh versioning tiện dụng khác trong apt gia đình. Để xem phiên bản nào có sẵn, hãy chạy apt-cache policy:

# apt-cache policy apache2
apache2:
  Installed: (none)
  Candidate: 2.4.7-1ubuntu4.5
  Version table:
     2.4.10-1ubuntu1.1~ubuntu14.04.1 0
        100 http://us.archive.ubuntu.com/ubuntu/ trusty-backports/main amd64 Packages
     2.4.7-1ubuntu4.5 0
        500 http://security.ubuntu.com/ubuntu/ trusty-security/main amd64 Packages
     2.4.7-1ubuntu4 0
        500 http://us.archive.ubuntu.com/ubuntu/ trusty/main amd64 Packages

Sau đó, như đã đề cập ở nơi khác, hãy cài đặt phiên bản cụ thể apt-get:

# apt-get install apache2=2.4.7-1ubuntu4.5
...

Bây giờ bạn có thể xem phiên bản nào bạn đã cài đặt bằng cách chạy apt-cache policy lần nữa:

# apt-cache policy apache2
apache2:
  Installed: 2.4.7-1ubuntu4.5
  Candidate: 2.4.7-1ubuntu4.5
  Version table:
     2.4.10-1ubuntu1.1~ubuntu14.04.1 0
        100 http://us.archive.ubuntu.com/ubuntu/ trusty-backports/main amd64 Packages
 *** 2.4.7-1ubuntu4.5 0
        500 http://security.ubuntu.com/ubuntu/ trusty-security/main amd64 Packages
        100 /var/lib/dpkg/status
     2.4.7-1ubuntu4 0
        500 http://us.archive.ubuntu.com/ubuntu/ trusty/main amd64 Packages

Nếu bạn không muốn cài đặt các phiên bản mới hơn trên các bản cập nhật, hãy ghim gói với apt-mark:

# apt-mark hold apache2
apache2 set on hold.

Giả sử phiên bản apache2 mới được thêm vào chỉ mục gói và máy của bạn được đồng bộ hóa với apt-get update. Bạn sẽ thấy điều này khi bạn chạy tiếp theo apt-get upgrade:

# apt-get upgrade
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Calculating upgrade... Done
The following packages have been kept back:
  apache2
0 upgraded, 0 newly installed, 0 to remove and 1 not upgraded.

10
2017-07-15 17:25





Thực tế nói, điều này là không thể bởi vì các phiên bản cũ không được lưu giữ trong kho lưu trữ, vì vậy trừ khi bạn có một bản sao của phiên bản cũ nằm xung quanh một nơi nào đó, bạn không thể cài đặt nó. Bạn nên tự hỏi tại sao bạn muốn cài đặt phiên bản cũ hơn ở nơi đầu tiên. Trên một bản phát hành ổn định, lý do chính cho một phiên bản mới được phát hành là sửa một lỗ hổng bảo mật, và bạn không muốn chạy một máy chủ dễ bị tấn công phải không?


8
2018-01-02 00:33



Tôi cần điều này để tái tạo các bản sao chính xác của môi trường cũ cho các mục đích phát triển. Có thể thiết lập một máy nhân bản không xóa các phiên bản gói cũ để truy cập các gói cần thiết hay tôi cần thiết lập nhiều kho lưu trữ mà chỉ giữ các khác biệt? - ayckoster
@psusi: Không chính xác phản hồi công bằng, có thể có nhiều lý do. Trong trường hợp của tôi, phiên bản mới hơn có thể thực sự có một lỗi, và để kiểm tra lại xem trường hợp phiên bản cũ có cần thiết hay không. Chỉ là một ví dụ. - Cookie
@ nomen, không, nó là một bản phân phối duy nhất không phải sử dụng một mô hình phát hành lăn. Việc chăm sóc tuyệt vời được thực hiện để đảm bảo rằng khi các lỗi nghiêm trọng và lỗ hổng bảo mật được khắc phục trong bản phát hành ổn định, chúng không gây ra hồi quy, nhưng nếu nó xảy ra, hãy gửi báo cáo lỗi được gắn thẻ với hồi quy hồi quy và nó sẽ được cố định hoặc cuộn trở lại. - psusi
@ nomen, nếu bạn muốn tạo nên ý nghĩa của riêng bạn cho các từ bạn sẽ có một thời gian khó khăn giao tiếp với những người khác. Đối với tất cả mọi người khác trên thế giới, đó không phải là những gì một phát hành lăn, và phát hành cán là đối diện chính xác, và do đó, loại trừ lẫn nhau với bản phát hành ổn định. Và bây giờ tôi nghĩ về nó, phiên bản gốc được gửi kèm với bản phát hành thực sự được giữ trong túi, và các bản cập nhật sẽ chuyển sang túi -updates hoặc bảo mật, vì vậy trong khi bạn không thể quay lại bản cập nhật trước, bạn có thể quay lại phiên bản được phát hành ban đầu. - psusi
@psusi: Đây là một số khác cho bạn. Unison được yêu cầu phải luôn luôn là phiên bản tương tự trên tất cả các máy. Tuy nhiên, ngày 13.10 nó là một phiên bản khác với trong 12.04 LTS. Thế bây giờ thì thế nào? Khi đến một câu hỏi như thế này, nhận được câu trả lời như tại sao bạn muốn làm điều này thực sự vô cùng vô ích và lãng phí thời gian cho mọi người. - Cookie