จะป้องกันการอัพเดทแพ็คเกจเฉพาะได้อย่างไร?


374

เนื่องจากข้อผิดพลาด # 693758ฉันต้องการป้องกันapt-get upgradeและ Update Manager จากการอัปเดตแพคเกจ "libgtk2.0-0"

สิ่งนี้จะสำเร็จได้อย่างไร


@ hhlp: แต่คำถามนี้ถามเกี่ยวกับแพคเกจที่ไม่เคยติดตั้ง
Nathan Osman

1
@Gorge Edison - นอกจากนี้ยังมีแพคเกจการถือครองซึ่งช่วยให้คุณไม่ได้อัปเดตแพคเกจ ดังนั้นการถือแพคเกจโดยทั่วไปหมายความว่าคุณกำลังบอกให้ผู้จัดการแพ็คเกจเก็บเวอร์ชันปัจจุบันเอาไว้ไม่ว่าอะไรจะเกิดขึ้น สิ่งนี้มีประโยชน์หากโปรแกรมรุ่นล่าสุดที่ทำงานอยู่ในปัจจุบันหยุดทำงานหลังจากการอัพเดท (คุณไม่สามารถถือแพคเกจที่ไม่เคยติดตั้งและเห็นคำถามของฉันเหมือนกัน) .... ฉันทดสอบในตอนนี้ - ดูเขาพูดdisable packages from the auto-update
hhlp

คำตอบ:


554

โฮลดิ้ง

มีสี่วิธีในการหยุดหีบห่อแพ็คเกจ: ด้วย dpkg, apt, aptitude หรือ dselect

dpkg

พักบรรจุภัณฑ์:

echo "<package-name> hold" | sudo dpkg --set-selections

ยกเลิกการระงับ:

echo "<package-name> install" | sudo dpkg --set-selections

แสดงสถานะของแพ็คเกจของคุณ:

dpkg --get-selections

แสดงสถานะของแพ็คเกจเดียว:

dpkg --get-selections | grep "<package-name>"

ฉลาด

ถือแพคเกจ:

sudo apt-mark hold <package-name>

ยกเลิกการระงับ:

sudo apt-mark unhold <package-name>

แสดงแพ็คเกจทั้งหมดที่ถูกระงับ:

sudo apt-mark showhold

dselect

ด้วย dselect ป้อน [S] หน้าจอเลือกตั้งพบแพคเกจที่คุณต้องการที่จะยึดมั่นในสถานะปัจจุบันและกดหรือ= Hการเปลี่ยนแปลงจะมีผลทันทีหลังจากออกจากหน้าจอเลือก [S]


วิธีการต่อไปนี้มีข้อ จำกัด ในการล็อค / บรรจุหีบห่อภายในความถนัดหรือ synaptic ไม่มีผลต่อ apt-get / apt

ความถนัด

ถือแพคเกจ:

sudo aptitude hold <package-name>

ยกเลิกการระงับ:

sudo aptitude unhold <package-name>

การล็อกด้วย Synaptic Package Manager

ไปที่Synaptic Package Manager (ระบบ> การดูแลระบบ> Synaptic Package Manager)

คลิกปุ่มค้นหาและพิมพ์ชื่อแพ็คเกจ

เมื่อคุณพบแพคเกจให้เลือกและไปที่แพคเกจเมนูและเลือกล็อครุ่น

เมนู Synaptic

แพ็คเกจดังกล่าวจะไม่ปรากฏในตัวจัดการอัปเดตและจะไม่ได้รับการอัปเดต


4
สิ่งนี้ยังทำงานเพื่อป้องกันไม่ให้มีการติดตั้งแพคเกจ เมื่อทำการติดตั้งdevscriptsแพคเกจจำนวนมากจะถูกดึงเป็นแพ็คเกจที่แนะนำ ขณะที่ผมไม่จำเป็นต้องมี MailServer (postfix) ผมสามารถปิดการใช้งานการติดตั้งของมันโดยการทำงานก่อนที่จะใช้echo postfix hold | sudo dpkg --set-selections sudo apt-get install devscriptsการดำเนินการพักนี้ยังคงมีอยู่สำหรับการติดตั้งนี้หลังจากการติดตั้งการเลือกจะถูกรีเซ็ต
Lekensteyn

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

2
เพียงแค่ทราบ: apt-markไม่รองรับholdในเวอร์ชั่น 0.7.25 (Ubuntu Lucid)
Joril

1
สิ่งนี้มีประโยชน์อย่างยิ่งเมื่อพยายามหยุดไดรเวอร์กราฟิก สำหรับผู้ใช้ apt-mark hold fglrx fglrx-amdcccle fglrx-dev && aptitude hold fglrx fglrx-amdcccle fglrx-devATI,
earthmeLon

8
ในปัจจุบัน synaptic และความถนัดเท่านั้นล็อคแพคเกจภายในโปรแกรมเหล่านั้น "สิ่งอื่นใดที่ทำให้การอัพเกรดแพ็คเกจ (อ่าน: Update Manager, apt-get, aptitude, ฯลฯ ) ไม่สนใจสิ่งนี้" จากคำถามนี้
holocronweaver

