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


37

Một liên kết cứng được định nghĩa là một con trỏ đến một nút. Một liên kết mềm , còn được gọi là liên kết tượng trưng , được định nghĩa là một tệp độc lập trỏ đến một liên kết khác mà không bị hạn chế bởi các liên kết cứng.

Sự khác biệt giữa một tập tin và một liên kết cứng là gì? Một liên kết cứng trỏ đến một nút, vậy một tập tin là gì? Các mục inode chính nó? Hoặc một inode với một liên kết cứng?

Hãy nói rằng tôi tạo một tập tin với cảm ứng. Sau đó, một mục nhập inode được tạo ra trong bảng inode . Và tôi tạo một liên kết cứng, có cùng số inode với tệp. Vì vậy, tôi đã tạo một tập tin mới? Hoặc là tập tin chỉ được định nghĩa là một nút?


Đây gần như chắc chắn là một bản sao của unix.stackexchange.com/questions/9575/ trên
kết hợp vào

7
@infixed Chính xác là không, tôi đang hỏi sự khác biệt của một tập tin và một liên kết cứng.
Levent Divilioglu

Vì vậy, tôi đã xóa bỏ câu trả lời ban đầu của mình mà tôi tin rằng cũng được bao phủ trong các câu trả lời cho câu hỏi được liên kết đó. Vì vậy, nó vẫn "chính xác không"?
vào

7
Sự khác biệt giữa một tệp và một liên kết cứng giống như sự khác biệt giữa bạn và dòng có tên của bạn trong danh bạ.
Jörg W Mittag

Câu trả lời:


61

Câu trả lời rất ngắn gọn là:

  • một tập tin là một kho dữ liệu ẩn danh
  • một liên kết cứng là tên của một tập tin
  • một liên kết tượng trưng là một tệp đặc biệt có nội dung là tên đường dẫn

Các tệp và thư mục Unix hoạt động chính xác như các tệp và thư mục trong thế giới thực (và không giống như các thư mục trong thế giới thực); Các hệ thống tập tin Unix được cấu trúc (về mặt khái niệm) như thế này:

  • một tập tin là một blob ẩn danh của dữ liệu; Nó không có tên, chỉ có một số (inode)
  • một thư mục là một loại tệp đặc biệt chứa ánh xạ tên đến các tệp (cụ thể hơn là các nút); vì một thư mục chỉ là một tệp, các thư mục có thể có các mục cho các thư mục, đó là cách thức đệ quy được thực hiện (lưu ý rằng khi các hệ thống tệp Unix được giới thiệu, điều này không rõ ràng, rất nhiều hệ điều hành không cho phép các thư mục chứa các thư mục trở lại sau đó)
  • các mục thư mục này được gọi là liên kết cứng
  • một liên kết tượng trưng là một loại tệp đặc biệt khác, có nội dung là tên đường dẫn; tên đường dẫn này được hiểu là tên của một tệp khác
  • các loại tệp đặc biệt khác là: ổ cắm, fifos, thiết bị khối, thiết bị ký tự

Hãy ghi nhớ ẩn dụ này và đặc biệt ghi nhớ rằng các thư mục Unix hoạt động như các thư mục trong thế giới thực và không giống như các thư mục trong thế giới thực giải thích nhiều "điều kỳ lạ" mà người mới sử dụng thường gặp, như: tại sao tôi có thể xóa một tệp tôi không ' t có quyền truy cập viết? Chà, đối với một người, bạn không xóa tệp, bạn đang xóa một trong nhiều tên có thể có của tệp và để làm điều đó, bạn chỉ cần truy cập ghi vào thư mục, không phải tệp. Giống như trong thế giới thực.

Hoặc, tại sao tôi có thể có các liên kết lơ lửng? Chà, symlink chỉ đơn giản chứa một tên đường dẫn. Không có gì nói rằng thực sự phải có một tập tin với tên đó.

Câu hỏi của tôi chỉ đơn giản là sự khác biệt của một tập tin và một liên kết cứng là gì?

Sự khác biệt giữa một tập tin và một liên kết cứng giống như sự khác biệt giữa bạn và dòng với tên của bạn trong danh bạ điện thoại.

Liên kết cứng đang trỏ đến một nút, vậy một tập tin là gì? Nhập vào chính nó? Hoặc một Inode với một liên kết cứng?

Một tập tin là một phần dữ liệu ẩn danh. Đó là nó. Một tệp không phải là một nút, một tệp một nút, giống như bạn không phải là Số An sinh Xã hội, bạn SSN.

