Đầu tiên, hãy xua tan một số huyền thoại.
nó là nguyên tử nên sự mâu thuẫn không thể xảy ra
Di chuyển một tệp bên trong cùng một hệ thống tệp (tức là rename
) hệ thống gọi là nguyên tử đối với môi trường phần mềm. Nguyên tử có nghĩa là bất kỳ quá trình tìm kiếm tệp nào cũng sẽ thấy nó ở vị trí cũ hoặc tại vị trí mới của nó; sẽ không có quá trình nào có thể quan sát thấy tệp có số lượng liên kết khác hoặc tệp có trong thư mục nguồn sau khi có mặt trong thư mục đích hoặc tệp không có trong thư mục đích sau khi vắng mặt trong nguồn danh mục.
Tuy nhiên, nếu hệ thống gặp sự cố do lỗi, lỗi đĩa hoặc mất điện, không có gì đảm bảo rằng hệ thống tập tin được để ở trạng thái nhất quán, chứ đừng nói rằng việc di chuyển không được thực hiện một nửa. Linux nói chung không đảm bảo tính nguyên tử đối với các sự kiện phần cứng.
đầu tiên bạn sao chép mục dir trong thư mục mới và sau đó xóa mục trên thư mục trước đó, do đó bạn có thể có sự không nhất quán khi có tệp được tham chiếu hai lần, nhưng số lần giới thiệu là 1
Điều này đề cập đến một kỹ thuật thực hiện cụ thể. Co nhung nguoi khac.
Điều đó xảy ra khi ext2 trên Linux (kể từ kernel 3.16) sử dụng kỹ thuật đặc biệt này. Tuy nhiên, điều này không có nghĩa là nội dung đĩa đi qua chuỗi [vị trí cũ] → [cả hai vị trí] → [vị trí mới], bởi vì hai thao tác (thêm mục nhập mới, loại bỏ mục nhập cũ) không phải là nguyên tử ở cấp độ phần cứng : có thể một trong số chúng bị gián đoạn, khiến hệ thống tập tin ở trạng thái không nhất quán. (Hy vọng fsck sẽ sửa chữa nó.) Hơn nữa, lớp khối có thể sắp xếp lại ghi, vì vậy nửa đầu có thể được cam kết vào đĩa ngay trước khi sự cố và nửa sau sẽ không được thực hiện.
Số tham chiếu sẽ không bao giờ được quan sát là khác với 1 miễn là hệ thống không gặp sự cố (xem ở trên) nhưng đảm bảo đó không kéo dài đến sự cố hệ thống.
đầu tiên nó xóa con trỏ và sau đó sao chép con trỏ sao cho sự không nhất quán là tệp có tham chiếu 0
Một lần nữa, điều này đề cập đến một kỹ thuật thực hiện cụ thể. Một tập tin lơ lửng không thể được quan sát nếu hệ thống không gặp sự cố, nhưng đó là hậu quả có thể xảy ra của sự cố hệ thống, ít nhất là trong một số cấu hình.
Theo một bài đăng trên blog của Alexander Larsson , ext2 không đảm bảo tính nhất quán trong sự cố hệ thống, nhưng ext3 thực hiện trong data=ordered
chế độ. (Lưu ý rằng bài đăng trên blog này không phải là về rename
bản thân nó, mà là về sự kết hợp của việc ghi vào một tệp và gọi rename
vào tệp đó.)
Theodore Ts'o, tác giả chính của các hệ thống tập tin ext2, ext3 và ext4, đã viết một bài đăng trên blog về cùng một vấn đề . Bài đăng trên blog này thảo luận về tính nguyên tử (chỉ liên quan đến môi trường phần mềm) và độ bền (đó là tính nguyên tử đối với các sự cố cộng với đảm bảo cam kết, tức là biết rằng hoạt động đã được thực hiện). Thật không may, tôi không thể tìm thấy thông tin về nguyên tử liên quan đến các vụ tai nạn. Tuy nhiên, đảm bảo độ bền được đưa ra cho ext4 yêu cầu đó rename
là nguyên tử. Tài liệu kernel cho ext4 nói rằng ext4 với auto_da_alloc
tùy chọn (là mặc định trong các kernel hiện đại), cũng như ext4, cung cấp một đảm bảo độ bền cho write
tiếp theo làrename
, ngụ ý đó rename
là nguyên tử liên quan đến sự cố phần cứng.
Đối với btrfs, một rename
là ghi đè một tập tin hiện là đảm bảo được nguyên tử liên quan đến sự cố với, nhưng một rename
mà không ghi đè lên một tập tin có thể dẫn đến không tập tin hoặc cả hai tập tin hiện có.
Tóm lại, câu trả lời cho câu hỏi của bạn là không chỉ di chuyển một tệp không phải là nguyên tử liên quan đến sự cố trên ext2, mà thậm chí còn không đảm bảo để tệp ở trạng thái nhất quán (mặc dù các lỗi fsck
không thể sửa chữa là rất hiếm) - hầu như không có gì, đó là lý do tại sao các hệ thống tập tin tốt hơn đã được phát minh. Ext3, ext4 và btrfs cung cấp đảm bảo hạn chế.
rename
là nguyên tử, nhưng btrfs không theo wiki (xem câu trả lời của tôi). Cũng có thể đảm bảo tính nguyên tử mà không cần tạp chí (tôi không biết về các ví dụ trên Linux nhưng có thể có một số). Bạn có thông tin đáng tin cậy về ext2?