เปิดไฟล์จัดการจะไปที่ไหนเมื่อพวกเขาตาย?


15

เกิดอะไรขึ้นกับไฟล์ที่ถูกลบในขณะที่มีการจัดการไฟล์เปิดอยู่

ฉันสงสัยมาตั้งแต่เริ่มคิดแล้วว่าฉันสามารถลบไฟล์วิดีโอในขณะที่เล่นในMPlayerและมันจะยังคงเล่นต่อไปจนจบ มันดึงข้อมูลจากที่ไหน มันยังมาจากฮาร์ดไดรฟ์หรือไม่? มันถูกคัดลอกไปยัง RAM เมื่อฉันลบไฟล์หรือไม่

หากยังอยู่ในฮาร์ดไดรฟ์จะเกิดอะไรขึ้นถ้าฉันเติมระบบไฟล์ในขณะที่โปรแกรมกำลังอ่านจากพื้นที่ที่ไม่ได้ถูกจัดสรรเป็นหลัก? หากบัฟเฟอร์ใน RAM เกิดอะไรขึ้นถ้าฉันล้างบัฟเฟอร์

จะเกิดอะไรขึ้นถ้าไฟล์นั้นอยู่ใน NFS share – มันถูกเก็บไว้บนเซิร์ฟเวอร์? (นั่นเป็นความเสี่ยงด้านความปลอดภัยหรือไม่ - DoS ด้วยไฟล์รีโมตแบบเปิดจำนวนมากจัดการใช่หรือไม่)

การทำlsof -n |grep '(deleted)'บางครั้งให้ผลลัพธ์ที่น่าสนใจ ถ้าฉันอัปเกรดแพ็คเกจที่แลกเปลี่ยนไฟล์ไลบรารีที่แชร์แล้วการรันโปรแกรมที่ใช้ไลบรารีเหล่านั้นจะยังคงสามารถใช้งานได้ราวกับไม่มีอะไรเปลี่ยนแปลง

คำถามโบนัส: มีวิธีที่จะรับข้อมูลกลับมาจากความตายในสถานการณ์นี้หรือไม่?

คำตอบ:


13

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

debugfs และเครื่องมือที่คล้ายกันสามารถใช้ในการกู้คืนเนื้อหาของ inodes


10
สิ่งนี้ถูกต้อง แต่ถ้าไฟล์ยังคงเปิดอยู่คุณสามารถรับมันคืนได้โดยไปที่ / proc / <PID> / fd โดยที่ PID คือ pid ของโปรแกรมที่เปิดไฟล์อยู่ ไดเรกทอรีนี้มีตัวอธิบายไฟล์ที่เปิดอยู่ทั้งหมดของโปรแกรมและคุณสามารถเข้าถึงได้เช่นเดียวกับไฟล์ปกติดังนั้นคุณสามารถสร้างฮาร์ดลิงก์เพื่อ 'เรียกคืนไฟล์'
แพทริค

โปรดทราบว่า/procเป็นเฉพาะ Linux (ตามที่เป็นdebugfs)
Ignacio Vazquez-Abrams

1
Solaris มี / proc เช่นกันและเทคนิคการทำงานที่นั่นก็ดี ไม่ทราบเกี่ยวกับ BSD
Patrick

2
ฉันแค่ต้องเพิ่มว่านี่ยอดเยี่ยม
n0pe

1
@Patrick: คุณไม่สามารถสร้างฮาร์ดลิงก์เพื่อ 'กู้คืน' ไฟล์/procได้ ฮาร์ดลิงก์ใช้งานได้กับระบบไฟล์เดียวกันไม่ใช่ข้ามระบบไฟล์และเนื่องจาก/procเป็นระบบไฟล์ที่ไม่สามารถเขียนได้แยกต่างหากคุณจึงไม่สามารถสร้างฮาร์ดลิงก์ได้ คุณสามารถคัดลอกไฟล์ออก/procได้
camh

5

เคอร์เนลอ้างอิงถึงการนับในการอ้างอิงถึงไอโหนด ดูคำตอบของฉันที่จะเกิดอะไรขึ้นเมื่อฉันปิด () file descriptor? .

การลบไฟล์ที่เปิดอยู่น่าจะไม่มีกลไก DOS ที่มีประสิทธิภาพมากกว่าการเปิดไฟล์ ulimitบนไฟล์ที่เปิดให้การป้องกันการนี้พยายาม DOS มันใช้กับไฟล์ที่เปิดอยู่ทั้งหมดถูกลบหรือไม่


5

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

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

คุณไม่สามารถสร้างลิงก์ไปยังไฟล์บนระบบ Linux ได้อีกครั้งเท่าที่ฉันรู้ (ขาดการข้ามไดรฟ์เวอร์ระบบไฟล์ด้วยdebugfsวิธีการที่คล้ายกัน) แต่คุณสามารถกู้คืนเนื้อหาได้อย่างง่ายดายcat /proc/12345/fd/42โดยที่ 12345 เป็น ID กระบวนการที่เปิดไฟล์ และ 42 คือหมายเลขตัวอธิบายไฟล์

บน NFS เมื่อคุณลบไฟล์ที่ยังคงเปิดอยู่ในไคลเอนต์บางตัวเซิร์ฟเวอร์ NFS จะเปลี่ยนชื่อไฟล์บนเซิร์ฟเวอร์ แต่จะไม่ลบจนกว่าไคลเอ็นต์ทั้งหมดจะปล่อยไฟล์ จากประสบการณ์ของฉันชื่อใหม่คือ.nfs…แม้ว่าฉันจะไม่ทราบว่าชื่อนั้นเหมือนกันในการปรับใช้ NFS ทั้งหมดหรือไม่

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