Một liên kết cứng là một tên cho một tập tin. Một tập tin có thể có nhiều tên.

Giả sử, tôi tạo một tệp bằng cảm ứng, sau đó một mục Inode được tạo trong Bảng Inode .

Vâng.

Và tôi tạo một liên kết cứng, có cùng số Inode với tệp.

Không. Một liên kết cứng không có số inode, vì nó không phải là một tập tin. Chỉ các tệp có số inode.

Các liên kết cứng liên kết một tên với một số inode.

Vì vậy, tôi đã tạo một tập tin mới?

Vâng.

Hoặc tập tin chỉ được định nghĩa là một nút?

Không. Tập tin có một nút, nó không phải là một nút .


15
Tôi chưa bao giờ thực sự hiểu (hoặc nghĩ đúng về) ẩn dụ đằng sau từ "thư mục". Ví dụ về danh bạ điện thoại là một ví dụ tuyệt vời; có lẽ bạn nên giới thiệu nó sớm hơn (khi bạn lần đầu tiên đề cập đến thế giới thực). Tương tự, hầu hết mọi người hiếm khi xử lý các "tệp" bên ngoài máy tính, vì vậy có lẽ sẽ rõ ràng hơn khi nói "giống như các tệp giấy và một thư mục như danh bạ điện thoại".
IMSoP

2
@IMSoP Đó là một khoảng cách thế hệ. Trước máy tính, một danh bạ điện thoại là một trong những loại thư mục. Từ điển Cambridge nói: " thư mục: một cuốn sách cung cấp danh sách tên, địa chỉ hoặc các sự kiện khác [... ví dụ] Tra cứu số điện thoại của họ trong danh bạ điện thoại. "
kubanchot

2
@kubanchot Thật vậy - đối với những người làm việc trong các văn phòng tiền kỹ thuật số, tôi đoán các phép ẩn dụ dường như quá rõ ràng đến nỗi cảm thấy gần như hạ mình để giải thích chúng. Nhưng với những người thuộc thế hệ của tôi và bên dưới, nó tối nghĩa như tại sao khu vực lưu trữ ở phía sau xe được gọi là "khởi động" hoặc "cốp", vì vậy bạn phải đánh vần nó ra.
IMSoP

Từ "có" trong cụm từ "Liên kết cứng không có số inode" có thể gây hiểu nhầm, bởi vì sau đó bạn nói rằng "Liên kết cứng liên kết tên với số inode". Cấu trúc dữ liệu của mục nhập thư mục "hardlink" thực sự chứa inode # - đây là cách liên kết được "liên kết" với inode #. Bởi "không có" Tôi nghĩ bạn có nghĩa là liên kết cứng không có inode # cho biết nơi liên kết được lưu trữ trên đĩa.
Kelvin

2
Nói rằng một tập tin một inode là hơi ngược. Inode là cấu trúc chứa thông tin về vị trí "blob của dữ liệu". Nếu không có inode, không có tập tin.
Barmar

18

Một liên kết cứng là một mục thư mục. Một tệp có thể có nhiều mục nhập thư mục, nếu nó xuất hiện dưới các tên khác nhau hoặc trong các thư mục khác nhau. Một mục nhập thư mục được gọi là liên kết cứng cứng nghiêm trọng khi nó được đặt trong mối quan hệ với các mục nhập thư mục khác cho cùng một tệp.

Inode chứa siêu dữ liệu của tệp khác với tên và nội dung của nó (vị trí của nội dung, quyền, dấu thời gian, v.v.). Có một nút trên mỗi tệp. (Không phải tất cả các hệ thống tập tin đều đặt siêu dữ liệu vào một không gian có thể nhận dạng rõ ràng trên đĩa mà bạn có thể gọi là Inodeode, nhưng đó là một kiến ​​trúc phổ biến.) Một mục nhập thư mục liên kết tên với một nút. Có thể có nhiều mục nhập thư mục để liên kết đến cùng một nút, do đó, thuật ngữ này có liên kết. Một liên kết như vậy được gọi là một liên kết cứng của người dùng, do sự đối lập với các liên kết mềm, các liên kết tượng trưng, ​​hoặc không liên quan đến biểu tượng, mà không nói là tên của tên này, hãy sử dụng inode này nhưng tên này, tìm tên khác.

