Tại sao các liên kết cứng dường như chiếm không gian giống như bản gốc?


14

Nhờ một số câu hỏi hay ở đây và trang này , giờ tôi đã hiểu các liên kết. Tôi thấy các liên kết cứng tham chiếu cùng một nút theo một tên khác và các bản sao là các nút khác nhau, với các tên khác nhau. Các liên kết mềm có tên và đường dẫn tệp gốc là nút của chúng, vì vậy nếu tệp được di chuyển, liên kết sẽ bị đứt.

Vì vậy, tôi đã kiểm tra những gì tôi đã học được với một số tệp ("saluton_mondo.cpp" bên dưới), tạo một liên kết cứng và mềm và một bản sao.

jmcf125@VMUbuntu:~$ ls -lh soft hard copy s*.cpp
-rw-rw-r-- 1 jmcf125 jmcf125 205 Aŭg 27 16:10 copy
-rw-rw-r-- 2 jmcf125 jmcf125 205 Aŭg 25 13:34 hard
-rw-rw-r-- 2 jmcf125 jmcf125 205 Aŭg 25 13:34 saluton_mondo.cpp
lrwxrwxrwx 1 jmcf125 jmcf125  17 Aŭg 27 16:09 soft -> saluton_mondo.cpp

Tôi thấy lúng túng rằng liên kết cứng, tuy nhiên, có cùng kích thước với bản gốc và, về mặt logic, bản sao. Nếu liên kết cứng và bản gốc chia sẻ cùng một nút, có dữ liệu và chỉ khác nhau theo tên tệp, thì liên kết cứng có nên chỉ chiếm không gian của tên của nó, thay vì 205 byte không? Hoặc là kích thước của tập tin gốc ls -lhtrả về? Nhưng làm thế nào tôi có thể biết tên tệp chiếm không gian nào? Ở đây nó nói các liên kết cứng không có kích thước. Tên tệp của họ có được giữ cùng với tên tệp gốc không? Tên tập tin của các liên kết cứng được lưu trữ ở đâu?

Câu trả lời:


16

Một tệp là một nút có dữ liệu meta trong đó một danh sách các con trỏ tới nơi để tìm dữ liệu.

Để có thể truy cập một tệp, bạn phải liên kết nó với một thư mục (nghĩ về các thư mục là thư mục điện thoại, không phải thư mục), đó là thêm một hoặc nhiều mục vào một trong nhiều thư mục để liên kết tên với tệp đó.

Tất cả các liên kết, các tên tệp đó trỏ đến cùng một tệp. Không có cái nào là bản gốc và cái khác là liên kết. Chúng là tất cả các điểm truy cập vào cùng một tệp (cùng một nút) trong cây thư mục. Khi bạn nhận được kích thước của tệp ( lstatcuộc gọi hệ thống), bạn đang truy xuất thông tin (siêu dữ liệu được đề cập ở trên) được lưu trữ trong nút, không quan trọng tên tệp nào, liên kết nào bạn đang sử dụng để tham chiếu đến tệp đó .

Ngược lại, symlink là một tệp khác (một nút khác) có nội dung là đường dẫn đến tệp đích. Giống như bất kỳ tệp nào khác, các liên kết tượng trưng đó phải được liên kết với một thư mục (phải có tên) để bạn có thể truy cập chúng. Bạn cũng có thể có một số liên kết đến một liên kết tượng trưng, ​​hay nói cách khác, liên kết tượng trưng có thể được đặt một số tên (trong một hoặc nhiều thư mục).

$ touch a
$ ln a b
$ ln -s a c
$ ln c d
$ ls -li [a-d]
10486707 -rw-r--r-- 2 stephane stephane 0 Aug 27 17:05 a
10486707 -rw-r--r-- 2 stephane stephane 0 Aug 27 17:05 b
10502404 lrwxrwxrwx 2 stephane stephane 1 Aug 27 17:05 c -> a
10502404 lrwxrwxrwx 2 stephane stephane 1 Aug 27 17:05 d -> a

Trên số tập tin 10486707 là một tập tin thông thường. Hai mục trong thư mục hiện tại (một có tên a, một có tên b) liên kết với nó. Vì số liên kết là 2, chúng tôi biết không có tên nào khác của tệp đó trong thư mục hiện tại hoặc bất kỳ thư mục nào khác. Số tệp 10502404 là một tệp khác, lần này loại symlink được liên kết hai lần với thư mục hiện tại. Nội dung của nó (mục tiêu) là đường dẫn tương đối "a".

