จะติดตั้งแพคเกจ Ubuntu เฉพาะกับรุ่นที่แน่นอนได้อย่างไร


224

ฉันต้องการตั้งค่าเครื่องเสมือนใหม่ด้วยแพคเกจที่ระบุ (ชื่อและรุ่น) ที่ระบุ

ตัวอย่างเช่น apache2 ในรุ่นที่2.2.20-1ubuntu1มีการอ้างอิงทั้งหมด แม้ว่าจะมีแพ็คเกจใหม่ในเซิร์ฟเวอร์นี้ควรติดตั้งรุ่นนี้

การแก้ปัญหาต้องทำงาน / ปรับขนาดด้วย "การตั้งค่า" หลายรายการ เครื่องเสมือนอื่นอาจต้องการ apache2 รุ่นเก่ากว่า

ปัจจุบันฉันรู้ถึงความเป็นไปได้บางอย่างที่ติดตั้งแพ็คเกจที่แน่นอน แต่ไม่ได้ปรับขนาดที่ดี:

  1. คัดลอกทั้งหมดที่ต้องการ*.debไปยังเครื่องเสมือนทุกเครื่องด้วยตนเองและป้อน: dpkg -i... -> สามารถใช้งานได้ แต่มีข้อผิดพลาดเกิดขึ้นได้ง่ายมาก (สคริปต์แบบแมนนวล ฯลฯ )
  2. สร้างและใช้ที่เก็บ Ubuntu ใหม่สำหรับการตั้งค่าแต่ละครั้ง -> ไม่ทำงานเพราะฉันต้องการที่เก็บ n รายการ
  3. ติดตั้งเครื่องหนึ่งครั้งและคัดลอก VM / สร้างสแน็ปช็อต -> ไม่ทำงานเพราะฉันจะต้องเก็บ n VMs

ปัญหาของฉันอาจระบุว่าเป็นการจัดการแก้ไข แต่ฉันไม่ต้องการอัปเดตแพ็คเกจเป็นเวอร์ชันปัจจุบัน เป้าหมายของฉันคือการติดตั้งแพ็คเกจเก่า

คำตอบ:


227

คุณสามารถใช้apt-getเพื่อติดตั้งแพคเกจเวอร์ชันเฉพาะได้ตราบใดที่มันอยู่ในไฟล์เก็บถาวรที่ apt รู้ได้ดี จากapt-getmanpage:

สามารถเลือกเวอร์ชันของแพ็กเกจเฉพาะสำหรับการติดตั้งโดยทำตามชื่อแพ็กเกจที่มีค่าเท่ากับและเวอร์ชันของแพ็กเกจที่เลือก นี่จะทำให้รุ่นนั้นอยู่และถูกเลือกเพื่อติดตั้ง อีกทางเลือกหนึ่งการกระจายที่เฉพาะเจาะจงสามารถเลือกได้โดยทำตามชื่อแพคเกจด้วยเครื่องหมายทับและรุ่นของการกระจายหรือชื่อที่เก็บถาวร (เสถียรแช่แข็งไม่เสถียร)

ตัวอย่างเช่นคุณสามารถทำได้:

sudo apt-get install apache2=2.2.20-1ubuntu1

โปรดทราบว่าคุณอาจจำเป็นต้องทำการแก้ปัญหาบางอย่างด้วยตัวคุณเองในกรณีนี้ แต่หากมีปัญหาใด ๆ apt-get จะแจ้งให้คุณทราบว่าอะไรเป็นสาเหตุของปัญหา ในระบบ 11.10 ของฉันฉันต้องทำสิ่งต่อไปนี้เพื่อให้มันใช้งานได้:

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
จะทราบได้อย่างไรว่ามีรุ่นใดบ้าง
Rodrigo Gurgel

12
@Rodrigo Gurgel, "aptitude versions apache2"
169015

3
@ user169015 "version เดิม"! = "เวอร์ชั่นได้รับการบรรจุสำหรับ Ubuntu และสามารถใช้ได้กับapt"
Kyle Strand

สวัสดีไคล์ฉันไม่ได้รับความคิดเห็นของคุณแม้ว่าใช่แพคเกจสามารถติดตั้งโดยใช้ฉลาดเช่นกัน ฉันใช้ความถนัดเพราะฉันใช้มันมานานแล้ว ... :)
user169015

