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


768

Gần đây tôi đã được hỏi điều này trong một cuộc phỏng vấn việc làm. Tôi đã thành thật và nói rằng tôi biết cách liên kết tượng trưng hành xử và cách tạo liên kết, nhưng không hiểu cách sử dụng liên kết cứng và nó khác với liên kết tượng trưng như thế nào.


2
về 'không hiểu việc sử dụng một liên kết cứng', nó có thể được sử dụng trong các hệ thống xây dựng có nhiều bản sao nhị phân. Tạo liên kết cứng thay vì sao chép thực tế tăng tốc mọi thứ. MSBuild 4.0 hỗ trợ này.
Ankush

13
Tôi thấy liên kết này rất hữu ích để hiểu nó. Askubfox.com/questions/108771/ Mạnh
kta

2
unix.stackexchange có một danh sách tốt các gạch đầu dòng ... rất hữu ích vì nó đưa ra tất cả các ràng buộc rất chính xác và dễ dàng lướt qua. (rất nhiều trong số các gạch đầu dòng này bao gồm các trường hợp / cảnh báo cạnh chỉ được đề cập trong các bình luận của câu hỏi này ... hoặc hoàn toàn không được đề cập)
Trevor Boyd Smith

Câu trả lời:


781

Bên dưới hệ thống tập tin, các tập tin được thể hiện bằng các nút. (Hoặc là nhiều nút? Không chắc chắn.)

Một tệp trong hệ thống tệp về cơ bản là một liên kết đến một nút.
Sau đó, một liên kết cứng chỉ cần tạo một tệp khác có liên kết đến cùng một nút inode.

Khi bạn xóa một tập tin, nó sẽ xóa một liên kết đến nút bên dưới. Inode chỉ bị xóa (hoặc có thể xóa / ghi quá mức) khi tất cả các liên kết đến inode đã bị xóa.

Một liên kết tượng trưng là một liên kết đến một tên khác trong hệ thống tập tin.

Khi một liên kết cứng đã được thực hiện, liên kết là đến nút. Xóa, đổi tên hoặc di chuyển tệp gốc sẽ không ảnh hưởng đến liên kết cứng khi liên kết đến nút bên dưới. Mọi thay đổi đối với dữ liệu trên nút được phản ánh trong tất cả các tệp tham chiếu đến nút đó.

Lưu ý: Liên kết cứng chỉ có hiệu lực trong cùng một Hệ thống tệp. Liên kết tượng trưng có thể mở rộng hệ thống tệp vì chúng chỉ đơn giản là tên của tệp khác.


2
Tôi chắc rằng các nút i phụ thuộc vào biến thể cụ thể của HĐH; tuy nhiên, tôi tin rằng nó thường là một nút i. Nút i có thông tin về tệp và thông tin về nơi lưu trữ dữ liệu trên đĩa. Các tệp lớn sẽ có con trỏ gián tiếp đến các bảng bổ sung.
terson

76
Bạn có thể muốn thêm tính năng hữu ích mà các liên kết tượng trưng có thể vượt qua các hệ thống tệp, liên kết cứng không thể (chúng phải tham chiếu đến một tệp trên cùng hệ thống tệp).
paxdiablo

52
Có một lời giải thích trực quan tốt trong một bài viết trên Linux Gazette
Coleue

1
Tôi cũng đã viết một blog về điều đó sau khi đọc và thử nghiệm csharpbsharp.tumblr.com
Adnan Bhatti

1
@zen: Bạn có thể ngắt kết nối / kết nối lại hệ thống tệp bất cứ khi nào nó không được sử dụng. Đối với phân vùng gốc, điều này hơi khó nhưng có thể được thực hiện (không được đề xuất). Để làm điều đó cho root, tốt nhất là khởi động đĩa CD giải cứu trước tiên sửa đổi các mount và khởi động lại. Nhưng bạn nên hỏi loại câu hỏi này trên siêu người dùng.
Martin York

464

Một số trực giác tốt có thể giúp ích, sử dụng bất kỳ bảng điều khiển Linux (ish) nào.

Tạo hai tệp:

$ touch foo; touch bar

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

$ echo "Cat" > foo
$ echo "Dog" > bar

(Trên thực tế, tôi có thể đã sử dụng tiếng vang ở nơi đầu tiên, vì nó tạo ra các tệp nếu chúng không tồn tại ... nhưng đừng bận tâm điều đó.)

Và như mong đợi:

$cat foo; cat bar
Cat
Dog

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

