저는 현재 BTRFS 사용자이며 CoW를 활용하여 파일이 동일한 btrfs 파일 시스템에 복사될 때 기존 범위를 재사용하여 자동으로 중복 제거되도록 하고 싶습니다. 이를 수행하는 두 가지 방법을 생각할 수 있습니다.
솔루션 1(로컬)
.bashrc에 별칭을 설정하면 cp
호출할 때마다 플래그가 자동으로 추가됩니다 --reflink=auto
.
alias cp='cp --reflink=auto'
솔루션 2(글로벌)
제가 생각할 수 있는 또 다른 해결책은 /usr/local/bin/cp
PATH 변수에서 더 높은 우선순위를 갖는 솔루션을 만드는 것입니다. 스크립트는 다음과 같습니다:
#!/bin/sh
CP=/bin/cp
exec $CP --reflink=auto $*
/bin/cp
coreutils에 대한 업데이트는 결국 내 변경 사항을 덮어쓰게 되므로 교체는 좋은 생각이 아니라고 생각합니다 . 그러나 이는 희망적으로 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
).bash
dash
원래 수신된 경로 $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;