Khi nào bạn sẽ sử dụng cái này hơn cái kia?
Khi nào bạn sẽ sử dụng cái này hơn cái kia?
Câu trả lời:
Các ngữ nghĩa khác nhau giữa các liên kết cứng và mềm làm cho chúng phù hợp cho những thứ khác nhau.
Liên kết cứng:
Liên kết tượng trưng (liên kết mềm)
ls -l
sẽ hiển thị đường dẫn nào mà symlink trỏ tới)unlink(2)
. Các tệp "bình thường" (có số lượng liên kết là 1) chỉ là một trường hợp đặc biệt. Nếu nó hữu ích, bạn có thể nghĩ các nút là các đối tượng và đặt tên là các con trỏ được đếm lại (số liên kết của nút là số tham chiếu).
..
và .
.
Điểm của cả hai loại liên kết là cung cấp một cách để làm cho một tệp xuất hiện ở hai vị trí cùng một lúc. Điều này có rất nhiều công dụng. 9 lần trong số 10 bạn muốn sử dụng các liên kết tượng trưng.
Liên kết tượng trưng hoặc "liên kết tượng trưng" hoạt động giống như các phím tắt Windows. Nội dung của một liên kết tượng trưng là một con trỏ đến vị trí thực của tệp / thư mục. Nếu bạn xóa tệp thực, liên kết tượng trưng sẽ trở nên "lơ lửng" và không hoạt động. Xóa symlink không xóa tập tin thực. Bạn có thể có bao nhiêu liên kết tượng trưng cho một tệp (hoặc thậm chí các liên kết tượng trưng khác) tùy thích.
Không giống như Windows, chúng hoạt động ở cấp hệ thống tệp, không phải vỏ hoặc cấp ứng dụng, do đó, hầu như bất kỳ ứng dụng nào cũng sẽ "theo" các liên kết tượng trưng như mong đợi. ls -al
có thể được sử dụng như một cách nhanh chóng để xem nơi liên kết tượng trưng "trỏ" tới.
Hardlinks hoạt động ngay cả ở mức độ thấp hơn. Một liên kết cứng là một mục nhập thư mục thực tế, trên hệ thống tập tin thực tế của tập tin. Về mặt kỹ thuật, một mục nhập thư mục là một liên kết cứng, do đó mỗi tệp có ít nhất một liên kết cứng trong một thư mục ở đâu đó. Các liên kết cứng không tách rời khỏi tệp mà chúng trỏ đến; nếu một tệp có nhiều liên kết cứng trong các thư mục khác nhau, hãy xóa liên kết cứng với các tiện ích như rm
sẽ không thực sự xóa tệp, cho đến khi tất cả các liên kết cứng không còn nữa.
Tôi không thể nghĩ đến tình huống sử dụng các liên kết cứng là phổ biến hoặc thậm chí là cần thiết, trừ khi bạn cố tình muốn ngăn chặn các tệp bị xóa hoặc đang thực hiện một số công việc cấp thấp kỳ lạ với các phân vùng hoặc các thứ khác liên quan đến hệ thống tệp. EDIT: Mặc dù vậy, có những ý tưởng tuyệt vời trong các câu trả lời khác cho câu hỏi này!
ls -l
là đủ để xem những gì đang được liên kết bởi một liên kết tượng trưng, a
viết tắt của --all
, xem manpage. Và ngay cả khi các liên kết tượng trưng hoạt động tại hệ thống tệp, có các chức năng thay thế để sử dụng các liên kết tượng trưng làm tệp thay vì theo dõi.
ln -s /home 1; ls -l 1
cho thấy symlink 1 dài 5 byte, trong khi ln -s /usr/share/ 2; ls -l 2
đó cho thấy 2 dài 11 byte.
Liên kết cứng rất hữu ích cho các cơ chế sao lưu dựa trên đĩa, bởi vì bạn có thể có một cây thư mục đầy đủ cho mỗi bản sao lưu trong khi chia sẻ không gian cho các tệp không thay đổi - và hệ thống tệp theo dõi đếm tham chiếu, vì vậy khi tham chiếu cuối cùng đến một phiên bản nhất định biến mất vì sao lưu đã hết hạn / bị xóa vì lý do không gian, không gian mà nó sử dụng được tự động lấy lại. Một số ứng dụng thư khách cũng sử dụng nó cho các thư được gửi đến nhiều thư mục, vì cùng một lý do.
Liên kết cứng chỉ là tham chiếu đến cùng một không gian đĩa, đó là 'tại sao' bạn không thể liên kết cứng một cái gì đó trong hệ thống tập tin khác.
Symlinks là các tệp liên kết các tệp khác (như các phím tắt Windows), có thể trong cùng một hệ thống tệp, có thể không.
EDIT: Tôi sẽ giải thích một cái gì đó nhiều hơn. Mỗi tệp tồn tại có tối thiểu 1 liên kết cứng. Liên kết cứng là cách để truy cập nội dung của một nút của hệ thống tập tin. Bạn có thể lấy số inode của một tệp với ls -i
và lấy số lượng liên kết cứng stat
như sau trong ví dụ này:
$ stat plantilla-disenos.odt
File: «plantilla-disenos.odt»
Size: 12367 Blocks: 32 IO Block: 4096 fichero regular
Device: 803h/2051d Inode: 319875 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1000/ d4rio) Gid: ( 1000/ d4rio)
Access: 2011-02-11 21:36:19.000000000 -0300
Modify: 2010-03-02 23:27:28.000000000 -0300
Change: 2010-04-10 17:46:27.000000000 -0300
Cảm ơn @geekizard vì tài liệu tham khảo này:
Hạt nhân phải khởi động lại bản dịch pathname-in-inode (duyệt qua cây thư mục) để mở rộng các liên kết tượng trưng, trong khi tất cả các liên kết cứng đều sử dụng cùng một inode. (Bạn sẽ thường thấy điều này được gọi là namei, từ tên của hàm kernel đã làm điều này trong Unix truyền thống.)
và điều này (đã được chỉnh sửa):
Liên kết cứng rất hữu ích cho các cơ chế sao lưu gia tăng dựa trên đĩa như Time Machine của Apple , vì bạn có thể có một cây thư mục đầy đủ cho mỗi bản sao lưu trong khi chia sẻ không gian cho các tệp không thay đổi - và hệ thống tệp theo dõi việc đếm tham chiếu, vì vậy khi tham chiếu cuối cùng cho một phiên bản nhất định biến mất vì sao lưu đã hết hạn / bị xóa vì lý do không gian, không gian mà nó sử dụng sẽ tự động được lấy lại. Một số ứng dụng thư khách cũng sử dụng nó cho các thư được gửi đến nhiều thư mục, vì cùng một lý do.
Chúc mừng
namei
, từ tên của hàm kernel đã làm điều này trong Unix truyền thống.)
stat
sẽ thất bại.
Một liên kết mềm trỏ đến một tên đường dẫn khác. Tên đường dẫn đó có thể thực sự tồn tại. Đường dẫn không được tìm kiếm cho đến khi bạn truy cập vào liên kết tượng trưng. Nếu đường dẫn không tồn tại khi bạn cố truy cập nó, bạn có một liên kết tượng trưng bị hỏng.
Với một liên kết cứng, bạn có một tệp có nhiều tên. Bạn không thể nói rằng một trong số đó là tệp "thực" và những cái khác chỉ là một liên kết đến nó. Họ đều như nhau. Không có thứ gọi là liên kết cứng bị hỏng theo cách có các liên kết tượng trưng bị hỏng.
Liên kết cứng chỉ hoạt động trong một hệ thống tập tin duy nhất. Nếu bạn muốn liên kết đến một tệp trên một hệ thống tệp khác (ví dụ: phân vùng khác hoặc chia sẻ mạng), bạn phải sử dụng liên kết mềm.
Một sự khác biệt lớn là những gì xảy ra khi bạn xóa một tập tin được liên kết. Nếu bạn xóa một trong các cặp tệp được liên kết cứng, sau đó tạo một tệp mới có cùng tên, bạn sẽ có hai tệp riêng biệt (liên kết đã biến mất). Nếu bạn xóa mục tiêu của một liên kết tượng trưng và tạo một tệp mới có cùng tên, liên kết sẽ trỏ đến tệp mới.
liên kết "cứng" chia sẻ cùng một nút
$ touch foo
$ ln foo foolink # Creates a hard link
$ ls -li foo foolink
54996 -rw-r--r-- 2 bsd users 0 2011-12-11 09:06 foo
54996 -rw-r--r-- 2 bsd users 0 2011-12-11 09:06 foolink
Nếu tôi chỉnh sửa foo hoặc crazyink thì chỉ có một tệp và nó sẽ được cập nhật. Nếu tôi chỉ xóa một trong các tên tệp, thì nút và dữ liệu sẽ tồn tại, đánh lừa sẽ tồn tại.
$ rm foo
$ ls -li foo foolink
ls: cannot access foo: No such file or directory
54996 -rw-r--r-- 1 bsd users 0 2011-12-11 09:06 foolink
Nếu tôi tạo cùng một thứ, nhưng với một liên kết "mềm" hoặc tượng trưng, thì Có một tệp, một nút và một tệp mới có nút riêng của nó trỏ đến đầu tiên.
$ touch foo
$ ln -s foo foolink # Create symlink
$ ls -li foo foolink
55029 -rw-r--r-- 1 bsd users 0 2011-12-11 09:11 foo
55033 lrwxrwxrwx 1 bsd users 3 2011-12-11 09:11 foolink -> foo
Nếu tôi chỉnh sửa foo hoặc crazyink thì vẫn chỉ có một tệp và nó sẽ được cập nhật.
Nếu tôi chỉ xóa symlink, inode và dữ liệu sẽ tồn tại. Nếu tôi xóa foo, dữ liệu sẽ biến mất, symlink sẽ tồn tại nhưng trỏ đến một tệp không tồn tại.
$ rm foo
removed `foo'
$ ls -l foo foolink
ls: cannot access foo: No such file or directory
lrwxrwxrwx 1 bsd bsd 3 2011-12-11 09:11 foolink -> foo
Liên kết cứng là các mục thư mục bổ sung cho cùng một tệp. Điều đó có nghĩa là
Nhiều biên tập viên không viết nội dung mới vào cùng một tệp khi lưu mà chỉ thực hiện quy trình sau:
Lược đồ này có nghĩa là mọi liên kết cứng khác đến cùng một tệp sẽ không còn trỏ đến tệp hiện tại, mà là phiên bản trước đó (điều này đúng ngay cả trong trường hợp trình soạn thảo xóa tệp cũ, vì trong Unix, "xóa" tệp chỉ có nghĩa là xóa liên kết của nó, chỉ khi liên kết bị xóa là liên kết duy nhất thì tập tin thực sự bị xóa).
Vì liên kết cứng đi trực tiếp vào tệp, bạn có thể truy cập tệp đó ngay cả khi bạn không có quyền truy cập vào vị trí ban đầu của tệp đó (ví dụ: vì bạn không có bất kỳ quyền nào trên thư mục mà mục nhập ban đầu nằm trong) . Các quyền duy nhất xác định quyền truy cập của bạn là quyền truy cập của chính tệp đó (được liên kết với tệp chứ không phải với liên kết; bạn không thể tạo liên kết cứng với các quyền khác nhau cho cùng một tệp) và quyền truy cập cho đường dẫn liên kết cứng được chứa trong (về cơ bản, quyền thực thi thư mục mà liên kết nằm trong và bất kỳ thư mục mẹ trực tiếp và gián tiếp nào).
Mặt khác, các liên kết tượng trưng lưu trữ tên đường dẫn (tên của tệp - hay đúng hơn là mục nhập thư mục của nó - có khả năng bao gồm đường dẫn của nó, như /bin/sh
hoặc subdir/foo.bar
) - của một tệp khác. Nếu tên đường dẫn là tương đối, nó luôn được giải thích liên quan đến thư mục mà liên kết được chứa trong đó. Điều đó có nghĩa là:
Liên kết tượng trưng có thể đề cập đến các tệp trên một hệ thống tệp khác (ngay cả với hệ thống tệp không hỗ trợ các liên kết cứng hoặc mềm, như FAT).
Nếu tệp gốc bị xóa, liên kết tượng trưng không bảo toàn nội dung tệp. Trừ khi có các liên kết cứng khác đến cùng một tệp, nội dung tệp sẽ không còn nữa. Liên kết tượng trưng sau đó sẽ được treo lủng lẳng (nghĩa là đề cập đến một tên đường dẫn không tương ứng với một mục nhập thư mục). Mặt khác, xóa liên kết tượng trưng không ảnh hưởng đến tệp gốc, vì nó chỉ đề cập đến tên đường dẫn của nó.
Nếu tệp gốc được di chuyển hoặc đổi tên, liên kết tượng trưng không được cập nhật mà còn lơ lửng. Nếu bạn di chuyển liên kết tượng trưng, nó chỉ bị phá vỡ nếu nó chứa một đường dẫn tương đối và đường dẫn không còn hợp lệ từ vị trí mới.
Nếu tệp gốc được thay thế bằng một tệp mới có cùng tên (như trong kịch bản biên tập được mô tả ở trên), liên kết đề cập đến tệp mới.
Hầu hết việc sử dụng các liên kết cứng về cơ bản là một cách để có một bản sao của tệp mà không phải lưu trữ nội dung tệp hai lần. Điều này hoạt động tốt nhất nếu các tệp không bao giờ thay đổi một lần nữa, vì nếu không, rất dễ vô tình phá vỡ liên kết (xem kịch bản biên tập ở trên). Tất nhiên, có những trường hợp bạn muốn liên kết bị hỏng, như trong trường hợp giữ một vài bản sao lưu: Đối với các tệp đã thay đổi trong các bản sao lưu mới hơn, bạn cũng không muốn bản sao trong các bản sao lưu cũ thay đổi.
Thông thường nếu bạn muốn có một liên kết, bạn sẽ sử dụng một liên kết tượng trưng. Một ví dụ là khi bạn di chuyển một thư mục sang một phân vùng khác (vì nó đang đầy), bạn có thể đặt một liên kết mềm từ vị trí cũ sang vị trí mới, vì vậy mọi chương trình cố gắng truy cập thư mục ở vị trí cũ sẽ truy cập nó ở nơi mới thay thế. Điều này sẽ không thể thực hiện được với các liên kết cứng. Tuy nhiên, hãy lưu ý rằng các liên kết tượng trưng trong thư mục đã di chuyển có thể bị hỏng nếu chúng chứa các đường dẫn tương đối dẫn ra khỏi thư mục đã di chuyển.
HARD LINK (Chỉ tệp) so với LINK LINK (Tệp hoặc Thư mục) so với BIND (LIÊN KẾT HARD cho Thư mục)
(nguồn: freesoftwareservers.com )
Trong khi câu trả lời của daxelrod giải thích tốt câu hỏi, tôi nghĩ rằng hình ảnh trong trường hợp này đã tạo ra một sự khác biệt lớn, đặc biệt là đối với những người mới bắt đầu chưa hiểu về inodes và biệt ngữ Linux phức tạp.
Hãy nghĩ về điều này, nếu bạn "xóa" mọi thứ khỏi ổ đĩa của mình, bạn có thể chạy phần mềm để khôi phục dữ liệu, bởi vì 1 và 0 vẫn còn đó, bạn chỉ cần xóa tất cả các Liên kết cứng. Mục đích của Recovery Software là xây dựng lại các Liên kết cứng để hiểu ý nghĩa của 0 và 1
Tôi đã đọc một "một lớp lót" tuyệt vời khiến tất cả đều có ý nghĩa và tôi muốn chia sẻ!
Tất cả các tệp trong Linux là "Liên kết cứng" đến 0 và 1 trên đĩa. Khi bạn tạo dữ liệu (0 & 1), HĐH sẽ tạo Liên kết cứng trong Cây tệp để tham chiếu điểm đó trên đĩa cứng.
Bạn có thể tạo một liên kết cứng khác và xóa tệp gốc và bạn vẫn có quyền truy cập vào liên kết cứng mới được tạo.
Nếu bạn đã xóa HARD LINK 1, bạn có nghĩ LINK LINK sẽ hoạt động không? Không, HĐH sẽ báo cáo lại rằng HARD LINK 1 không tồn tại.
Ngược lại, nếu bạn xóa LINK LINK, liệu HARD LINK có hoạt động không? Đúng. Miễn là HĐH có một tệp HARD LINK, nó sẽ báo cáo rằng phần điền chưa bị xóa.
- Cũng đáng nghiên cứu / lưu ý là BIND, một cách để BIND hai thư mục như symlinking hai thư mục, nhưng nó rõ ràng với HĐH (OS có thể biết khi nào bạn Symlink và một số có quy tắc về thời tiết họ có thể theo Symlinks). Nó sử dụng Mount, không phải LS và có thể được cấu hình thông qua FSTAB.
Một liên kết cứng sẽ giữ một tệp trên đĩa cho đến khi tất cả các liên kết cứng đến nó, ngay cả đầu tiên ("tên tệp" về mặt kỹ thuật là một liên kết cứng), đã bị xóa. Một liên kết mềm có thể được "treo lủng lẳng" cho đến khi tập tin mà nó trỏ (s / ed) tới được thay thế.
Đây là một câu hỏi rất cũ nhưng tôi có một trường hợp sử dụng yêu cầu tôi sử dụng các liên kết cứng.
Tôi là một nhạc sĩ và vì vậy tôi có rất nhiều và rất nhiều tệp âm thanh thuộc nhiều loại khác nhau trên một số ổ đĩa cứng được gắn vào máy Mac của tôi. Terabyte đáng giá. Tôi có chúng hầu hết được tổ chức rất độc đáo với các thư mục symlink để tôi có thể tìm thấy chúng theo nhà xuất bản nội dung, phong cách / âm thanh và các tiêu chí khác dựa trên cách tôi nghĩ lúc đó. Thật không may, một chương trình tôi sử dụng, Ableton Live, hoàn toàn không có khả năng xem bí danh hoặc liên kết tượng trưng từ trình duyệt tệp của nó. Giải pháp duy nhất tôi tìm thấy là tạo các liên kết cứng của các thư mục mà tôi muốn nó có thể xem được, và sau đó mọi thứ hoạt động rất tốt.
Vì vậy, đây là một trường hợp khác khi bạn có thể cần sử dụng các liên kết cứng, điều đó có thể không xảy ra với người khác.