ปัญหาเดิม
ฉันมีไฟล์ในระบบไฟล์เดียว: /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
หมายเหตุ : ฉันเปลี่ยนชื่อไฟล์และไดเรกทอรีด้วยตนเองเพื่อให้สถานการณ์ชัดเจนขึ้นดังนั้นอาจมีการพิมพ์ผิดหรือสองครั้งในการอ่านคำสั่ง
/data
ฉันสามารถเข้าถึงไอโหนดจากไดเร็กทอรี bind mount ดังนั้นทั้ง bind mount จะต้องอยู่ในพาร์ติชั่นเดียวกัน/data
หรือฮาร์ดลิงค์ทำงานบนอุปกรณ์ต่าง ๆ ซึ่งน่าจะผิดกฎหมาย ฉันพลาดอะไรไป