44

หากต้องการพักแพคเกจ "foo" ไว้:

echo "foo hold" | dpkg --set-selections

ในกรณีของคุณเราจะหยุดไวน์ไว้:

sudo -i
echo "wine hold" | dpkg --set-selections

หากต้องการยกเลิกการระงับ:

sudo -i
echo "wine install" | dpkg --set-selections

นอกจากนี้ยังทราบว่าในขณะที่แพคเกจถูกระงับคุณสามารถapt-get install wine=1.2.3ติดตั้งรุ่นที่เฉพาะเจาะจงผ่าน การพักสายป้องกันไม่ให้apt-get (dist-)upgradeเปลี่ยนแปลง
rcoup

@rcoup หากคุณมีการระงับเวอร์ชันเก่าและจากนั้นคุณอัปเกรดเป็นเวอร์ชันใหม่ด้วยตนเองโดยไม่ลบการพักตามที่คุณอธิบายไว้เวอร์ชันเก่าจะถูกเก็บไว้ในแคชเพื่อให้คุณสามารถกลับไปใช้ใหม่ได้หรือไม่
cxrodgers

1
@cxrodgers แคชในตัวเครื่อง (โดยทั่วไป/var/cache/apt/archives) ไม่ขึ้นกับการพัก & อัปเกรด & เนื้อหาดังนั้นเวอร์ชันทั้งหมดที่คุณดาวน์โหลดจะอยู่ที่นั่นจนกว่าคุณจะทำงานapt-get [auto]clean
rcoup

35

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

แพคเกจ: compiz-plugins-main
Pin: รุ่น 1: 0.9.7.0 ~ bzr19-0ubuntu10.1
ลำดับความสำคัญพิน: -1

สิ่งนี้จะเข้าสู่ไฟล์ / etc / apt / preferences


9
นี่เป็นวิธีที่ดีกว่าการป้องกันการอัปเดตอย่างไม่มีกำหนด
Eero Aaltonen

ด้วยวิธีการนี้ผมคิดว่าโอกาสที่ใหญ่กว่าเพื่อป้องกันไม่ให้อูบุนตู 'แอดแวร์' เหมือนอูบุนตูหนึ่งหรือไอคอน Amazon จากการติดตั้งอัพเกรดรุ่นถัดไป ...
แดเนียลออลเด้อ

19

ติดตั้งโดยใช้synapticsudo apt-get install synaptic

เรียกใช้โดยใช้gksudo synapticและในช่องค้นหาค้นหาแพ็คเกจที่คุณต้องการล็อคเช่น:gedit

ป้อนคำอธิบายรูปภาพที่นี่

จากเมนูแพ็คเกจเลือกล็อคเวอร์ชัน :

ป้อนคำอธิบายรูปภาพที่นี่

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


7
โปรดดูที่ "รุ่นล็อคไม่ได้ฉลาดเท่าที่ควรจะทำในสิ่งที่มันพูดบนกระป๋องล็อครุ่น ... แต่มันล็อคเฉพาะภายใน Synaptic สิ่งอื่นใดที่อัพเกรดแพ็คเกจ (อ่าน: Update Manager apt-get, aptitude และอื่น ๆ ) ไม่สนใจสิ่งนี้ซึ่งอาจเป็นพฤติกรรมที่บั๊กกี้ดังนั้นฉันคาดว่าจะได้รับการแก้ไขในเวลาต่อไป " จากaskubuntu.com/questions/9607/what-does-lock-version-do สถานะปัจจุบันคืออะไร หากบางสิ่งถูกล็อคใน Synaptic ผู้จัดการแพคเกจอื่นจะ "ให้เกียรติ" ล็อคหรือไม่

