เหตุใดแพคเกจซอฟต์แวร์จึงทำงานได้ดีแม้ในขณะที่กำลังอัปเกรดอยู่


29

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

คำตอบ:


35

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

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


10
เพื่อชี้แจงภายใต้ Linux คุณไม่สามารถแก้ไขไฟล์ที่ปฏิบัติการได้ในขณะที่มันกำลังทำงานอยู่ แต่คุณสามารถยกเลิกการเชื่อมโยงไฟล์และแทนที่ด้วยไฟล์ใหม่ที่มีชื่อเดียวกัน
cjm

ภายใต้ Linux คุณอาจแก้ไขไฟล์เรียกทำงานขณะที่กำลังทำงาน ผลลัพธ์อาจไม่แน่นอนแม้ว่าคุณจะไม่รู้ว่ากำลังทำอะไรอยู่ เพิ่มจุด "ชื่อเดียวกัน" ซึ่งไม่ได้ระบุอย่างชัดเจน
jlliagre

4
@jlliagre ยกเว้นว่าฉันเข้าใจผิดคุณไม่สามารถทำได้เท่าที่ฉันทราบ: sprunge.us/egiR
Chris Down

2
สิ่งหนึ่งที่เรียบร้อยเกี่ยวกับ NFTS คือ - ถ้าคุณทำการเปลี่ยนชื่อจากบรรทัดคำสั่งหรือโปรแกรมอื่นคุณสามารถวางไฟล์ที่มีชื่อเดียวกันกลับไปที่นั่นและจะไม่ส่งผลกระทบต่อโปรแกรมที่เปิดไฟล์ต้นฉบับ (คำสั่งเปลี่ยนชื่อใน explorer ไม่ได้ผล)
Steffan Donal

1
@cjm คุณถูกต้องเกี่ยวกับการป้องกัน "ไฟล์ข้อความไม่ว่าง" ภายใต้ Linux, ตอบปรับปรุง ไม่มีข้อ จำกัด ดังกล่าวภายใต้ Solaris ที่ฉันคุ้นเคยกับ คุณยังคงสามารถแก้ไขไลบรารีที่แชร์ด้วยทั้งสองระบบปฏิบัติการได้
jlliagre

18

โดยทั่วไปไฟล์เรียกทำงานจะเปิดขึ้นหนึ่งครั้งแนบมากับ file descriptor และไม่มี file descriptor ไปที่ไบนารีที่ถูกเปิดใหม่ในช่วงระยะเวลาหนึ่งของการเรียกใช้งาน ตัวอย่างเช่นถ้าคุณรันbash, exec()ทั่วไปเพียง แต่จะสร้างบ่งแฟ้มสำหรับ inode ชี้ไป/bin/bashครั้งเดียว - ในการภาวนา

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

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

สำหรับกรณีที่ใช้งานง่าย แต่ก็ปลอดภัยที่จะอัปเกรดโดยไม่ต้องเริ่มกระบวนการใหม่


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

1
ฉันเกรงว่าย่อหน้าแรกของคุณไม่ถูกต้อง เคอร์เนล Unix / Linux ไม่โหลดโปรแกรมที่เรียกใช้งานได้พร้อมกัน แต่มีการแมปหน่วยความจำ นั่นหมายความว่าเฉพาะหน้าที่ใช้งานจริงเท่านั้นที่นำไปใช้กับ RAM นี่คือจุดรวมของการป้องกัน "ไฟล์ข้อความไม่ว่าง" ภายใต้ Linux ไม่มีการรับประกันว่าส่วนหนึ่งของการปฏิบัติการจะไม่สามารถอ่านได้นานหลังจากเปิดตัว ยิ่งไปกว่านั้นบางหน้าจะไม่ถูกโหลดสำหรับโปรแกรมที่มีขนาดใหญ่และนี่ก็เป็นความจริงสำหรับไลบรารีที่โหลดแบบไดนามิก ตัวอย่างเช่นbashไบนารีมีประมาณ 200 4K หน้าไม่แน่ใจว่ามันถูกใช้ในเซสชันโดยเฉลี่ย
jlliagre

@jlliagre ฉันกำลังพูดถึงialloc()ing ไปยัง kernel kernel เมื่ออ่านไม่ใช่การแมปหน่วยความจำของหน้าเว็บ ฉันไม่ถูกต้องหรือไม่ที่คิดว่าในปัจจุบันระบบไฟล์ ext * inode ในที่สุดก็สอดคล้องกันในเคอร์เนล (และภายในระบบย่อย VM)?
Chris Down

ไม่มีส่วนการรับประกันของเนื้อหาที่ดำเนินการได้จะไม่ถูกอ่านเป็นเวลานานหลังจากที่เรียกใช้และไม่มีการรับประกันว่าหน้าเดียวกันจะไม่สามารถอ่านได้อีกครั้งหลังจากผ่านไประยะหนึ่งในระหว่างเวลาดำเนินการ
jlliagre

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