ทำไมฉันไม่สามารถสร้าง "hardlink" ไปยังไฟล์จากไดเรกทอรี“ mount --bind” ในระบบไฟล์เดียวกันได้


9

ปัญหาเดิม

ฉันมีไฟล์ในระบบไฟล์เดียว: /data/src/file

และฉันต้องการเชื่อมโยงอย่างหนักกับ: /home/user/proj/src/file

แต่/homeอยู่ในดิสก์หนึ่งและ/dataอยู่ในอีกดิสก์หนึ่งดังนั้นฉันจึงได้รับข้อผิดพลาด:

$ cd /home/user/proj/src
$ ln /data/src/file .
ln: failed to create hard link './file' => '/data/src/file': Invalid cross-device link

ตกลงดังนั้นฉันเรียนรู้ว่าฉันไม่สามารถลิงก์ข้ามอุปกรณ์ได้ยาก มีเหตุผล.

ปัญหาที่เกิดขึ้น

ดังนั้นฉันคิดว่าฉันจะได้รับแฟนซีและผูกติดsrcโฟลเดอร์ที่อยู่ใน/dataระบบไฟล์ของ:

$ mkdir -p /data/other/src
$ cd /home/user/proj
$ sudo mount --bind /data/other/src src/
$ cd src
$ # (now we're technically on `/data`'s file system, right?)
$ ln /data/src/file .
ln: failed to create hard link './file' => '/data/src/file': Invalid cross-device link

ทำไมสิ่งนี้ถึงไม่ทำงาน?

วิธีแก้ปัญหา

ฉันรู้ว่าฉันมีการตั้งค่านี้ถูกต้องเพราะฉันสามารถสร้างฮาร์ดลิงก์ได้ตราบใดที่ฉันอยู่ใน/dataไดเรกทอรี"ของจริง" แทนที่จะเป็นลิงก์ที่ถูกผูกไว้

$ cd /data/other/src
$ ln /data/src/file .
$ # OK
$ cd /home/user/proj/src
$ ls -lh
total 35M
-rw------- 2 user user 35M Jul 17 22:22 file

$

ข้อมูลระบบบางอย่าง

$ uname -a
Linux <host> 4.10.0-24-generic #28-Ubuntu SMP Wed Jun 14 08:14:34 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

$ findmnt
.
.
.
├─/home                               /dev/sdb8   ext4       rw,relatime,data=ordered
│ └─/home/usr/proj/src             /dev/sda2[/other/src]
│                                                 ext4       rw,relatime,data=ordered
└─/data                               /dev/sda2   ext4       rw,relatime,data=ordered

$ mountpoint -d /data
8:2

$ mountpoint -d /home/usr/proj/src/
8:2

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


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

2
จุดนี่คือไฟล์ไม่ได้อยู่ในพาร์ทิชันที่แตกต่างกันทางกายภาพ มันเป็นระบบไฟล์เดียวกันจากพาร์ติชันเดียวกัน ความแตกต่างคือการผูกติด
roaima

ผูกติดเป็นเพียงนิยาย มันไม่เปลี่ยนโครงสร้างข้อมูลบนดิสก์ ระบบไฟล์ยังคงแยกจากกัน
Bob Eager

แต่เมื่อฉันสร้างฮาร์ดลิงก์บน/dataฉันสามารถเข้าถึงไอโหนดจากไดเร็กทอรี bind mount ดังนั้นทั้ง bind mount จะต้องอยู่ในพาร์ติชั่นเดียวกัน/dataหรือฮาร์ดลิงค์ทำงานบนอุปกรณ์ต่าง ๆ ซึ่งน่าจะผิดกฎหมาย ฉันพลาดอะไรไป
jdk1.0

คำตอบ:


6

มีการขาดที่น่าผิดหวังของความคิดเห็นในเรื่องรหัส มันเหมือนกับไม่มีใครคิดว่ามันมีประโยชน์เพราะเวลาที่ใช้การเชื่อมโยงถูกนำมาใช้ใน v2.4 แน่นอนว่าสิ่งที่คุณต้องทำคือแทนที่.mnt->mnt_sbที่มันบอกว่า.mnt...

เพราะมันทำให้คุณมีขอบเขตความปลอดภัยรอบทรีย่อย