$ ln foo foo-hard
$ ln -s bar bar-soft

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

$ ls -l

foo
foo-hard
bar
bar-soft -> bar

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

$ mv foo foo-new
$ cat foo-hard
Cat

foo-hard trỏ đến inode, nội dung của tệp - không thay đổi.

$ mv bar bar-new
$ ls bar-soft
bar-soft
$ cat bar-soft  
cat: bar-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 foobị xóa, foo-hardvẫn giữ nội dung; nếu barbị xóa, bar-softchỉ là một liên kết đến một tệp không tồn tại.


12
điều này có nghĩa là "tập tin" và "liên kết cứng" giống nhau không, cả hai đều trỏ đến một nút? khi xóa tập tin hoặc liên kết cứng, nội dung vẫn tồn tại miễn là người ta vẫn chỉ vào nút phải không?
Daniel W.

1
@DanFromGermany Đúng. Nội dung có thể truy cập miễn là có ít nhất một liên kết cứng (ví dụ: tệp) đang trỏ vào nó.
Adam Matan

6
touch blah1; touch blah2có thể rút ngắn thànhtouch blah1 blah2
Dmitri Zaitsev

11
@DmitriZaitsev Đúng, nhưng nó sẽ khó đọc hơn cho người mới bắt đầu IMO.
Adam Matan

8
Tôi nghĩ rằng đây là câu trả lời dễ hiểu nhất đối với nhiều câu trả lời tôi đã đọc. Một mẫu tốt hơn bó văn bản giải thích.
Scott Chu

435

Như đã nói, một bức tranh đáng giá ngàn lời nói. Đây là cách tôi hình dung nó:

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

