Tại sao các liên kết cứng đến các thư mục không được phép trong UNIX / Linux?


130

Tôi đọc trong sách giáo khoa rằng Unix / Linux không cho phép liên kết cứng đến thư mục nhưng không cho phép liên kết mềm. Có phải bởi vì, khi chúng ta có chu kỳ và nếu chúng ta tạo các liên kết cứng và sau một thời gian chúng ta xóa tệp gốc, nó sẽ trỏ đến một số giá trị rác?

Nếu chu kỳ là lý do duy nhất đằng sau việc không cho phép liên kết cứng, thì tại sao liên kết mềm đến thư mục được phép?


2
Nên ..chỉ đến đâu? Đặc biệt là sau khi gỡ bỏ liên kết cứng đến thư mục này, trong thư mục được chỉ bởi ..? Nó cần phải chỉ ra một nơi nào đó.
Thorbjørn Ravn Andersen

2
..không cần tồn tại trên bất kỳ ổ đĩa nào. Dù sao, đó là công việc của hệ điều hành để theo dõi thư mục làm việc hiện tại, do đó, nó cũng tương đối đơn giản để giữ một danh sách các nút được liên kết với mỗi quy trình 'cwd và đề cập đến điều đó khi thấy nó sử dụng ... Tất nhiên, điều đó có nghĩa là các liên kết tượng trưng sẽ cần được tạo ra với ý nghĩ đó, nhưng bạn phải cẩn thận để không phá vỡ các liên kết tượng trưng và tôi không nghĩ rằng quy tắc bổ sung sẽ khiến chúng vô dụng.
Bắn Parthian

Tôi thích lời giải thích này . Súc tích và dễ đọc và / hoặc đọc lướt.
Trevor Boyd Smith

Câu trả lời:


143

Đây chỉ là một ý tưởng tồi, vì không có cách nào để nói sự khác biệt giữa một liên kết cứng và một tên gốc.

Việc cho phép các liên kết cứng đến các thư mục sẽ phá vỡ cấu trúc đồ thị theo chu kỳ có hướng của hệ thống tập tin, có thể tạo ra các vòng lặp thư mục và các thư mục thư mục lơ lửng, điều này sẽ gây ra fsckvà bất kỳ lỗi nào của tập tin cây đi bộ khác.

Trước tiên, để hiểu điều này, hãy nói về inodes. Dữ liệu trong hệ thống tập tin được giữ trong các khối trên đĩa và các khối đó được thu thập với nhau bằng một nút. Bạn có thể nghĩ về inode như tập tin. Inodes thiếu tên tập tin, mặc dù. Đó là nơi liên kết đến.

Một liên kết chỉ là một con trỏ đến một nút. Một thư mục là một nút giữ các liên kết. Mỗi tên tệp trong một thư mục chỉ là một liên kết đến một nút. Mở một tệp trong Unix cũng tạo ra một liên kết, nhưng đó là một loại liên kết khác (nó không phải là một liên kết có tên).

Một liên kết cứng chỉ là một mục nhập thư mục bổ sung trỏ đến nút đó. Khi bạn ls -l, số sau các quyền là số liên kết được đặt tên. Hầu hết các tập tin thông thường sẽ có một liên kết. Tạo một liên kết cứng mới đến một tệp sẽ làm cho cả hai tên tệp trỏ đến cùng một nút. Ghi chú:

% ls -l test
ls: test: No such file or directory
% touch test
% ls -l test
-rw-r--r--  1 danny  staff  0 Oct 13 17:58 test
% ln test test2
% ls -l test*
-rw-r--r--  2 danny  staff  0 Oct 13 17:58 test
-rw-r--r--  2 danny  staff  0 Oct 13 17:58 test2
% touch test3
% ls -l test*
-rw-r--r--  2 danny  staff  0 Oct 13 17:58 test
-rw-r--r--  2 danny  staff  0 Oct 13 17:58 test2
-rw-r--r--  1 danny  staff  0 Oct 13 17:59 test3
            ^
            ^ this is the link count

