การอัพเดตเคอร์เนล Linux ในขณะที่ปล่อยให้ระบบเหลืออยู่


25

ฉันเป็นผู้ใช้ OpenBSD ในคำถามที่พบบ่อย OpenBSDกล่าวว่า:

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

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

การมีเคอร์เนลซิงค์นอกระบบพื้นฐานและ / หรือแพคเกจของบุคคลที่สามเป็นแหล่งที่มาของปัญหาและอาจทำให้คุณไม่ได้รับความช่วยเหลืออย่างจริงจังจากรายชื่อผู้รับจดหมายอย่างเป็นทางการ

ฉันค่อนข้างโอเคกับเรื่องนี้ อันที่จริงนี่เป็นหนึ่งในเหตุผลที่ฉันใช้ OpenBSD มันทำให้ระบบเป็นหน่วยที่สอดคล้องกันและทำให้มันง่ายสำหรับฉันในการสร้างภาพรวมทางจิตใจของมัน

บน Linux เป็นอย่างไร ลินุกซ์ส่วนใหญ่ที่ฉันรู้ว่าไม่มี "ระบบพื้นฐาน" ในความหมายเดียวกับ BSD แต่เป็นชุดของแพ็คเกจที่ประกอบโดยผู้ให้บริการกระจายสินค้า ซอฟต์แวร์เพิ่มเติมจะถูกเพิ่มเข้าไปในสิ่งนี้โดยผู้ดูแลระบบท้องถิ่นในลักษณะที่ขอบเขตระหว่างสิ่งที่อยู่ที่นั่นตั้งแต่เริ่มต้นและสิ่งที่เพิ่มเข้ามาในภายหลังนั้นเป็นสิ่งที่ดีที่สุดไม่ชัดเจน

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

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

เหตุผลที่ฉันถามคือเนื่องจากผู้ใช้รายอื่นในไซต์นี้ถามฉันว่าการเปลี่ยนเคอร์เนลในระบบ Linux ของเขาด้วยเวอร์ชันที่ใหม่กว่า "น่าจะเป็นไปได้" มาจากด้าน OpenBSD ของสิ่งที่ฉันไม่สามารถพูดได้ว่าใช่นี้จะรับประกันได้ว่าจะไม่ทำลายระบบ


ฉันใช้ "Linux" ด้านบนเป็นแบบย่อสำหรับ "Linux distribution" เคอร์เนล + ยูทิลิตี้


เป็นอีกวิธีหนึ่งในการบอกว่า OpenBSD มีเพียงการแจกจ่ายเดียว รายการเมนูด้วงหลายรายการในระบบ Linux ปกติสำหรับการกลับไปใช้เคอร์เนลก่อนหน้านี้ในกรณีที่ (ปกติ) รุ่นใหม่ล่าสุดไม่สามารถบูตได้ด้วยเหตุผลบางประการ
Thorbjørn Ravn Andersen

คำตอบ:


29

Linus Torvalds มีความเห็นที่แข็งแกร่งมากต่อการเปลี่ยนแปลงเคอร์เนลซึ่งส่งผลให้ผู้ใช้ถอยหลัง (ดูคำถาม " เคอร์เนล Linux: การแบ่งพื้นที่ผู้ใช้ " สำหรับรายละเอียด)

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

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

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

อย่างไรก็ตามความมั่นคง API เดียวกันไม่รับรองเคอร์เนลอินเตอร์เฟซและการดำเนินการอื่น ๆ รายละเอียด Sysfs (เปิด/sys) และprocsfs (เปิด/proc/) เปิดเผยรายละเอียดการใช้งานเคอร์เนลเกี่ยวกับการกำหนดค่ารันไทม์, ฮาร์ดแวร์, เครือข่าย, กระบวนการ ฯลฯ ซึ่งใช้โดยแอปพลิเคชันระดับต่ำ เป็นไปได้สำหรับอินเทอร์เฟซเหล่านั้นที่จะเปลี่ยนในทางที่เข้ากันไม่ได้ระหว่างเคอร์เนลเวอร์ชันหากมีเหตุผลที่ดี การเปลี่ยนแปลงยังคงพยายามลดความเข้ากันไม่ได้ให้น้อยที่สุดถ้าเป็นไปได้และมีกฎสำหรับวิธีที่แอปพลิเคชันสามารถใช้อินเทอร์เฟซได้อย่างน้อยน่าจะทำให้เกิดปัญหา ผลกระทบก็มี จำกัด เช่นกันเพราะแอปพลิเคชั่นที่ไม่ใช่ระดับต่ำไม่ควรใช้อินเทอร์เฟซเหล่านี้

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

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

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