Hãy nghĩ về các tập tin như phòng và các mục thư mục như cửa ra vào. Nỗ lực mở tập tin /foo/barXì gà có nghĩa là đi đến hành lang /foovà đến phòng phòng bar. Đi đến phòng phòng, barthực sự có nghĩa là người Bỉ mở cửa được đánh dấu barvà vào phòng, nhưng vào phòng barthì đây là một cách không đáng kể để nói điều tương tự theo cách ngắn hơn. Có thể có nhiều hơn một cánh cửa dẫn đến cùng một phòng.

Khi bạn tạo một liên kết cứng đến một tệp hiện có ( ln existing new), bạn đang tạo một liên kết thứ hai đến cùng một tệp, tức là bạn đang tạo một mục nhập thư mục mới liên kết đến tệp đã tồn tại. Sau khi tạo, hai mục nhập thư mục có trạng thái bằng nhau: không có mục nào là Chính sơ cấp và một mục đó là thứ cấp, đó chỉ là cả hai liên kết đến cùng một tệp.

Bạn cũng có thể xóa tất cả các liên kết đến một tệp mà không xóa tệp đó. Điều này xảy ra nếu bạn xóa một tệp (tức là bạn xóa tất cả các mục trong thư mục của nó) trong khi chương trình vẫn mở tệp. Các tập tin vẫn còn trên hệ thống tập tin, nó chỉ thực sự bị xóa khi quá trình cuối cùng đã mở tập tin đóng nó. Trong phép ẩn dụ phòng và cửa, một căn phòng không có cửa vẫn chiếm không gian.


lần lượt các liên kết cứng và mềm được giới thiệu lần đầu tiên?
n611x007

2
@ n611x007: Bạn có thể vui lòng mở một câu hỏi mới nếu bạn có câu hỏi mới hoặc theo dõi không? Phần bình luận không phù hợp hoặc có nghĩa là cho các câu hỏi mới hoặc thảo luận mở rộng. Cảm ơn.
David Foerster

1
@ n611x007 Liên kết cứng cũ hơn Unix, v1 có chúng . Symlinks trong Unix mới hơn một chút; Wikipedia có một số lịch sử.
Gilles 'SO- ngừng trở nên xấu xa'

Phòng và cửa là một sự tương tự tuyệt vời! Symlinks sau đó giống như các dấu hiệu cho các cửa.
tò mò

1
@cquildannii: Symlinks giống như những căn phòng có một người ngồi trong đó nói rằng "oi m8 sai văn phòng đi đến # 234 thay vào đó"
Lightness Races with Monica

8

Ngoài tất cả các câu trả lời khác, tôi muốn chỉ ra các thuộc tính quan trọng sau:

Một liên kết mềm là một tham chiếu thực sự, tức là nó là một tệp nhỏ chứa tên đường dẫn. Việc giải quyết một /this/path/hereliên kết mềm xảy ra trong suốt cho ứng dụng: nếu một quá trình mở tệp, giả sử đó là một liên kết tượng trưng chỉ đến /that/other/paththì toàn bộ việc xử lý mở /that/other/pathđược thực hiện bởi HĐH. Hơn nữa, nếu /that/other/pathchính nó là một liên kết tượng trưng, ​​thì điều này cũng đang được HĐH xử lý. Trong thực tế, HĐH tuân theo chuỗi liên kết tượng trưng cho đến khi tìm thấy một thứ khác (ví dụ: tệp thông thường) hoặc cho đến khi đạt được SYMLOOP_MAX(xem sysconf(3)) nhiều mục, trong trường hợp đó, HĐH (chính xác hơn: lệnh gọi hệ thống) trả về lỗi và đặt errnođể ELOOP. Do đó, một tham chiếu vòng tròn như thế xyz -> xyzsẽ không làm trì hoãn quá trình. (Đối với các hệ thống Linux, hãy xem path_resolution(7)chi tiết đầy đủ.)

Lưu ý rằng một quy trình có thể kiểm tra xem tên đường dẫn có phải là một liên kết tượng trưng hay không thông qua việc sử dụng lstat(2)và có thể sửa đổi các thuộc tính tệp của nó (được lưu trữ trong bảng inode) thông qua lchown(2)và các mục khác (xem symlink(7)toàn bộ câu chuyện.)

