Sự khác biệt giữa liên kết cứng và liên kết tượng trưng là gì?


488

Như tiêu đề đã nói, tôi muốn biết sự khác biệt giữa liên kết cứng và liên kết mềm được tạo bởi lệnh ln. Lệnh man lnkhông cung cấp thông tin, nhưng không trả lời đầy đủ câu hỏi của tôi.

Ngoài ra, thật tuyệt nếu ai đó có thể cung cấp một cài đặt trong đó liên kết cứng có thể thích hợp hơn liên kết tượng trưng.


15
một trong những khác biệt ... bạn có một số tệp, ví dụ kiểm tra tệp. Nếu bạn tạo liên kết kiểm tra ln, hãy tạo liên kết kiểm tra ln -s và sau đó di chuyển kiểm tra tệp sang thư mục khác (hoặc đổi tên), symlink sẽ không hoạt động. Hardlink sẽ hoạt động. Bây giờ hãy thử xóa kiểm tra tập tin. Hardlink vẫn sẽ hoạt động, trên thực tế, bạn vẫn có thể truy cập tệp cho đến khi số lượng liên kết cứng đến tệp không phải là 0. Đó là do inodes, nó được viết bằng tay ...
Denwerko

5
Tôi đã mở lại điều này bởi vì nó xứng đáng có một câu trả lời chung chung về vấn đề này (không giống như câu hỏi trước đó là một ví dụ C tối nghĩa).
Oli

4
Câu trả lời hay nhất: youtube.com/watch?v=aO0OkNxDJ3c
Abhishek Bhatia

1
Cũng có một câu trả lời khá đầy đủ: stackoverflow.com/questions/185899/
Kẻ

@AbhishekBhatia video không khả dụng
Ooker

Câu trả lời:


59

Trong Linux / Unix, Phím tắt được gọi là Liên kết


Liên kết có hai loại: liên kết mềm (liên kết tượng trưng) hoặc liên kết cứng.

  1. Liên kết mềm (liên kết tượng trưng)

    Bạn có thể tạo liên kết đến tệp và thư mục và bạn có thể tạo liên kết (phím tắt) trên phân vùng khác nhau và với số inode khác với bản gốc.

    Nếu bản sao thực sự bị xóa, liên kết sẽ không hoạt động .

  2. Liên kết cứng

    Liên kết cứng chỉ dành cho các tập tin; bạn không thể liên kết đến một tệp trên phân vùng khác với số inode khác nhau.

    Nếu bản sao thực sự bị xóa, liên kết sẽ hoạt động , bởi vì nó truy cập dữ liệu cơ bản mà bản sao thực sự đang truy cập.


Câu hỏi: Làm thế nào để tôi tạo liên kết mềm?

Trả lời: Một liên kết mềm có thể được thực hiện với ln -s; đầu tiên bạn cần xác định nguồn và sau đó bạn cần xác định đích. (Hãy nhớ rằng bạn cần xác định đường dẫn đầy đủ của cả nguồn và đích; nếu không nó sẽ không hoạt động.)

 sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib32/libGL.so.1
             (----------Source-------)             ( Destination )

nhập mô tả hình ảnh ở đây

Như bạn có thể thấy nó có một inode khác và có thể được thực hiện trên một phân vùng khác.


Câu hỏi: Làm thế nào để tôi tạo liên kết cứng?

Trả lời: Một liên kết cứng có thể được thực hiện với ln; đầu tiên bạn cần xác định nguồn và sau đó bạn cần xác định đích. (Hãy nhớ rằng bạn cần xác định đường dẫn đầy đủ của cả nguồn và đích; nếu không nó sẽ không hoạt động.)

Hãy nói rằng tôi có một tập lệnh trong /scriptthư mục có tên firefox.

 ls -i # Shows you the inode
 5898242 firefox

 ln /scripts/firefox /scripts/on-fire
       ( Source )    ( Destination )

nhập mô tả hình ảnh ở đây

