Hệ thống tập tin có thể trở nên không nhất quán nếu bị gián đoạn khi di chuyển một tập tin?


13

Tôi có hai thư mục trên cùng một phân vùng (EXT2) Nếu tôi mv folder1/file folder2và một số gián đoạn xảy ra (ví dụ như mất điện), hệ thống tệp có thể không nhất quán không?

Không phải là mvnguyên tử hoạt động?

Cập nhật: Cho đến nay trên IRC tôi đã có những quan điểm sau:

  1. nó là nguyên tử nên sự mâu thuẫn không thể xảy ra
  2. đầ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
  3. đầ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

Ai đó có thể làm rõ?

Câu trả lời:


11

Đầ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=orderedchế độ. (Lưu ý rằng bài đăng trên blog này không phải là về renamebả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 renamevà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 đó renamelà nguyên tử. Tài liệu kernel cho ext4 nói rằng ext4 với auto_da_alloctù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 writetiếp theo làrename, ngụ ý đó renamelà nguyên tử liên quan đến sự cố phần cứng.

Đối với btrfs, một renamelà 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 renamemà 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 fsckkhô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ế.


13

Thao tác đổi tên rất nhanh trên bất kỳ hệ thống tệp nào, do đó không có khả năng bị gián đoạn, nhưng trên hệ thống tệp cổ điển chắc chắn thể bị gián đoạn - nếu nó tạo liên kết đích trước, nó có thể để lại hai liên kết trên một tệp - đó là hợp pháp, nhưng tập tin nghĩ rằng nó chỉ có một, điều này có thể gây ra vấn đề nếu bị xóa sau đó. Mặt khác, nếu nó xóa liên kết nguồn trước, tệp có thể bị mất. Chạy fsck thường sẽ phát hiện và sửa một trong hai điều kiện, mặc dù nếu tệp bị mất, nó sẽ được đặt trong thư mục "mất + tìm thấy" với một tên tùy ý thay vì ở vị trí mong muốn - và nếu nó có hai liên kết thì số lượng liên kết sẽ đơn giản được cập nhật, vì vậy tệp sẽ tồn tại ở hai vị trí nếu hệ thống tệp hỗ trợ này.

Nếu bạn cần một hệ thống tệp mạnh mẽ khi gặp sự cố mất điện, bạn nên sử dụng hệ thống tệp nhật ký , chẳng hạn như NTFS, EXT3 hoặc XFS. Hầu hết các hệ thống hiện đại sẽ sử dụng hệ thống tệp nhật ký theo mặc định, mặc dù bạn nên biết rằng FAT không phải là hệ thống tệp nhật ký nếu bạn sử dụng nó cho các ổ đĩa ngoài.

Một hệ thống tập tin nhật ký sử dụng một hệ thống "mục nhập kép" - nó ghi vào tập tin thực tế rằng nó có ý định di chuyển nó, sau đó thực hiện di chuyển. Khi hệ thống tập tin được kiểm tra khi khởi động, nếu nó bị gián đoạn, nó sẽ nhận thấy rằng việc di chuyển chưa hoàn thành và làm lại sau đó.

Có hai loại hệ thống tập tin nhật ký - ghi nhật ký siêu dữ liệu và ghi nhật ký đầy đủ. Ghi nhật ký siêu dữ liệu có nghĩa là nó không theo dõi các thay đổi đối với nội dung tệp trong hệ thống nhật ký (vì vậy, bạn có thể sẽ mất nội dung nếu bạn đang ghi vào một tệp), nhưng nó vẫn sẽ theo dõi thông tin hệ thống tệp quan trọng như nội dung thư mục , thuộc tính tệp, v.v.


Khi mọi người nói về hoạt động đổi tên là nguyên tử, điều đó có nghĩa là nó không thể được quan sát giữa quá trình chuyển đổi giữa một quá trình khác trên hệ thống và không thể hoàn thành một nửa bằng cách làm gián đoạn mvchính lệnh đó ^C. Quá trình vật lý ghi vào mỗi thư mục, có không gian lưu trữ có thể ở các vị trí khác nhau trên đĩa, có thể không phải là một hoạt động nguyên tử thực sự ở cấp độ phần cứng.


Để đầy đủ, tôi sẽ lưu ý rằng cũng có một số thao tác I / O ngẫu nhiên liên quan đến việc đổi tên ngoài việc tạo liên kết mới trong thư mục đích và xóa nó trong thư mục cũ - cập nhật thời gian của cả hai thư mục, có thể mở rộng kích thước phân bổ của thư mục đích, thay đổi ..liên kết và số lượng liên kết của các thư mục mẹ nếu tệp là một thư mục. Ngoài ra, tôi không chắc chắn nếu thời gian của tập tin bị ảnh hưởng.


Một tạp chí không đảm bảo sự cố mất điện nguyên tử. Tôi nghĩ rằng ext3 và ext4 đảm bảo đó renamelà 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?
Gilles 'SO- ngừng trở nên xấu xa'

@Gilles bạn có bất kỳ thông tin nào về cách nó thậm chí có thể được đảm bảo về mặt lý thuyết mà không cần một tạp chí không? Ý tôi là, ở cấp độ cơ bản, chúng ta đang nói về việc đồng bộ hóa ghi vào hai tệp khác nhau để đảm bảo rằng bạn không bao giờ nhận được kết quả mà chỉ một trong số chúng được thực hiện.
Random832

Các hệ thống tập tin có cấu trúc log duy trì tính nhất quán bằng cách không ghi đè các khối đang sử dụng. Điều này rất phù hợp với phương tiện flash trong đó ghi đè dữ liệu hiện có là tốn kém. Nhật ký không thực sự giống như một tạp chí vì không có gì được phát lại khi cài đặt - mặc dù bạn có thể nói rằng toàn bộ hệ thống tệp là nhật ký (ngoại trừ việc gắn kết không bao giờ liên quan đến việc phát lại toàn bộ nội dung trong bộ nhớ vì nó sẽ quá chậm). Mô tả về LogFS trong Wikipedia là một tổng quan tốt.
Gilles 'SO- ngừng trở nên xấu xa'

1

Câu hỏi này đã được hỏi một cách hơi khác nhau trên Super User. Trang Wikipedia về mvlệnh cũng giải thích nó khá tốt:

Di chuyển tệp trong cùng một hệ thống tệp thường được triển khai khác với sao chép tệp và sau đó xóa tệp gốc. Trên các nền tảng không hỗ trợ đổi tên tòa nhà, một liên kết mới được thêm vào thư mục mới và liên kết ban đầu sẽ bị xóa. Dữ liệu của tập tin không được truy cập.

Linux đã đổi tên tòa nhà và do đó sẽ đổi tên tệp thành một hoạt động nguyên tử, tức là không thể bị phá vỡ. Vì vậy, không, hệ thống tập tin có thể trở nên không nhất quán trong tình huống mà bạn mô tả.


2
là sys đổi tên gọi một trừu tượng os? Vì phần cứng thông minh, tôi luôn có thể làm gián đoạn một loạt các hoạt động vì việc đổi tên phải là một chuỗi các hoạt động
graphtheory92

Không, đó không phải là một sự trừu tượng của hệ điều hành, nhưng tôi nghĩ rằng "do đó rất khó có khả năng hệ thống tập tin trở nên không nhất quán ..." sẽ khiến mọi thứ trở nên quá phức tạp. Tôi đồng ý với suy nghĩ của bạn.
Benjamin B.

2
Câu trả lời này lá tôi tự hỏi tại sao các renamecuộc gọi hệ thống không thể dẫn đến việc hệ thống tập tin là trong một nhà nước không phù hợp thậm chí nếu có mất điện. Tôi cảm thấy như đây là cốt lõi của câu hỏi của @ graphtheory92.
Tanner Swett

1
@ graphtheory92: Nếu một cuộc gọi hệ thống là nguyên tử, điều đó không có nghĩa là hoạt động của đĩa kết quả (hoặc một loạt các hoạt động của đĩa!) cũng sẽ là nguyên tử. ------ Tôi có thể tưởng tượng rằng bằng cách di chuyển một tệp (liên kết cứng số 1) và cắt nguồn, kết nối đĩa cứng hoặc làm hỏng kernel đúng lúc, bạn có thể kết thúc bằng hai liên kết cứng (bản gốc và bản mới ) vào tệp có số lượng liên kết cứng vẫn là 1. ------ Tôi nghĩ có hai giải pháp cơ bản cho vấn đề: a) phần mềm - ghi nhật ký FS có thể tự động phục hồi từ các trạng thái không nhất quán. b) CTNH hỗ trợ giao dịch.
pabouk

2
Sự đảm bảo về tính nguyên tử mà bạn đề cập là liên quan đến việc quan sát bởi các quá trình khác. Nó không giữ nếu hệ thống gặp sự cố.
Gilles 'SO- ngừng trở nên xấu xa'
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.