ไฟล์ที่เปิดทำงานอย่างไรในระบบลินุกซ์?


17

ฉันเพิ่งเปลี่ยนชื่อไฟล์บันทึกเป็น "foo.log.old" และสันนิษฐานว่าแอปพลิเคชันจะเริ่มเขียนไฟล์บันทึกใหม่ที่ "foo.log" ฉันประหลาดใจที่พบว่ามันติดตาม logfile ไปยังชื่อใหม่และเก็บบรรทัดต่อท้ายไว้ที่ "foo.log.old"

ใน Windows ฉันไม่คุ้นเคยกับพฤติกรรมแบบนี้ - ฉันไม่รู้ว่าเป็นไปได้หรือไม่ที่จะนำไปใช้ พฤติกรรมนี้นำมาใช้อย่างแน่นอนใน linux อย่างไร ฉันจะเรียนรู้เพิ่มเติมเกี่ยวกับมันได้ที่ไหน


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

คำตอบ:


20

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

ดังนั้นหลายสิ่งที่ควรระวัง:

  1. ย้ายไฟล์โดยใช้mvไม่ได้เปลี่ยนหมายเลขสมุนว่าถ้าคุณย้ายข้าม filesystems (ซึ่งเทียบเท่ากับการใช้cpแล้วrmในต้นฉบับ)
  2. เนื่องจากชื่อมากกว่าหนึ่งชื่อสามารถเชื่อมต่อกับไฟล์เดียว (เช่นเรามีฮาร์ดลิงก์) ข้อมูลในไฟล์ "ลบ" จึงไม่หายไปจนกว่าการอ้างอิงทั้งหมดไปยังไฟล์ underling จะหายไป
  3. อาจสำคัญที่สุด: เมื่อopenไฟล์โปรแกรมsa ทำการอ้างอิงถึงมันคือ (สำหรับจุดประสงค์ของเมื่อข้อมูลจะถูกลบ) เทียบเท่ากับชื่อไฟล์ที่เชื่อมต่อกับมัน

สิ่งนี้ก่อให้เกิดพฤติกรรมหลายอย่างเช่น:

  • โปรแกรมสามารถopenอ่านไฟล์ได้ แต่ไม่สามารถอ่านได้จริงจนกว่าผู้ใช้rmจะอ่านไฟล์ที่บรรทัดคำสั่งและโปรแกรมจะยังสามารถเข้าถึงข้อมูลได้
  • สิ่งที่คุณพบ: mvการเปิดไฟล์ไม่ได้ตัดการเชื่อมต่อความสัมพันธ์ระหว่างไฟล์และโปรแกรมใด ๆ ที่เปิดอยู่ (ยกเว้นกรณีที่คุณย้ายข้ามขอบเขตระบบไฟล์ซึ่งในกรณีนี้โปรแกรมยังคงมีเวอร์ชันดั้งเดิมให้ทำงาน)
  • หากโปรแกรมมีopenไฟล์สำหรับการเขียนและผู้ใช้rmเป็นชื่อไฟล์สุดท้ายที่บรรทัดคำสั่งโปรแกรมสามารถทำการใส่ข้อมูลลงในไฟล์ได้ทันที แต่ทันทีที่ปิดลงจะไม่มีการอ้างอิงกับข้อมูลและ มันจะหายไป
  • สองโปรแกรมที่สื่อสารผ่านมากกว่าหนึ่งไฟล์สามารถขอรับน้ำมันดิบบางส่วนการรักษาความปลอดภัยโดยการลบไฟล์ (s) หลังจากที่พวกเขาเสร็จแล้วopenไอเอ็นจี (นี่ไม่ใช่ความปลอดภัยที่เกิดขึ้นจริงมันแค่เปลี่ยนรูโหว่ให้เป็นสภาพการแข่งขัน)

1
ฉันเห็นด้วยกับ @ dmckee ฉันแค่ต้องการที่จะทราบ: โปรแกรมสามารถopenไฟล์สำหรับการอ่านและการเขียน (เช่นสิ่งที่เกิดขึ้นกับไฟล์บันทึกในคำถาม)
jsbillings

@jsbillings: ใช่ แต่มีความเสี่ยง หากชื่อระบบไฟล์ทั้งหมดหายไปคุณสามารถเขียน GB เป็นไฟล์เปิดซึ่งจะระเหยเหมือนน้ำค้างตอนเช้าทันทีที่คุณปิด
dmckee

1
นอกจากนี้ไอโหนดจะถูกคัดลอกไปยังเคอร์เนลและนั่นคือสิ่งที่ถูกดำเนินการบนไม่ใช่สำเนาดิสก์ ดังนั้นไฟล์อาจเป็น mv'd หรือ cp 'แต่ไฟล์ที่เปิดอยู่จะทำงานกับ sternures data kernal ไม่ใช่เวอร์ชันของดิสก์ ดังนั้นหากคุณคัดลอกไฟล์อื่นลงในไฟล์ที่เปิดสำหรับการเขียนกระบวนการจะยังคงเขียนไปยังตำแหน่งที่สัมพันธ์กันเช่นเดียวกับในไฟล์เก่า นี่คือเหตุผลที่โปรแกรมเช่น Apache httpd มีตัวจัดการสัญญาณซึ่งปิดและเปิดไฟล์บันทึกใหม่
Arcege

0

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

สำหรับการใช้งานใน Windows นี่เป็นคำถามสำหรับไซต์อื่น

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


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