“ dist-upgrade” คืออะไรและทำไมมันถึงอัพเกรดมากกว่า“ upgrade”?


395

ฉันสงสัยว่าทำไมupgradeบางครั้งไม่ต้องการอัพเกรดบางส่วนของระบบในขณะที่dist-upgradeทำ นี่คือตัวอย่างหลังจากทำงานapt-get upgrade:

apt-get upgrade:

rimmer@rimmer-Lenovo-IdeaPad-S10-2:~$ sudo apt-get upgrade
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following packages have been kept back:
  linux-generic linux-headers-generic linux-image-generic
0 upgraded, 0 newly installed, 0 to remove and 3 not upgraded.

กับapt-get dist-upgrade:

rimmer@rimmer-Lenovo-IdeaPad-S10-2:~$ sudo apt-get dist-upgrade
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Calculating upgrade... Done
The following NEW packages will be installed:
  linux-headers-3.0.0-13 linux-headers-3.0.0-13-generic
  linux-image-3.0.0-13-generic
The following packages will be upgraded:
  linux-generic linux-headers-generic linux-image-generic
3 upgraded, 3 newly installed, 0 to remove and 0 not upgraded.
Need to get 48.5 MB of archives.
After this operation, 215 MB of additional disk space will be used.
Do you want to continue [Y/n]?

ในคำอื่น ๆ ทำไมไม่สามารถนี้จะดำเนินการโดยupgrade?

คำตอบ:


327

จากapt-getคู่มือ :

upgrade
   upgrade is used to install the newest versions of all packages
   currently installed on the system from the sources enumerated in
   /etc/apt/sources.list. Packages currently installed with new
   versions available are retrieved and upgraded; under no
   circumstances are currently installed packages removed, or packages
   not already installed retrieved and installed. New versions of
   currently installed packages that cannot be upgraded without
   changing the install status of another package will be left at
   their current version. An update must be performed first so that
   apt-get knows that new versions of packages are available.

dist-upgrade
   dist-upgrade in addition to performing the function of upgrade,
   also intelligently handles changing dependencies with new versions
   of packages; apt-get has a "smart" conflict resolution system, and
   it will attempt to upgrade the most important packages at the
   expense of less important ones if necessary. So, dist-upgrade
   command may remove some packages. The /etc/apt/sources.list file
   contains a list of locations from which to retrieve desired package
   files. See also apt_preferences(5) for a mechanism for overriding
   the general settings for individual packages.

และด้วยaptเครื่องมือใหม่ที่มีให้ตั้งแต่ 14.04 เป็นต้นไป:

full-upgrade
   full-upgrade performs the function of upgrade but may also remove
   installed packages if that is required in order to resolve a
   package conflict.

โดยเฉพาะในกรณีของคุณผมเห็นเช่นว่าlinux-headersเป็นแพคเกจเสมือนที่ให้บริการโดยทั้งสองlinux-headers-3.0.0-12และlinux-headers-3.0.0-13และเสียงเช่นเดียวกับชนิดของการติดตั้งแพคเกจและการกำจัดการจัดการโดยแต่ไม่ได้โดยdist-upgradeupgrade


4
ฉันไม่เห็นfull-upgradeว่าเป็นตัวเลือกสำหรับapt-getอายุต่ำกว่า 14.04.1
สูงศักดิ์

ฉันไม่รู้aptเหมือนกัน แต่ดูเหมือนจะเป็นคำสั่งที่แตกต่างอย่างสิ้นเชิงตามหน้า man ที่เขาเชื่อมโยง
BlueWizard

18
@nobar คุณไม่เห็นเพราะมันเป็นตัวเลือกของaptไม่ได้มาจากapt-get... :-) man aptลอง
Hastur

โอเคฉันค้นหาและลิงค์แรกสุดที่ฉันพบคือ Ubuntu 15.10 (ซึ่งออกมาตอนปลายปี 2014 ซึ่งมีตะเข็บที่เหมาะสมกับการทดสอบของ Jessie) manpages.ubuntu.com/manpages/wily/en/man8/apt.8.html
Z boson

6
@Zboson ใช่และ 14.04 ออกมาไม่ได้ในปี 2011 แต่ในเดือนเมษายน 2014 ... ดูรูปแบบ?
2560

137

apt-get upgradeถูก จำกัด ในกรณีที่แพคเกจจะถูกแทนที่ด้วยรุ่นที่ใหม่กว่า แต่ไม่จำเป็นต้องมีการเพิ่มหรือลบแพคเกจ เช่น Firefox เวอร์ชันใหม่ควรติดตั้งapt-get upgradeได้

อย่างไรก็ตามapt-get upgradeจะปฏิเสธที่จะทำงานเมื่อมีการเพิ่มเติมหรือการลบที่จำเป็นโดยรุ่นที่ปรับปรุง ตัวอย่างเช่นเมื่อคุณlinux-image-3.2.0-10-genericติดตั้งเคอร์เนลและlinux-image-3.2.0-11-genericปรากฏขึ้นlinux-image-genericแพ็คเกจจะได้รับการอัปเดตให้ขึ้นอยู่กับเวอร์ชันที่ใหม่กว่า apt-get dist-upgradeในการติดตั้งเคอร์เนลใหม่ที่คุณต้องทำงาน

สังเกตว่าapt-get upgradeจะบอกว่าเคอร์เนลแพ็กเกจเป็นheld backอย่างไร apt-get dist-upgradeนั่นเป็นคิวสำหรับการใช้