Lưu ý rằng nếu 10502404 được liên kết với một thư mục khác so với thư mục hiện tại, nó thường sẽ trỏ đến một tệp khác tùy thuộc vào cách truy cập.

$ mkdir 1 2
$ echo foo > 1/a
$ echo bar > 2/a
$ ln -s a 1/b
$ ln 1/b 2/b
$ ls -lia 1 2
1:
total 92
10608644 drwxr-xr-x   2 stephane stephane  4096 Aug 27 17:26 ./
10485761 drwxrwxr-x 443 stephane stephane 81920 Aug 27 17:26 ../
10504186 -rw-r--r--   1 stephane stephane     4 Aug 27 17:24 a
10539259 lrwxrwxrwx   2 stephane stephane     1 Aug 27 17:26 b -> a

2:
total 92
10608674 drwxr-xr-x   2 stephane stephane  4096 Aug 27 17:26 ./
10485761 drwxrwxr-x 443 stephane stephane 81920 Aug 27 17:26 ../
10539044 -rw-r--r--   1 stephane stephane     4 Aug 27 17:24 a
10539259 lrwxrwxrwx   2 stephane stephane     1 Aug 27 17:26 b -> a
$ cat 1/b
foo
$ cat 2/b
bar

Các tệp không có tên được liên kết với chúng ngoài các thư mục liên kết chúng. Không gian được lấy theo tên của họ là các mục trong các thư mục đó, nó chiếm trong kích thước tệp / mức sử dụng đĩa của các thư mục.

Bạn sẽ nhận thấy rằng hệ thống gọi để xóa một tập tin unlink. Đó là, bạn không xóa các tệp, bạn hủy liên kết chúng khỏi các thư mục mà chúng được tham chiếu. Một khi đã hủy liên kết khỏi thư mục cuối cùng có một mục nhập đến một tệp nhất định, tệp đó sẽ bị hủy (miễn là không có quá trình nào có nó đã mở).


À ... Giờ thì tôi hiểu rồi. Vì vậy, một tập tin gọi là "hi" và bản sao chính xác của nó được gọi là "ajhĝjdmjefsjmksgskgjkmŝŭna" lấy chính xác cùng một khoảng trống; bởi vì tên của họ không được tính cho lstatcuộc gọi hệ thống có kích thước của chúng.
JMCF125

@ JMCF125, vâng, kích thước được lấy theo tên của họ là mục trong các thư mục tương ứng, nó được tính vào kích thước tệp của các thư mục.
Stéphane Chazelas

Cảm ơn. Bạn có thể bao gồm điều đó trong câu trả lời của bạn? Đợi đã, tôi sẽ làm rõ câu hỏi của tôi trước.
JMCF125

5

Liên kết cứng về cơ bản là tập tin gốc. Vì vậy, kích thước bạn thấy được báo cáo là kích thước của tệp được liên kết đến. Đó là các liên kết mềm chỉ chiếm không gian của tên của họ (kinda).

Theo như hệ thống tập tin, liên kết cứng và bản gốc là cùng một thứ, chúng trỏ đến cùng một nút để kích thước tương tự được báo cáo.


Nhưng tên của liên kết cứng phải mất không gian, đúng không?
JMCF125

Xem câu trả lời của @ stephan bên dưới, anh ấy giải thích rõ hơn.
terdon

2
@ JMCF125 Có, nhưng không gian đó nằm trong thư mục. Nếu bạn tạo đủ tệp, bạn sẽ nhận thấy rằng kích thước thư mục tăng lên. Kích thước của tệp không bao gồm siêu dữ liệu của nó, chẳng hạn như tên của nó.
Gilles 'SO- ngừng trở nên xấu xa'

@Gilles, cảm ơn, nhưng @Stephane đã cập nhật câu trả lời của anh ấy với thông tin đó. Ngoài ra, bây giờ tôi nghĩ về nó tốt hơn, tên của nó /phải được lưu trữ trong chính nó, như thể bạn làm cd ..trong /bạn ở lại /.
JMCF125
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.