จะข้ามการอัพเดตเคอร์เนลได้อย่างไร


25

ฉันใช้ Ubuntu 12.04.1 LTS i686 บน VirtulBox ทุกครั้งที่ฉันตรวจสอบการอัพเดตมีเคอร์เนล Linux ตัวใหม่อยู่ หากฉันติดตั้งเคอร์เนลใหม่ฉันต้องติดตั้ง Virtulbox Guest Additions อีกครั้งและรีบูตเซิร์ฟเวอร์ ฉันไม่ต้องการทำสิ่งนี้ทุกสัปดาห์ ฉันรู้ว่าฉันสามารถยกเลิกการเลือกแพคเกจเคอร์เนลจากตัวจัดการอัปเดตได้ด้วยตนเอง แต่มีวิธีข้ามการอัปเดตเคอร์เนลโดยอัตโนมัติหรือไม่ ฉันพบคำตอบที่นี่ แต่สำหรับ Ubuntu 10 ขอบคุณ

คำตอบ:


18

APT (Advanced Packaging Tool) เป็นระบบที่ Ubuntu ใช้เพื่อจัดการซอฟต์แวร์ทั้งหมดที่ติดตั้งบนระบบ ช่วยให้คุณสามารถ "ตรึง" แพ็คเกจไปยังรุ่นที่แน่นอนเพื่อที่จะไม่ได้รับการปรับปรุงเมื่อคุณ Update Manager ทำงาน

ในการปักหมุดเคอร์เนลแพ็คเกจของคุณก่อนอื่นคุณต้องพิจารณาว่าเคอร์เนลของคุณคืออะไร วิธีหนึ่งในการทำเช่นนี้คือเปิด Synaptic Package Manager ในระบบ> การดูแลระบบ

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

พิมพ์“ linux-generic” ในช่องค้นหาข้อความด่วนและกด Enter

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

จดบันทึกหมายเลขที่ปรากฏในคอลัมน์“ เวอร์ชันที่ติดตั้ง” เราจะใช้มันในขั้นตอนต่อไป

ต่อไปเราต้องแก้ไขไฟล์ / etc / apt / preferences เปิดโดยกด Alt + F2 เพื่อเปิดหน้าต่าง Run Application ขึ้นมาและเข้าสู่:

gksudo gedit /etc/apt/preferences

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

นี่จะเปิดหน้าต่าง gedit เป็นไปได้ว่าหน้าต่างนั้นจะว่างเปล่าเว้นแต่ว่าคุณเคยเล่นกับ APT มาก่อน

ในหน้าต่างพิมพ์ต่อไปนี้แทนที่หมายเลขรุ่นด้วยหมายเลขรุ่นที่คุณพบใน Synaptic Package Manager

Package: linux-generic linux-headers-generic linux-image-generic linux-restricted-modules-generic
Pin: version <insert version here>
Pin-Priority: 1001

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

บันทึกไฟล์และปิด gedit หากคุณเปิด Update Manager คุณจะเห็นว่าการอัพเดทเคอร์เนลของ Linux นั้นถูกซ่อนอยู่ในตอนนี้!

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

แหล่ง

การปิดกั้นแพ็คเกจด้วย APT / DPKG

จำชื่อแพ็คเกจของเคอร์เนลของคุณจากด้านบน

เปิดเทอร์มินัลแล้วเรียกใช้:

sudo -s

enterและตี

ป้อนรหัสผ่านของคุณสำหรับ sudo:

echo kernel_package_name hold | dpkg --set-selections

แทนที่kernel_package_nameด้วยชื่อของเคอร์เนลที่คุณต้องการปักหมุด

ตอนนี้ทำงาน:

sudo apt-get update && sudo apt-get upgrade

หากต้องการลบ PIN จาก Apt / Dpkg:

เปิดเทอร์มินัล

sudo -s
echo kernel_package install | dpkg --set-selections

แทนที่ kernel_package ด้วยแพ็คเกจที่คุณต้องการปักหมุด

ตอนนี้ทำงาน:

sudo apt-get update &&  sudo apt-get upgrade

แหล่ง

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


1
ขอบคุณสำหรับการตอบกลับของคุณ. ดูเหมือนว่าเรากำลังใช้รุ่นที่แตกต่างกัน ฉันไม่มี Synaptic Package Manager และ / etc / apt / preferences ใน Ubuntu 12.04 ของฉัน
garconcn

2
ใช่ Synaptic ไม่ได้ติดตั้งโดยค่าเริ่มต้น
ish

1
@garconcn คุณสามารถติดตั้ง Synaptic และติดตั้งโปรแกรมแก้ไขที่ฉันบอกคุณหรืออ่านคำถามอีกครั้งเนื่องจากฉันได้ใส่ข้อมูลเพิ่มเติมลงไป
LnxSlck

