Làm thế nào để linux làm việc với các liên kết tượng trưng?


11

Tôi có nghĩa là những gì đang xảy ra khi một số quá trình muốn đọc một liên kết tượng trưng? Điều gì đang xảy ra khi một cái gì đó thay đổi một liên kết tượng trưng trong quá trình đọc hoặc thậm chí viết?

Ví dụ: Tôi có 2 tệp 100G lớn, tương tự /mnt/1/mnt/2. /mnt/1có sẵn thông qua các liên kết tượng trưng /home/user/file. Một số chương trình Abắt đầu đọc /home/user/file. Và sau một thời gian, một cái gì đó thay đổi liên kết từ /mnt/1đến /mnt/2, nhưng Avẫn đang đọc tệp.

Chương trình có lưu trữ đường dẫn tuyệt đối không?

Nó sẽ thất bại và lỗi, bởi vì liên kết tượng trưng đã được thay đổi hoặc nó sẽ hoạt động tốt, như không có gì xảy ra?

Nó có khác trong trường hợp /home/user/fileđược liên kết với một thiết bị khối không (ví dụ 2 đĩa iscsi được sao chép)?

Câu trả lời:


9

Symlink trỏ đến tên của tệp thực ( inode ) trong hệ thống tệp. Khi hệ thống giải quyết liên kết tượng trưng đó để tìm tệp thực tế và mở nó, nó sẽ tìm và sử dụng inode của tệp. Tại thời điểm đó, đường dẫn bạn sử dụng để đến tệp không thành vấn đề. Những gì HĐH không lưu vào bộ đệm, nó đọc từ tệp bằng inode của nó. Theo tôi hiểu, bạn có thể bắt đầu đọc tệp thông qua một liên kết cứng và xóa liên kết cứng đó (miễn là tệp vẫn được liên kết từ nơi khác) và nó sẽ không gây ra sự cố miễn là tệp đã được giải quyết ( chuỗi tên-> inode).


4
Bạn có thể xóa TẤT CẢ các liên kết đến tệp và vẫn tiếp tục đọc nó khi bạn mở nó. Đây là lý do tại sao bạn có thể nâng cấp các gói mà không cần khởi động lại như bạn phải trên windows; bởi vì bạn có thể rm tệp thực thi chương trình ngay cả khi nó đang chạy.
psusi

1
@psusi Tôi biết dữ liệu và inode vẫn còn đó và chỉ không được trỏ đến nữa, nhưng một khi tệp đã bị xóa, hệ thống có thể ghi đè lên vị trí đó trên đĩa, phải không? Vì vậy, nếu tệp quá lớn để phù hợp với bộ đệm của tệp, như tệp 100 GB được đề cập, điều gì xảy ra nếu một phần của chúng bị ghi đè trước khi bạn kết thúc? Đây không phải là mối quan tâm đối với các tệp hệ thống quan trọng vì chúng được tải vào bộ nhớ cache và được giữ ở đó, nhưng 100 GB đủ lớn để tôi nghĩ rằng đây có thể là một mối lo ngại.
Kevin

2
Kevin, tập tin đã không xóa khỏi đĩa cho đến khi quá trình cuối cùng sử dụng tập tin chết. Bạn luôn có thể tìm thấy tất cả các tệp đang được sử dụng tại thời điểm này trong Proc. Nhưng câu trả lời của bạn dường như đã giải thích câu hỏi của tôi. Cảm ơn.
vội vàng

2
Câu trả lời này bỏ lỡ một điểm quan trọng, đó là một liên kết tượng trưng chứa tên của tệp đích.
Keith Thompson

6

Một biểu tượng liên kết là một tập tin nhỏ có chứa các vị trí (đường dẫn ví dụ và tên file) của một tập tin mục tiêu, với một lá cờ trong mục nhập thư mục chỉ ra rằng đó là một liên kết tượng trưng.