Đây là cách chúng ta có được bức tranh đó:

  1. Tạo một tên myfile.txttrong hệ thống tệp trỏ đến một nút mới (chứa siêu dữ liệu cho tệp và trỏ đến các khối dữ liệu có chứa nội dung của nó, tức là văn bản "Xin chào, Thế giới!":

    $ echo 'Hello, World!' > myfile.txt
    
  2. Tạo một liên kết cứng my-hard-linkđến tệp myfile.txt, có nghĩa là "tạo một tệp nên trỏ đến cùng một nút mà myfile.txttrỏ tới":

    $ ln myfile.txt my-hard-link
    
  3. Tạo một liên kết mềm my-soft-linkđến tệp myfile.txt, có nghĩa là "tạo một tệp nên trỏ đến tệp myfile.txt":

    $ ln -s myfile.txt my-soft-link
    

Hãy xem điều gì sẽ xảy ra nếu myfile.txtbị xóa (hoặc di chuyển): my-hard-linkvẫn trỏ đến cùng một nội dung và do đó không bị ảnh hưởng, trong khi my-soft-linkbây giờ chỉ ra không có gì. Các câu trả lời khác thảo luận về ưu / nhược điểm của mỗi.


3
@ThunderWires Bởi "điểm", ý tôi là bất cứ điều gì liên kết tham chiếu. Trong trường hợp liên kết cứng, nó tham chiếu trực tiếp một nút (tức là cùng một nút được tham chiếu bởi myfile.txt). Đối với liên kết mềm, tham chiếu của nó không phải là inode (chứa dữ liệu), mà là tham chiếu của nó là đường dẫn hệ thống tệp đến myfile.txt(ví dụ /home/Documents/myfile.txt)
akivajgordon

4
Tôi thực sự thích phản ứng trực quan của bạn @akivajgordon - thực sự đã giúp tôi hiểu rõ hơn về sự khác biệt!
wmock

7
Mười vạn chữ!
SaganRitual

13
Có thể tôi chậm, nhưng bức ảnh của bạn mới xóa được 20 năm bí ẩn trong khoảng 2 giây.
jdk1.0

3
Câu trả lời hữu ích nhất, tôi điên điều này được chôn sâu trong bài viết này. Tôi sẽ cung cấp cho bạn một trăm điểm internet nhưng thật buồn là tôi chỉ có thể cung cấp cho bạn một điểm.
Dagroom

71

Liên kết cứng rất hữu ích khi tệp gốc được di chuyển xung quanh. Ví dụ: di chuyển tệp từ / bin sang / usr / bin hoặc đến / usr / local / bin. Bất kỳ liên kết tượng trưng nào đến tệp trong / bin sẽ bị phá vỡ bởi điều này, nhưng một liên kết cứng, là một liên kết trực tiếp đến nút cho tệp, sẽ không quan tâm.

Các liên kết cứng có thể chiếm ít không gian đĩa hơn vì chúng chỉ chiếm một mục nhập thư mục, trong khi một liên kết tượng trưng cần inode riêng để lưu tên mà nó trỏ đến.

Liên kết cứng cũng mất ít thời gian hơn để giải quyết - liên kết tượng trưng có thể trỏ đến các liên kết tượng trưng khác có trong thư mục liên kết tượng trưng. Và một số trong số này có thể nằm trên NFS hoặc các hệ thống tệp có độ trễ cao khác và do đó có thể dẫn đến lưu lượng truy cập mạng phải giải quyết. Các liên kết cứng, luôn nằm trên cùng một hệ thống tệp, luôn được giải quyết trong một lần tra cứu và không bao giờ liên quan đến độ trễ mạng (nếu đó là một liên kết cứng trên hệ thống tệp NFS, máy chủ NFS sẽ giải quyết và nó sẽ vô hình hệ thống máy khách). Đôi khi điều này rất quan trọng. Không phải cho tôi, nhưng tôi có thể tưởng tượng các hệ thống hiệu suất cao, nơi điều này có thể quan trọng.

Tôi cũng nghĩ rằng những thứ như mmap (2) và thậm chí mở (2) sử dụng chức năng tương tự như các liên kết cứng để giữ cho inode của tệp hoạt động để ngay cả khi tệp bị hủy liên kết (2), thì inode vẫn cho phép quá trình tiếp tục truy cập, và chỉ khi quá trình đóng nó, tập tin mới thực sự biến mất. Điều này cho phép các tệp tạm thời an toàn hơn nhiều (nếu bạn có thể mở và hủy liên kết xảy ra nguyên tử, có thể có API POSIX mà tôi không nhớ, thì bạn thực sự có tệp tạm thời an toàn) nơi bạn có thể đọc / ghi dữ liệu của bạn mà không ai có thể truy cập nó. Vâng, đó là sự thật trước đây / Proc đã cho mọi người khả năng xem xét các mô tả tệp của bạn, nhưng đó là một câu chuyện khác.

Nói về việc này, khôi phục một tệp đang mở trong quy trình A, nhưng không được liên kết trên hệ thống tệp xoay quanh việc sử dụng các liên kết cứng để tạo lại các liên kết inode để tệp không bị mất khi quá trình mở nó đóng hoặc biến mất.


35

Liên kết mềm :

mềm hoặc tượng trưng là phần cắt ngắn hơn so với tệp gốc .... nếu bạn xóa bản gốc, phím tắt không thành công và nếu bạn chỉ xóa phần cắt ngắn thì không có gì xảy ra với bản gốc.

Cú pháp liên kết mềm :ln -s Pathof_Target_file link

Đầu ra: link -> ./Target_file

Bằng chứng: readlink link Cũng trong ls -l linkđầu ra, bạn sẽ thấy chữ cái đầu tiên lrwxrwxrwxl đó là dấu hiệu cho thấy các tập tin là một liên kết mềm.

Xóa liên kết: unlink link

Lưu ý: Nếu bạn muốn, liên kết mềm của bạn có thể hoạt động ngay cả sau khi di chuyển nó đi nơi khác từ thư mục hiện tại. Hãy chắc chắn rằng bạn đưa ra đường dẫn tuyệt đối và không phải đường dẫn tương đối trong khi tạo một liên kết mềm. tức là (bắt đầu từ / root / user / Target_file chứ không phải ./Target_file)

Liên kết cứng:

Liên kết cứng là một bản sao nhân bản hoặc nhiều đường dẫn đến cùng một tệp. Làm một cái gì đó cho tập tin1 và nó xuất hiện trong tập tin 2. Xóa cái này vẫn giữ cái kia ok.

Inode (hoặc tệp) chỉ bị xóa khi tất cả các liên kết (cứng) hoặc tất cả các đường dẫn đến (cùng một tệp) đã bị xóa.

Khi một liên kết cứng đã được tạo, liên kết có nút của tệp gốc. Xóa đổi tên hoặc di chuyển tệp gốc sẽ không ảnh hưởng đến liên kết cứng vì nó liên kết với nút bên dưới. Mọi thay đổi đối với dữ liệu trên nút được phản ánh trong tất cả các tệp tham chiếu đến nút đó.

Cú pháp liên kết cứng :ln Target_file link

Đầu ra: Một tệp có liên kết tên sẽ được tạo với cùng số inode như của Targetfile.

Bằng chứng: ls -i link Target_file (kiểm tra các nút của họ)

Xóa liên kết: rm -f link (Xóa liên kết giống như một tệp bình thường)

Lưu ý : Liên kết tượng trưng có thể mở rộng hệ thống tệp vì chúng chỉ đơn giản là tên của tệp khác. Trong khi các liên kết cứng chỉ có hiệu lực trong cùng một Hệ thống tệp.

Liên kết tượng trưng có một số tính năng liên kết cứng bị thiếu:

  • Liên kết cứng trỏ đến nội dung tập tin. trong khi liên kết mềm trỏ đến tên tệp.
  • trong khi kích thước của liên kết cứng là kích thước của nội dung trong khi liên kết mềm có kích thước tên tệp.
  • Liên kết cứng chia sẻ cùng một nút. Liên kết mềm thì không.
  • Liên kết cứng không thể vượt qua hệ thống tập tin. Liên kết mềm làm.
  • bạn biết ngay nơi một liên kết tượng trưng chỉ đến trong khi với các liên kết cứng, bạn cần khám phá toàn bộ hệ thống tệp để tìm các tệp chia sẻ cùng một nút.

    # find / -inum 517333

    /home/bobbin/sync.sh
    /root/synchro
    
  • liên kết cứng không thể trỏ đến thư mục.

Các liên kết cứng có hai hạn chế:

  • Các thư mục có thể được liên kết cứng. Linux không cho phép điều này duy trì cấu trúc cây tuần hoàn của các thư mục.
  • Một liên kết cứng không thể được tạo trên các hệ thống tập tin. Cả hai tệp phải nằm trên cùng một hệ thống tệp, vì các hệ thống tệp khác nhau có các bảng inode độc ​​lập khác nhau (hai tệp trên các hệ thống tệp khác nhau, nhưng có cùng số inode sẽ khác nhau).

3
"trong khi kích thước của liên kết cứng là kích thước của nội dung trong khi liên kết mềm có kích thước tên tệp." Chỉ cần làm rõ, tạo một liên kết cứng khác chỉ ảnh hưởng đến không gian trống bằng một vài byte.
Ingo

34

Một cách đơn giản để thấy sự khác biệt giữa liên kết cứng và liên kết tượng trưng là thông qua một ví dụ đơn giản. Một liên kết cứng đến một tệp sẽ trỏ đến nơi lưu trữ tệp hoặc inode của tệp đó. Một liên kết tượng trưng sẽ trỏ đến tập tin thực tế.

Vì vậy, nếu chúng ta có một tệp gọi là "a" và tạo liên kết cứng "b" và liên kết tượng trưng "c" mà tất cả đều đề cập đến tệp "a":

echo "111" > a
ln a b
ln -s a c

Đầu ra của "a", "b" và "c" sẽ là:

cat a --> 111
cat b --> 111
cat c --> 111

Bây giờ, hãy xóa tệp "a" và xem điều gì xảy ra với đầu ra của "a", "b" và "c":

rm a
cat a --> No such file or directory
cat b --> 111
cat c --> No such file or directory

Vậy chuyện gì đã xảy ra?

Bởi vì tệp "c" trỏ đến tệp "a", nếu tệp "a" bị xóa thì tệp "c" sẽ không có gì để trỏ đến, trên thực tế, nó cũng bị xóa.

Tuy nhiên, tệp "b" trỏ đến vị trí lưu trữ hoặc nút inode của tệp "a". Vì vậy, nếu tệp "a" bị xóa thì nó sẽ không còn trỏ đến nút, nhưng vì tệp "b" không, nên nút sẽ tiếp tục lưu trữ bất kỳ nội dung nào thuộc về "a" cho đến khi không còn liên kết cứng nào trỏ đến nó nữa.


Có thể hữu ích khi chỉ ra rằng, một tệp là một đối tượng rất trừu tượng và với tất cả những thứ trừu tượng, mục đích thực sự của việc triển khai ở cấp độ cao có thể không được giải thích hợp lý mà không có nguy cơ thổi bay sự trừu tượng.
Cholthi Paul Ttiopic

28

Liên kết tượng trưng liên kết đến một tên đường dẫn. Đây có thể là bất cứ nơi nào trong cây tệp của hệ thống và thậm chí không phải tồn tại khi liên kết được tạo. Đường dẫn đích có thể là tương đối hoặc tuyệt đối.

Liên kết cứng là các con trỏ bổ sung cho một nút, có nghĩa là chúng chỉ có thể tồn tại trên cùng một âm lượng với mục tiêu. Các liên kết cứng bổ sung đến một tệp không thể phân biệt với tên "gốc" được sử dụng để tham chiếu tệp.


Ngoài ra, khi bạn xóa tệp bạn liên kết đến, một liên kết tượng trưng sẽ bị hỏng, liên kết cứng vẫn còn hiệu lực, vì nó "giữ" tệp trong hệ thống tệp.
njsf

21

Tôi sẽ chỉ bạn đến Wikipedia:

Một vài điểm:

  • Symlinks, không giống như các liên kết cứng, có thể xuyên qua các hệ thống tập tin (hầu hết thời gian).
  • Symlinks có thể trỏ đến thư mục.
  • Liên kết cứng trỏ đến một tệp và cho phép bạn tham chiếu đến cùng một tệp có nhiều hơn một tên.
  • Miễn là có ít nhất một liên kết, dữ liệu vẫn có sẵn.

1
Về lý thuyết (và trong một số trường hợp ngay cả trong thực tế) các liên kết cứng cũng có thể trỏ đến các thư mục (thực tế là "." Là một liên kết cứng đến thư mục hiện tại và ".." là một liên kết cứng đến thư mục mẹ). Nhưng chúng có thể nguy hiểm, vì vậy hầu hết các UNIX không cho phép chúng (hoặc yêu cầu bạn thực hiện các bước đặc biệt để thực hiện). Apple sử dụng chúng để triển khai cỗ máy thời gian của họ, ví dụ: earthlingsoft.net/ssp/blog/2008/03/x5_time_machine
Joachim Sauer

3
Bạn đang chỉ đến một liên kết đến một bài viết ... điều đó có làm cho bạn một liên kết tượng trưng không?
Ian Campbell

@JoachimSauer Bạn có nghĩ rằng hệ thống tệp mới của Apple sẽ loại bỏ sự cần thiết của Time Machine để sử dụng các liên kết cứng đến các thư mục?
cjm

Tôi thấy lời giải thích của wikipedia ngắn hơn và cụ thể hơn nhiều so với lời giải thích trong các câu trả lời được đánh giá tốt nhất.
lakeare

9

Liên kết cứng rất hữu ích khi thực hiện sao lưu gia tăng. Xem rsnapshot , ví dụ. Ý tưởng là sao chép bằng các liên kết cứng:

  • sao chép số dự phòng n thành n + 1
  • sao lưu dự phòng n - 1 đến n
  • ...
  • sao lưu dự phòng 0 sang sao lưu 1
  • cập nhật sao lưu 0 với bất kỳ tập tin thay đổi.

Bản sao lưu mới sẽ không chiếm thêm bất kỳ dung lượng nào ngoài bất kỳ thay đổi nào bạn đã thực hiện, vì tất cả các bản sao lưu gia tăng sẽ trỏ đến cùng một bộ nút cho các tệp không thay đổi.


6

Liên kết cứng vs Liên kết mềm

Liên kết cứng Vs Liên kết mềm có thể dễ dàng giải thích bằng hình ảnh này.


5
Tôi đoán pic liên kết mềm của bạn là không đúng. Điểm: nút của liên kết mềm không được trỏ đến nút của tệp gốc. Nguyên nhân là nếu bạn đổi tên tệp gốc, liên kết mềm có liên quan đã chết
percy507

@ percy507 có bạn đúng - nhưng tôi vẫn thấy đó là một lời giải thích rất hay và trực quan. Chỉ cần tưởng tượng rằng mũi tên giữa các nút không có ở đó ...
Michael Litvin

5

Tôi thêm vào câu hỏi của Nick: khi nào các liên kết cứng hữu ích hoặc cần thiết? Ứng dụng duy nhất xuất hiện trong đầu tôi, trong đó các liên kết tượng trưng sẽ không thực hiện được công việc, là cung cấp một bản sao của tệp hệ thống trong môi trường chroot.


Hệ thống phân tán w / mount điểm ở những nơi khác nhau trên các hệ thống khác nhau. Tất nhiên, điều này có thể được thiết kế ra khỏi hệ thống bằng cách nhất quán.
terson

Tôi nghĩ rằng @Tanktalus đã cung cấp một ví dụ tuyệt vời.
Nick Stinemates

4

Từ MSDN ,

Liên kết tượng trưng

Liên kết tượng trưng là một đối tượng hệ thống tệp trỏ đến một đối tượng hệ thống tệp khác. Đối tượng được chỉ vào được gọi là mục tiêu.

Liên kết tượng trưng là minh bạch cho người dùng; các liên kết xuất hiện dưới dạng các tệp hoặc thư mục bình thường và có thể được người dùng hoặc ứng dụng xử lý theo cách chính xác.

Các liên kết tượng trưng được thiết kế để hỗ trợ di chuyển và tương thích ứng dụng với các hệ điều hành UNIX. Microsoft đã triển khai các liên kết tượng trưng của mình để hoạt động giống như các liên kết UNIX.

Liên kết tượng trưng có thể là liên kết tuyệt đối hoặc tương đối. Liên kết tuyệt đối là các liên kết chỉ định từng phần của tên đường dẫn; các liên kết tương đối được xác định liên quan đến vị trí của các trình xác định liên kết tương đối trong một đường dẫn cụ thể

Một ví dụ về liên kết tượng trưng tuyệt đối

X: "C:\alpha\beta\absLink\gamma\file"
Link: "absLink" maps to "\\machineB\share"
Modified Path: "\\machineB\share\gamma\file"

Một ví dụ về Liên kết tượng trưng tương đối

X: C:\alpha\beta\link\gamma\file
Link: "link" maps to "..\..\theta"
Modified Path: "C:\alpha\beta\..\..\theta\gamma\file"
Final Path: "C:\theta\gamma\file"

Liên kết cứng

Một liên kết cứng là đại diện hệ thống tập tin của một tập tin bằng cách đó hơn một con đường tham chiếu một tập tin duy nhất trong cùng một khối lượng .

Để tạo một liên kết cứng trong các cửa sổ, điều hướng đến nơi liên kết sẽ được tạo và nhập lệnh này:

mklink /H Link_name target_path

Lưu ý rằng bạn có thể xóa các liên kết cứng bất kỳ thứ tự nào, bất kể thứ tự mà chúng được tạo. Ngoài ra, các liên kết cứng không thể được tạo khi

  • tài liệu tham khảo trong các ổ đĩa cục bộ khác nhau
  • tài liệu tham khảo bao gồm ổ đĩa mạng. Nói cách khác, một trong những tài liệu tham khảo là một ổ đĩa mạng
  • liên kết cứng được tạo nằm trong cùng đường dẫn với mục tiêu

Giao lộ

NTFS hỗ trợ một loại liên kết khác gọi là đường giao nhau. MSDN định nghĩa nó như sau:

Một đường nối (còn được gọi là liên kết mềm) khác với một liên kết cứng ở chỗ các đối tượng lưu trữ mà nó tham chiếu là các thư mục riêng biệt và một đường nối có thể liên kết các thư mục nằm trên các ổ đĩa cục bộ khác nhau trên cùng một máy tính . Mặt khác, các mối nối hoạt động giống hệt với các liên kết cứng.

Các phần in đậm trong phần liên kết cứng và phần tiếp giáp cho thấy sự khác biệt cơ bản giữa hai phần.

Lệnh tạo một đường nối trong các cửa sổ, điều hướng đến nơi liên kết sẽ được tạo và sau đó nhập:

mklink /J link_name target_path

3

Cũng thế:

  1. Đọc hiệu suất của các liên kết cứng tốt hơn các liên kết tượng trưng (hiệu suất vi mô)
  2. Liên kết tượng trưng có thể được sao chép, kiểm soát phiên bản, ..v.v. Nói cách khác, chúng là một tập tin thực tế. Mặt khác, liên kết cứng là thứ gì đó ở cấp độ thấp hơn một chút và bạn sẽ thấy rằng so với liên kết tượng trưng, ​​có ít công cụ cung cấp phương tiện để làm việc với các liên kết cứng như liên kết cứng và không phải là tệp thông thường

3

Đơn giản, Liên kết cứng: chỉ là thêm tên mới vào một tệp, có nghĩa là, một tệp có thể có nhiều tên cùng một lúc, tất cả các tên đều bằng nhau, không ai thích, Liên kết cứng không có nghĩa là sao chép tất cả nội dung của tập tin và tạo tập tin mới không phải là nó, nó chỉ tạo ra một tên thay thế được biết đến ..

Liên kết tượng trưng (symlink): là một con trỏ tệp đến một tệp khác, nếu liên kết tượng trưng trỏ đến một tệp hiện có sau đó bị xóa, liên kết tượng trưng tiếp tục trỏ đến cùng một tên tệp mặc dù tên không còn đặt tên cho bất kỳ tệp nào.


3

Những gì bạn nghĩ về một "tập tin" thông thường thực sự là hai điều riêng biệt: Dữ liệu của một tập tin và một mục nhập thư mục. Khi bạn tạo một liên kết cứng cho một tệp, bạn thực sự tạo một mục nhập thư mục thứ hai liên quan đến cùng một dữ liệu. Cả hai mục thư mục có chức năng chính xác như nhau; mỗi cái có thể được sử dụng để mở tập tin để đọc nó. Vì vậy, bạn không thực sự có "một tệp cộng với một liên kết cứng", bạn có "dữ liệu tệp với hai mục nhập thư mục". Những gì bạn nghĩ về việc xóa một tập tin thực sự xóa một mục nhập thư mục và khi mục nhập thư mục cuối cùng cho dữ liệu bị xóa, thì chính dữ liệu đó cũng bị xóa. Đối với các tệp thông thường chỉ có một mục nhập thư mục, xóa mục nhập thư mục sẽ xóa dữ liệu như mọi khi. (Trong khi một tệp được mở, HĐH sẽ tạo một liên kết tạm thời đến tệp,

Ví dụ: tạo tệp A.txt, liên kết cứng B.txt và xóa A.txt. Khi bạn tạo A.txt, một số dữ liệu đã được tạo và mục nhập thư mục A.txt. Khi bạn tạo liên kết cứng, một mục nhập thư mục khác B.txt đã được tạo, trỏ đến cùng một dữ liệu. Khi bạn xóa A.txt, bạn vẫn có tất cả dữ liệu và một mục nhập thư mục B.txt, chính xác như thể bạn đã tạo một tệp B.txt ở vị trí đầu tiên.

Một liên kết mềm chỉ là một tệp thông thường (gần như), ngoại trừ việc nó không chứa dữ liệu, mà là đường dẫn của một mục nhập thư mục khác. Nếu bạn xóa tệp mà liên kết mềm đề cập đến, thì liên kết mềm sẽ chứa đường dẫn không trỏ đến mục nhập thư mục nữa; nó hư rồi. Nếu bạn xóa liên kết mềm, nó giống như xóa bất kỳ tệp nào khác, tệp mà nó trỏ đến không bị ảnh hưởng.


2

Một mục nhập thư mục là liên kết một structrue:

struct dentry{
    ino_t ino;
    char  name[256];
}

Ino là số lượng inode, tên là tên tệp, cấu trúc inode có thể giống như

struct inode{
      link_t nlink; 
      ...
}

ví dụ: bạn tạo một tập tin / 1, mục nhập thư mục có thể như:

struct dentry{
     ino_t ino; /* such as 15 */
     char  name[256]; /* "1" */
} 

cấu trúc inode có thể như:

   struct inode{ /* inode number 15 */
         link_t nlink; /* nlink = 1 */
         ...
    }

sau đó bạn tạo một liên kết cứng (có thể là / 100), mục nhập thư mục có thể như:

  struct dentry{
     ino_t ino; /* 15 */
     char  name[256]; /* 100 */
  }

cấu trúc inode có thể như:

   struct inode{ /* inode numebr 15 */
         link_t nlink; /* nlink = 2 */
         ...
    }

sau đó bạn tạo một liên kết tượng trưng (có thể là / 200) đến tệp 1, mục nhập thư mục có thể như:

  struct dentry{
        ino_t ino; /* such as 16 */
        char  name[256]; /* "200" */
  }

cấu trúc inode có thể như:

   struct inode{ /* inode number 15 */ 
         link_t nlink; /* nlink = 2 */
         ...
    }

   struct inode{ /* inode number 16 */
         link_t nlink; /* nlink = 1 */
         ...
    } /* the data of inode 16 maybe /1 or 1 */

2

Thêm vào tất cả các câu trả lời ở trên, sự khác biệt trong việc tìm tệp cứng và liên kết mềm có thể được hiểu như dưới đây:

Tôi có một tập tin f6trong thư mục hiện tại của tôi, cũng như một thư mục có tênt2 .

Tập tin được đặt tên f1./t2/f2là các liên kết tượng trưng đến f6.

Tập tin có tên f7./t2/f8là liên kết cứng của f6.

Để tìm liên kết mềm cũng như cứng, chúng ta có thể sử dụng:

$ find -L . -samefile f6 

> ./f1
> ./f6
> ./f7
> ./t2/f2
> ./t2/f8

Để chỉ tìm liên kết cứng, chúng ta có thể sử dụng:

$ find . -xdev -samefile f6

> ./f6
> ./f7
> ./t2/f8

Vì các liên kết cứng có thể được tạo trên cùng một hệ thống tệp, chúng tôi có thể tìm kiếm tất cả các liên kết cứng mà không có -Ltùy chọn được sử dụng (với-xdev tùy chọn) trong cùng hệ thống tệp / mount-point. Nó lưu các tìm kiếm không cần thiết vào các điểm gắn kết khác nhau.

Vì vậy, tìm kiếm liên kết cứng có phần nhanh hơn sau đó tìm kiếm các liên kết mềm (Vui lòng chỉnh sửa nếu tôi sai hoặc không rõ ràng).


1

Liên kết tượng trưng đặt tên khác cho một tệp, theo cách tương tự như liên kết cứng. Nhưng một tập tin có thể bị xóa ngay cả khi có các liên kết tượng trưng còn lại.


Không. Liên kết tượng trưng không phải là "tên khác cho cùng một tệp", nó là một tệp theo đúng nghĩa của nó, liên kết đến tệp đích.
Kusalananda

1

Hai xu của tôi khi sử dụng:

Liên kết mềm có thể được sử dụng để rút ngắn tên đường dẫn dài, nghĩa là:

ln -s /long/folder/name/on/long/path/file.txt /short/file.txt

Những thay đổi được thực hiện /short/file.txtsẽ được áp dụng trên tệp gốc.

Liên kết cứng có thể được sử dụng để di chuyển xung quanh các tệp lớn:

$ ls -lh /myapp/dev/
total 10G
-rw-r--r-- 2 root root 10G May 22 12:09 application.bin

ln /myapp/dev/application.bin /myapp/prd/application.bin

Sao chép tức thì vào thư mục khác và tệp gốc (bật /myapp/dev) có thể được di chuyển hoặc xóa mà không cần chạm vào tệp trên/myapp/prd


0

Tôi chỉ tìm thấy một cách dễ dàng để hiểu các liên kết cứng trong một kịch bản phổ biến, cài đặt phần mềm.

Một ngày nọ tôi tải một phần mềm vào thư mục Downloadsđể cài đặt. Sau khi tôi đã làm sudo make install, một số thực thi đã được cped vào thư mục bin cục bộ. Ở đây, cptạo liên kết cứng . Tôi hài lòng với phần mềm nhưng sớm nhận ra rằng đó Downloadskhông phải là một nơi tốt trong thời gian dài. Vì vậy, tôi mved thư mục phần mềm vào thư mục source. Chà, tôi vẫn có thể chạy phần mềm như trước mà không phải lo lắng về bất kỳ điều gì liên kết mục tiêu, như trong Windows. Điều này có nghĩa là liên kết cứng tìm thấy inode trực tiếp và các tệp khác xung quanh.


0

IN câu trả lời này khi tôi nói một tập tin tôi có nghĩa là vị trí trong bộ nhớ

Tất cả dữ liệu được lưu được lưu trữ trong bộ nhớ bằng cấu trúc dữ liệu được gọi là inodes Mỗi inode có inodenumber. Số inode được sử dụng để truy cập inode. Tất cả các liên kết cứng đến một tệp có thể có các tên khác nhau nhưng có chung số inode. Vì tất cả các liên kết cứng có cùng một inodenumber (mà inturn truy cập vào cùng một nút), tất cả chúng đều trỏ đến cùng một bộ nhớ vật lý.

Liên kết tượng trưng là một loại tệp đặc biệt. Vì vậy, đây cũng là một tệp, nó sẽ có một tên tệp và số inode. Như đã nói ở trên số inode tích hợp một inode trỏ đến dữ liệu. các inodenumbers trong các liên kết tượng trưng truy cập vào các nút đó trỏ đến "một đường dẫn" đến một tệp khác. Cụ thể là số inode trong liên kết tượng trưng cho các nút đó trỏ đến một liên kết cứng khác.

Khi chúng tôi đang di chuyển, sao chép, xóa một tệp trong GUI chúng tôi đang chơi với các liên kết cứng của tệp không phải là bộ nhớ vật lý. Khi chúng tôi xóa một tệp, chúng tôi sẽ xóa liên kết cứng của tệp. chúng tôi sẽ không xóa bộ nhớ vật lý. Nếu tất cả các liên kết cứng đến tệp bị xóa thì sẽ không thể truy cập dữ liệu được lưu trữ mặc dù nó vẫn có thể có trong bộ nhớ

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.