为什么cp --reflink=auto
不是默认行为?启用它会造成任何伤害吗?
是否可以在编译时启用它,以便在整个系统中使用它,而不仅仅是在交互式 shell 中使用?
Pád*_*ady 57
这不是默认设置,因为出于健壮性原因,人们可能希望进行复制以防止数据损坏。同样出于性能原因,您可能希望写入发生在复制时,而不是一些处理 CoW 文件的延迟敏感过程,并且可能会被写入机械磁盘的不同部分而延迟。请注意,从 coreutils v8.24 mv 将默认重新链接,因为它没有上述约束。另请注意,v8.32之后的主要版本将默认尝试在 cp 中重新链接,因为这样的更改不适用于次要版本。
Sté*_*las 18
不知道为什么它不是默认值,可能是因为它的行为与其他不支持它的复制实用程序(rsync
, cpio
, pax
, tar
...)相同(或者当文件通过不允许这样做的接口复制时) (如 NFS、samba、融合文件系统层......)。
几年前我也处于同样的情况,快速查看 GNU cp 代码,它仍然相同,您必须修补代码以获得不同的默认行为:
--- 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;
Run Code Online (Sandbox Code Playgroud)
Bru*_*ams 11
从 coreutils 9.0 开始,reflink=auto 是默认行为。看:
https://lists.gnu.org/archive/html/info-gnu/2021-09/msg00010.html
这是为了发布 coreutils-9.0,一个稳定版本。
这是一个新的主要版本,具有以下重大变化:
- cp 改变了它处理数据的方式
- 默认启用 CoW(通过 FICLONE ioctl),
- 在可用的情况下使用复制卸载(通过 copy_file_range),
- 检测孔的方式不同(尽管 SEEK_HOLE)
- 这也适用于 mv 和 install。
小智 5
alias cp='cp --reflink=auto --sparse=always'
Run Code Online (Sandbox Code Playgroud)
比修补代码更有意义