2
ที่สมบูรณ์แบบ! : D คำถามอีกสองข้อ ... ผู้จัดการการปรับปรุงที่ใช้กราฟิกในอูบุนตูใช้อะไร? สิ่งที่แนะนำคืออะไร?
THpubs

11
ยูทิลิตีกราฟิกupdate-managerไม่ได้ใช้apt-getโดยตรง aptdaemonแทนที่มันจะทำงานร่วมกับแบ็กเอนด์ที่เรียกว่า ความสามารถมาตรฐานของupdate-managerการรวมกันของupgradeและdist-upgradeโหมดของapt-get: มันสามารถเพิ่ม แต่ไม่ลบแพคเกจ - มันจะเรียกใช้เครื่องมือ "อัพเกรดบางส่วน" เมื่อจำเป็นต้องลบ apt-get upgradeเมื่อใช้บรรทัดคำสั่งที่ใช้ หากคุณเห็นรายงานว่าแพคเกจถูก "ระงับ" ให้เรียกใช้apt-get dist-upgradeเพื่อรับการปรับปรุงที่เหลืออยู่
pablomme

33

โดยทั่วไปการอัพเกรดจะอัพเกรดแพ็คเกจที่มีอยู่จากรุ่นหนึ่งเป็นรุ่นอื่นเท่านั้น มันจะไม่ติดตั้งหรือลบแพ็คเกจแม้ว่าจะต้องทำเช่นนั้นเพื่ออัพเกรดรุ่นอื่น ๆ ในกรณีของการอัปเดตเคอร์เนลการอัพเกรดแพ็คเกจ linux-generic ต้องติดตั้งแพ็คเกจใหม่ linux-3.0.0-13- ทั่วไปและเนื่องจากการอัพเกรดปฏิเสธที่จะติดตั้งหรือลบแพคเกจก็ปฏิเสธที่จะอัพเกรด linux-generic

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


2
สุดยอดแก่นแท้ ยังไงวิธีการเก็บแพคเกจบางอย่าง?
0xC0000022L

11

apt-get upgradeคำสั่งจะได้ตามปกติเพียงติดตั้งโปรแกรมปรับปรุง (หรือแก้ไข) แพคเกจติดตั้งในปัจจุบัน ตัวอย่างเช่นโดยทั่วไปแล้วMozilla Firefoxรุ่นใหม่จะถูกติดตั้งด้วยคำสั่งนี้

อย่างไรก็ตามโดยทั่วไปapt-get upgradeจะไม่ติดตั้งรีลีสใหม่เมื่อมีการเปลี่ยนแปลงครั้งใหญ่ (รวมถึงการลบแพ็กเกจหรือการอัพเดต GRUB) ตัวอย่างเช่นเมื่อเคอร์เนล Linux ใหม่ (linux-image-3.xx-xx-generic ฯลฯ ) พร้อมใช้งานแพ็คเกจจะไม่ได้รับการติดตั้ง

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


12
นี่เป็นสิ่งที่ทำให้เข้าใจผิด dist-upgradeจะไม่อัปเกรดเป็นรีลีสใหม่เว้นแต่จะsources.listได้รับการแก้ไขตามนั้น (และแม้กระทั่งนั่นไม่ใช่วิธีการอัปเกรดที่รองรับใน Ubuntu) เมื่อ kernel ใหม่มีการติดตั้งdist-upgradeที่ไม่ได้เป็นรุ่นใหม่ของอูบุนตู มันเป็นเพียงแพ็คเกจใหม่ นอกจากนี้จำเป็นต้องมีการอ้างสิทธิ์ "หรือการอัปเดต GRUB" เป็นเท็จ sudo apt-get upgradeมีความสามารถในการอัพเกรดแพ็คเกจในสถานการณ์ที่ GRUB ต้องถูกอัพเดตอย่างสมบูรณ์ตราบใดที่ไม่มีแพ็กเกจที่ถูกลบออกและติดตั้งแพ็กเกจใหม่ update-grubทำงานโดยอัตโนมัติเช่นเคย
Eliah Kagan

2
คุณควรเขียนคำตอบของคุณเองเพราะนั่นจะช่วยเพิ่มความชัดเจนให้กับฉัน
david6

2
นอกจากสิ่งที่เอลียาห์กล่าวถึงจุดสำคัญคือapt-get upgradeจะไม่ลบหรือเพิ่มแพ็คเกจ หากการแก้ไขแพคเกจต้องใช้แพคเกจใหม่การปรับปรุงจะถูกระงับ คำตอบของ pablommeที่คุณแก้ไขให้ถูกต้องน้อยกว่านั้นดีกว่าและฉันขอแนะนำให้ผู้อ่านไปที่หน้านั้น
Chan-Ho Suh

1
การแก้ไข: apt-get upgradeจะไม่ติดตั้งหรือลบแพ็คเกจใด ๆ การอัพเกรดเคอร์เนลจะได้รับการบรรจุเป็นแพ็คเกจใหม่และดังนั้นapt-get upgradeจะไม่มีการอัพเกรดเคอร์เนล ความจริงที่ว่าอัพเกรดเคอร์เนลไม่ "สำคัญ" การเปลี่ยนแปลงเช่นการกำหนดค่าด้วงไม่ได้เป็นเหตุผลสำหรับความแตกต่างระหว่างและupgrade dist-upgrade
Mikko Rantalainen

1

ตัวเลือกที่ดีที่สุดของคุณคือ:

apt full-upgrade

- อัตโนมัติจัดการการพึ่งพาเมื่ออัพเกรดแพคเกจ; ขณะที่:

apt upgrade

- ไม่อ้างอิงอัตโนมัติเมื่อจัดการกับแพ็กเกจ

- duBtrotterS

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