Các liên kết cứng được tính là tập tin bình thường?


21

Tôi đã tự hỏi liệu có cách nào để đăng ký cái này không, nhưng vì hầu hết các công cụ tìm kiếm hiện đại không hoạt động tốt với các cụm từ dài hơn 5 từ, tôi cần một số trợ giúp về cái này.

Tôi đã tự hỏi điều này bởi vì tôi đang tạo một tập lệnh bash phải đăng ký các tệp theo một số loại nhất định và đưa ra quyết định phù hợp. Điều này về mặt kỹ thuật không quan trọng đối với dự án của tôi, nhưng tôi đã tò mò.

Ngoài ra, nếu chúng được coi là các tệp thông thường, vậy có cách nào để kiểm tra xem các tệp này có được liên kết cứng mà không phải phân tích cú pháp ls -ikhông? Và có cách nào để kiểm tra xem một số tệp tùy ý, X, có liên kết cứng với một số tệp tùy ý khác, Y, mà không sử dụng find -ilệnh không?


5
Với các liên kết cứng "X" không thực sự được liên kết với "Y". "X" và "Y" là cùng một tệp.
jordanm

6
Tất cả "tập tin thông thường" trong một thư mục là các liên kết cứng. Một số tập tin như vậy có nhiều hơn một.
Andrew Henle

@AndrewHenle Wow, điểm tốt. Đó chính xác là thứ mà tôi đang tìm kiếm, cảm ơn.
Ông Minty Fresh

2
@ Mr.MintyFresh Đặc biệt, không có sự phân biệt giữa "bản gốc" và "liên kết" như có các liên kết tượng trưng.
Random832

Câu trả lời:


38

Trong các hệ thống kiểu Unix, cấu trúc dữ liệu đại diện cho các đối tượng hệ thống tệp (nói cách khác, dữ liệu về một tệp), được lưu trữ trong cái gọi là "inode".

Tên tệp chỉ là một liên kết đến nút này và được gọi là "liên kết cứng". Không có sự khác biệt giữa tên đầu tiên một tập tin được đưa ra và bất kỳ liên kết tiếp theo. Vì vậy, câu trả lời là "có": một liên kết cứng là một tệp thông thường và thực sự, một tệp thông thường là một liên kết cứng.

Các lslệnh sẽ cho bạn thấy có bao nhiêu liên kết cứng có đến tập tin.

Ví dụ:

seumasmac@comp:~$ echo Hello > /tmp/hello.txt
seumasmac@comp:~$ ls -l /tmp/hello.txt 
-rw-rw-r-- 1 seumasmac seumasmac 6 Oct  4 13:05 /tmp/hello.txt

Ở đây chúng tôi đã tạo một tập tin gọi là /tmp/hello.txt. Đầu 1ra từ ls -lchỉ ra rằng có 1 liên kết cứng đến tệp này. Liên kết cứng này là tên tệp chính nó /tmp/hello.txt.

Nếu bây giờ chúng ta tạo một liên kết cứng khác đến tệp này:

seumasmac@comp:~$ ln /tmp/hello.txt /tmp/helloagain.txt
seumasmac@comp:~$ ls -l /tmp/hello*
-rw-rw-r-- 2 seumasmac seumasmac 6 Oct  4 13:05 /tmp/helloagain.txt
-rw-rw-r-- 2 seumasmac seumasmac 6 Oct  4 13:05 /tmp/hello.txt

bây giờ bạn có thể thấy rằng cả hai tên tệp cho biết có 2 liên kết cứng đến tệp. Cả hai đều không phải là tên tệp "phù hợp", cả hai đều có giá trị như nhau. Chúng ta có thể thấy rằng cả hai đều trỏ đến cùng một nút (trong trường hợp này, 5374043):

seumasmac@comp:~$ ls -i /tmp/hello*
5374043 /tmp/helloagain.txt  5374043 /tmp/hello.txt

Có một quan niệm sai lầm phổ biến rằng điều này là khác nhau cho các thư mục. Tôi đã nghe người ta nói rằng số lượng liên kết được trả về bởi lsmột thư mục là số thư mục con, trong đó có ...đó là không chính xác . Hoặc, ít nhất, trong khi nó sẽ cung cấp cho bạn con số chính xác, nó đúng vì những lý do sai!

Nếu chúng ta tạo một thư mục và thực hiện, ls -ldchúng ta sẽ nhận được:

seumasmac@comp:~$ mkdir /tmp/testdir
seumasmac@comp:~$ ls -ld /tmp/testdir
drwxrwxr-x 2 seumasmac seumasmac 4096 Oct  4 13:20 /tmp/testdir

Điều này cho thấy có 2 liên kết cứng đến thư mục này. Đó là:

/tmp/testdir
/tmp/testdir/.

Lưu ý rằng /tmp/testdir/..không một liên kết đến thư mục này, đó là một liên kết đến /tmp. Và điều này cho bạn biết lý do tại sao "số lượng thư mục con" hoạt động. Khi chúng ta tạo một thư mục con mới:

seumasmac@comp:~$ mkdir /tmp/testdir/dir2
seumasmac@comp:~$ ls -ld /tmp/testdir
drwxrwxr-x 3 seumasmac seumasmac 4096 Oct  4 13:24 /tmp/testdir

Bây giờ bạn có thể thấy có 3 liên kết cứng đến /tmp/testdirthư mục. Đó là:

/tmp/testdir
/tmp/testdir/.
/tmp/testdir/dir2/..

Vì vậy, mỗi thư mục con mới sẽ tăng số lượng liên kết lên một, vì ..mục nhập mà nó chứa.