Bây giờ, về mặt quyền, bạn sẽ nhận thấy rằng các liên kết tượng trưng luôn có quyền 777 ( rwxrwxrwxtheo ký hiệu tượng trưng). Điều này là do thực tế là bất kỳ quyền nào khác có thể được bỏ qua bằng cách truy cập tệp thực tế, dù sao đi nữa. Ngược lại, 777 cho một liên kết tượng trưng không làm cho tệp symlink được truy cập nếu nó không thể truy cập được ở vị trí đầu tiên. Chẳng hạn, một liên kết tượng trưng có quyền 777 trỏ đến một tệp có quyền 640 không cho phép tệp này có thể truy cập được đối với "khác" (công khai chung). Nói cách khác, một tệp xyzcó thể truy cập thông qua một liên kết tượng trưng khi và chỉ khi nó có thể truy cập trực tiếp, tức là không có sự gián tiếp. Do đó, các quyền của symlink không có tác dụng bảo mật nào.

Một trong những khác biệt chính có thể nhìn thấy giữa liên kết cứng và liên kết tượng trưng (còn gọi là liên kết mềm) là liên kết tượng trưng hoạt động trên các hệ thống tệp trong khi liên kết cứng bị giới hạn trong một hệ thống tệp. Đó là, một tệp trên phân vùng A có thể được liên kết với nhau từ phân vùng B, nhưng nó không thể được liên kết cứng từ đó. Điều này rõ ràng từ thực tế là một liên kết cứng thực sự là một mục trong thư mục, bao gồm tên tệp và số inode, và số inode chỉ là duy nhất cho mỗi hệ thống tệp.

Thuật ngữ hardlink thực sự là hơi sai lệch. Mặc dù đối với nguồn symlink và đích có thể phân biệt rõ ràng (symlink có mục riêng trong bảng inode), nhưng điều này không đúng với liên kết cứng. Nếu bạn tạo một liên kết cứng cho một tệp, mục nhập ban đầu và liên kết cứng không thể phân biệt được về những gì đã có trước tiên. (Vì chúng đề cập đến cùng một nút, chúng chia sẻ các thuộc tính tệp của chúng như chủ sở hữu, quyền, dấu thời gian, v.v.) hoặc thứ ba, hoặc thứ tư ...) liên kết cứng. Trong thực tế, mỗi inode lưu trữ một bộ đếm cho số lượng liên kết cứng đến inode đó.

Cuối cùng, lưu ý rằng người dùng thông thường có thể không liên kết thư mục cứng. Điều này là do điều này phải được thực hiện hết sức thận trọng: một người dùng không cẩn thận có thể đưa các chu kỳ vào cây tệp phân cấp nghiêm ngặt khác, mà tất cả các công cụ thông thường (như fsck) và bản thân HĐH không được chuẩn bị để xử lý.


6

Một câu trả lời đơn giản:

  • Một mục nhập tệp trong một thư mục là một liên kết cứng đến tệp đó.

  • Một số tệp có nhiều liên kết cứng như vậy, vì nhiều liên kết cứng đến cùng một tệp được cho phép.


3

Trong những ngày đầu của Unix, các tệp bên trong là các nút trên một ổ đĩa cụ thể. Tên tập tin là một cách thân thiện hơn để truy cập chúng.

Một liên kết cứng đã gán nhiều hơn một tên tệp cho một nút. Bạn có thể tạo một tệp, liên kết cứng tên thứ hai với nó và xóa tên đầu tiên và nó không thể phân biệt được với việc chỉ tạo tệp có tên thứ hai ở vị trí đầu tiên.

Thật vậy, hệ thống gọi chương trình cần sử dụng để xóa tệp là 'unlink (2) `. Dữ liệu không biến mất cho đến khi tên cuối cùng được hủy liên kết khỏi nút. (và inode không được mở bởi một quá trình ở đâu đó)

Đây là điều giúp Linux dễ dàng nâng cấp mọi thứ hơn trong khi vẫn chạy các chương trình. Nếu một quá trình đang chạy một thực thi và một bản cập nhật xảy ra thì tên chương trình sẽ được sử dụng lại, nhưng inode chứa phiên bản cũ vẫn tồn tại để nó có thể tiếp tục chạy. Và khi quá trình cuối cùng chạy phiên bản cũ đó dừng lại, bộ lưu trữ phiên bản cũ đó sẽ được phát hành.

Liên kết mềm xuất hiện bởi vì khi bạn có một cây tập tin đơn nhất, với nhiều điểm gắn kết, bạn không thể tạo một liên kết cứng từ một ổ đĩa cứng đến một nút trên một cái khác. Vì vậy, các liên kết mềm đã được phát minh.


Tôi đoán đây là bản sao của unix.stackexchange.com/questions/9575/ triệt
trộn vào

