Tại sao cp --reflink=auto
không phải là hành vi mặc định? Nó có thể gây ra bất kỳ tác hại để kích hoạt nó?
Có thể kích hoạt nó vào thời gian biên dịch, vì vậy nó được sử dụng trên toàn hệ thống, không chỉ trong các vỏ tương tác?
Tại sao cp --reflink=auto
không phải là hành vi mặc định? Nó có thể gây ra bất kỳ tác hại để kích hoạt nó?
Có thể kích hoạt nó vào thời gian biên dịch, vì vậy nó được sử dụng trên toàn hệ thống, không chỉ trong các vỏ tương tác?
Câu trả lời:
Đây không phải là mặc định vì lý do mạnh mẽ, người ta có thể muốn một bản sao diễn ra để bảo vệ chống tham nhũng dữ liệu. Ngoài ra, vì lý do hiệu năng, bạn có thể muốn ghi xảy ra tại thời điểm sao chép thay vì một số quy trình nhạy cảm độ trễ làm việc trên tệp CoW và bị trì hoãn bởi ghi có thể vào một phần khác của đĩa cơ. Lưu ý rằng từ coreutils v8.24 mv sẽ phản xạ theo mặc định, vì nó không có các ràng buộc ở trên.
Không biết lý do tại sao nó không phải là mặc định, có lẽ vì vậy mà nó cư xử giống như tiện ích sao chép khác ( rsync
, cpio
, pax
, tar
...) mà không có sự hỗ trợ cho nó (hoặc khi tập tin được sao chép qua một giao diện mà không cho phép điều đó (như các lớp hệ thống tệp NFS, samba, fuse ...).
Tôi đã ở trong tình huống tương tự vài năm trước và nhìn vào mã cp GNU nhanh chóng, nó vẫn giống nhau, bạn phải vá mã để có một hành vi mặc định khác:
--- coreutils-8.21/src/cp.c~ 2013-06-22 21:50:26.265639114 +0100
+++ coreutils-8.21/src/cp.c 2013-06-22 21:51:06.880513924 +0100
@@ -775,7 +775,7 @@ cp_option_init (struct cp_options *x)
x->interactive = I_UNSPECIFIED;
x->move_mode = false;
x->one_file_system = false;
- x->reflink_mode = REFLINK_NEVER;
+ x->reflink_mode = REFLINK_AUTO;
x->preserve_ownership = false;
x->preserve_links = false;
Một vấn đề lớn là tiềm năng hết dung lượng để thực hiện sao chép khi bạn viết.
Với một bản sao bình thường, ngay sau khi bản sao hoàn thành, bạn không bao giờ phải lo lắng về việc ghi vào các phần hiện có của tệp bị lỗi: không gian được phân bổ hoàn toàn và sẽ không biến mất cho đến khi bạn xóa tệp. Nhưng với một bản sao phản chiếu, luôn có nguy cơ rằng tại một số điểm hoặc vài tháng sau đó, việc ghi vào một phần hiện có của tệp sẽ thất bại vì không có đủ không gian để tạo một bản sao.
Khám phá ra rằng hệ thống của bạn đã thực hiện các bản sao phản chiếu sau lưng khi một thao tác như thế thất bại sẽ là một bất ngờ khá khó chịu.
alias cp='cp --reflink=auto --sparse=always'
có ý nghĩa tốt hơn là vá mã
/bin/cp
và thay thế nó bằng một tập lệnh shell tương tự
Lý do mạnh mẽ người ta có thể muốn một bản sao diễn ra để bảo vệ chống lại "mất mát" dữ liệu.
Chúng tôi không biết đó là lý do, nhưng những điều tồi tệ có thể xảy ra được giới hạn trong việc phá hủy phương tiện truyền thông. Hầu hết tất cả các thiết bị khối sẽ có một số hình thức nhận dạng tham nhũng (crc), nếu không chuyển tiếp sửa lỗi (chẵn lẻ).
Không phải vì lý do hiệu suất.
CoW xảy ra khi chỉ là một phần của? Xóa? khối được viết vào. Với đĩa hiện đại! Thiết bị có kích thước khối phần cứng là bội số của 4k. Việc thay đổi một phần của 4k khiến ổ đĩa đọc toàn bộ 4k và ghi lại, nhưng trên hết, hạt nhân sẽ làm điều tương tự vì vậy sẽ không có bất kỳ ghi nào tới thiết bị khối, SSD hay nói cách khác . Hạt nhân cần thực hiện CoW vì những lý do tương tự, trừ khi chúng ta có một bản sao được lưu trong bộ nhớ cache, chúng ta không thể tạo dữ liệu tồn tại trong các phần khác của thiết bị, lưu vào phần cuối của tệp nhưng sau đó là điểm xe đẩy Nhưng lưu trữ một bản sao của một tập tin và sao chép một tập tin là các hoạt động khác nhau, trước đây là rẻ hơn nhiều.
Địa chỉ của văn bản là không quan trọng, nhưng làm cho nó biết rằng "một số phần chưa sử dụng của thiết bị" rẻ hơn để khám phá so với "nơi các khối tệp hiện đang cư trú."
Thực tế là bất kỳ phương pháp CoW nào đều rẻ hơn hoặc bằng cách đơn giản là cập nhật một thiết bị khối. Bây giờ nếu chúng ta không nói chuyện với các thiết bị khối, thì đó sẽ là một câu chuyện khác ... Được viết trên băng ở đâu đó.