6
@ user169015 ฉันคิดว่าคุณขาดความคิดเห็นของ Kyle, ดูคำตอบของ psusi ด้านล่าง เห็นได้ชัดว่าที่เก็บ Ubuntu APT ไม่ได้เป็นโฮสต์ของแพ็คเกจเก่า! ซึ่งแตกต่างจากตัวจัดการแพ็คเกจรันไทม์ (pip, gem, maven, ฯลฯ ) คุณไม่สามารถพึ่งพาที่เก็บ Ubuntu APT ได้หากคุณต้องการสร้างการกำหนดค่าแบบเก่าที่รู้จักกันดี ฉันรู้สึกประหลาดใจและผิดหวังที่รู้ตัวเอง บางที Arch จะจัดการกับสิ่งนี้ได้ดีกว่ากัน? ( askubuntu.com/questions/728439/… )
algal

66

หากต้องการตรวจสอบว่ามีเวอร์ชันใดให้บ้างคุณสามารถตรวจสอบผ่าน:

sudo apt-cache madison ^apache2

หากใช้งานไม่ได้ให้ลองเรียกใช้sudo apt-get updateก่อนที่จะอัปเดตรายการแพคเกจ

จากนั้นคัดลอกเวอร์ชันหรือใช้ไวยากรณ์ต่อไปนี้:

sudo apt-get install apache2=2.2\*

หากต้องการตรวจสอบเวอร์ชันที่คุณติดตั้งให้เรียกใช้:

dpkg -l 'apache2*' | grep ^i

5
ขอบคุณมากที่ชี้ให้เห็น=2.2\*ตัวเลือกเป็นวิธีการใช้ไวด์การ์ดในการเลือกการโค่นล้มที่มีอยู่ thats สิ่งที่ฉันอยากจะรู้ แต่ไม่ทราบวิธีการขอ :)
aexl

3
เมื่อรายการรุ่นที่ใช้dpkg -l <packageName>บางครั้งหมายเลขรุ่นจะถูกตัดทอน เพื่อหลีกเลี่ยงปัญหานี้ให้ใช้COLUMNS=100 dpkg -l <packageName>
CJBS

ใน Yakkety คำสั่งแรกให้ฉัน:N: Unable to locate package ^apache2
Jesse Glick

@JesseGlick เรียกใช้sudo apt-get updateก่อน ตรวจสอบให้แน่ใจว่าคุณกำหนดค่าแหล่งข้อมูล Apt ที่ถูกต้อง
kenorb

1
N: ไม่สามารถหาแพคเกจ ^ apache2 หลังจาก $ sudo apt-get ปรับปรุง แต่ sudo apt-get install apache2 = 2.2 * ทำงานสำหรับฉัน
Braian เมลเลอร์

17

ฉันจะขยายคำตอบก่อนหน้านี้ด้วยคำสั่งการกำหนดเวอร์ชันที่มีประโยชน์อื่น ๆ ในaptตระกูล หากต้องการดูว่ามีรุ่นใดให้เรียกใช้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

จากนั้นตามที่กล่าวไว้ในที่อื่นให้ติดตั้งเวอร์ชันที่ระบุด้วยapt-get:

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

ตอนนี้คุณสามารถดูเวอร์ชันที่คุณติดตั้งโดยเรียกใช้apt-cache policyอีกครั้ง:

# 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

หากคุณไม่ต้องการให้ติดตั้งรุ่นที่ใหม่กว่าในการอัปเดตให้ปักหมุดแพ็กเกจด้วยapt-mark:

# apt-mark hold apache2
apache2 set on hold.

สมมติว่าเป็นรุ่นใหม่ของ apache2 apt-get updateจะถูกเพิ่มดัชนีแพคเกจและเครื่องของคุณซิงค์กับ คุณจะเห็นสิ่งนี้เมื่อคุณเรียกใช้ครั้งต่อไป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

ในทางปฏิบัติไม่สามารถทำได้เนื่องจากเวอร์ชันเก่าไม่ได้ถูกเก็บไว้ในที่เก็บถาวรดังนั้นหากคุณไม่มีสำเนาของเวอร์ชันเก่าวางอยู่ที่ไหนสักแห่งคุณไม่สามารถติดตั้งได้ คุณควรถามตัวเองว่าทำไมคุณถึงต้องการติดตั้งเวอร์ชั่นเก่ากว่าในตอนแรก ในรุ่นที่เสถียรเหตุผลหลักสำหรับรุ่นใหม่ที่วางจำหน่ายคือการแก้ไขช่องโหว่ด้านความปลอดภัยและคุณไม่ต้องการใช้เซิร์ฟเวอร์ที่มีช่องโหว่หรือไม่


