จะอัพเกรดไลบรารีที่แชร์โดยไม่มีข้อผิดพลาดได้อย่างไร


18

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

อย่างไรก็ตามเมื่อฉันพยายามที่จะแทนที่ไฟล์ไบนารีในขณะที่กระบวนการกำลังทำงาน (กับ scp จาก dev เป็นเซิร์ฟเวอร์ทดสอบ) ก็ระบุว่า 'ไฟล์ไม่ว่าง' และถ้าฉันแทนที่ไฟล์ไลบรารีที่ใช้ร่วมกัน (* .so) กระบวนการทั้งหมดที่ลิงก์ล้มเหลว

ทำไมเป็นเช่นนั้น ฉันพลาดอะไรไปรึเปล่า? ฉันจะแทนที่ไฟล์ไบนารีโดยไม่หยุด / หยุดทำงานกระบวนการได้อย่างไร


คุณสามารถตรวจสอบ.soไฟล์โดยใช้ldd filename.soเพื่อตรวจสอบการพึ่งพา
Rahul Patil

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

จำเป็นต้องหยุดทำงาน .. หรือคุณสามารถทำได้ stop app && create symlink of .so && start app
Rahul Patil

คำตอบ:


21

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

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

วิธีที่ถูกต้องในการอัพเดทคือ:

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

  2. การสร้างไฟล์ใหม่ด้วยเนื้อหาที่อัพเดท

กระบวนการที่สร้างขึ้นใหม่จะใช้เนื้อหาที่อัปเดตการเรียกใช้แอปพลิเคชันจะเข้าถึงเวอร์ชันเก่า นี่คือสิ่งที่ยูทิลิตี้การจัดการแพคเกจมีสติไม่ โปรดทราบว่าอาจไม่สมบูรณ์โดยไม่มีอันตรายใด ๆ - ตัวอย่างเช่นแอปพลิเคชันการโหลดรหัสแบบไดนามิก (โดยใช้dlsym()และเพื่อน) จะประสบปัญหาหาก API ของห้องสมุดเปลี่ยนไปอย่างเงียบ ๆ

หากคุณต้องการอยู่ในด้านที่ปลอดภัยจริงๆปิดระบบติดตั้งระบบไฟล์จากอินสแตนซ์ของระบบปฏิบัติการอื่นอัปเดตและนำระบบที่อัปเดตขึ้นมาอีกครั้ง


6

การอัพเกรดรอบต่อนาทีทำได้เช่นเดียวกัน - โดยใช้ไบนารีและไลบรารี่ขณะที่ไม่มีอะไรขัดข้อง

ดังนั้นความแตกต่างคืออะไร:

  1. ยกเลิกการเชื่อมโยงไฟล์
  2. เขียนไฟล์ใหม่ด้วยชื่อเดียวกัน

สิ่งนี้จะไม่แทนที่ไฟล์ inplace: inode ที่อ้างถึง in-use-binary ยังคง "ยุ่ง" จนกระทั่งวัตถุสุดท้ายที่ถือมันเปิดเสร็จสิ้น ไฟล์ใหม่จะถูกสร้างขึ้นด้วยหมายเลขไอโหนดใหม่

ทีนี้scpหรือcpจะพยายามแทนที่ไฟล์เข้าแทนที่ - ซึ่งจะเปลี่ยนเนื้อหาที่ไอโหนดอ้างถึง สิ่งนี้ไม่ทำงาน - ตามที่คุณอธิบาย

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