ความแตกต่างระหว่าง ln -s และ mount - ผูกคืออะไร?


36

ฉันพยายามที่จะเข้าใจความแตกต่างระหว่างการใช้และln -s mount --bindในสถานการณ์พื้นฐานฉันสามารถใช้ทั้งสองเพื่อเข้าถึงหนึ่งไดเรกทอรีจากที่อื่น ในสถานการณ์ใดที่ทั้งสองจะทำงานแตกต่างกันอย่างไร


7
ฉันควรจะเตือนต่อบนrm -r mount --bindด้วยlnก็เอาการเชื่อมโยงในขณะที่หา--bindก็มีผลเช่นเดียวกับการทำงานของrm -rเป้าหมาย ไม่ดีอย่างที่ฉันพบเมื่อไม่นานมานี้ก่อนที่จะสร้างเซิร์ฟเวอร์ของฉันขึ้นมาใหม่ ...
Mark K Cowan

@MarkKCowan ที่จริงเว้นแต่คุณจะสร้างการเชื่อมโยงอย่างหนัก
JohnnyQ

@JohnnyQ ไม่สามารถลิงก์ไดเรกทอรีได้
Mark K Cowan

คำตอบ:


33

พวกเขาจะทำงานแตกต่างกันอย่างน้อยสองกรณี:

  • ในchrootหากเป้าหมายลิงก์อยู่นอก chroot ลิงก์นั้นจะตาย การเชื่อมต่อการผูกจะยังคงสามารถเข้าถึงได้
  • หลายโปรแกรมสามารถแยกความแตกต่างระหว่างลิงก์สัญลักษณ์และไดเรกทอรีหรือไฟล์จริง มีน้อย (ถ้ามี) สามารถแยกความแตกต่างระหว่างไดเรกทอรีหรือไฟล์กับที่ติดตั้งอยู่ นอกจากนี้ยังรวมถึงลิงก์สัญลักษณ์ไปยังสิ่งที่ ( A) ซึ่งมีอย่างอื่น ( B) ติดตั้งอยู่ การเชื่อมโยงจะแสดงเนื้อหาของภูเขาเป้าหมาย (คนB) แทนของเดิม ( A)

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


16

ดีln -sสร้างลิงค์สัญลักษณ์ในขณะที่mount --bindสร้างภูเขา

ลิงก์สัญลักษณ์เป็นไฟล์ชนิดพิเศษ ถ้าคุณทำเช่นln -s /var/target /var/linkนั้น/var/linkจะเป็นไฟล์ที่มีพา ธ " /var/target" อยู่ในนั้น ข้อแตกต่างระหว่างลิงก์สัญลักษณ์และไฟล์ทั่วไปคือเมื่อโปรแกรมพยายามดำเนินการกับลิงก์สัญลักษณ์การดำเนินการมักจะดำเนินการกับเป้าหมายแทนที่จะเป็นไฟล์ ดังนั้นถ้าคุณทำเช่นls /var/linkนี้lsโปรแกรมจะพยายามรับรายชื่อไดเรกทอรี/var/linkแต่จะได้รับรายชื่อไดเรกทอรี/var/targetแทน

ลิงก์สัญลักษณ์ยังคงเป็นเพียงไฟล์ พวกเขาสามารถเปลี่ยนชื่อและลบและแจ๊สทั้งหมดที่ โปรดทราบว่าคุณไม่สามารถสร้างลิงก์สัญลักษณ์ (หรือไฟล์ธรรมดาสำหรับเรื่องนั้น) ที่เรียกว่า/var/linkมีไฟล์ที่ถูกเรียก/var/linkแล้ว คุณต้องกำจัดมันเสียก่อน

การเมาท์ไม่ใช่ไฟล์ เป็นเรคคอร์ดที่เคอร์เนลเก็บไว้ในหน่วยความจำ ถ้าคุณทำmount --bind /var/target /var/mountเคอร์เนลจะบันทึกความจริงที่ว่าตอนนี้เป็นชื่อใหม่สำหรับ/var/mount /var/target(ฉันไม่ทราบรายละเอียดโดยเฉพาะฉันไม่ทราบว่าการติดตั้งบางสิ่งในไดเรกทอรีย่อย/var/targetจะทำให้ปรากฏขึ้น/var/mountด้วยหรือไม่หรือทำไมหรือไม่ทำไมการแก้ไขคำตอบนี้จะได้รับการชื่นชม) ดังนั้นตอนนี้ ถ้าคุณทำls /var/mountสิ่งเดียวกันจะเกิดขึ้นราวกับว่าคุณทำls /var/targetเพราะ/var/mountและ/var/targetเป็นไดเรกทอรีเดียวกัน

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


1
ฉันไม่ได้ใช้ติด --bind แต่ฉันสงสัยมันสามารถทำซ้ำพฤติกรรมของ symlink ln -s ../../myfile .เหมือนที่ หากคุณย้ายไปที่ไดเรกทอรีอื่นมันจะชี้ไปที่อื่นเพราะเป็นลิงก์ที่เกี่ยวข้อง สิ่งนี้จะมีประโยชน์หากคุณต้องการแบ็คอัพทรีย่อยและยังคงมีลิงค์ทำงานอยู่ในการสำรองข้อมูล
Joe


2

นอกจากคำตอบอื่น ๆ ระบบไม่อนุญาตให้เชื่อมโยงไปยังไดเรกทอรีอย่างหนัก:

# ln mydir mpoint
ln: `mydir': hard link not allowed for directory

เมานต์ช่วยให้คุณสร้างลิงก์ได้ยากเช่นชื่อสองชื่อขึ้นไปสำหรับinodeเดียวกัน:

# mount -B mydir/ mpoint/
# ls -d -i *
807175  mpoint/  807175  mydir/

(หนึ่งสามารถค้นหาช่วยสำรอง snapshot ด้วย rsync รุ่นเก่า)

นอกจากนี้โปรดทราบว่าการติดตั้งนี้ไม่สมบูรณ์:

# mount -B -oro mydir/ mpoint/
mount: warning: mpoint/ seems to be mounted read-write.
# mount | grep mpoint
/root/learn/mydir on /root/learn/mpoint type none (rw,bind)

ดังนั้นเมานต์ยังคงอ่านและเขียนแม้ว่าฉันจะขอตัวเลือก ro (อ่านอย่างเดียว)

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