Như bạn có thể thấy, nó có cùng một nút. Nếu tôi xóa bản gốc, liên kết sẽ hoạt động và nó sẽ hoạt động như bản gốc.

nhập mô tả hình ảnh ở đây

Ở trên tôi kiểm tra xem liên kết có hoạt động không, rồi xóa tập lệnh firefox gốc.


Câu hỏi của bạn: Sẽ thật tuyệt nếu ai đó có thể cung cấp một cài đặt trong đó liên kết cứng có thể thích hợp hơn liên kết tượng trưng.

Trả lời : Tùy thuộc vào bố cục phân vùng đĩa, Liên kết cứng có giới hạn là chúng phải nằm trên cùng một phân vùng (-1 điểm) và chỉ có thể liên kết đến các tệp (-1 điểm) ), nhưng +1 điểm nếu bản gốc bị xóa liên kết sẽ hoạt động và nó hoạt động như bản gốc.

Mặt khác, một liên kết mềm có thể trỏ đến các thư mục hoặc tệp (+1 điểm) và không có giới hạn phân vùng (+1 điểm), nhưng (-1 điểm) nếu nguồn bị xóa, liên kết sẽ không hoạt động.


Tôi có thể tạo một liên kết cứng và cung cấp inode làm nguồn không?
TMOTTM

324

Một liên kết cứng không phải là một con trỏ tới một tệp, đó là một mục nhập thư mục (một tệp) trỏ đến cùng một nút. Ngay cả khi bạn thay đổi tên của tệp khác, một liên kết cứng vẫn trỏ đến tệp. Nếu bạn thay thế tệp khác bằng phiên bản mới (bằng cách sao chép tệp), một liên kết cứng sẽ không trỏ đến tệp mới. Bạn chỉ có thể có các liên kết cứng trong cùng một hệ thống tập tin. Với các liên kết cứng, bạn không có khái niệm về các tệp và liên kết gốc, tất cả đều bằng nhau (nghĩ về nó như một tham chiếu đến một đối tượng). Đó là một khái niệm cấp độ rất thấp.

Mặt khác, một liên kết tượng trưng thực sự đang trỏ đến một đường dẫn khác (tên tệp); nó giải quyết tên của tệp mỗi khi bạn truy cập nó thông qua liên kết tượng trưng. Nếu bạn di chuyển tệp, symlink sẽ không theo sau. Nếu bạn thay thế tệp này bằng một tên khác, giữ nguyên tên, symlink sẽ trỏ đến tệp mới. Symlinks có thể mở rộng hệ thống tập tin. Với các liên kết tượng trưng, ​​bạn có sự phân biệt rất rõ ràng giữa tệp thực tế và liên kết tượng trưng, ​​không lưu trữ thông tin nào bên cạnh đường dẫn về tệp mà nó trỏ đến.


1
Một điều mà (bằng từ riêng) "trỏ đến tệp" có thể được gọi là một con trỏ (nó gần như là đúng về mặt tautologological). Nếu chúng ta đang nitpicking thì (nói chung) khái niệm liên kết cứng có thể tồn tại ngay cả khi một hệ thống tập tin không sử dụng inodes.
jfs

320

"Một bưc tranh đang gia ngan lơi noi." Ảnh đại diện


Và, "Một ví dụ đáng giá cả trăm đoạn ..."

Tạo hai tệp:

$ touch blah1   
$ touch blah2

Nhập một số dữ liệu vào chúng:

$ echo "Cat" > blah1
$ echo "Dog" > blah2

Và như mong đợi:

$cat blah1; cat blah2
Cat
Dog

Hãy tạo các liên kết cứng và mềm:

$ ln blah1 blah1-hard
$ ln -s blah2 blah2-soft

Hãy xem điều gì vừa xảy ra:

$ ls -l

blah1
blah1-hard
blah2
blah2-soft -> blah2

Thay đổi tên của blah1 không quan trọng:

$ mv blah1 blah1-new
$ cat blah1-hard
Cat

blah1 - điểm cứng vào nút, nội dung của tệp - không thay đổi.

