linux ทำงานกับลิงค์สัญลักษณ์อย่างไร


11

ฉันหมายถึงสิ่งที่เกิดขึ้นเมื่อบางกระบวนการต้องการอ่าน symlink? เกิดอะไรขึ้นเมื่อมีบางสิ่งเปลี่ยน symlink ในระหว่างกระบวนการอ่านหรือการเขียน

ตัวอย่าง: ฉันมีขนาดใหญ่ไฟล์ 100G ที่คล้ายกัน 2 และ/mnt/1 สามารถใช้ได้ผ่านทาง symlink บางโปรแกรมจะเริ่มต้นการอ่าน และในขณะที่บางสิ่งบางอย่างเปลี่ยนลิงค์จากเป็นแต่ยังคงอ่านไฟล์อยู่/mnt/2/mnt/1/home/user/fileA/home/user/file/mnt/1/mnt/2A

โปรแกรมแคชเส้นทางสัมบูรณ์หรือไม่

มันจะล้มเหลวและผิดพลาดเพราะ symlink เปลี่ยนไปหรือมันจะทำงานได้ดีเหมือนไม่มีอะไรเกิดขึ้น?

มันจะแตกต่างกันในกรณีที่/home/user/fileเชื่อมโยงกับอุปกรณ์บล็อก (ตัวอย่างเช่นดิสก์ iscsi ที่จำลองแบบ 2)?

คำตอบ:


9

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


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

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

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

2
คำตอบนี้พลาดจุดสำคัญไปที่ symlink มีชื่อของไฟล์เป้าหมาย
Keith Thompson

6

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

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

ในกรณีส่วนใหญ่การดำเนินการข้อมูลไฟล์บน symlink จะส่งผลกระทบต่อFinalFile (เช่นการอ่านและการเขียนไปยัง symlink จะอ่านจาก / เขียนไปยังFinalFile ) แต่มีข้อยกเว้น: การreadlink()เรียกระบบจะอ่านเนื้อหาของ symlink เอง

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


(1) มีข้อ จำกัด เกี่ยวกับจำนวนระดับและสิ่งต่าง ๆ มีความซับซ้อนขึ้นเล็กน้อยหากตำแหน่งใน symlink เป็นเส้นทางแบบสัมพัทธ์

(2) อ่านsymlink (7): การจัดการลิงก์สัญลักษณ์สำหรับรายละเอียดเพิ่มเติมman 7 symlink

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


1

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

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

ความแตกต่างในการเชื่อมโยงสัญลักษณ์ไปยังฮาร์ดลิงค์คือการนัดหมายคือการเชื่อมโยงหนักแทนการ poiting ไปยังเซกเตอร์ข้อมูลเหมือนฮาร์ดลิงก์ทำ

ตัวอย่าง:

ทดสอบ 1:

echo 'data' >file.txt

สิ่งนี้จะสร้างฮาร์ดลิงก์ file.txt ที่ชี้ไปยังส่วนที่ 10 ถึง 20 * (* หมายเลขเพื่ออธิบายเท่านั้น)

ทดสอบ 2:

ตอนนี้จะเกิดอะไรขึ้น?

ln file.txt file_2.txt

สิ่งนี้สร้าง hardlink file_2.txt ซึ่งชี้ไปยังส่วนที่ 10 ถึง 20 (เหมือนกันกับ file.txt) ดังนั้นหากคุณลบ file.txt ส่วนที่ 10 ถึง 20 จะถูกสงวนไว้และคุณสามารถดูข้อมูลภายใน file_2.txt ... . (file.txt และ file_2.txt เป็นเหมือนต้นฉบับ)

ทดสอบ 3:

ln -s file.txt file_sym.txt 

ชี้ symbolic link file_sym.txt ไปที่ hard link file.txt ดังนั้นเมื่อคุณพยายามเข้าถึง file_sym.txt คุณจะเห็น file.txt แต่ถ้าคุณลบ file.txt file_sym จะไม่พบเป้าหมายอีกต่อไป

สิ่งเหล่านั้นได้รับการจัดการโดยระบบไฟล์ตัวอย่างเช่นโดยโมดูล ext4 สำหรับ linux (หรือถ้ามันถูกคอมไพล์บนเคอร์เนล) มันไม่สำคัญว่าคุณกำลังใช้ Linux หรือ Unix อื่น ๆ

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