cp --reflink = auto가 기본 동작이 아닌 이유는 무엇입니까?


31

cp --reflink=auto기본 행동 이 아닌 이유는 무엇 입니까? 그것을 가능하게하는 데 해를 입힐 수 있습니까?

컴파일 타임에 활성화 할 수 있습니까? 그래서 대화 형 쉘뿐만 아니라 시스템 전체에서 사용됩니까?


4
예, 좋은 질문입니다. BTRFS만이 기본 Linux 파일 시스템으로 시작하기 때문에 IMHO도 마찬가지입니다.
Adam Ryczkowski 2016 년

답변:


38

견고성으로 인해 데이터 손상으로부터 보호하기 위해 사본을 만들 수 있기 때문에 기본값이 아닙니다. 또한 성능상의 이유로 CoW 파일에서 작업하고 기계 디스크의 다른 부분에 대한 쓰기로 지연 될 수있는 대기 시간에 민감한 프로세스가 아니라 복사 시간에 쓰기를 원할 수 있습니다. coreutils v8.24에서 mv는 위의 제약 조건이 없으므로 기본적으로 참조 연결됩니다.


8
(Pádraig는 GNU coreutils의 관리자이므로 신뢰할만한 답변으로 간주 될 수 있습니다).
Stéphane Chazelas

8
나는 적어도 btrfs 에서이 대답이 옳지 않다고 생각합니다. 파일이 나중에 기록되면 btrfs CoW로 인해 새 데이터가 다른 디스크 섹터에 기록되므로 참조 링크를 수행하지 않는 대기 시간 이점이 없습니다. NoDataCoW가 설정된 파일은 다시 참조 할 수 없습니다. 또한 데이터 손상을 방지하려면 다른 파티션으로 복사해야하며 참조 링크도 작동하지 않습니다.
JanKanis

3
BTRFS가 쓰기시 ​​공간을 찾아 할당해야하므로 대기 시간 문제가 있습니다. 이 힘도 가능하여 쓰기 시간에 ENOSPC 오류를 던지고 수 없습니다
파드 리그 브래디

1
mv는 reflink에 어떤 용도로 사용됩니까?
Macil

1
크로스 서브 볼륨은 btrfs를에 이름을 변경
파드 리그 브래디에게

17

그것은 아마 그래서 다른 복사 유틸리티 (같은 동작하는지, 기본하지 왜 몰라 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;

4

가장 큰 문제는 글을 쓸 때 복사 할 공간이 부족하다는 것입니다.

일반 복사를 사용하면 복사가 완료 되 자마자 파일의 기존 부분에 대한 쓰기 실패에 대해 걱정할 필요가 없습니다. 공간이 완전히 할당되어 파일을 삭제할 때까지 사라지지 않습니다. 그러나 reflink 사본을 사용하면 몇 주 또는 몇 달이 지나면 사본을 만들 공간이 충분하지 않아 파일의 기존 부분에 대한 쓰기가 실패 할 위험이 항상 있습니다.

이와 같은 작업이 실패했을 때 시스템이 등 뒤에서 reflink 사본을 수행하고 있음을 발견하는 것은 상당히 놀라운 일입니다.


적어도 btrfs에서 이미 할당 된 파일 부분에 대한 쓰기도 ENOSPC로 실패 할 수 있습니다 ...
graywolf

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

코드를 패치하는 것보다 낫다


6
당신이 간과 한 것처럼 보입니다 . 컴파일 타임에 활성화 할 수 있습니까? 그래서 OP의 질문 에서 대화 형 쉘뿐만 아니라 시스템 전체에서 사용됩니다 .
Stéphane Chazelas

5
@StephaneChazelas 하나는 항상 이름 /bin/cp을 바꾸고 비슷한 쉘 스크립트로 대체 할 수 있습니다
goncalopp

0
  1. 견고성 이유로 인해 데이터 "손실"을 방지하기 위해 사본을 만들 수 있습니다.

    우리는 그 이유를 알지 못하지만 일어날 수있는 나쁜 일은 미디어 파괴로 제한됩니다. 대부분의 모든 블록 장치는 순방향 오류 수정 (패리티)이 아닌 경우 어떤 형태의 손상 식별 (crc)을 갖습니다.

  2. 성능상의 이유가 아닙니다.

    CoW는 오류의 일부만 발생했을 때 발생합니까? 블록이 작성됩니다. 현대적인! disk! 하드웨어 블록 크기는 4k의 배수입니다. 4k의 일부를 변경하면 드라이브가 전체 4k를 읽고 다시 쓰게되지만 커널은 동일한 작업을 수행하므로 블록 장치, SSD 또는 기타 장치에 부분 쓰기가 발생하지 않습니다. . 캐시 된 사본이 없으면 장치의 다른 부분에 존재하는 데이터를 구성 할 수없고 파일의 끝 부분을 저장하지 않으면 커널은 동일한 이유로 CoW를 수행해야합니다. 무트. 그러나 파일 사본을 캐싱하고 파일을 복사하는 작업은 운영 방식이 다르므로 전자가 훨씬 저렴합니다.

    글의 주소는 중요하지 않지만 "장치의 사용되지 않은 일부 부분"은 "파일의 현재 블록이있는 위치"보다 발견하기가 저렴하다는 것을 알아야합니다.

사실 CoW 방법은 단순히 블록 장치를 업데이트하는 것보다 저렴하거나 같습니다. 우리가 블록 장치를 말하지 않았다면 또 다른 이야기가 될 것입니다. 어딘가에 테이프로 작성되었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.