ทำไมฉันไม่สามารถสร้างฮาร์ดลิงก์จากไฟล์อุปกรณ์ในไดเรกทอรีอื่นที่ไม่ใช่ / dev


11

เมื่อฉันต้องการสร้างการเชื่อมโยงอย่างหนักใน/homeไดเรกทอรีของฉันในโหมดราก , Linux แสดงข้อความข้อผิดพลาดต่อไปนี้:

ln: failed to create hard link ‘my_sdb’ => ‘/dev/sda1’: Invalid cross-device link

ข้อความแสดงข้อผิดพลาดด้านบนแสดงอยู่ด้านล่าง:

# cd /home/user/
# ln /dev/sda1 my_sdb

แต่ฉันสามารถสร้างฮาร์ดลิงก์ใน/devไดเรกทอรีและเป็นไปไม่ได้ในไดเรกทอรีอื่น

ตอนนี้ฉันต้องการทราบวิธีสร้างฮาร์ดลิงก์จากไฟล์อุปกรณ์ที่มีอยู่ (เช่นsdb1) ใน/homeไดเรกทอรี (หรือไดเรกทอรีอื่น ๆ ) หรือไม่

คำตอบ:


21

แต่ฉันสามารถสร้างฮาร์ดลิงก์ในไดเรกทอรี / dev และเป็นไปไม่ได้ในไดเรกทอรีอื่น

ดังที่แสดงโดยข้อความแสดงข้อผิดพลาดเป็นไปไม่ได้ที่จะสร้างฮาร์ดลิงก์ในระบบไฟล์ที่แตกต่างกัน คุณสามารถสร้างลิงก์นุ่ม (สัญลักษณ์) เท่านั้น

ตัวอย่างเช่นถ้าคุณ/homeอยู่ในพาร์ทิชันที่แตกต่างจากพาร์ทิชันรากของคุณคุณจะไม่สามารถที่จะเชื่อมโยงอย่างหนักเพื่อ/tmp/foo/home/user/

ตอนนี้ตามที่ @RichardNeumann ชี้ให้เห็นว่า/devมักจะติดตั้งเป็นระบบไฟล์ devtmpfs ดูตัวอย่างนี้:

[dr01@centos7 ~]$ df
Filesystem                      1K-blocks    Used Available Use% Mounted on
/dev/mapper/centos_centos7-root  46110724 3792836  42317888   9% /
devtmpfs                          4063180       0   4063180   0% /dev
tmpfs                             4078924       0   4078924   0% /dev/shm
tmpfs                             4078924    9148   4069776   1% /run
tmpfs                             4078924       0   4078924   0% /sys/fs/cgroup
/dev/sda1                         1038336  202684    835652  20% /boot
tmpfs                              815788      28    815760   1% /run/user/1000

ดังนั้นคุณสามารถสร้างฮาร์ดลิงก์ไปยังไฟล์/devภายใน/devเท่านั้น


3
พาร์ติชันไม่ใช่ปัญหา มันเป็นตามที่คุณระบุข้อ จำกัด ข้ามระบบไฟล์ /devมักจะเมาท์เป็นdevtmpfsระบบไฟล์ ดังนั้นคุณสามารถสร้าง hardlinks แฟ้มในภายใน/dev /devคุณเช่นไม่สามารถสร้างฮาร์ดลิงก์ไปที่/dev/nullภายใน/dev/ptsเพราะมันถูกเมาท์ด้วยdevptsเป็นระบบไฟล์อื่น
Richard Neumann

1
@RichardNeumann จุดดี ฉันแก้ไขคำตอบที่ถูกต้องเพียงบางส่วนเท่านั้น
dr_

11

ฮาร์ดลิงก์ไม่สามารถใช้เพื่อให้ได้สิ่งที่คุณต้องการเนื่องจากฮาร์ดลิงก์ไม่ทำงานระหว่างระบบไฟล์

อย่างไรก็ตามคุณสามารถบรรลุสิ่งที่คุณต้องการด้วยmknodคำสั่ง

  1. ls -l /dev/devicefileวิ่ง คุณควรเห็นผลลัพธ์เช่นนี้

    crw-rw-rw- 1 root root 1, 9 Mar 29 15:46 /dev/urandom
    
  2. จดจำนวนในคอลัมน์ขนาด ( 1, 9)
  3. เรียกใช้คำสั่งmknod /path/to/destination c 1 9(แทนค่าที่คุณต้องการ)

ทำไมจึงใช้งานได้

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



2

ฮาร์ดลิงก์จะสร้างรายการใหม่ในไดเรกทอรีโดยชี้ไปที่ไฟล์ ดังนั้นฮาร์ดลิงก์ไม่สามารถอ้างอิงไฟล์ในระบบไฟล์อื่นได้

ซอฟต์ลิงค์คือคุณเป็นเพื่อนในกรณีนี้ ln -sใช้ ซอฟต์ลิงค์สามารถไปข้ามระบบไฟล์และสามารถชี้ไปยังสิ่งที่ไม่มี

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