PS: ที่มีการหารือกันหลายครั้ง แต่เพื่อหลีกเลี่ยงการค้นหา: พิจารณาเช่น Mount - ผูก / tmp / tmp; ตอนนี้คุณมีสถานการณ์เมื่อผู้ใช้ไม่สามารถสร้างลิงก์ไปยังที่อื่น ๆ โดยไม่มีรูท fs แม้ว่าพวกเขาจะสามารถ / tmp เขียนได้ เทคนิคที่คล้ายกันนี้สามารถใช้ได้กับความต้องการด้านการแยกอื่น ๆ โดยทั่วไปคุณสามารถ จำกัด การเปลี่ยนชื่อ / ลิงค์ไปยังทรีย่อย IOW มันเป็นคุณสมบัติที่มีเจตนา โปรดทราบว่าคุณสามารถผูกต้นไม้ไว้ใน chroot และรับข้อ จำกัด ที่คาดเดาได้โดยไม่คำนึงว่าสิ่งของจะได้รับการจัดเรียงใหม่ในอีกหนึ่งปีต่อมาในต้นไม้หลัก ฯลฯ

- อัลวิโร

มีตัวอย่างที่เป็นรูปธรรมยิ่งกว่านั้นในเธรด

เมื่อใดก็ตามที่เราทำให้ mount -r - ผูกทำงานอย่างถูกต้อง (ซึ่งฉันใช้เพื่อวางสำเนาของไลบรารีที่ใช้ร่วมกันที่จำเป็นภายในคุก chroot ในขณะที่อนุญาตการแชร์แคชของหน้า) คุณลักษณะนี้จะทำลายความปลอดภัย

mkdir /usr/lib/libs.jail
for i in $LIST_OF_LIBRARIES; do
ln /usr/lib/$i /usr/lib/libs.jail/$i
done
mount -r /usr/lib/libs.jail /jail/lib
chown prisoner /usr/log/jail
mount /usr/log/jail /jail/usr/log
chrootuid /jail prisoner /bin/untrusted &

แม้ว่าการป้องกันควรจะเพียงพอ แต่ฉันควรหลีกเลี่ยงการมีลิงก์นักโทษ /jail/lib/libfoo.so (การเขียนคืนค่า EROFS) ไปที่ / jail / usr / log ที่อาจเขียนได้


-1

เหตุผลที่คุณไม่สามารถทำการเชื่อมโยงข้ามอุปกรณ์ได้เพราะคุณมีความกำกวม รายการไดเร็กทอรีสำหรับไฟล์มี (ในระบบแบบง่าย) หมายเลข i-node สำหรับไฟล์ที่เกี่ยวข้อง ฮาร์ดลิงก์ (เพียงรายการไดเร็กทอรีอื่น) ยังต้องมีหมายเลข i-node เดียวกัน นี่เป็นเรื่องปกติ แต่หมายเลข i-node นั้นไม่ซ้ำกันภายในระบบไฟล์เดียว

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

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

ลองลิงค์สัญลักษณ์? ( ln -s)


จะไม่มีชื่อสำหรับการเรียงลำดับหมายเลข inode ใด ๆ ที่นี่ มีระบบไฟล์พื้นฐานเดียวเท่านั้นที่มีสองมุมมอง
Gilles 'หยุดความชั่วร้าย'

ls -lเหตุผลหนึ่งที่ผมไม่ได้ต้องการการเชื่อมโยงสัญลักษณ์เป็นเพราะเส้นทางของฉันได้นานและมันก็ยุ่งทำ Kinda โง่เหตุผลในตอนแรก แต่แล้วมันนำไปสู่โพรงกระต่ายและฉันก็อยากรู้ว่าสิ่งที่เกิดขึ้นกับการเชื่อมโยงที่ยาก ...
jdk1.0

@Gilles นั่นคือสิ่งที่ฉันพูด จุดที่ฉันทำก็คือการเรียงลำดับหมายเลข inode จะไร้สาระ ไม่ทราบว่าทำไมคำตอบที่ถูกต้องจึงถูกแก้ไข
Bob Eager

คุณได้ข้อสรุปที่ถูกต้อง แต่คำอธิบายของคุณผิดในหลาย ๆ ที่ที่คำตอบโดยรวมของคุณนั้นทำให้เข้าใจผิดมาก ดูคำตอบของ sourcejedi สำหรับคำอธิบายที่ดี
Gilles 'หยุดชั่วร้าย'

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