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


224

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-1ubuntu1với tất cả các phụ thuộc. Ngay cả khi có một phiên bản mới của gói này trên các máy chủ thì vẫn nên cài đặt phiên bản này.

Giải pháp phải làm việc / chia tỷ lệ 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.

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

  1. Sao chép tất cả các yêu cầu *.debvào mọi máy ảo theo cách thủ công và nhập: dpkg -i... -> Có thể hoạt động, nhưng nó rất dễ bị lỗi. (Kịch bản 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 vì tôi sẽ cần n kho.
  3. Cài đặt máy một lần và sao chép VM / tạo ảnh chụp nhanh. -> Không hoạt động vì tôi sẽ cần lưu trữ n VM.

Vấn đề của tôi có thể được gắ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ũ.

Câu trả lời:


227

Bạn có thể sử 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-gettrang hướng dẫn:

Có thể chọn phiên bản cụ thể của gói để cài đặt bằng cách theo tên gói với giá trị bằng và phiên bản của gói cần chọn. Điều này sẽ khiến phiên bản đó được định vị và chọn để cài đặt. Ngoài ra, một phân phối cụ thể có thể được chọn bằng cách làm theo tên gói bằng dấu gạch chéo và phiên bản phân phối hoặc tên Lưu trữ (ổn định, đông lạ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 tự mình thực hiện một số giải pháp phụ thuộc 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ì gây ra chúng. Trên hệ thống 11.10 của tôi, tôi cần phải làm như sau để làm việc này:

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

46
Làm thế nào để biết phiên bản nào có sẵn?
Rodrigo Gurgel

12
@Rodrigo Gurgel, "phiên bản năng khiếu apache2"
user169015

3
@ user169015 "phiên bản tồn tại"! = "phiên bản được đóng gói cho Ubuntu và có sẵn với apt"
Kyle Strand

Xin chào Kyle, tôi không nhận được bình luận của bạn, mặc dù Có, gói cũng có thể được cài đặt bằng apt. Tôi chỉ tiếp tục với năng khiếu bởi vì tôi đã sử dụng nó trong một thời gian dài ... :)
user169015

6
@ user169015 Tôi nghĩ bạn đang thiếu quan điểm bình luận của Kyle ,. Có một cái nhìn vào câu trả lời của psus bên dưới. Rõ ràng các 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ữ APT của Ubuntu nếu bạn muốn khôi phục cấu hình cũ, đã biết. Tôi đã ngạc nhiên và thất vọng khi nhận ra điều này bản thân mình. Có lẽ Arch xử lý việc này tốt hơn? ( Askubfox.com/questions/728439/NH )
tảo

66

Để 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 chạy sudo apt-get updatetrướ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 nào bạn đã cài đặt, hãy chạy:

dpkg -l 'apache2*' | grep ^i

5
Cảm ơn rất nhiều vì đã chỉ ra =2.2\*tùy chọn này như một cách để sử dụng ký tự đại diện để chọn bất kỳ lật đổ có sẵn nào. Đó là những gì tôi muốn biết nhưng không biết cách hỏi :)
aexl

3
Khi liệt kê các phiên bản bằng cách sử dụng dpkg -l <packageName>, số phiên bản đôi khi bị cắt ngắn. Để tránh điều này, hãy sử dụngCOLUMNS=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

@JlieGlick Chạy sudo apt-get updatetrước. Hãy chắc chắn rằng bạn đã cấu hình đúng nguồn Apt.
kenorb

1
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 với tôi
Braian Mellor

17

Tôi sẽ mở rộng các câu trả lời trước đó bằng các lệnh phiên bản tiện dụng khác trong aptgia đì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, cài đặt một phiên bản cụ thể với 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 policylại:

# 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ử một phiên bản mới của apache2 được thêm vào chỉ mục gói và máy của bạn được đồng bộ hóa 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.

6

Nói một cách thực tế, điều này là không thể vì các phiên bản cũ không được lưu 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 ở đâu đó, 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 một phiên bản cũ hơn ở nơi đầu tiên. Trên phiên bản ổn định, lý do chính khiến phiên bản mới được phát hành là để khắc phục 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 thương phải không?


25
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 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 phải thiết lập nhiều kho lưu trữ chỉ giữ khác biệt?
ayckoster

19
@psusi: Không chính xác là một phản ứng 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ó lỗi và để kiểm tra kỹ xem đó có phải là phiên bản cũ hơn không. Chỉ là một ví dụ.
Cookie

2
@nomen, không, nó là một bản phân phối duy nhất không sử dụng mô hình phát hành cán. Phải hết sức cẩn thận để đảm bảo rằng khi các lỗi nghiêm trọng và lỗ hổng bảo mật được sửa 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, thì hãy gửi báo cáo lỗi được gắn thẻ phát hành hồi quy và nó sẽ được sửa hoặc cuộn trở lại.
psusi

5
@nomen, nếu bạn muốn tạo ra ý 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 người khác. Đối với tất cả những người khác trên thế giới, đó không phải là một bản phát hành cuộn, và bản phát hành cuộn là hoàn toàn ngược lại, 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 phát hành cùng với bản phát hành thực sự được giữ trong túi-phát hành và các bản cập nhật sẽ chuyển sang túi -updates hoặc -securance, 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 phát hành ban đầu.
psusi

5
@psusi: Đây là một cái khác cho bạn. Unison được yêu cầu phải luôn là phiên bản giống nhau trên tất cả các máy. Tuy nhiên, vào ngày 13.10, đây là phiên bản khác so với phiên bản 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 một 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 tất cả mọi người.
Cookie

2

Như psusi giải thích, các phiên bản cũ không được lưu trong kho ubfox, nhưng rõ ràng bạn vẫn có thể tìm thấy chúng trên launchpad. Vì vậy, bạn đi đến (thay thế đáng tin cậy và amd64 bằng phiên bản và kiến ​​trúc Ubuntu của bạn):

https://launchpad.net/ubfox/trusty/amd64/apache2

và chọn phiên bản bạn mong muốn. Sau đó, bạn tải xuống deb dưới dạng tệp và cài đặt với:

dpkg -i apache2_2.4.7-1ubuntu4.20_amd64.deb

Một lần nữa, thay thế tên tệp vào tập tin của bạn. Điều này trở nên tẻ nhạt nếu bạn phải hạ cấp rất nhiều gói nhưng tốt hơn là không có gì nếu bạn tuyệt vọng.

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.