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


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 ln 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, nó sẽ là tốt đẹp nếu ai đó có thể cung cấp một thiết lập nơi liên kết cứng có thể được ưa thích hơn một liên kết tượng trưng.


447
2018-02-29 09:03


gốc


một trong những khác biệt ... bạn có một số tập tin, ví dụ như kiểm tra tập tin. Nếu bạn tạo ln test hardlink, hãy tạo liên kết ln -s test và sau đó di chuyển file test sang dir 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. Hardlink sẽ vẫn làm việc, trên thực tế bạn sẽ vẫn có thể acces tập tin cho đến khi số lượng các liên kết cứng để tập tin isnt 0. Thats vì inodes, nó được viết bằng tay ... - Denwerko
Tôi đã mở cửa trở lại vì nó xứng đáng là 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♦
Câu trả lời hay nhất: youtube.com/watch?v=aO0OkNxDJ3c - Abhishek Bhatia
Câu trả lời khá hoàn chỉnh: stackoverflow.com/questions/185899/… - Elzo Valugi
@AbhishekBhatia video không khả dụng - Ooker


Các câu trả lời:


 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 các 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 số gốc.

    Nếu thực bản sao bị xóa, liên kết sẽ không làm việc.

  2. Liên kết cứng

    Các liên kết cứng chỉ dành cho các tệp; 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.

    Nếu thực bản sao 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 đang truy cập.


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

Câu 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 phải 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 )

enter image description here

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


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

Câu 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 phải 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.)

Giả sử tôi có một kịch bản trong /script thư mục có tên firefox.

 ls -i # Shows you the inode
 5898242 firefox

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

enter image description here

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

enter image description here

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


Bạn Câu hỏi: Sẽ rất tuyệt nếu ai đó có thể cung cấp một thiết lập nơi liên kết cứng có thể thích hợp hơn một liên kết tượng trưng.

Câu 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 rằng chúng phải ở cùng một phân vùng ( -1 điểm ) và chỉ có thể liên kết đến tệp ( -1 điểm ) ), nhưng +1 điểm nếu bản gốc bị xóa thì 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 (điểm +1) và không có giới hạn phân vùng (điểm +1), nhưng (-1 điểm) nếu nguồn bị xóa, liên kết sẽ không hoạt động.


32
2018-05-09 00:42





Liên kết cứng không phải là con trỏ tới tệp, đó là mục nhập thư mục (tệp) trỏ đến cùng một inode. 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 nó), 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. Với các liên kết cứng bạn không có khái niệm về các tệp gốc và các liên kết, 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ự trỏ đến một đường dẫn khác (tên tệp); nó giải quyết tên của tập tin mỗi khi bạn truy cập nó thông qua các liên kết tượng trưng. Nếu bạn di chuyển tệp, liên kết tượng trưng sẽ không theo. Nếu bạn thay thế tệp bằng một tệp khác, giữ tên, liên kết tượng trưng sẽ trỏ đến tệp mới. Các liên kết có thể mở rộng các 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 và liên kết tượng trưng, ​​không lưu trữ thông tin bên cạnh đường dẫn về tệp mà nó trỏ tới.


314
2018-05-18 09:51



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


"Một bưc tranh đang gia ngan lơi noi." Pictorial representation


Và, "Một ví dụ trị giá một trăm đoạn vă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 những 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-cứng điểm đến inode, nội dung, của tập tin - mà không được 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, tên đã được thay đổi và không cho 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: blatantly sao chép nó từ StackOverflow!


294
2017-07-21 07:33



Để 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! Kết hợp hai câu trả lời thực sự rất hữu ích :) - icc97
giải thích tốt hơn, hư không! - dennisbot
Tôi cứ nhìn chằm chằm vào hình ảnh trong 20 giây và sau đó, đột nhiên, tôi đã tìm ra nó. Điều này thực sự tuyệt vời. - Mohammed Joraid
btw: Sử dụng liên kết cứng với git  là một ý tưởng tồi, chỉ trong trường hợp ai đó (thất vọng về các liên kết mềm) kỳ diệu ... cũng có thể áp dụng cho các hệ thống phiên bản khác. - Frank Nocke
Là một inode để hardlinks của nó tương tự như một tập tin được lưu trữ trong đám mây để bất kỳ thiết bị truy cập nó? - Ooker


