โปรแกรมบันทึกสามารถเข้าสู่ไฟล์ที่ถูกลบได้อย่างไร?


12

จากเครื่องมือไฟฟ้าของ Unix รุ่นที่ 3 : แทนที่จะลบไฟล์ให้ล้างข้อมูลในส่วน:

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

( เน้นที่เหมือง )

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

คำตอบ:


11

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

unlinkฟังก์ชั่นที่ถูกกำหนดให้มีพฤติกรรมนี้โดย POSIX:

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

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

ในที่สุดเมื่อ daemon ยกเลิกหรือcloses ไฟล์พื้นที่จะว่าง ไม่มีใครใหม่สามารถเปิดไฟล์ในเวลาเฉลี่ย (นอกเหนือจากผ่านอินเตอร์เฟซการสะท้อนแสงเฉพาะระบบเช่นของลินุกซ์/proc/x/fd/... ) รับประกันด้วยว่า:

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

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


1
อะไรจะเกิดขึ้นถ้าผู้ใช้ (ขอพูดรากของที่นี่) พยายามที่จะยกเลิกการเชื่อมโยง/proc/x/fd/y? นั่นจะทำให้กระบวนการล้มเหลวในการเขียนไปยังไฟล์ descriptor หรือเป็นการดำเนินการที่ผิดกฎหมายหรือไม่?
nanofarad

@ hexafraction /proc/*/fd/*เป็นsymlink ไปยังไฟล์จริงดังนั้นการลบออกจะไม่ลบไฟล์ ผมขอแนะนำให้คุณทดสอบ :) (ไม่ได้อยู่ในระบบการผลิตแน่นอน!)
Ruslan

1
@MichaelHomer บางทีคุณอาจจะอธิบายให้ชัดเจนว่าคำตอบของคุณเมื่อไฟล์ถูกยกเลิกการเชื่อมโยงกระบวนการที่มีไฟล์ descriptor ชี้ไปที่มันสามารถลิงก์อีกครั้งได้ที่พา ธ เดียวกันหรือไม่ บางครั้งสิ่งนี้อาจมีประโยชน์
lgeorget

@ hexafraction เอาล่ะสิ่งเหล่านี้เป็นเพียงการแสดง (ในพื้นที่ระบบไฟล์) ของสถานะกระบวนการและวัตถุ หากคุณลบการรับรองเหล่านั้นในพื้นที่ระบบไฟล์ไม่มีสิ่งใดที่จะเกิดขึ้นกับกระบวนการจริง - เว้นแต่ว่ามัน (หรือกระบวนการอื่น) จะขึ้นอยู่กับการเป็นตัวแทนนั้น ไม่แน่ใจว่าคุณสามารถใช้rmภายในอย่างไม่หยุดยั้ง/procหรือ/sysไม่ได้รับการบอกกล่าวจากระบบอยู่ดี
David Tonhofer

@lgeorget สำเร็จได้อย่างไร
Michael

8

เผง

ไฟล์เป็นแบบสามส่วน

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

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

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


4

อีก 2 คำตอบอธิบายปัญหาได้ดี - ไฟล์ไม่ได้รับ "ลบ" จนกว่าลิงก์ไดเรกทอรีทั้งหมดจะไปถึงและตัวอธิบายไฟล์ที่เปิดอยู่ทั้งหมดจะหายไป

เพื่อหลีกเลี่ยงปัญหานี้มันเป็นนิสัยที่ดีที่จะใช้

> /var/log/bigfile

แทน

rm -f /var/log/bigfile

ตั้งแต่นั้นเพียงแค่รีเซ็ตเนื้อหาเป็น 0 ไบต์แทนที่จะลบมันและคุณยังสามารถเห็นสิ่งที่เขียนไป

หากคุณลบไฟล์และอยู่ใน linux ที่คุณมีระบบไฟล์ / proc / fd คุณยังสามารถใช้งานได้

> /proc/12345/fd/3

เป็นศูนย์เนื้อหาของไฟล์ (สมมติว่า 12345 เป็นรหัสกระบวนการของคุณและ 3 คือหมายเลข fd ของไฟล์ขนาดใหญ่) นี่สามารถช่วยชีวิตหากดิสก์ของคุณทำงานเต็มและคุณไม่สามารถฆ่ากระบวนการที่กำลังเขียนไฟล์บันทึกของคุณด้วยเหตุผลบางอย่าง


> /var/log/bigfileลบข้อมูลที่มีอยู่ในไฟล์ แต่ไม่ได้หยุดโปรแกรมจากการเขียนที่นั่น มีบางสถานการณ์ที่มันเป็นสิ่งที่ถูก ฉันจะบอกว่ามันเป็นนิสัยที่ไม่ดีที่จะเข้าไป หากคุณต้องการที่จะลบไฟล์, rmการใช้งาน หากคุณต้องการหยุดโปรแกรมที่กำลังเขียนอยู่ให้ฆ่าหรือทำให้โปรแกรมหยุดเขียนก่อนหรือหลังการลบ
Gilles 'หยุดชั่วร้าย'

1
@Giles หัวข้อนี้เกี่ยวกับข้อเท็จจริงที่ว่าการลบจะไม่ช่วยถ้าโปรแกรมยังเปิดไฟล์อยู่ และถ้าฮาร์ดดิสก์ของคุณเต็มไปด้วยเพราะบาง misbehaves โปรแกรมและsyslogdเติม/var/log/messages, เป็นตัวเลือกที่ดีกว่าการฆ่า> /var/log/messages syslogdแน่นอนว่าไม่ควรหยุดคุณไม่ให้วิเคราะห์สิ่งที่เป็นปัญหาตั้งแต่แรก
Guntram Blohm สนับสนุน Monica
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.