솔루션 1(로컬)

솔루션 1(로컬)

저는 현재 BTRFS 사용자이며 CoW를 활용하여 파일이 동일한 btrfs 파일 시스템에 복사될 때 기존 범위를 재사용하여 자동으로 중복 제거되도록 하고 싶습니다. 이를 수행하는 두 가지 방법을 생각할 수 있습니다.

솔루션 1(로컬)

.bashrc에 별칭을 설정하면 cp호출할 때마다 플래그가 자동으로 추가됩니다 --reflink=auto.

alias cp='cp --reflink=auto'

솔루션 2(글로벌)

제가 생각할 수 있는 또 다른 해결책은 /usr/local/bin/cpPATH 변수에서 더 높은 우선순위를 갖는 솔루션을 만드는 것입니다. 스크립트는 다음과 같습니다:

#!/bin/sh

CP=/bin/cp

exec $CP --reflink=auto $*

/bin/cpcoreutils에 대한 업데이트는 결국 내 변경 사항을 덮어쓰게 되므로 교체는 좋은 생각이 아니라고 생각합니다 . 그러나 이는 희망적으로 PATH에서 (직접이 아닌) cp를 호출하는 /bin/cp애플리케이션이 항상 자동으로 참조 링크를 사용한다는 것을 의미합니다.

질문

이에 반대하는 주장이 있습니까? 아니면 이를 부과하는 것이 문제를 일으킬 수 있는 상황이 있습니까? 이것을 설정하면 auto기본 파일 시스템이 참조 링크를 지원하는지, 그리고 동일한 장치에 있는 경우 참조 링크를 사용하면 외부 ext4 파일 시스템을 연결하거나 btrfs 파일 시스템 간에 복사할 때 문제가 없는지 자동으로 결정한다고 가정합니다.

내가 읽고cp --reflink=auto가 기본 동작이 아닌 이유는 무엇입니까?주된 주장은 cp를 사용하여 파일 백업을 생성할 수 있다는 것 같지만, 제 생각에는 로컬에서 더 적은 공간을 소비하고 데이터를 백업하는 것이 목표인 다른 시스템에 데이터를 완전히 복사할 수 있는 것이 더 낫다고 생각합니다. 이 경우 솔루션 2를 구현해도 안전한가요?

로컬 디스크 공간 사용량을 최소화하기 위한 설정 권장 사항을 보았으므로 --sparse=always여기에도 비슷한 질문이 적용될 것이라고 생각했습니다.

답변1

코드에 문제가 있다는 점에 유의하세요. $*인용없이안 돼요말이 되네요. $*위치 매개변수와 첫 번째 문자를 연결한 것입니다 $IFS. 그러면 IFS가 비어 있을 때 동작에 약간의 변화가 있지만 이는 토큰화 및 파일 이름 생성의 영향을 받습니다. 원하는 곳은 다음과 같습니다.

#!/bin/sh -
exec /bin/cp --reflink=auto "$@"

"$@"모든 위치 인수를 별도의 인수로 확장합니다.

업데이트할 때 변경 사항을 업데이트하고 유지하려는 경우 /bin/cp대부분의 시스템에는 이를 수행하는 정식 방법이 있습니다. Debian 및 그 파생 제품에서는 다음을 수행할 수 있습니다.

$ sudo dpkg-divert --local --rename /bin/cp
Adding 'local diversion of /bin/cp to /bin/cp.distrib'

그런 다음 다음과 같이 작성하십시오 /bin/cp.

#! /bin/sh -
exec "$0.distrib" --reflink=auto "$@"

cp.distrib대신 coreutils의 모든 업데이트가 업데이트됩니다 cp.

sh실행하기 전에 로드하고 실행 해야 하므로 성능에 영향을 미칩니다 cp. /bin/sh.NET 기반 데비안에서는 그렇게 나쁘지 않습니다 dash.

cp.distrib이는 또한 다음 대신 오류 및 도움말 메시지가 언급된다는 것을 의미합니다 cp.

$ cp
/bin/cp.distrib: missing file operand
Try '/bin/cp.distrib --help' for more information.

마지막 부분은 다음과 같이 스크립트를 작성하여 해결할 수 있습니다.

#! /bin/bash -
exec -a "$0" "$0.distrib" --reflink=auto "$@"

( 부풀어 오른 껍질 과 동일 ksh93하거나 비교됨 zsh).bashdash

원래 수신된 경로 $0대신 스크립트 경로가 포함되므로 엄격히 동일하지는 않지만 적어도 .argv[0] cp/bin/cp/bin/cp.distrib

답변2

내 솔루션(젠투를 실행하고 있기 때문에 정말 편리함)은 패키지 관리자에게 패치를 요청하는 것이었습니다. 패치는 기본적으로 --reflink=auto를 조정 cp하고 install사용하며 래퍼를 사용하여 크래킹하는 것보다 더 효율적이고 다재다능합니다.

∞ cat /etc/portage/patches/sys-apps/coreutils/coreutils-reflink-auto.patch 
--- a/src/install.c.orig    2021-04-10 15:13:14.698039128 +0300
+++ a/src/install.c 2021-04-10 15:13:24.114292838 +0300
@@ -264,7 +264,7 @@
 {
   cp_options_default (x);
   x->copy_as_regular = true;
-  x->reflink_mode = REFLINK_NEVER;
+  x->reflink_mode = REFLINK_AUTO;
   x->dereference = DEREF_ALWAYS;
   x->unlink_dest_before_opening = true;
   x->unlink_dest_after_failed_open = false;
--- a/src/cp.c.orig 2021-04-10 15:12:03.591111323 +0300
+++ a/src/cp.c  2021-04-10 15:12:40.576190820 +0300
@@ -793,7 +793,7 @@
   x->move_mode = false;
   x->install_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;

관련 정보