2013-06-04 61 views
8

Các liên kết tượng trưng được quản lý nội bộ bằng hệ thống UNIX/Linux như thế nào. Được biết, một liên kết tượng trưng có thể tồn tại ngay cả khi không có tệp đích thực (liên kết Dangling). Vậy cái gì đại diện cho một liên kết tượng trưng trong nội bộ.Có gì đằng sau một liên kết tượng trưng?

Trong Windows, câu trả lời là reparse point.

Câu hỏi:

là câu trả lời một inode trong UNIX/Linux?

Nếu có, thì số inode sẽ giống nhau cho mục tiêu và liên kết?

Nếu có, thì inode liên kết có thể có quyền khác với quyền inode của đích (nếu có) không?

Trả lời

13

Nó không phải là về UNIX/Linux nhưng về triển khai hệ thống tập tin - nhưng có, Unix/Linux sử dụng inodes ở cấp hạt nhân và triển khai hệ thống tập tin có inodes (ít nhất là ảo).

Trong nói chung, liên kết tượng trưng là các tập tin (btw, danh bạ cũng được tập tin), có đơn giản:

  • cờ file-type trong "inode" mà nói đến hệ thống tập tin này là một "liên kết tượng trưng"
  • nội dung tệp: đường dẫn đến mục tiêu - nói cách khác: liên kết tượng trưng đơn giản là tệp chứa tên tệp có cờ trong inode.

Hệ thống tệp ảo cũng có thể có liên kết tượng trưng, ​​vì vậy, hãy kiểm tra FUSE hoặc một số nguồn triển khai hệ thống tệp khác. (Ext2/ext3/ufs..etc)

Vì vậy,

là câu trả lời một inode trong UNIX/Linux?

phụ thuộc vào triển khai hệ thống tệp, nhưng có, thường là inode chứa "loại tệp" (và chủ sở hữu, quyền truy cập, dấu thời gian, kích thước, con trỏ đến khối dữ liệu). Có các hệ thống tập tin không có inode s (trong một phép thuật vật lý) nhưng chỉ có "các nút ảo" để duy trì tính tương thích với hạt nhân.

Nếu có, thì số inode sẽ giống nhau cho mục tiêu và liên kết?

Không. Thông thường, các liên kết tượng trưng là một tập tin với inode riêng của mình, (với loại tập tin, các khối dữ liệu riêng, vv)

Nếu có, có thể liên kết inode có thể có quyền khác với inode mục tiêu (nếu một tồn tại)?

Đây là khoảng cách xử lý các tệp liên kết tượng trưng. Thông thường hạt nhân không cho phép thay đổi các quyền liên kết tượng trưng - và các liên kết tượng trưng luôn có các quyền mặc định.Bạn có thể viết hệ thống tập tin của riêng bạn cho phép các quyền khác nhau cho các liên kết tượng trưng, ​​nhưng bạn sẽ gặp rắc rối, bởi vì các chương trình phổ biến như chmod không thay đổi quyền đối với liên kết tượng trưng, ​​vì vậy hãy tạo hệ thống tập tin như vậy là vô nghĩa)

To hiểu sự khác biệt giữa hardlinks và symlink, bạn nên hiểu các thư mục trước.

Thư mục là các tệp (được phân biệt bằng cờ trong inode) cho biết hạt nhân, "xử lý tệp này dưới dạng bản đồ là file-name đến inode_number". Liên kết cứng chỉ đơn giản là các tên tệp ánh xạ tới cùng một số inode. Vì vậy, nếu thư mục file chứa:

file_a: 1000 
file_b: 1001 
file_c: 1000 

các phương tiện trên, trong thư mục này có 3 file:

  • file_a mô tả bởi inode 1000
  • file_b mô tả bởi inode 1001 và
  • file_c một lần nữa được mô tả bằng inode 1000 (do đó, nó là một liên kết cứng với tệp_a, không phải là liên kết cứng đến file_a - bởi vì không thể biết tên tệp nào đến trước - y là giống nhau).

Đây là sự khác biệt chính để liên kết tượng trưng, ​​nơi mà các inode của file_b (inode 1001) có thể có nội dung "file_a" và một lá cờ có nghĩa là "đây là một liên kết tượng trưng". Trong trường hợp này, file_b sẽ là một liên kết tượng trưng trỏ đến file_a.

2

Bạn cũng có thể dễ dàng khám phá này trên của riêng bạn:

$ touch a 
$ ln -s a b 
$ ln a c 
$ ls -li 
total 0 
95905 -rw-r--r-- 1 regnarg regnarg 0 Jun 19 19:01 a 
96990 lrwxrwxrwx 1 regnarg regnarg 1 Jun 19 19:01 b -> a 
95905 -rw-r--r-- 2 regnarg regnarg 0 Jun 19 19:01 c 

Các -i tùy chọn để ls cho thấy số inode trong cột đầu tiên. Bạn có thể thấy rằng liên kết tượng trưng có số inode khác nhau trong khi liên kết cứng có cùng. Bạn cũng có thể sử dụng stat(1) lệnh:

$ stat a 
    File: 'a' 
    Size: 0   Blocks: 0   IO Block: 4096 regular empty file 
Device: 28h/40d Inode: 95905  Links: 2 
[...] 

$ stat b 
    File: 'b' -> 'a' 
    Size: 1   Blocks: 0   IO Block: 4096 symbolic link 
Device: 28h/40d Inode: 96990  Links: 1 
[...] 

Nếu bạn muốn làm điều này theo chương trình, bạn có thể sử dụng cuộc gọi lstat(2) hệ thống để tìm thông tin về các liên kết tượng trưng riêng của mình (số inode của nó vv), trong khi stat(2) hiển thị thông tin về mục tiêu của liên kết tượng trưng, ​​nếu nó tồn tại. Ví dụ bằng Python:

>>> import os 
>>> os.stat("b").st_ino 
95905 
>>> os.lstat("b").st_ino 
96990 
+0

Và 'readlink()' cho phép bạn tìm thấy những gì được lưu trữ làm tên đường dẫn trong liên kết tượng trưng đã cho một liên kết tượng trưng. Hạt nhân xử lý nó với sự tự tin; mọi người không nhất thiết. Ngoài ra còn có 'realpath()' xác định đường dẫn tuyệt đối không có liên kết tượng trưng cho một tệp nhất định. –

Các vấn đề liên quan