การอัพเดตการรันไบนารีแอปพลิเคชันในระหว่างการอัปเกรดทำงานอย่างไร


23

ฉันเพิ่งอัพเกรด ubuntu lucid ของฉันเป็น natty ในระหว่างการอัพเกรดมันแทนที่แอพพลิเคชั่นส่วนใหญ่ที่ทำงานด้วยเวอร์ชั่นที่ใหม่กว่า

มันทำงานอย่างไร (แอปพลิเคชันจะไม่ทำงานล้มเหลวหรือไม่) จะเกิดอะไรขึ้นกับแอปพลิเคชันหากมีการอัปเกรดไฟล์ lib และแอปพลิเคชันที่ทำงานซึ่งกำลังมองหา lib รุ่นเก่าพยายามโหลดมัน


เป็นคำถามที่ดี แต่น่าจะดีกว่าที่นี่: unix.stackexchange.com (ฉันรู้ว่า URL บอกว่า Unix แต่พวกเขาก็มีคำถามเกี่ยวกับ Linux ด้วย!)

ทำความเข้าใจเกี่ยวกับการทำงานแทนในขณะที่เปิดของลินุกซ์ดูเหมือนว่ามันยังคงเขียนโปรแกรม ( แต่เพิ่ง :)
bdonlan

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

1
มันไม่เกี่ยวข้องกับรหัสการแก้ไขตัวเองจริงๆ แต่แน่นอนว่ามีบางคนที่เขียนไลบรารี่สำหรับ linux ควรรู้ใช่ :)
bdonlan

1
@Piskvor ฟังดูคล้ายกับขั้นตอนการรวบรวมแบบหลายขั้นตอนสำหรับ gcc :) แต่โดยทั่วไปแล้วคอมไพเลอร์จะทำสิ่งนั้นและโดยทั่วไปคุณจะไม่อัปเกรดระบบในขณะที่คุณทำ (แม้ว่าคุณจะทำตราบใดที่คุณยังไม่ได้ 'T ปรับลดอะไรในขณะที่มันอยู่ในขั้นตอนที่คุณกำลังดีเพราะมันจะใช้สำเนารวบรวมเอกชนของอะไรที่มันเป็นเรื่องสำคัญ)
bdonlan

คำตอบ:


31

Linux (และ UNIX อื่น ๆ ) วาดความแตกต่างระหว่างชื่อไฟล์ ( ลิงค์ ), ไฟล์ตัวเอง (มักถูกระบุด้วยไอโหนด ) และเปิดการจัดการกับไฟล์ เมื่อคุณไปลบไฟล์คุณโทรunlink()ออก - นี่เป็นการลบลิงค์ไปยังไฟล์ (คุณสามารถใช้rename()เพื่อเขียนทับไฟล์ด้วย inode อื่น) อย่างไรก็ตามถ้าเปิดจัดการกับไฟล์ (หรือลิงค์อื่น ๆ - ไฟล์สามารถมีหลายฮาร์ดลิงก์) ยังคงinodeยังคงและเนื้อหาของไฟล์เช่นนั้นจนกว่าการเชื่อมโยงและจัดการทั้งหมดจะหายไป

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

นอกจากนี้โปรดทราบว่าโปรแกรมที่คาดหวังว่า 'ห้องสมุดเก่า' จะสามารถใช้งานได้ดีกับห้องสมุดรุ่นใหม่กว่า ไลบรารี Linux ถูกกำหนดชื่อไฟล์ ('soname') ที่สะท้อนถึงเวอร์ชันของ ABI (Application Binary Interface) ที่เสนอโดยห้องสมุด ยกตัวอย่างเช่นห้องสมุด C libc.so.6ในระบบของฉันคือ โปรแกรมใด ๆ ที่คอมไพล์กับ libc เวอร์ชันเก่า แต่ยังคงเป็น libc เวอร์ชันที่ใช้เวอร์ชัน 6 ABI จะทำงานได้ดี จริงๆโปรแกรมเก่าจะมองหาlibc.so.5หรือlibc.so.4หรือสิ่งแทน; ในกรณีนี้คุณจะต้องเก็บเวอร์ชันเก่าไว้ด้วย - แต่เนื่องจากชื่อไฟล์นั้นแตกต่างกันจึงไม่เป็นปัญหา


9

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

โดยปกติแล้วแอปที่รันอยู่จะโหลดไลบรารีที่จำเป็นไว้ล่วงหน้าดังนั้นปัญหาที่คุณอธิบายจะเกิดขึ้นเฉพาะในช่วงเวลาที่เฉพาะเจาะจงเท่านั้นในขณะที่กำลังติดตั้งแพคเกจ: แอพที่กำลังทำงานอยู่ยังคงใช้ไลบรารีเวอร์ชันเก่าอยู่ หนึ่ง.

สิ่งนี้ใช้ไม่เพียง แต่ในการอัพเกรด distro แต่เกิดขึ้นกับการอัปเกรดแพ็คเกจทุกครั้ง (การอัพเกรด dist จะเพิ่มขั้นตอนอัตโนมัติอีกสองสามขั้นตอนให้กับกระบวนการนั้น)


0

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

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