Điều gì xảy ra nếu một tập tin được sửa đổi trong khi bạn sao chép nó?


19

Hiệu quả của việc sao chép một tập tin nói fileA.big (900mb) từ vị trí B sang locationC. Nếu trong quá trình hoạt động cp đó, hãy nói 35% trong suốt quá trình, fileA.big được thêm thông tin mới và tăng từ 900mb lên 930mb.

Kết quả của bản sao cuối (ví dụ fileA.big tại locationC) là gì?

Điều gì xảy ra nếu bản sao có khoảng 70% thông qua và tệp gốc được cập nhật nhưng lần này bị cắt ngắn thành 400mb (tức là tiến trình của bản sao vượt quá điểm cắt), kết quả của bản sao cuối là gì?

Tham khảo hệ điều hành linux trên hệ thống tập tin ext3 / ext4. Không có bóng ma thuật âm lượng vv .. Chỉ đơn giản là cp cũ. Sự tò mò nổi lên bằng cách sao chép các tập tin couchdb trực tiếp để sao lưu, nhưng quan tâm nhiều hơn đến các tình huống chung hơn là trường hợp sử dụng cụ thể.


Cảm ơn đã hỏi cái này 'Kiến thức' của tôi chủ yếu là phỏng đoán ... cho đến bây giờ.
tshepang

Câu trả lời:


10

Nếu fileA.bigđược phát triển trong quá trình sao chép, bản sao sẽ bao gồm dữ liệu được nối thêm.

Nếu tệp bị cắt ngắn hơn so với vị trí của bản sao hiện tại, bản sao sẽ hủy bỏ ngay tại nơi tệp đó và tệp đích sẽ chứa những gì được sao chép cho đến khi nó bị hủy bỏ.


27

Patrick có ít nhiều đúng, nhưng đây là lý do tại sao. Cách bạn sao chép một tệp trong UNIX hoạt động như thế này:

  1. Cố gắng đọc một số (nhiều) byte từ fileA.
  2. Nếu chúng tôi không nhận được byte bởi vì chúng tôi ở (hoặc quá khứ) ở cuối tệp, chúng tôi đã hoàn tất; bỏ thuốc lá
  3. Mặt khác, ghi các byte vào fileBvà lặp lại bước 1.

Biết điều đó và biết nó đơn giản như thế, cho phép chúng ta thấy một số trường hợp góc.

Ngay sau khi chúng tôi tìm thấy phần cuối của tệp, bản sao đã được thực hiện. Vì vậy, giả sử tập tin của chúng tôi đang phát triển trong quá trình sao chép, nhưng đang phát triển chậm hơn so với việc chúng tôi sao chép nó. Chương trình sao chép sẽ tiếp tục vượt qua kích thước tệp gốc, bởi vì tại thời điểm nó đến đó, có nhiều tệp hơn. Nhưng tại một số điểm, nó bắt kịp với phần cuối của tệp và nó biết nó ở cuối bởi vì nó không thể đọc thêm bất kỳ byte nào ngay bây giờ . Vì vậy, nó thoát ngay tại đó, ngay cả khi tập tin sắp phát triển hơn nữa.

Nếu tệp bị cắt ngắn, chương trình sao chép sẽ ghi "Whoa, tôi đã qua cuối tệp!" và bỏ cuộc.

Và nếu các phần của tệp được cập nhật ngẫu nhiên bởi, giả sử, một chương trình cơ sở dữ liệu :-), thì bản sao của bạn sẽ là một sự pha trộn của dữ liệu cũ và mới, bởi vì dữ liệu không phải là tất cả được sao chép cùng một lúc. Kết quả có thể sẽ là một bản sao bị hỏng, đó là lý do tại sao nói chung không phải là một ý tưởng tốt để tạo các bản sao của cơ sở dữ liệu trực tiếp.

(Điều đó nói rằng, tôi không quen thuộc với CouchDB và có thể thiết kế cơ sở dữ liệu để chống lại loại tham nhũng này. Nhưng tốt nhất là phải chắc chắn tuyệt đối.)


Lời giải thích hay. BTW, điều này luôn làm tôi ngạc nhiên tại sao điều này có thể xảy ra trong các HĐH giống UNIX mà không nhận được thông báo lỗi điển hình được biết từ Windows ("Không thể truy cập tệp - tệp đang sử dụng") Bạn thậm chí không thể phát tệp MP3 đã bị xóa trong khi chơi nó Trong Unix, bạn có thể (đáng ngạc nhiên) - không có vấn đề gì cả. Tôi đoán các hệ điều hành dựa trên UNIX luôn hoạt động với các bản sao lưu của các tệp, vì vậy điều này là khả thi.
cú pháp

1
Trên thực tế, việc có thể đọc một tệp bị xóa xuất phát từ một tính năng UNIX khác: trong UNIX, các tệp và tên tệp là những thứ khác nhau. Khi bạn xóa một tệp, những gì bạn thực sự đang làm là xóa một "liên kết" có tên đến tệp. Khi một chương trình mở một tập tin, đó cũng được tính là một liên kết. Hệ thống sẽ tự xóa tệp chỉ khi nó không còn liên kết.
Jander

Vậy nếu tập tin phát triển nhanh hơn chúng ta có thể sao chép thì cp sẽ không bao giờ chấm dứt? Tôi nhận ra điều đó là không thể, vì bất cứ điều gì ghi vào tệp sẽ phải có khả năng ghi vào tệp, nhanh hơn cp có thể đọc từ nó.
Bladt
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.