Bây giờ, bạn có thể thấy rõ rằng không có thứ gọi là liên kết cứng. Một liên kết cứng giống như một tên thông thường. Trong ví dụ trên, testhoặc test2, đó là tệp gốc và liên kết cứng nào? Cuối cùng, bạn không thể thực sự nói (thậm chí bằng dấu thời gian) bởi vì cả hai tên đều trỏ đến cùng một nội dung, cùng một nút:

% ls -li test*  
14445750 -rw-r--r--  2 danny  staff  0 Oct 13 17:58 test
14445750 -rw-r--r--  2 danny  staff  0 Oct 13 17:58 test2
14445892 -rw-r--r--  1 danny  staff  0 Oct 13 17:59 test3

Các -ilá cờ để lscho bạn thấy số inode vào đầu dòng. Lưu ý làm thế nào testtest2có cùng số inode, nhưng test3có một số khác.

Bây giờ, nếu bạn được phép làm điều này cho các thư mục, hai thư mục khác nhau ở các điểm khác nhau trong hệ thống tệp có thể chỉ ra cùng một điều. Trong thực tế, một subir có thể quay trở lại ông bà của nó, tạo ra một vòng lặp.

Tại sao vòng lặp này là một mối quan tâm? Bởi vì khi bạn đang di chuyển ngang, không có cách nào để phát hiện bạn đang lặp (mà không theo dõi các số inode khi bạn di chuyển ngang). Hãy tưởng tượng bạn đang viết dulệnh, cần phải lặp lại thông qua các thư mục con để tìm hiểu về việc sử dụng đĩa. Làm thế nào để dubiết khi nào nó đạt một vòng lặp? Đó là lỗi dễ dàng và rất nhiều sổ sách kế toán dusẽ phải làm, chỉ để thực hiện nhiệm vụ đơn giản này.

Symlinks là một con thú hoàn toàn khác nhau, trong đó chúng là một loại "tệp" đặc biệt mà nhiều API hệ thống tệp tệp có xu hướng tự động theo. Lưu ý, một liên kết tượng trưng có thể trỏ đến một đích không tồn tại, vì chúng trỏ theo tên và không trực tiếp đến một nút. Khái niệm đó không có ý nghĩa với các liên kết cứng, bởi vì sự tồn tại đơn thuần của "liên kết cứng" có nghĩa là tệp tồn tại.

Vậy tại sao có thể duđối phó với các liên kết tượng trưng dễ dàng và không phải là liên kết cứng? Chúng tôi đã có thể thấy ở trên rằng các liên kết cứng không thể phân biệt với các mục thư mục bình thường. Symlinks, tuy nhiên, là đặc biệt, có thể phát hiện và bỏ qua!  duthông báo rằng symlink là một symlink và bỏ qua nó hoàn toàn!

% ls -l 
total 4
drwxr-xr-x  3 danny  staff  102 Oct 13 18:14 test1/
lrwxr-xr-x  1 danny  staff    5 Oct 13 18:13 test2@ -> test1
% du -ah
242M    ./test1/bigfile
242M    ./test1
4.0K    ./test2
242M    .

7
Allowing hard links to directories would break the directed acyclic graph structure of the filesystem. Bạn có thể vui lòng giải thích thêm về vấn đề với các chu kỳ sử dụng các liên kết cứng? Tại sao nó ổn với symlink
user3539

33
Dường như họ đã cho phép nó trên máy Mac bằng cách thêm phát hiện chu kỳ vào lệnh gọi hệ thống link () và từ chối cho phép bạn tạo một liên kết cứng thư mục nếu nó tạo ra một chu kỳ. Có vẻ là một giải pháp hợp lý.
psusi

10
@psusi mkdir -pa / b; nocheckln ca; mv ca / ​​b; - nocheckln có một ln lý thuyết không kiểm tra thư mục args, và chỉ chuyển đến liên kết, và vì không có chu trình nào được thực hiện, tất cả chúng ta đều tốt trong việc tạo 'c'. sau đó chúng tôi di chuyển 'c' vào 'a / b' và một chu trình được tạo từ a / b / c -> a / - check in link () không đủ tốt
Danny Dulai