Khi bạn mở một liên kết tượng trưng, ​​HĐH sẽ theo vị trí để tìm tệp mục tiêu. Nếu mục tiêu tự nó là một liên kết tượng trưng, ​​nó cũng đi theo vị trí của nó (1) (2) cho đến khi vị trí trỏ đến một tệp không phải là một liên kết tượng trưng (hãy gọi nó là FinalFile ). Sau đó, HĐH thu được inode của FinalFile (inode chứa siêu dữ liệu như thời gian sửa đổi và cũng có một con trỏ tới dữ liệu của tệp). Cuối cùng, nút của FinalFile được mở. Từ giờ trở đi, quá trình sử dụng inode đó để đọc / ghi vào tệp. Kết quả là thay đổi tên hoặc đường dẫn liên kết tượng trưng, ​​xóa liên kết tượng trưng, ​​thay đổi đường dẫn hoặc tên của FinalFile hoặc thậm chí xóa FinalFile(3) không có hiệu lực trong quá trình; nó vẫn đọc từ cùng một nút.

Trong hầu hết các trường hợp, các thao tác dữ liệu tệp trên symlink sẽ ảnh hưởng đến FinalFile (ví dụ đọc và ghi vào symlink sẽ đọc từ / ghi vào FinalFile ) nhưng có trường hợp ngoại lệ: readlink()cuộc gọi hệ thống tự đọc nội dung của symlink.

Các hoạt động siêu dữ liệu tệp (như đổi tên hoặc xóa) mặt khác thường sẽ ảnh hưởng đến liên kết tượng trưng. Nhưng cũng có trường hợp ngoại lệ: lstat()cuộc gọi hệ thống là như thế stat(), ngoại trừ việc nó trả về thông tin trên chính liên kết tượng trưng chứ không phải trên FinalFile (2).


(1) Có giới hạn về số lượng cấp độ và mọi thứ trở nên phức tạp hơn một chút nếu vị trí trong liên kết tượng trưng là một đường dẫn tương đối.

(2) Đọc symlink (7): xử lý liên kết tượng trưng để biết thêm chi tiết.man 7 symlink

(3) rmLệnh hoặc lệnh unlink()gọi hệ thống không xóa vật lý một tệp. Nó loại bỏ mục nhập thư mục trỏ đến nút của tệp. Bản thân tệp chỉ bị xóa nếu cả a) không có thêm mục nhập thư mục (liên kết cứng) nào đề cập đến inode của nó và b) không có quá trình nào mở tệp.


1

Điều đó gần như minh bạch đối với Linux và nó liên quan nhiều đến hệ thống tập tin bạn đang sử dụng hơn hệ điều hành.

Nó không phải là một tệp thông thường, hoặc một tệp rất nhỏ vì bạn không thể tạo một liên kết tượng trưng hoạt động trong phân vùng VFAT, ví dụ bằng cách chỉ sao chép chính liên kết tượng trưng vào nó, bởi vì nó được ghi lại trực tiếp bởi hệ thống tệp.

Sự khác biệt trong liên kết tượng trưng đến một liên kết cứng là việc bổ nhiệm là một liên kết cứng thay vì sẵn sàng cho các lĩnh vực dữ liệu như một liên kết cứng.

Thí dụ:

Kiểm tra 1:

echo 'data' >file.txt

Điều này sẽ tạo ra file.txt liên kết cứng trỏ đến các ngành từ 10 đến 20 * (số * chỉ để giải thích).

Bài kiểm tra 2:

Bây giờ thì sao?

ln file.txt file_2.txt

Điều này đã tạo ra một tệp hardlink file.txt.txt trỏ đến các sector 10 đến 20 (giống với file.txt), vì vậy nếu bạn xóa file.txt, các sector 10 đến 20 vẫn được bảo lưu và bạn có thể thấy dữ liệu bên trong file_2.txt ... . (file.txt và file_2.txt đều giống như bản gốc)

Bài kiểm tra 3:

ln -s file.txt file_sym.txt 

File_sym.txt liên kết biểu tượng nhọn đến file.txt liên kết cứng, vì vậy khi bạn cố gắng truy cập file_sym.txt, bạn sẽ thấy file.txt, nhưng nếu bạn xóa file.txt thì file_sym sẽ không tìm thấy mục tiêu nữa.

Chúng được quản lý bởi hệ thống tập tin, ví dụ như các mô đun ext4 cho linux (hoặc nếu nó được biên dịch trên kernel), không vấn đề gì nếu bạn đang sử dụng Linux hoặc Unix khác.

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.