Cả hai đều là con trỏ tới các tệp; sự khác biệt là loại của con trỏ. Một liên kết tượng trưng trỏ đến một tệp khác bằng tên. Nó có một bit chế độ đặc biệt xác định nó như 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 tin thực. Bởi vì nó chỉ chứa một tên, tên đó không thực sự 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 tin đượ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 tin 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ỏ tới.

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 với 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 đều có tên hợp lệ cho tệp. Bởi vì điều này, các tập tin bạn liên kết đến phải thực sự tồn tại và được trong cùng một hệ thống tập tin mà bạn đang cố gắng để tạo ra các 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 đều là tên hợp lệ cho các tập tin, bạn không thể nhìn vào một và xem các tên khác cho tập tin; để tìm thấy điều này, bạn phải xem xét mọi tệp 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 tệp có từ đầu ra của ls -l. Số đầu tiên sau chế độ tệp là số liên kết. Một tệp có nhiều hơn 1 liên kết có tên khác ở đâu đó và ngược lại, tệp có số liên kết chỉ 1 không có liên kết cứng (khác).


87
2018-05-18 15:23



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 rõ. Bạn có nghĩa là nếu tôi thay thế các tập tin mà tôi có một liên kết tượng trưng đến, sau đó các liên kết có chứa tên vẫn bị ảnh hưởng. 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
@ Tương tự, có: các điểm liên kết tượng trưng đến tên tệp gốc, do đó, thay thế tệp đó có nghĩa là liên kết hiện trỏ đến tệp mới. - psusi
Bbut chỉ khi nó có cùng tên đúng không? Điểm liên kết sẽ đến chuối và tôi thay thế tệp bằng màu cam thì 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ỉ xóa một tệp và thêm một tệp khác;) - psusi


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 inode (các tệp được tham chiếu bên trong bằng các inode). 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ó biến mất (bạn rmd hoặc unlinkd liên kết cuối cùng). Các liên kết cứng thường chỉ hoạt động đối với các tệp chứ không phải các thư mục.

Một liên kết tượng trưng (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ể làm việc trên các hệ thống tập tin, và thậm chí có thể trỏ đến các tập tin khác nhau, ví dụ như bạn tháo một ổ đĩa cứng gắn ngoài và thay thế nó bằng một ổ khác, trong đó có một 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 một trong hai tệp hoặc thư mục.


57
2018-02-29 09:20



Cảm ơn, điều này cho tôi biết cách họ làm việc, nhưng chính xác thì liên kết cứng sẽ 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ắn? Có vẻ như trên một số hệ thống tập tin hardlinks đến các thư mục được cho phép nhưng chỉ root mới có thể tạo chúng. Xem -d, -F, --directory công tắc. Và vâng, tôi có nhìn thấy ghi chú trong ln(1) trang :) - 0xC0000022L
@kniwor: cách dễ nhất để mô tả liên kết cứng là "chỉ một tên khác cho cùng một tệp (có nghĩa là, dữ liệu trên đĩa)". Và - ít nhất là trên (các) hệ thống của tôi - ln không thể được sử dụng để tạo các liên kết cứng đến các thư mục. Có tồn tại các liên kết cứng đến các thư mục, ví dụ nổi bật nhất là . và ... Tôi không muốn bao gồm điều đó trong câu trả lời ban đầu của tôi, vì điều đó sẽ chỉ làm phức tạp mọi thứ. - knittl
@STATUS_ACCESS_DENIED: được rồi ... nhưng đó không phải là ý 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. Ngoài ra, hãy xem nhận xét trước của tôi về các ví dụ. - knittl
do đó, một liên kết cứng có thể trỏ đến cùng một thư mục / tệp với các tên khác nhau, tức là có các tên khác nhau liên kết với cùng một inode? - Charlie Parker


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 đăng của bạn) trang này mà tôi nghĩ là một lời giải thích mức 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 tin chuẩn là một con trỏ từ hệ thống tập tin đến một inode mà 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ó tới hệ thống tệp (về cơ bản là đường dẫn của nó) và một liên kết đến inode.
  • Liên kết cứng, giống như tệp. Chúng chỉ là một con trỏ bổ sung trực tiếp đến một inode.
  • Liên kết tượng trưng là các tệp riêng biệt (bao gồm cả inode và dữ liệu riêng biệt) lưu trữ đường dẫn hệ thống tệp vào tệp.

Các hạt nhân và hệ thống tập tin liên quan đến dịch tất cả mọi thứ một cách minh bạch.

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

  • Các liên kết cứng chỉ cho phép liên kết cùng một hệ thống tập tin. Các liên kết có thể trỏ tới bất kỳ đường dẫn nào.
  • 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 (trong đó, hãy nhớ rằng bản thân nó chỉ là một liên kết cứng trỏ đến một inode), liên kết cứng vẫn hoạt động. Di chuyển đích của 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 như vậy. Đó là phần đá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 bản thân mình một chút nhưng đọc qua những thứ khác nhau, tôi đang đấu tranh để tìm sự khác biệt giữa một tập tin tiêu chuẩn và một liên kết cứng. Cách tôi đọc nó là mỗi tập tin bao gồm một liên kết cứng (lưu trữ tên tập tin), liên kết với một inode trỏ vào dữ liệu vật lý.

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


