Tại sao cp --reflink = auto không phải là hành vi mặc định?


31

Tại sao cp --reflink=autokhô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?


4
Vâng, câu hỏi hay. IMHO nó sẽ, vì chỉ BTRFS bắt đầu là một hệ thống tệp Linux mặc định.
Adam Ryczkowski

Câu trả lời:


38

Đâ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.


8
(đó có thể được coi là một câu trả lời có thẩm quyền vì Pádraig là người duy trì GNU coreutils).
Stéphane Chazelas

8
Tôi nghi ngờ câu trả lời này là chính xác, ít nhất là trên btrfs. Nếu sau đó tệp được ghi vào, dữ liệu mới sẽ được ghi vào một khu vực đĩa khác do btrfs CoW, do đó không có lợi thế về độ trễ khi không thực hiện phản xạ. Dù sao đi nữa, các tập tin có NoDataCoW không thể được xem lại. Và nếu bạn muốn bảo vệ chống tham nhũng dữ liệu, bạn cần phải sao chép sang một phân vùng khác và đèn flash cũng không hoạt động.
JanKanis

3
Có các vấn đề về độ trễ do BTRFS cần tìm và phân bổ không gian tại thời điểm ghi. Điều này thậm chí có thể không khả dụng do đó gây ra lỗi ENOSPC tại thời điểm ghi
Pádraig Brady

1
Mv có công dụng gì cho phản xạ?
Macil

1
đổi tên subvolume trên btrfs
Pádraig Brady

17

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;

4

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.


Ít nhất trên btrfs thậm chí ghi vào một phần của tệp đã được phân bổ có thể thất bại với ENOSPC ...
Graywolf

2
alias cp='cp --reflink=auto --sparse=always'

có ý nghĩa tốt hơn là vá mã


6
Có vẻ như bạn đã bỏ qua phầ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 trong câu hỏi của OP.
Stéphane Chazelas

5
@StephaneChazelas Người ta luôn có thể đổi tên /bin/cpvà thay thế nó bằng một tập lệnh shell tương tự
goncalopp

0
  1. 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ẻ).

  2. 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 đó.

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.