2
@LnxSlck ฉันได้ติดตั้ง Synaptic และทำตามคำแนะนำของคุณ มันได้ผล. ขอบคุณ
garconcn

16

ในหนึ่งบรรทัดคือ:

echo $(dpkg -l "*$(uname -r)*" | grep image | awk '{print $2}') hold | dpkg --set-selections

นี่จะเป็นการตั้งค่าสถานะอิมเมจของเคอร์เนลจากการติดตั้งให้พักไว้และจะป้องกันการอัพเดต


8

สายการบินเดียวโดย Christoph ไม่ได้พิจารณาแพ็คเกจเพิ่มเติม (เช่น linux-image-extra-3.13.0-45-generic) ใช้อันนี้แทน:

สำหรับ i ใน $ (dpkg -l "* $ (uname -r) *" | grep image | awk '{พิมพ์ $ 2}'); ทำเสียงก้อง $ i ถือ | dpkg - ชุดตัวเลือก; เสร็จแล้ว

4

ในความสัมพันธ์ของคำแนะนำของ superlexx: บรรทัดนั้นจะพลาดแพ็คเกจ "ส่วนหัว":

dpkg -l "*$(uname -r)*" | grep image | awk '{print $2}'
linux-image-3.13.0-48-generic
linux-image-extra-3.13.0-48-generic

ดังนั้นวิธีการเกี่ยวกับการใช้ดังต่อไปนี้:

dpkg -l "*$(uname -r)*" | grep kernel | awk '{print $2}'
linux-headers-3.13.0-48-generic
linux-image-3.13.0-48-generic
linux-image-extra-3.13.0-48-generic

1
หากแพ็กเกจพิเศษ / ส่วนหัว / อื่น ๆ ไม่ได้ถูกทำเครื่องหมายจะมีปัญหาหรือไม่ หรือคุณกำลังแนะนำให้ทำเครื่องหมายพวกเขาเช่นกันเพื่อความสมบูรณ์? ฉันคาดหวังว่า Ubuntu จะไม่พยายามติดตั้งแพ็กเกจส่วนหัวที่อัปเดตจนกว่าจะติดตั้ง linux-image (ส่วนหัวเป็นภาพที่ขึ้นต่อกัน) ฉันยังไม่ได้ตรวจสอบสิ่งนี้
whitehat101

2
พวกคุณสามารถทำงานร่วมกันในสายการบินเดียวแทนการวางซ้อนกัน 3 อันกับอีกคนหนึ่ง = P เพียงแค่พูดใน
cubuspl42

1
มันไม่จำเป็นที่จะเรียก grep ถ้าคุณกำลังใช้ awk:dpkg -l "*$(uname -r)*" | awk '/kernel/{print $2}'
Javier Lopez

1

สิ่งนี้จะกำจัดแพ็คเกจเมตาเคอร์เนลที่เปิดใช้งานการอัพเดตเคอร์เนล

sudo apt purge $(apt-cache rdepends -i --installed linux-{headers,image}-$(uname -r)|awk '!/[0-9]/ && /^[ ]/{print $1}')

(หากคุณเพิ่งอัพเกรดเคอร์เนลคุณต้องรีบูตครั้งแรกด้วยเคอร์เนลใหม่หรือค้นหาเคอร์เนลรุ่นล่าสุดและใช้ในด้านบนแทน "$ (uname -r)")

ขอแนะนำให้ติดตั้งการอัปเดตเมล็ดข้าวเนื่องจากเป็นการปรับปรุงความปลอดภัยเป็นส่วนใหญ่


0

บน Ubuntu 16.04.1 โค้ดต่อไปนี้ใช้งานได้

for i in $(dpkg -l "*$(uname -r)*" | grep image | awk '{print $2}'); do echo $i hold | sudo dpkg --set-selections; done

the คือการปรับปรุงโค้ดของ Superlexx, sudoเพิ่มเข้ามา

dpkg -l | grep linux-image

คุณจะพบว่า:

สวัสดี linux-image-4.4.0-34-generic ...

hi linux-image-extra-4.4.0-34-generic ...

โปรดทราบว่าตอนนี้แท็กจะอ่านhiไม่ใช่ii

เพื่อลบพิน

for i in $(dpkg -l "*$(uname -r)*" | grep image | awk '{print $2}'); do echo $i install | sudo dpkg --set-selections; done

คำตอบที่ดี แต่คุณใส่sudoความเห็นไม่ใช่คำสั่ง ...
WinEunuuchs2Unix

0

เวอร์ชั่นที่สั้นกว่า: (แทนที่ "hold" ด้วย "install" เพื่อลบ PIN)

 dpkg -l "*$(uname -r)*" | grep kernel | awk '{print $2,"hold"}' | sudo dpkg --set-selections

หากต้องการดูสถานะของภาพเคอร์เนลและส่วนหัวทั้งหมดให้เรียกใช้:

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