1
มันจะมีประโยชน์ในระยะยาวเพื่อขยายคำอธิบายนี้โดยสรุปของอินเทอร์เฟซผู้ใช้เคอร์เนล (เรียกว่าระบบเรียก) เพราะมันอธิบายกลไกที่เมล็ดต่าง ๆ กำหนดค่าไม่ทำลายโปรแกรม
wallyk

3
แม้แต่ procfs ( /proc) และ sysfs ( /sys) ก็ยังคงเสถียรที่สุดเท่าที่จะทำได้โดยทำตามนโยบาย / ปรัชญา "อย่าทำลายผู้ใช้พื้นที่" นอกจากนี้ioctl()รหัสไฟล์บนอุปกรณ์en.wikipedia.org/wiki/Ioctl มันไปไกลเกินกว่าที่เรียบง่ายระบบโทร ABI เข้ากันได้ แต่อย่างที่คุณพูดเมื่อมีเหตุผลที่ดีสิ่งที่ไม่เปลี่ยนแปลงในและ/proc /sysมันจะไม่ทำลายโปรแกรมส่วนใหญ่โดยตรง แต่ถ้ามันทำลายโปรแกรมพื้นที่ผู้ใช้ระดับต่ำที่ใช้โดยสคริปต์ init ของ distro คุณอาจมีปัญหา โชคดีที่มันหายาก
Peter Cordes

จริงๆแล้วไฟล์บางไฟล์เช่นrfkillสวิตช์IIRC เปลี่ยนตำแหน่งในการอัพเกรดเคอร์เนล ดังนั้น/procและ/sysมีความเสถียรน้อยกว่าอินเตอร์เฟส syscall โชคดีที่การแจกแจงมักจะไม่รวมถึงการอัพเกรดเคอร์เนลดังกล่าวเว้นแต่จะเป็นการอัพเกรดรุ่นการแจกจ่ายหลัก
Ruslan

3
มีสองด้านที่ต้องพิจารณาที่นี่: การอัพเกรดเคอร์เนลและการอัพเกรด userspace ขอขอบคุณต่อความมั่นคง ABI เคอร์เนลของการอัพเกรดเคอร์เนลมีความปลอดภัยมาก (แม้จะมี/procและ/sysการเปลี่ยนแปลงมักจะ - ลบใช้เวลาหลายปี) อย่างไรก็ตามการอัพเกรด userspace อาจต้องการเคอร์เนลใหม่และคุณสามารถจบลงด้วยระบบที่ไม่สามารถบูทได้หากคุณไม่มีเคอร์เนลใหม่เพียงพอ บันทึกย่อประจำรุ่น Distro พูดถึงสิ่งนี้ตามความเหมาะสม (ดังนั้นอย่าอัพเกรด distros สุ่มสี่สุ่มห้าอ่านบันทึกประจำรุ่น)
Stephen Kitt

1
มีแนวทางสำหรับไฟล์ / proc และ / sys และวิธีที่ userspace ควรอ่านเพื่อให้สามารถเพิ่มฟิลด์เพิ่มเติมในเมล็ดที่ใหม่กว่าได้ ตัวอย่างเช่น / proc / stat หรือ / proc / meminfo คาดว่าพื้นที่ผู้ใช้จะไม่สนใจฟิลด์ที่เพิ่ม
Zan Lynx

11

เคอร์เนล Linux และพื้นที่ผู้ใช้ของการแจกจ่าย Linux ซึ่งในอดีตถูกครอบงำโดยเครื่องมือของผู้ใช้ที่พัฒนาโดยโครงการ GNU นั้นเชื่อมโยงกันอย่างอิสระ ในส่วนนี้เกิดจากการออกแบบและในส่วนนี้ก็เป็นสิ่งจำเป็น