20
2018-05-18 15:10



Tôi nghĩ rằng bạn là đúng, mỗi tập tin là một tên đường dẫn cho một inode, và một liên kết cứng là một tên đường dẫn bổ sung cho cùng một inode. Vì vậy, một liên kết cứng là 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 cả inode riêng biệt và dữ liệuNó lưu trữ một đường dẫn hệ thống tập tin vào một tập tin. "Có một liên kết tượng trưng thực sự có dữ liệu riêng biệt không? Sau đó, nó giống như một bản sao của thư mục 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 viết hai lần vào đĩa? - MiniGod
@MiniGod Không một liên kết tượng trưng nào là một inode cho một khối dữ liệu lưu trữ đường dẫn đến một inode khác (tên tệp). Vâng, nó giống như ma trận giống như khó hiểu nhưng một khi bạn nhận được nó, bạn sẽ không bao giờ quên :) - Oli♦
@ Tôi có thể bị nhầm lẫn, nhưng khi bạn nói: "bao gồm cả inode riêng biệt và dữ liệu ", bạn có nghĩa là các liên kết tượng trưng có dữ liệu riêng biệt !? - MiniGod
@MiniGod Yeah. Các liên kết là một inode trỏ đến dữ liệu (giống như một tập tin bình thường) và dữ liệu đó là một đường dẫn. Nó thông minh hơn một chút - để cho phép sử dụng trong suốt thông qua các liên kết tượng trưng - nhưng đó thực chất là tất cả. - Oli♦


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

Liên kết trên các hệ thống tập tin: Nếu bạn muốn liên kết các tập tin trên các hệ thống tập tin, bạn chỉ có thể sử dụng các liên kết mềm / 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 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ữ: Các liên kết cứng chiếm không gian rất không đáng kể, vì không có các inode mới đượ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ụ không gian (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 khi truy cập 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 một 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ẽ không thành công.

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


15
2017-09-06 23:48



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 inode, nhưng không tiêu thụ không gian khối 4kb. - syockit


Sự nhầm lẫn đặt trong 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ó.

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ỏ đến 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ệ điều hành 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. Và khi nó đủ đông đúc trên đĩa, dữ liệu có thể bị ghi đè bởi dữ liệu của một tệp khác. Cho đến lúc đó, dữ liệu từ tệp đã xóa có thể được khôi phục nhưng rất khó tìm thấy dữ liệu mà không có liên kết cứng.

Các liên kết tượng trưng, ​​như được 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 một 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. Liên kết cứng biết điều đó.


7
2018-03-01 11:28





Đối với một tuyệt vời người mới- và -ex-Windoze-người dùng-thân thiện giải thích, với sơ đồ đẹp và một Câu hỏi thường gặp xem trang này http://www.geekride.com/hard-link-vs-soft-link/. Của chúng bản quyền những hạn chế ngăn cản tôi trích xuất nội dung của họ, vì vậy đủ để tôi cung cấp liên kết tại đây.

Đây là nỗ lực thứ 2 hoặc thậm chí thứ 3 của tôi trong việc nắm lấy bí ẩn mềm / khó liên kết, luôn ném vào khăn và trì hoãn sự hiểu biết của tôi về một số thời điểm không xác định trong tương lai - ngay sau khi các giải thích và trang-man nhân sâu và quá kỹ thuật với inode và tất cả ...

Thưởng thức!


3
2018-02-10 16:03





Nó rất đơn giản. Các tập tin (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 kỳ thứ gì). Thông thường, bạn có một tên được ánh xạ tới một địa chỉ và đó là cách bạn lấy tệp của mình. A liên kết cứng là tên thứ hai, thứ ba, v.v. được ánh xạ tới cùng một địa chỉ. A liên kết tượng trưng thay vào đó là biểu tượng - tên - và đó là tên thứ hai được ánh xạ tới tên đầu tiên. Theo như 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 trở lại đầu với giá trị đích là tên tệp (nhiều hơn hoặc ít hơn) để các liên kết tương đối có thể nhưng vô cùng hữu ích. Tên mục tiêu không được sử dụng ở trên mức hệ thống tệp ngoại trừ nếu nó được truy vấn một cách rõ ràng trong mã vùng người dùng.


0
2017-07-03 15:39