2
early daystại sao bây giờ nó lại khác câu trả lời của bạn dường như không phản ánh quan điểm đó dù sao?
n611x007

@ n611x007 Bởi vì 'những ngày này' như Linux có thể gắn kết các hệ thống tệp loại không trộn không phù hợp với mô hình inode. Giống như các dẫn xuất của FAT và ISO-9660 chẳng hạn. Đó là một hệ sinh thái hệ thống tệp đa dạng hơn nhiều thay vì một kích thước phù hợp với tất cả
kết hợp vào

1

Một tập tin là dữ liệu được ghi trên đĩa. Dữ liệu này được tham chiếu bởi inode của nó, chứa siêu dữ liệu về tệp cho hệ thống biết khối nào trên đĩa được sử dụng bởi tệp này, trong số những thứ khác. Một liên kết cứng trỏ đến số inode của tập tin này.

Về mặt kỹ thuật, vâng, bạn đang tạo một tệp mới, nhưng tất cả tệp này chứa là số inode cho tệp mà nó tham chiếu và tên của nó. Tốt hơn nên nghĩ về nó như là tạo một con trỏ tới nút, hoặc một con trỏ tới tệp.


1

Tệp là một khái niệm được sử dụng rộng rãi về các mục trong một hệ thống tệp.

Thông thường, nó bao gồm Thư mục , Tệp thông thường (liên kết cứng) và Liên kết tượng trưng (liên kết mềm). Và thậm chí có thể bao gồm thiết bị và ổ cắm.

Câu hỏi của tôi chỉ đơn giản là sự khác biệt của một tập tin và một liên kết cứng là gì? Liên kết cứng đang trỏ đến một nút, vậy một tập tin là gì? Nhập vào chính nó? Hoặc một Inode với một liên kết cứng?

Giả sử, tôi tạo một tệp bằng cảm ứng, sau đó một mục Inode được tạo trong Bảng Inode. Và tôi tạo một liên kết cứng, có cùng số Inode với tệp. Vì vậy, tôi đã tạo một tập tin mới? Hoặc tập tin chỉ được định nghĩa là một nút?

Vì ngay cả liên kết tượng trưng thường được tính là tệp, bản thân một liên kết cứng cũng có thể được tính là một tệp. Bạn có thể nói đó là một tập tin bất kể đó là liên kết cứng hay mềm.

Khái niệm này hơi mơ hồ nên cũng không sao khi nói rằng mục nhập inode là một tệp, mặc dù bạn thực sự có thể muốn tham khảo dữ liệu.

Nếu bạn là một lập trình viên C ++ hoặc Java, bạn có thể muốn đọc về std :: filesystem :: file_type , java.io.Filejava.nio.file.Files .

Chi tiết về sự khác biệt giữa liên kết cứng và liên kết mềm có thể được tìm thấy trong liên kết trong bình luận của infixed.


1

Sự khác biệt giữa một "tập tin" với một tên cụ thể và một "liên kết cứng" là một trong lịch sử. Một tệp (thông thường) có tên đã cho được tạo bằng lệnh gọi hệ thống tạo, liên kết cứng được tạo bằng lệnh gọi hệ thống liên kết.

Tuy nhiên, trong khi con người nói về và ghi nhớ lịch sử của các mục trong thư mục và gọi chúng là các tệp và các liên kết cứng tương ứng, thì hệ thống tệp lại không. Các mục nhập thư mục của "tệp gốc" và "liên kết cứng" hoàn toàn không thể phân biệt về chất lượng: cả hai đều thiết lập một tham chiếu giữa tên tệp và nút inode của tệp và khi tham chiếu cuối cùng không còn nữa (tham chiếu không chỉ là tên tệp cho một tập tin nhưng cũng có thể mô tả tập tin mà tập tin đã mở có thể được truy cập), tập tin cho inode không được ước tính được coi là bị xóa và không gian tập tin inode và liên quan được lấy lại.

Vì vậy, khi con người đối chiếu "tập tin" và "liên kết cứng", lần đầu tiên ra đời với "số lượng liên kết là 1" và tất cả những người khác ra đời với số lượng liên kết lớn hơn. Sự khác biệt là về mặt học thuật và thực sự đổi tên một tệp cùng một lúc bao gồm việc tạo một liên kết cứng cho tên đích và sau đó xóa liên kết cho tên nguồn. Ngày nay, thông thường một cuộc gọi hệ thống duy nhất được sử dụng thực hiện điều này một cách nguyên tử.

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.