$ mv blah2 blah2-new
$ ls blah2-soft
blah2-soft
$ cat blah2-soft  
cat: blah2-soft: No such file or directory

Không thể tìm thấy nội dung của tệp vì liên kết mềm trỏ đến tên, đã được thay đổi và không liên quan đến nội dung.
Tương tự, nếu blah1 bị xóa, blah1-hard vẫn giữ nội dung; nếu blah2 bị xóa, blah2-soft chỉ là một liên kết đến một tệp không tồn tại.


nguồn: sao chép một cách trắng trợn từ StackOverflow!


13
Để công bằng với bạn - bạn đã thêm hình ảnh đáng yêu ở trên cùng ... ah bạn cũng sao chép điều đó! Kết hợp hai câu trả lời thực sự rất hữu ích :)
icc97

2
giải thích tốt hơn, không nơi nào!
dennisbot

3
Tôi cứ nhìn chằm chằm vào hình ảnh trong 20 giây và rồi, đột nhiên, tôi phát hiện ra nó. Điều này thực sự tuyệt vời.
Mohammed Joraid

1
btw: Sử dụng các liên kết cứng với git là một ý tưởng tồi , chỉ trong trường hợp ai đó (bực bội vì các liên kết mềm) ... cũng có thể áp dụng cho các hệ thống phiên bản khác.
Frank Nocke

1
Là một inode cho các liên kết cứng của nó tương tự như một tệp được lưu trữ trên đám mây cho bất kỳ thiết bị nào truy cập nó?
Ooker

89

Cả hai đều là con trỏ đến tập tin; sự khác biệt là loại con trỏ. Một liên kết tượng trưng chỉ đến một tập tin khác theo tên . Nó có một bit chế độ đặc biệt xác định nó là một liên kết tượng trưng và nội dung của nó là tên của tệp thực. Bởi vì nó chỉ chứa một tên, tên đó không thực sự phải tồn tại hoặc có thể tồn tại trên một hệ thống tập tin khác. Nếu bạn thay thế tệp được đặt tên (thay đổi nội dung của nó mà không ảnh hưởng đến tên của nó), thì liên kết vẫn chứa cùng tên, và vì vậy bây giờ nó trỏ đến tệp mới. Bạn có thể dễ dàng xác định một liên kết tượng trưng và xem tên của tệp mà nó trỏ đến.

Một liên kết cứng trỏ đến tệp bằng số inode. Như vậy, các liên kết cứng không khác gì tên đầu tiên của một tệp. Không có tên "thực" so với tên liên kết cứng; tất cả các liên kết cứng là tên hợp lệ như nhau cho tập tin. Do đó, tệp bạn liên kết phải thực sự tồn tại và nằm trong cùng hệ thống tệp mà bạn đang cố gắng tạo liên kết. Nếu bạn xóa tên gốc, thì liên kết cứng vẫn trỏ đến cùng một tệp. Bởi vì tất cả các liên kết cứng là tên hợp lệ như nhau cho tệp, bạn không thể nhìn vào một và xem các tên khác cho tệp; để tìm thấy điều này, bạn phải xem xét mọi tập tin và so sánh số inode của chúng để tìm (các) tên khác có cùng số inode.

Bạn có thể cho biết có bao nhiêu tên một tệp từ đầu ra của ls -l. Số đầu tiên sau chế độ tập tin là số liên kết. Một tệp có nhiều hơn 1 liên kết có (các) tên khác ở đâu đó và ngược lại, một tệp có số lượng liên kết chỉ có 1 không có liên kết cứng (khác).


If you replace the named file, then the link still contains the same name, and so now it points to the new file- Tôi nghĩ rằng điều này không được giải thích tốt. Ý bạn là nếu tôi thay thế tập tin mà tôi có một liên kết tượng trưng đến, thì các liên kết có chứa tên vẫn còn nguyên. Nhưng nó sẽ chỉ trỏ đến tệp được thay thế khi tên tệp của nó (tức là tệp mới thay thế tệp cũ) giống với tệp được thay thế (tức là tệp cũ đã được thay thế bằng tệp mới), đúng không?
Mike