ซึ่งแตกต่างจาก BSD ที่ซึ่งเคอร์เนลและพื้นที่ผู้ใช้พื้นฐานได้รับการออกแบบและบำรุงรักษาร่วมกันเคอร์เนล Linux และพื้นที่ผู้ใช้ของมันได้รับการพัฒนาและดูแลโดยบุคคลอื่น ดังนั้นการรักษาพวกเขาให้แน่นเข้าด้วยกันจะเป็นเรื่องยากแม้ว่าชุมชนจะต้องการมันซึ่งฉันไม่คิดว่ามันจะเป็นเช่นนั้น

และ @sebasth ยังทำให้จุดที่ยอดเยี่ยมว่านโยบายที่สำคัญของโครงการเคอร์เนล Linux คือมันจะต้องไม่ทำลายพื้นที่ผู้ใช้ ซึ่งแน่นอนว่าเป็นปัจจัยอีกประการหนึ่งที่บังคับใช้ข้อต่อหลวม

อย่างไรก็ตามยังคงมีการแต่งงานกันในระดับหนึ่ง เคอร์เนล Linux ที่เก่าเพียงพอจะไม่ทำงานกับการแจกแจงที่ทันสมัย


2
@Abigail นี่คือการหยิบยก แต่สามารถส่งต่อความเข้ากันได้ถ้า userspace ดำเนินการทางเลือกที่เหมาะสม บ่อยครั้งที่มันไม่เป็นที่ต้องการหรือคุ้มค่าเป็นที่ยอมรับ แต่ซอฟต์แวร์บางตัวก็ทำเช่นนี้ ( glibcตัวอย่าง) (แต่ใช่นี่ไม่ใช่สัญญาเคอร์เนลเป็นสัญญาผู้ใช้)
Stephen Kitt

7

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

เป็นเรื่องปกติที่จะมีการติดตั้งเคอร์เนลแพ็คเกจสองชุดในระบบ - แพ็คเกจที่ใช้อยู่ในปัจจุบันและแพ็คเกจที่ติดตั้งไว้ก่อนหน้านี้ เมื่ออัปเกรดหลังจากตรวจสอบให้แน่ใจว่าเวอร์ชันใหม่ทำงานอย่างถูกต้องแล้วสามารถลบเก่าที่สุดและคุณยังมีทางเลือกสำรองที่ปลอดภัย ตัวอย่างเช่น Red Hat (และลูกพี่ลูกน้อง) package-cleanup --oldkernels --count 2ต้องทำสิ่งนี้โดยอัตโนมัติ


แม้แต่บางอย่างเช่นkmodซึ่งคุณคิดว่าจะต้องเชื่อมโยงกับเคอร์เนลเวอร์ชันมีระยะเวลาเพิ่มขึ้นเล็กน้อยซึ่งเวอร์ชั่นนี้จะใช้งานได้
Ignacio Vazquez-Abrams

4

นอกจากข้อโต้แย้งที่ดีทั้งหมดที่นี่ฉันอาจเพิ่มบางจุดที่จะช่วย

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

ดิสทริบิวชันบางตัวเพิ่มแพตช์พิเศษมากกว่าตัวอื่น ๆ แต่ความคิดก็คือเพื่อให้มันมาจากนักพัฒนาต้นน้ำ เห็นได้ชัดว่ามีบางโปรแกรมที่ต้องการการกำหนดค่าเคอร์เนลพิเศษโดยเฉพาะอย่างยิ่งเวอร์ชวลไลเซชันและไดรเวอร์ของบุคคลที่สามและโดยปกติจะใช้ทั้งสองอย่างเพื่อทำงานร่วมกับเคอร์เนลรุ่นที่เฉพาะเจาะจงหรืออย่างน้อยรุ่นเก่าเกินไป ... เพื่อทำงานกับฟีเจอร์เคอร์เนลใหม่ล่าสุดและด้วยเหตุนี้หากคุณพยายามรันด้วยเคอร์เนลเก่ามันอาจทำงานไม่ถูกต้อง

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

ดังนั้นที่เป็นชุมชนและแล้วสิ่งที่ควรจะเป็นวิธีการทั่วไปที่เราจำเป็นต้องมีซอฟต์แวร์การทำงานร่วมกันและไม่ทำลายระบบนั่นเป็นเหตุผลที่เราพยายามที่จะทำตามมาตรฐานบางอย่างเช่นระบบแฟ้มลำดับชั้นมาตรฐาน

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