3
Chu kỳ rất tệ. Windows có vấn đề này với "mối nối" là các thư mục liên kết cứng. Nếu bạn vô tình áp dụng các quyền cho toàn bộ hồ sơ của mình, nó sẽ mở ra một loạt các mối nối tạo ra một chu kỳ vô hạn. Đệ quy thông qua các thư mục đệ quy cho đến khi giới hạn độ dài đường dẫn dừng nó.
doug65536

4
@WhiteWinterWolf, theo liên kết này, họ đặc biệt thêm hỗ trợ cho nó cho cỗ máy thời gian, nhưng chỉ có root được phép làm điều đó: superuser.com/questions/360926/...
psusi

14

Ngoại trừ các điểm gắn kết, mỗi thư mục có một và chỉ cha mẹ : ...

Một cách để làm pwdlà kiểm tra thiết bị: inode cho '.' và '..'. Nếu chúng giống nhau, bạn đã đạt đến thư mục gốc của hệ thống tệp. Mặt khác, tìm tên của thư mục hiện tại trong phần cha mẹ, ấn nó trên ngăn xếp và bắt đầu so sánh '../.' với '../ ..', sau đó '../../.' với '../../ ..', v.v. Khi bạn đã truy cập vào thư mục gốc, hãy bắt đầu bật và in tên từ ngăn xếp. Thuật toán này dựa trên thực tế là mỗi thư mục có một và chỉ một cha.

Nếu liên kết cứng đến thư mục được cho phép, một trong nhiều cha mẹ nên ..trỏ đến? Đó là một lý do thuyết phục tại sao liên kết cứng đến thư mục không được phép.

Liên kết đến thư mục không gây ra vấn đề đó. Nếu một chương trình muốn, nó có thể thực hiện lstat()trên từng phần của tên đường dẫn và phát hiện khi gặp liên kết tượng trưng. Các pwdthuật toán sẽ trả lại tên đường dẫn tuyệt đối đúng đối với một thư mục đích. Thực tế là có một đoạn văn bản ở đâu đó (symlink) trỏ đến thư mục đích là không liên quan nhiều. Sự tồn tại của một liên kết tượng trưng như vậy không tạo ra một vòng lặp trong biểu đồ.


3
Không chắc chắn về điều này. Nếu chúng ta nghĩ rằng đó ..là một loại liên kết cứng ảo với cha mẹ, không có lý do kỹ thuật nào mà mục tiêu của liên kết chỉ có thể có một liên kết khác với nó. pwdsẽ chỉ phải sử dụng một thuật toán khác để giải quyết đường dẫn.
Benubird

13

Bạn có thể sử dụng liên kết gắn kết để mô phỏng các thư mục liên kết cứng

sudo mount --bind /some/existing_real_contents /else/dummy_but_existing_directory
sudo umount /else/dummy_but_existing_directory

7

Tôi muốn thêm vài điểm về câu hỏi này. Liên kết cứng cho các thư mục được cho phép trong linux, nhưng theo một cách hạn chế.

Một cách chúng ta có thể kiểm tra điều này là khi chúng ta liệt kê nội dung của một thư mục, chúng ta tìm thấy hai thư mục đặc biệt "." và "..". Như chúng ta biết "." trỏ đến cùng thư mục và ".." trỏ đến thư mục mẹ.