25
ฉันต้องการสิ่งนี้เพื่อทำซ้ำสำเนาที่แน่นอนของสภาพแวดล้อมเก่าเพื่อการพัฒนา เป็นไปได้หรือไม่ที่จะติดตั้งมิเรอร์ที่ไม่ได้ลบแพ็คเกจเก่า ๆ เพื่อเข้าถึงแพ็คเกจที่ต้องการหรือฉันต้องติดตั้งหลาย ๆ repository ที่มีความแตกต่างกันเท่านั้น?
ayckoster

19
@psusi: ไม่ใช่คำตอบที่ยุติธรรม แต่อาจมีหลายเหตุผล ในกรณีของฉันเวอร์ชันใหม่กว่าอาจมีข้อบกพร่องจริง ๆ และตรวจสอบอีกครั้งว่าเป็นกรณีที่จำเป็นต้องใช้รุ่นเก่ากว่า เป็นเพียงตัวอย่าง
Cookie

2
@nomen, ไม่ใช่, มันเป็น distro เดียวที่ไม่ได้ใช้แบบจำลองการหมุน มีการดูแลอย่างดีเยี่ยมเพื่อให้แน่ใจว่าเมื่อข้อบกพร่องที่สำคัญและช่องโหว่ด้านความปลอดภัยได้รับการแก้ไขในการเปิดตัวแบบคงที่พวกเขาจะไม่ทำให้เกิดการถดถอย แต่ถ้าเกิดขึ้นให้ยื่นรายงานข้อผิดพลาดที่ติดแท็กด้วยการปล่อยการถดถอย กลับ.
psusi

5
@nomen ถ้าคุณต้องการสร้างความหมายของตัวเองสำหรับคำคุณจะมีเวลาสื่อสารกับผู้อื่นได้ยาก สำหรับคนอื่น ๆ ในโลกนั่นไม่ใช่สิ่งที่จะเกิดขึ้นได้และการเปิดตัวในครั้งนี้เป็นสิ่งที่ตรงกันข้ามดังนั้นจึงไม่เกิดร่วมกันกับการปล่อยที่มั่นคง และตอนนี้ฉันคิดว่ามันเวอร์ชันดั้งเดิมที่จัดส่งพร้อมกับรีลีสนั้นจะถูกเก็บไว้ในกระเป๋า -release และการอัปเดตจะไปที่ -updates หรือ -security pocket ดังนั้นในขณะที่คุณไม่สามารถกลับไปอัปเดตก่อนหน้าได้ สามารถกลับไปใช้รุ่นที่วางจำหน่ายเดิม
psusi

5
@psusi: นี่คืออีกหนึ่งสำหรับคุณ พร้อมเพรียงกันจะต้องเป็นรุ่นเดียวกันทุกเครื่อง แต่ในวันที่ 13.10 มันเป็นเวอร์ชั่นที่แตกต่างจาก 12.04 LTS ตอนนี้คืออะไร เมื่อมาถึงคำถามเช่นนี้การได้รับคำตอบเช่นนี้ทำไมคุณถึงต้องการทำสิ่งนี้อย่างไม่น่าเชื่อจริงๆและเสียเวลาสำหรับทุกคน
คุกกี้

2

ดังที่ psusi อธิบายว่าเวอร์ชันเก่าจะไม่ถูกเก็บไว้ในที่เก็บ ubuntu แต่เห็นได้ชัดว่าคุณยังสามารถค้นหาได้บน launchpad ดังนั้นคุณไปที่ (แทนที่ trusty และ amd64 ด้วยเวอร์ชั่น ubuntu และสถาปัตยกรรมของคุณ):

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

และเลือกรุ่นที่คุณต้องการ จากนั้นคุณดาวน์โหลด deb เป็นไฟล์และติดตั้งด้วย:

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

ให้เปลี่ยนชื่อไฟล์เป็นไฟล์ของคุณอีกครั้ง สิ่งนี้น่าเบื่อถ้าคุณต้องดาวน์เกรดแพ็คเกจจำนวนมาก แต่มันก็ดีกว่าไม่มีอะไรเลยถ้าคุณหมดหวัง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.