@Mike, có: liên kết tượng trưng trỏ đến tên tệp gốc, vì vậy thay thế tệp đó có nghĩa là liên kết bây giờ trỏ đến tệp mới.
psusi

Bbut chỉ khi nó có cùng tên chính xác? Symlink sẽ trỏ đến chuối và tôi thay thế tệp bằng màu cam sau đó liên kết sy không thể tìm thấy tệp chuối nữa, tức là nó sẽ không hoạt động
Mike

@Mike, thế giới thay thế có nghĩa là nó có cùng tên, nếu không, bạn chỉ cần xóa một tệp và thêm tệp khác;)
psusi

58

Một liên kết cứng chỉ có thể hoạt động trên cùng một hệ thống tệp, nó chỉ đơn giản là một tên khác cho cùng một nút (các tệp được tham chiếu bên trong bởi các nút). Một tệp sẽ chỉ bị xóa khỏi đĩa khi liên kết cuối cùng đến inode của nó không còn nữa (bạn rmd hoặc unlinkd liên kết cuối cùng). Hardlinks thường chỉ làm việc cho các tập tin, không phải thư mục.

Symlink (liên kết tượng trưng) là một tệp đặc biệt chứa đường dẫn đến tệp khác. Con đường này có thể là tuyệt đối hoặc tương đối. symlink có thể hoạt động trên các hệ thống tệp và thậm chí có thể trỏ đến các tệp khác nhau, ví dụ nếu bạn rút ổ cứng ngoài và thay thế bằng ổ khác, có tệp khác ở cùng một đường dẫn. Một liên kết tượng trưng có thể trỏ đến tập tin hoặc thư mục.


Cảm ơn, điều này cho tôi biết làm thế nào họ làm việc, nhưng chính xác thì liên kết cứng làm gì? Và tại sao nó không hoạt động cho các thư mục?
ste_kwr

@knittl: bạn chắc chứ? Có vẻ như trên một số hệ thống tập tin, các liên kết cứng đến thư mục được cho phép nhưng chỉ root mới có thể tạo chúng. Xem các -d, -F, --directorycông tắc. Và vâng, tôi đã thấy ghi chú trong ln(1)trang :)
0xC0000022L

1
@kniwor: cách dễ nhất để mô tả các liên kết cứng là "chỉ một tên khác cho cùng một tệp (đó là dữ liệu trên đĩa)". Và - ít nhất là trên (các) hệ thống của tôi - lnkhông thể được sử dụng để tạo liên kết cứng đến thư mục. Có tồn tại các liên kết cứng đến thư mục, ví dụ nổi bật nhất là .... Tôi không muốn bao gồm điều đó trong câu trả lời ban đầu của mình, vì điều đó sẽ chỉ làm phức tạp mọi thứ.
knittl

2
@STATUS_ACCESS_DENIED: cũng không sao, nhưng đó thường không phải là một ý kiến ​​hay. Đó là lý do tại sao tôi viết »thường« trong câu trả lời ban đầu của tôi. Cũng xem bình luận trước của tôi cho ví dụ.
knittl

Vì vậy, một liên kết cứng có thể trỏ đến cùng một thư mục / tệp có tên khác nhau, nghĩa là có các tên khác nhau liên kết đến cùng một nút?
Charlie Parker

21

Một trong những câu trả lời từ chủ đề khác (hiện được liên kết từ đầu bài viết của bạn) đề cập đến trang này mà tôi nghĩ là một lời giải thích cấp trung bình khá tốt. Nếu bạn bị lạc trong nghệ thuật ascii, đây là phiên bản tl; dr:

  • Các tệp tiêu chuẩn là một con trỏ từ hệ thống tệp đến một nút, lần lượt trỏ đến dữ liệu vật lý. Thành phần tệp lưu trữ liên kết của nó đến hệ thống tệp (về cơ bản là đường dẫn của nó) và một liên kết đến nút.
  • Liên kết cứng, giống như các tập tin. Chúng chỉ là một con trỏ bổ sung trực tiếp vào một nút.
  • Liên kết tượng trưng là các tệp riêng biệt (bao gồm inode và dữ liệu riêng biệt) lưu trữ đường dẫn hệ thống tệp đến tệp.