Vì vậy, hãy tạo một cây thư mục trong đó "a" là thư mục mẹ có thư mục "b" là con của nó.

 a
 `-- b

Lưu ý inode của thư mục "a". Và khi chúng ta thực hiện một ls -latừ thư mục "a" chúng ta có thể thấy điều đó "." thư mục cũng trỏ đến cùng một nút.

797358 drwxr-xr-x 3 mkannan mkannan 4096 Sep 17 19:13 a

Và ở đây chúng ta có thể thấy rằng thư mục "a" có ba liên kết cứng. Điều này là do inode 797353 có ba liên kết cứng trong tên của "." bên trong thư mục "a" và tên là ".." bên trong thư mục "b" và một thư mục có tên "a" Itslef.

$ ls -ali a/
797358 drwxr-xr-x 3 mkannan mkannan 4096 Sep 17 19:13 .

$ ls -ali a/b/
797358 drwxr-xr-x 3 mkannan mkannan 4096 Sep 17 19:13 ..

Vì vậy, ở đây chúng ta có thể hiểu rằng các liên kết cứng chỉ có cho các thư mục để kết nối với các thư mục mẹ và con của chúng. Và do đó, một thư mục không có con sẽ chỉ có 2 liên kết cứng và vì vậy thư mục "b" sẽ chỉ có hai liên kết cứng.

Một lý do tại sao liên kết cứng của các thư mục bị ngăn chặn một cách tự do là để tránh các vòng lặp tham chiếu vô hạn sẽ gây nhầm lẫn cho các chương trình đi qua hệ thống tập tin.

Vì hệ thống tập tin được tổ chức dưới dạng cây và vì cây không thể có tham chiếu theo chu kỳ nên điều này nên tránh.


1
Ví dụ tốt. Nó xóa tan nghi ngờ của tôi. Vì vậy, những trường hợp này được xử lý theo một cách đặc biệt để tránh các vòng lặp vô hạn. đúng?
G Gill

1
Vì chúng tôi có một cách hạn chế cho phép liên kết cứng cho các thư mục, ví dụ: ".." và "." chúng tôi sẽ không đạt đến một vòng lặp vô hạn và vì vậy chúng tôi sẽ không yêu cầu bất kỳ cách đặc biệt nào để tránh những điều đó vì chúng sẽ không xảy ra :)
Kannan Mohan

6

Không có lý do nào sau đây là lý do thực sự cho việc từ chối các liên kết cứng đến các thư mục; mỗi vấn đề khá dễ giải quyết:

  • chu kỳ trong cấu trúc cây gây ra sự di chuyển khó khăn
  • nhiều cha mẹ, vậy cái nào là "thực"?
  • thu gom rác hệ thống tập tin

Các lý do thực sự (như gợi ý bởi @ Thorbjørn Ravn Andersen) đến khi bạn xóa một thư mục trong đó có nhiều phụ huynh, từ thư mục trỏ đến bởi ..:

..Bây giờ nên chỉ vào cái gì?

Nếu thư mục bị xóa khỏi cha mẹ của nó nhưng số lượng liên kết của nó vẫn lớn hơn 0thì phải có một cái gì đó, ở đâu đó vẫn trỏ đến nó. Bạn không thể để lại ..chỉ vào không có gì; Rất nhiều chương trình dựa vào .., vì vậy hệ thống sẽ phải duyệt toàn bộ hệ thống tệp cho đến khi tìm thấy điều đầu tiên trỏ đến thư mục đã xóa, chỉ để cập nhật ... Hoặc là, hoặc hệ thống tập tin sẽ phải duy trì một danh sách tất cả các thư mục trỏ đến một thư mục được liên kết cứng.

Dù bằng cách nào, đây sẽ là một chi phí hiệu năng và một sự phức tạp thêm cho dữ liệu và / hoặc mã meta của hệ thống tệp, vì vậy các nhà thiết kế đã quyết định không cho phép nó.


3
Điều đó cũng dễ giải quyết: giữ một danh sách cha mẹ của một thư mục con mà bạn cập nhật khi bạn thêm hoặc xóa một liên kết đến đứa trẻ. Khi bạn xóa cha mẹ chính tắc (mục tiêu của trẻ ..), hãy cập nhật ..để chỉ đến một trong những phụ huynh khác trong danh sách.
jathd

2
Tôi đồng ý. Không khoa học tên lửa để giải quyết. Tuy nhiên, dù sao cũng là một chi phí hiệu năng, và nó sẽ chiếm thêm một chút không gian trong dữ liệu meta của hệ thống tệp và thêm sự phức tạp. Và vì vậy, các nhà thiết kế đã áp dụng cách tiếp cận đơn giản, nhanh chóng - không cho phép liên kết đến các thư mục cứng.
Lqueryvg

1
Sym liên kết đến các thư mục "vi phạm ngữ nghĩa và hành vi đã giải quyết", nhưng chúng vẫn được cho phép. Do đó, một số lệnh cần các tùy chọn để kiểm soát xem các liên kết sym có được tuân theo hay không (ví dụ -L trong find và cp). Khi một chương trình theo sau '..' sẽ có thêm sự nhầm lẫn, do đó sự khác biệt về đầu ra từ pwd và / bin / pwd sau khi đi qua một liên kết sym. Không có "câu trả lời Unix"; chỉ quyết định thiết kế. Điều này xoay quanh những gì trở thành ".." như tôi đã nói trong câu trả lời của mình. Thật không may, '..' thậm chí không được đề cập trong câu trả lời mà mọi người khác đều rất muốn bỏ phiếu.
Lqueryvg

BTW, tôi không nói rằng tôi ủng hộ các liên kết cứng đến các thư mục. Không có gì. Tôi không muốn công việc hàng ngày của mình khó khăn hơn nó.
Lqueryvg

Đó không phải là những gì POSIX nói, nhưng IMO '..' không bao giờ nên là một khái niệm hệ thống tập tin, thay vào đó được giải quyết theo cú pháp trên các đường dẫn, vì vậy điều đó a/..luôn có nghĩa .. Đây là cách URL hoạt động, btw. Đó là trình duyệt đang giải quyết '..' trước khi nó chạm vào máy chủ. Và nó hoạt động rất tốt.
ybungalobill

3

Tạo liên kết cứng trên các thư mục sẽ không thể đảo ngược. Giả sử chúng ta có:

/dir1
├──this.txt
├──directory
│  └──subfiles
└──etc

Tôi liên kết nó với /dir2.

Vì vậy, /dir2bây giờ cũng chứa tất cả các tập tin và thư mục

Nếu tôi đổi ý thì sao? Tôi không thể chỉ rmdir /dir2(vì nó không trống)

Và nếu tôi xóa đệ quy trong /dir2... nó cũng sẽ bị xóa /dir1!

IMHO đó là một lý do đủ lớn để tránh điều này!

Biên tập :

Bình luận đề nghị loại bỏ các thư mục bằng cách làm rmtrên nó. Nhưng rmtrên một thư mục không trống, thất bại và hành vi này phải được duy trì, cho dù thư mục đó có được liên kết cứng hay không. Vì vậy, bạn không thể chỉ rmhủy liên kết. Nó sẽ yêu cầu một đối số mới rm, chỉ cần nói "nếu inode thư mục có số tham chiếu> 1, thì chỉ hủy liên kết thư mục".

Đến lượt nó, phá vỡ một nguyên tắc ít gây ngạc nhiên nhất: điều đó có nghĩa là việc xóa một liên kết cứng thư mục tôi vừa tạo không giống như xóa một liên kết cứng tệp bình thường ...

Tôi sẽ viết lại câu của mình: Nếu không phát triển thêm, việc tạo liên kết cứng sẽ không thể đảo ngược (vì không có lệnh hiện tại nào có thể xử lý việc xóa mà không phù hợp với hành vi hiện tại)

Nếu chúng tôi cho phép phát triển nhiều hơn để xử lý vụ việc, số lượng cạm bẫy và nguy cơ mất dữ liệu nếu bạn không đủ nhận thức về cách hệ thống hoạt động, thì sự phát triển đó có nghĩa là IMHO là một lý do đủ để hạn chế liên kết cứng trên các thư mục.


Đó không phải là một vấn đề. Với trường hợp của bạn, khi chúng tôi tạo liên kết cứng đến dir2, chúng tôi phải tạo liên kết cứng đến tất cả các nội dung trong dir1 và vì vậy nếu chúng tôi đổi tên hoặc xóa dir2, chỉ một liên kết bổ sung đến inode sẽ bị xóa. Và điều đó sẽ không ảnh hưởng đến dir1 và nội dung của nó vì có ít nhất một liên kết (dir1) đến inode.
Kannan Mohan

3
Lập luận của bạn không chính xác. Bạn sẽ chỉ hủy liên kết nó, không làm rm -rf. Và nếu số lượng liên kết đạt 0, thì hệ thống sẽ biết nó cũng có thể xóa tất cả nội dung.
LtWorf

rmDù sao thì ít nhiều tất cả đều ở bên dưới (bỏ liên kết). Xem: unix.stackexchange.com/questions/151951/ trộm Đây thực sự không phải là một vấn đề, nhiều hơn là với các tập tin liên kết cứng. Hủy liên kết chỉ loại bỏ tham chiếu được đặt tên và giảm số lượng liên kết. Thực tế là rmdirsẽ không xóa các thư mục không trống là không liên quan - nó sẽ không làm điều đó cho dir1 một trong hai. Hardlinks không phải là bản sao của dữ liệu, chúng là cùng một tệp thực tế, do đó thực sự "xóa" tệp dir2 sẽ xóa danh sách thư mục cho dir1. Bạn sẽ luôn cần phải hủy liên kết.
BryKKan

Bạn không thể hủy liên kết nó như một tệp bình thường, bởi vì rmtrên một thư mục không hủy liên kết nó nếu nó không trống. Xem Chỉnh sửa.
Pierre-Olivier Vares

1

Đây là một lời giải thích tốt. Về "Một trong nhiều cha mẹ nên .. chỉ vào?" một giải pháp sẽ là một quá trình để duy trì đường dẫn wd đầy đủ của nó, dưới dạng inodes hoặc dưới dạng chuỗi. inodes sẽ mạnh mẽ hơn vì tên có thể được thay đổi. Ít nhất là trong thời xa xưa, có một inode lõi cho mỗi tệp đang mở được tăng lên bất cứ khi nào một tệp được mở, giảm khi đóng. Khi nó đạt đến 0, nó sẽ được giải phóng. Khi tệp không còn được mở bởi bất kỳ ai, nó (Bản sao trong lõi) sẽ bị hủy bỏ. Điều này sẽ duy trì đường dẫn là hợp lệ nếu một quá trình khác chuyển một thư mục sang thư mục khác trong khi thư mục con nằm trong đường dẫn của một quy trình khác. Tương tự như cách bạn có thể xóa một tệp đang mở nhưng nó chỉ bị xóa khỏi thư mục,

Các thư mục liên kết cứng được sử dụng để được cho phép tự do trong Bell Labs UNIX, ít nhất là V6 và V7, Không biết về Berkeley trở lên. Không cần cờ. Bạn có thể làm cho các vòng lặp? Vâng, đừng làm vậy. Nó rất rõ ràng những gì bạn đang làm nếu bạn thực hiện một vòng lặp. Bạn nên thực hành thắt nút quanh cổ trong khi chờ đến lượt mình nhảy ra khỏi máy bay nếu bạn có đầu kia được treo một cách thuận tiện từ một cái móc trên đầu khối.

Những gì tôi hy vọng sẽ làm với nó ngày hôm nay là liên kết cứng với nhà để tôi có thể có / nhà / quản lý có sẵn hay không / nhà được che đậy bằng một thiết bị tự động ở nhà, ô tô đó có một liên kết tượng trưng có tên là quản trị / lhome / quản trị. Điều này cho phép tôi có một tài khoản quản trị hoạt động bất kể trạng thái của hệ thống tệp chính của tôi. Đây một thử nghiệm cho linux, nhưng tôi nghĩ đã học được một lần cho SunOS dựa trên UCB rằng việc tự động hóa được thực hiện ở cấp chuỗi ascii. Thật khó để thấy làm thế nào chúng có thể được thực hiện bằng cách khác như một lớp trên đầu trang của bất kỳ FS tùy ý nào.

Tôi đọc ở nơi khác mà. và .. không phải là tập tin nữa trong thư mục. Tôi chắc chắn rằng có những lý do chính đáng cho tất cả những điều này, và phần lớn những gì chúng ta thích (Chẳng hạn như có thể gắn NTFS) là có thể vì những điều như vậy, nhưng một số sự tao nhã của UNIX đã được triển khai. Chính những lợi ích như tính tổng quát và tính dễ uốn mà sự thanh lịch này mang lại đã cho phép nó trở nên mạnh mẽ và tồn tại trong bốn thập kỷ. Khi chúng ta thả lỏng các triển khai thanh lịch, cuối cùng nó sẽ trở thành giống như Windows (Tôi hy vọng tôi đã sai!). Ai đó sau đó sẽ tạo ra một hệ điều hành mới dựa trên các nguyên tắc thanh lịch. Đôi điều suy nghĩ. Có lẽ tôi sai, tôi không (rõ ràng) quen thuộc với việc thực hiện hiện tại. Nó tuyệt vời mặc dù cách hiểu áp dụng 30 năm đối với Linux ... hầu hết thời gian!


Tôi nghĩ rằng, mặc dù tôi có thể sai, mà ...không liên kết cứng trong tập tin hệ thống, cho các file hệ thống hiện đại. Tuy nhiên, trình điều khiển hệ thống tập tin giả mạo chúng. Đây là hệ thống tập tin ngăn chặn các thư mục liên kết cứng. Đối với các hệ thống tệp cũ, điều đó là có thể (nhưng nguy hiểm). Để làm những gì bạn đang cố gắng, nhìn vào mount --bind, cũng thấy mount --make…và có thể là container.
ctrl-alt-delor 23/2/2016

0

Từ những gì tôi thu thập được, lý do chính là nó có thể thay đổi tên thư mục mà không làm rối các chương trình đang chạy sử dụng thư mục làm việc của chúng để tham chiếu các tệp khác. Giả sử bạn đang sử dụng Wine để chạy ~/.newwineprefix/drive_c/Program Files/Firefox/Firefox.exe~/.winethay vào đó bạn muốn chuyển toàn bộ tiền tố sang . Nếu vì một lý do lạ nào đó, Firefox đã truy cập drive_c/windowsbằng cách tham khảo ../../windows, đổi tên ~/.newwineprefixsẽ phá vỡ các triển khai ..theo dõi thư mục mẹ dưới dạng chuỗi văn bản thay vì inode.

Lưu trữ inode của một thư mục cha đơn giản phải đơn giản hơn là cố gắng theo dõi mọi đường dẫn như cả một chuỗi văn bản và một chuỗi các nút.

Một lý do khác là các ứng dụng hoạt động sai có thể tạo ra các vòng lặp. Các ứng dụng ứng xử sẽ có thể kiểm tra xem nút inode của thư mục đang được di chuyển có giống như inode của bất kỳ thư mục lồng nhau nào mà nó được chuyển vào không, giống như bạn không thể di chuyển một thư mục vào chính nó, nhưng điều này có thể không được thực thi ở cấp độ hệ thống tập tin.

Tuy nhiên, một lý do khác có thể là nếu bạn có thể liên kết các thư mục cứng, bạn sẽ muốn ngăn chặn liên kết cứng một thư mục mà bạn không thể sửa đổi. findcó các cân nhắc về bảo mật vì nó được sử dụng để xóa các tệp được tạo bởi người dùng khác khỏi các thư mục tạm thời, điều này có thể gây ra sự cố nếu người dùng chuyển một thư mục thực sự cho một liên kết tượng trưng trong khi findđang gọi một lệnh khác. Có thể liên kết cứng các thư mục quan trọng sẽ buộc quản trị viên thêm các bài kiểm tra bổ sung findđể tránh ảnh hưởng đến chúng. (Ok, bạn đã không thể làm điều này cho các tệp, vì vậy lý do này không hợp lệ.)

Tuy nhiên, một lý do khác là việc lưu trữ inode của thư mục mẹ có thể cung cấp thêm dự phòng trong trường hợp hỏng hoặc hỏng hệ thống tệp. Nếu bạn muốn ..liệt kê tất cả các thư mục gốc liên kết cứng với thư mục này, vì vậy có thể dễ dàng tìm thấy một phụ huynh khác tùy ý nếu thư mục hiện tại bị xóa, không chỉ bạn vi phạm ý tưởng rằng các liên kết cứng bằng nhau, bạn phải thay đổi cách hệ thống tập tin lưu trữ và sử dụng inodes. Có các chương trình coi các đường dẫn là một chuỗi (duy nhất cho mỗi liên kết cứng) của các nút thư mục sẽ tránh được điều này, nhưng bạn sẽ không bị dư thừa trong trường hợp hỏng hệ thống tệp.

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.