2
vasa1: ตั้งแต่เวอร์ชัน 0.75.13 ยังไม่มี :( ปัญหาเดียวกันกับความถนัด
syockit

16

การป้องกันไม่ให้มีการติดตั้งแพคเกจเรียกว่า "การถือแพ็คเกจ" และมันง่ายมากที่จะทำ:

echo package_name hold | dpkg - ชุดตัวเลือก

... โดยที่ * package_name * เป็นชื่อของแพ็คเกจที่คุณต้องการป้องกันไม่ให้ติดตั้ง

หมายเหตุ:คำสั่งดังกล่าวจะใช้สิทธิ์ของรูท คุณอาจต้องพิมพ์sudo suก่อนเรียกใช้


สมบูรณ์แบบนี่คือคำตอบ ขอขอบคุณ.
asoundmove

s/sudo su/sudo -s/g(หรือsudo -i) ( -iจะให้เปลือกเข้าสู่ระบบ-sจะไม่)
derobert

6

เนื่องจากบางครั้งapt-getถูกแทนที่ด้วยaptดังนั้นตัวอย่างเช่นฉันต้องการป้องกัน Firefox ไม่ให้อัปเดตเป็นรุ่นที่สูงกว่า 56 เนื่องจากมี Add-on จำนวนมากเช่น"กลุ่มแท็บ"ไม่ทำงานกับ Firefox 57 ใหม่อีกต่อไป (ดู "WebExtensions" อัปเดต ")

เป็นไปได้ที่จะเก็บมากกว่าหนึ่งแพ็กเกจด้วยคำสั่งเดียวและใช้สัญลักษณ์แทน

ป้องกันไม่ให้ Firefox อัปเดต

sudo apt-mark hold firefox firefox-locale-*

หากคุณควรที่จะเปิดเผยพวกเขาในภายหลังนั่นคือคำสั่ง:

sudo apt-mark unhold firefox firefox-locale-*

4

ฉัน synaptic คุณสามารถตรึงรุ่นของแพคเกจเฉพาะฉันไม่แน่ใจ 100% ว่าจะแก้ไข apt-get แต่มันจะหยุดตัวจัดการการปรับปรุงแน่นอน

ในการตรึงแพคเกจให้เลือกใน synaptic จากนั้นเปิดเมนูแพ็คเกจและเลือกเวอร์ชันค้าง

หวังว่านี่จะช่วยได้

แก้ไข: คำถามนี้16668เกี่ยวข้องกับสถานการณ์ที่คล้ายกัน



3

ดูข้อบกพร่อง# 75332 , # 158981และ# 72806

สรุปคือการระงับที่ระดับ apt-get / aptitude ไม่ได้เรียกสถานะการพักใน dpkg (ดูที่ bug 72806 โดยเฉพาะ) และ update-manager อ่านสถานะจาก dpkg

การแก้ปัญหาชั่วคราวจะเรียกใช้เป็นราก: echo "package hold" | dpkg --set-selections


2

คุณสามารถใช้ความสามารถเฉพาะ "แทนที่เฉพาะ" เช่นนี้:

aptitude reinstall ~i oracle-java8-jre:

นี่เป็นเพียงการใช้ครั้งเดียวเท่านั้น (ไม่ได้เก็บไว้สำหรับการติดตั้งในอนาคต), แทนที่เฉพาะเพื่อติดตั้งแพ็กเกจทั้งหมดในระบบของคุณ แต่ไม่ใช่ oracle-java8-jre

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

สิ่งที่ดีมากถ้าคุณคิดว่าระบบของคุณถูกบุกรุก


1

หากคุณติดตั้ง Synaptic คุณสามารถเลือกแพ็คเกจและใช้เมนูแพ็คเกจ -> ล็อคเวอร์ชันเพื่อป้องกันไม่ให้อัปเดต

คุณสามารถติดตั้ง Synaptic ด้วย sudo apt-get install synaptic ฉันพบว่ามันมีประโยชน์มากกว่าศูนย์ซอฟต์แวร์ ... จากนั้นอีกครั้งฉันเป็นโรงเรียนค่อนข้างเก่า :)


0

บางครั้งอาจต้องการเก็บแพคเกจทั้งหมดที่ติดตั้งอยู่ในปัจจุบัน นี่คือวิธี

ก่อนอื่นให้บันทึกสถานะปัจจุบันเพื่อให้คุณสามารถยกเลิก:

dpkg --get-selections > current_selections.txt

จากนั้นให้ระงับแพ็คเกจทั้งหมด:

dpkg --get-selections | sed -r "s/\tinstall/hold/" |dpkg --set-selections

ในที่สุดเมื่อคุณต้องการเปลี่ยนกลับเป็นสถานะก่อนหน้า:

dpkg --set-selections < current_selections.txt

กรณีการใช้งานหนึ่งกรณีนี้อาจเกิดขึ้นเมื่อสร้าง VM หรือ Amazon AMI snapshot เพื่อโอนย้ายจาก QA ไปยังสภาพแวดล้อมการผลิต


0

การเพิ่มรายละเอียดไปยังความคิดเห็นของ@ sogerที่เกี่ยวข้องกับ Ubuntu 16.04

Ubuntu 16.04 ไม่มีไฟล์ / etc / apt / preferences ที่มีอยู่ตามค่าเริ่มต้น หากคุณยังไม่มีในตอนนี้เพียงแค่สร้างไฟล์ใหม่และเติมด้วย stanza ตามที่ @soger อธิบายด้านบนเพื่อไม่รวมแพ็กเกจที่กำหนดและการอ้างอิงจากการอัพเดต

หลังจากนั้นวิ่งapt updateและคุณเป็น GTG : 0)

ตัวอย่างเช่นฉันมีเซิร์ฟเวอร์ Ubuntu 16.04.5 LTS พร้อมการ์ดแสดงผล Intel และการ์ด NVidia การ์ด NVidia เป็นการ์ดเดียวที่ใช้ เซิร์ฟเวอร์ยังใช้ไดรเวอร์ CUDA ฉันมีปัญหาที่aptยังคงยืนยัน

va ไดรเวอร์ทั้งหมด

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

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