วิธีลบ deb โดยไม่ลบการอ้างอิง


43

ฉันต้องการติดตั้งbotoเวอร์ชันล่าสุดซึ่งฉันทำผ่านpython setup.py install

แต่เมื่อฉันพยายามลบเวอร์ชันเก่าแพ็คเกจต่อไปนี้ก็ถูกลบด้วย:

apt-get remove python-boto
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following packages will be REMOVED:
  cloud-init cloud-utils euca2ools python-boto

ฉันจะบอกผู้จัดการแพคเกจเพื่อลบ boto และพวกเขาทำเครื่องหมายว่าติดตั้งภายนอก (หรืออะไรทำนองนั้น) เพื่อที่ apt จะไม่พยายามแก้ไขการพึ่งพาที่หายไป?

ขอบคุณ
Maxim


คุณได้ลอง <code> sudo dpkg --remove python-boto </code> แล้วหรือยัง
dkuntz2

คำตอบ:


16

คุณสามารถสร้างแพคเกจ dummy .deb โดยใช้equivsยูทิลิตี้มันจะให้การพึ่งพาโดยไม่ต้องติดตั้งไฟล์ใด ๆ dpkg -i fake.debจากนั้นเพียงแค่เปลี่ยนแพคเกจติดตั้งในปัจจุบันให้เป็นรุ่นหุ่นใช้


60

ใช้ dpkg โดยตรงไม่ใช่ apt-get หรือ aptitude:

sudo dpkg -r --force-depends "packagename-version"

1
ถูกต้อง แต่เมื่อฉันจะพยายามใช้ apt เพื่อติดตั้งบางอย่างมันจะตรวจพบว่าแพ็คเกจที่ฉันลบด้วย dpkg หายไปและจะติดตั้งใหม่ คำถามฉันจะทำให้ apt ไม่ต้องการติดตั้งใหม่ / เพิกเฉยต่อความมั่นคงได้อย่างไร
Maxim Veksler

15

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

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

อย่างที่คุณเห็นในกรณีของฉันมันคือ zabbix ที่ฉันต้องการลบ:

uman@mango:~$ sudo aptitude purge zabbix-server-mysql zabbix-frontend-php
The following packages will be REMOVED:  
  apache2{u} dbconfig-common{u} fping{u} javascript-common{u} libhtml-template-perl{u} libiksemel3{u} libjs-prototype{u} 
  libjs-scriptaculous{u} libopenipmi0{u} libt1-5{u} mysql-server{u} mysql-server-5.1{u} mysql-server-core-5.1{u} php5{u} php5-gd{u} 
  php5-mysql{u} snmpd{u} wwwconfig-common{u} zabbix-frontend-php{p} zabbix-server-mysql{p} 
0 packages upgraded, 0 newly installed, 20 to remove and 0 not upgraded.
Need to get 0 B of archives. After unpacking 44.9 MB will be freed.
Do you want to continue? [Y/n/?]

และถ้าเรามองหาแพ็คเกจ apache มันก็จะเป็นแบบนี้

uman@mango:~$ aptitude search ^apache2
i A apache2        - Apache HTTP Server metapackage
<snip>

การตั้งค่าสถานะแรก "i" บอกเราว่ามีการติดตั้ง apache การตั้ง
ค่าสถานะถัดไป "A" หมายถึงการติดตั้งโดยอัตโนมัติ

ดังนั้นเพื่อที่จะแก้ไขปัญหานี้และไม่ต้องถอนการติดตั้ง apache, mysql และ php เราสามารถลบการตั้งค่าสถานะอัตโนมัติด้วยความถนัดเช่นนี้:

uman@mango:~$ sudo aptitude unmarkauto apache2 mysql-server php5
No packages will be installed, upgraded, or removed.
0 packages upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
Need to get 0 B of archives. After unpacking 0 B will be used.

ตอนนี้ดูเหมือนว่าเมื่อลบแพ็คเกจ zabbix:

uman@mango:~$ sudo aptitude purge zabbix-server-mysql zabbix-frontend-php
The following packages will be REMOVED:  
  dbconfig-common{u} fping{u} javascript-common{u} libiksemel3{u} libjs-prototype{u} libjs-scriptaculous{u} libopenipmi0{u} libt1-5{u} 
  php5-gd{u} wwwconfig-common{u} zabbix-frontend-php{p} zabbix-server-mysql{p} 
0 packages upgraded, 0 newly installed, 12 to remove and 0 not upgraded.
Need to get 0 B of archives. After unpacking 16.6 MB will be freed.
Do you want to continue? [Y/n/?] 

โปรดตรวจสอบหน้า man สำหรับความถนัดเพื่อดูรายละเอียดเพิ่มเติม


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

13

นั่นคือสิ่งที่apt-mark holdมีไว้เพื่อ

apt-mark hold package_name

จากเอกสาร:

hold ถูกใช้เพื่อทำเครื่องหมายแพ็กเกจว่าถูกพักไว้ซึ่งจะป้องกันไม่ให้แพ็กเกจถูกติดตั้งอัพเกรดหรือลบโดยอัตโนมัติ คำสั่งเป็นเพียง wrapper รอบ ๆ dpkg --set-selections และสถานะจึงเป็น

หากต้องการเปิดเผยแพ็คเกจ:

apt-mark unhold package_name


1
สำหรับสถานการณ์ของฉันนี่เป็นวิธีที่แนะนำ
เปาโล Coghi

1
น่าเสียดายที่สิ่งนี้ไม่สามารถระงับการพึ่งพาได้ นั่นคือถ้าฉันติดตั้งแพ็กเกจ A และ B และพวกเขาแบ่งปันการพึ่งพา X ร่วมกันการถือ A จะไม่ถือ X และการลบ B จะล้มเหลวด้วย "E: ข้อผิดพลาด pkgProblemResolver :: แก้ไขการแบ่งที่สร้างขึ้นซึ่งอาจเกิดจากแพ็คเกจที่ถืออยู่"
MSalters

ฉันเพิ่งได้รับข้อผิดพลาดเมื่อพยายามทำเช่นนี้: The following packages have unmet dependencies: mysql-server-5.7 : Depends: apparmor (>= 2.10) but it is not going to be installed E: Error, pkgProblemResolver::Resolve generated breaks, this may be caused by held packages.
frogstarr78

3

AFAIK ไม่มีทางที่จะลบแพ็กเกจโดยใช้ APT โดยไม่ต้องลบแพ็กเกจเหล่านั้นที่ขึ้นอยู่กับมันด้วย

การอ้างอิง: http://www.debian.org/doc/manuals/apt-howto/ch-apt-get.en.html


ไม่นี่เป็นหนึ่งในหลาย ๆ วัตถุประสงค์สำหรับแพคเกจเมตา
RobotHumans

0

เพื่อให้คำตอบของJoão Pinto สมบูรณ์คุณสามารถใช้สคริปต์เล็ก ๆ ของฉันเพื่อแก้ไขแพ็คเกจที่เสียหายสคริปต์นี้จะสร้างแพ็คเกจจำลองด้วย equiv และติดตั้ง คุณสามารถค้นหาบทความในบล็อกของฉันในฝรั่งเศส

หรือโดยตรงบนรหัสสรุปสาระสำคัญ

วิธีใช้:

$ ./gen-dummy-package.sh --install|i [packageName]+
# e.g. :
$ ./gen-dummy-package.sh -i rfkill nome-bluetooth bluez
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.