Nhân và hệ thống tập tin liên quan dịch mọi thứ trong suốt.

Vì vậy, dựa trên đó:

  • Liên kết cứng chỉ cho phép liên kết cùng hệ thống tập tin. Symlinks có thể chỉ vào bất kỳ con đường.
  • Liên kết cứng (về cơ bản) trỏ đến dữ liệu tuyệt đối. Các liên kết có thể trỏ đến các đường dẫn tương đối (ví dụ ../parent.file)
  • Bằng cách mở rộng, nếu bạn di chuyển con trỏ đích của một liên kết cứng (mà, hãy nhớ, bản chất nó chỉ là một liên kết cứng trỏ đến một nút), liên kết cứng vẫn hoạt động. Di chuyển mục tiêu của một liên kết tượng trưng thường sẽ phá vỡ liên kết tượng trưng.
  • Giải quyết một liên kết cứng sẽ nhanh hơn nhưng vô cùng lớn. Đó là phần không đáng kể của tốc độ đi kèm với chi phí của một hệ thống tập tin không linh hoạt.

Tôi có thể đã nhầm lẫn một chút nhưng đọc qua nhiều thứ khác nhau, tôi đang vật lộn để tìm sự khác biệt giữa một tệp tiêu chuẩn và một liên kết cứng. Cách tôi đọc nó là mỗi tệp bao gồm một liên kết cứng (lưu trữ tên tệp), liên kết đến một nút chỉ vào dữ liệu vật lý.

Thêm một liên kết cứng chỉ cung cấp một nút với một con trỏ dựa trên hệ thống tệp bổ sung. Có đúng không?


5
Tôi nghĩ bạn đã đúng, mỗi tệp là một tên đường dẫn cho một nút và một liên kết cứng là một tên đường dẫn bổ sung cho cùng một nút. Vì vậy, một liên kết cứng không khác với một tập tin bình thường.
enzotib

Tôi đang cố gắng để hiểu điều này ... nhưng bạn nói:> "Liên kết tượng trưng là các tệp riêng biệt (bao gồm inode và dữ liệu riêng biệt ) lưu trữ đường dẫn hệ thống tệp đến một tệp." Liệu một symlink thực sự có dữ liệu riêng biệt? Sau đó, nó giống như một bản sao của thư mục mà nó liên kết đến, phải không? ... Và mỗi khi một cái gì đó được ghi vào symlink, nó phải được ghi hai lần vào đĩa? Làm cho không có ý nghĩa.
MiniGod

@MiniGod Không có một liên kết tượng trưng nào là một nút đến một khối dữ liệu lưu trữ một đường dẫn đến một nút inode khác (tên tệp). Vâng, nó giống như ma trận khó hiểu nhưng một khi bạn đã nhận được nó, bạn sẽ không bao giờ quên :)
Oli

@Oli Tôi có thể bị nhầm lẫn, nhưng khi bạn nói: "bao gồm inode và dữ liệu riêng biệt ", bạn có nghĩa là liên kết tượng trưng có dữ liệu riêng biệt!?
MiniGod

1
@MiniGod Vâng. Symlink là một inode trỏ đến dữ liệu (giống như một tệp bình thường) và dữ liệu đó là một đường dẫn. Thông minh hơn thế một chút - cho phép sử dụng minh bạch thông qua các liên kết tượng trưng - nhưng về cơ bản đó là tất cả những gì chúng có.
Oli

15

Khi nào nên sử dụng Soft Link:

Liên kết trên các hệ thống tệp: Nếu bạn muốn liên kết các tệp trên các hệ thống tệp, bạn chỉ có thể sử dụng liên kết tượng trưng / liên kết mềm.