Tôi hiểu làm thế nào siêu dữ liệu, inodes và liên kết cứng hoạt động. Tôi chỉ cần nó làm rõ nếu tập tin liên kết cứng được tính là một tập tin thông thường. Điều này chỉ cho tôi thấy rằng câu trả lời là 'có' vì cột dành riêng cho điều này, điều này ngầm chỉ ra rằng đây là nguồn gốc của tất cả các tệp. Rất xin lỗi, nhưng tôi sẽ phải đánh giá thấp điều này :(
Ông Minty Fresh

Điều đó tốt, tôi chắc chắn đó sẽ là thông tin hữu ích cho người khác.
seumasmac

Chỉnh sửa thú vị với hệ thống liên kết cứng dotglob, tôi không bao giờ biết rằng nó làm điều này.
Ông Minty Fresh

Tôi đã làm rõ các liên kết cứng == đoạn tập tin thông thường.
seumasmac

1
Đặc biệt giống như câu: "Cả hai đều không phải là tên tệp 'thích hợp', cả hai đều có giá trị như nhau." Đó là một thành phần quan trọng cho sự hiểu biết về các liên kết cứng. Viết rất độc đáo.
tự đại diện

4

Các liên kết cứng được tính là tập tin bình thường?

Liên kết cứng được tính là bất cứ điều gì họ liên kết đến. Bạn có thể liên kết với bất cứ điều gì trên cùng một hệ thống tập tin.

mkdir test
cd !$

>file
ln -s file sym
mknod pipe p

ln file file2
ln -P sym sym2
ln pipe pipe2

ls -al

# sockets, too:
cat >tsock.c <<\EOD
#include <sys/socket.h>
#include <sys/un.h>
int main(int n, char **a)
{
        struct sockaddr_un test = { AF_UNIX, "socket" };
        int testfd = socket(AF_UNIX, SOCK_SEQPACKET, 0);
        bind(testfd,(struct sockaddr *)&test,sizeof test);
}
EOD
make tsock
./tsock

ln socket socket2

ls -al

# even devices if you want:
sudo mknod mytty c 5 0
ln mytty mytty2
sudo chmod 666 mytty

ls -al
# notice permissions are on an object not on the links to it:
echo Hi, Kilroy! >mytty2  

Mọi liên kết cứng với bất cứ thứ gì đều tương đương, đối tượng cơ bản dính xung quanh miễn là có bất kỳ liên kết nào (chỉnh sửa: không mang tính biểu tượng) với nó (ngay cả một mô tả tệp mở, mà tôi rất xấu hổ vì rất biết ơn).

Hệ thống sẽ thực thi các quy tắc trên các liên kết thư mục, bạn nhận được một liên kết có tên đến một thư mục và hệ thống sẽ tự động thêm .liên kết được nhúng và bất kỳ liên kết thư mục con nào ..(lưu ý rằng .trong ls ở trên có hai liên kết) nhưng đó là một kiểm tra rõ ràng, trên một số sửa đổi hệ thống người dùng đặc quyền hứa hẹn hứa sẽ không tạo vòng lặp có thể tự thêm liên kết mới. Hệ thống tập tin không quan tâm, nó có thể biểu thị các biểu đồ thư mục tùy ý, nhưng không ai muốn xử lý chúng.

Có (rất nhiều hệ thống tập tin không phải là unix) không hoạt động theo cách này, bao gồm một số hệ thống gọi những gì chúng cung cấp như là một "liên kết cứng" thay thế. OS X đã loại bỏ một tương đương trên HFS + (vốn không có chúng nguyên bản) nếu tôi nhớ lại một cách chính xác, tôi không biết nó trung thành như thế nào trong việc bảo tồn ngữ nghĩa ở đây.


những gì ./tsockthực sự làm, dù sao?
mikeerv

@mikeerv Đây là chương trình make-a-socket ở trên, nó chỉ bỏ một liên kết socket có tên là "socket" trong thư mục hiện tại của nó.
jthill

ok, nhưng có lẽ tôi nên nói rõ hơn về việc tôi biết ít về socket. Tôi nghĩ rằng tôi hiểu các liên kết đủ tốt và vì vậy nó chỉ cung cấp cho cùng một ổ cắm một tên mới, phải không? Điều đó không có bất kỳ ý nghĩa đặc biệt nào đối với ổ cắm hay bất cứ thứ gì, phải không? xin lỗi về sự thiếu hiểu biết của tôi
mikeerv

1
@mikeerv Một ổ cắm là một thực thể hoàn toàn thời gian chạy. socket()tạo ra một ổ cắm thực tế, bind()đặt cho nó một tên cụ thể, connect()kết nối một ổ cắm bạn đã tạo với một số ổ cắm có tên. Loại khác nhau của ổ cắm sử dụng các loại tên khác nhau, ví dụ như ổ cắm Internet sử dụng địa chỉ Internet, nhưng tất cả đều cổ phần phổ thông API (bao gồm read()write(), nó làm cho tôi buồn mà bạn không thể open()một ổ cắm hệ thống tập tin và có hệ điều hành hoặc libc làm socket()connect()cho bạn) . man 7 socketcó nhiều hơn, tất cả các giao thức mạng làm cho một manpage cuồng nhiệt.
jthill

1
@mikeerv Xem, tôi có thể đánh vần pty và pts, và thậm chí ptmx vào một ngày tốt, nhưng đó là về nó. :-) ít nhất nút 5.0 hoạt động ở mọi nơi tôi có thể tìm thấy, đó là loại thiết bị kiểm soát. Tôi đã nhận được nó chỉ với ls -l / dev / tty, đoán tôi đã gặp may mắn ở đó.
jthill
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.