Liên kết đến thư mục: Nếu bạn muốn liên kết các thư mục, thì bạn phải sử dụng các liên kết Mềm, vì bạn không thể tạo một liên kết cứng đến một thư mục.

Khi nào nên sử dụng Hard Link:

Dung lượng lưu trữ: Liên kết cứng chiếm dung lượng không đáng kể, vì không có nút mới nào được tạo trong khi tạo liên kết cứng. Trong các liên kết mềm, chúng tôi tạo một tệp tiêu thụ dung lượng (thường là 4KB, tùy thuộc vào hệ thống tệp)

Hiệu suất: Hiệu suất sẽ tốt hơn một chút trong khi truy cập một liên kết cứng, vì bạn đang truy cập trực tiếp vào con trỏ đĩa thay vì đi qua một tệp khác. Di chuyển vị trí tệp: Nếu bạn di chuyển tệp nguồn đến một số vị trí khác trên cùng hệ thống tệp, liên kết cứng sẽ vẫn hoạt động, nhưng liên kết mềm sẽ thất bại.

Dự phòng: Nếu bạn muốn đảm bảo an toàn cho dữ liệu của mình, bạn nên sử dụng liên kết cứng, vì trong liên kết cứng, dữ liệu sẽ an toàn, cho đến khi tất cả các liên kết đến các tệp bị xóa, thay vì trong liên kết mềm, bạn sẽ mất dữ liệu nếu bản gốc của tệp bị xóa.


Lưu ý rằng cũng có một liên kết tượng trưng nhanh cho kích thước tên đường dẫn lên đến 64 byte. Nó vẫn chiếm một nút, nhưng không tiêu tốn dung lượng khối 4kb.
syockit

8

Sự nhầm lẫn đặt ra khi bạn cố gắng tìm sự khác biệt giữa "tên tệp" và liên kết cứng vì không có liên kết nào.

Mỗi tệp bạn tạo bao gồm dữ liệu trên đĩa và liên kết cứng - là tên tệp trong thư mục và con trỏ tới dữ liệu trên đĩa. Kết thúc câu chuyện. Khi liên kết cứng cuối cùng (hoặc duy nhất) bị xóa, thì HĐH sẽ biết rằng dữ liệu không còn cần thiết nữa.

Từ đó bạn có thể thấy rằng dữ liệu thực tế không bao giờ bị xóa, chỉ có (các) liên kết cứng là. Và khi nó đủ đông trên đĩa, dữ liệu có thể bị ghi đè bởi dữ liệu của tệp khác. Cho đến lúc đó, dữ liệu từ tệp bị xóa có thể được phục hồi, nhưng thật khó để tìm thấy nếu không có liên kết cứng.

Symlinks, như đã giải thích trước đây, chỉ cần cho bạn biết "có một tệp có tên <targetname>trong thư mục có tên <targetfolder>". Họ chỉ vào liên kết cứng. Họ không biết dữ liệu ở đâu. Các liên kết cứng biết rằng.


0

Nó rất đơn giản. Các tệp (và thư mục!) Được lưu trữ tại các địa chỉ trên thiết bị khối (HDD hoặc bất cứ thứ gì). Thông thường, bạn có một tên duy nhất được ánh xạ tới một địa chỉ và đó là cách bạn nhận được tệp của mình. Một liên kết cứng là một tên thứ hai, thứ ba, vv được ánh xạ đến cùng một địa chỉ. Một liên kết tượng trưng thay vì đề cập đến các biểu tượng - tên - và do đó là một cái tên thứ hai ánh xạ tới tên đầu tiên. Đối với hạt nhân có liên quan, một khi nó đọc mục tiêu liên kết tượng trưng, ​​nó dừng lại và quay lại từ đầu với giá trị đích là tên tệp (ít nhiều) để các liên kết tương đối có thể nhưng cực kỳ vô ích. Tên mục tiêu không được sử dụng ở trên mức hệ thống tập tin trừ khi nó được truy vấn rõ ràng trong mã không gian người dùng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.