답변:
견고성으로 인해 데이터 손상으로부터 보호하기 위해 사본을 만들 수 있기 때문에 기본값이 아닙니다. 또한 성능상의 이유로 CoW 파일에서 작업하고 기계 디스크의 다른 부분에 대한 쓰기로 지연 될 수있는 대기 시간에 민감한 프로세스가 아니라 복사 시간에 쓰기를 원할 수 있습니다. coreutils v8.24에서 mv는 위의 제약 조건이 없으므로 기본적으로 참조 연결됩니다.
그것은 아마 그래서 다른 복사 유틸리티 (같은 동작하는지, 기본하지 왜 몰라 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;
가장 큰 문제는 글을 쓸 때 복사 할 공간이 부족하다는 것입니다.
일반 복사를 사용하면 복사가 완료 되 자마자 파일의 기존 부분에 대한 쓰기 실패에 대해 걱정할 필요가 없습니다. 공간이 완전히 할당되어 파일을 삭제할 때까지 사라지지 않습니다. 그러나 reflink 사본을 사용하면 몇 주 또는 몇 달이 지나면 사본을 만들 공간이 충분하지 않아 파일의 기존 부분에 대한 쓰기가 실패 할 위험이 항상 있습니다.
이와 같은 작업이 실패했을 때 시스템이 등 뒤에서 reflink 사본을 수행하고 있음을 발견하는 것은 상당히 놀라운 일입니다.
alias cp='cp --reflink=auto --sparse=always'
코드를 패치하는 것보다 낫다
/bin/cp
을 바꾸고 비슷한 쉘 스크립트로 대체 할 수 있습니다
견고성 이유로 인해 데이터 "손실"을 방지하기 위해 사본을 만들 수 있습니다.
우리는 그 이유를 알지 못하지만 일어날 수있는 나쁜 일은 미디어 파괴로 제한됩니다. 대부분의 모든 블록 장치는 순방향 오류 수정 (패리티)이 아닌 경우 어떤 형태의 손상 식별 (crc)을 갖습니다.
성능상의 이유가 아닙니다.
CoW는 오류의 일부만 발생했을 때 발생합니까? 블록이 작성됩니다. 현대적인! disk! 하드웨어 블록 크기는 4k의 배수입니다. 4k의 일부를 변경하면 드라이브가 전체 4k를 읽고 다시 쓰게되지만 커널은 동일한 작업을 수행하므로 블록 장치, SSD 또는 기타 장치에 부분 쓰기가 발생하지 않습니다. . 캐시 된 사본이 없으면 장치의 다른 부분에 존재하는 데이터를 구성 할 수없고 파일의 끝 부분을 저장하지 않으면 커널은 동일한 이유로 CoW를 수행해야합니다. 무트. 그러나 파일 사본을 캐싱하고 파일을 복사하는 작업은 운영 방식이 다르므로 전자가 훨씬 저렴합니다.
글의 주소는 중요하지 않지만 "장치의 사용되지 않은 일부 부분"은 "파일의 현재 블록이있는 위치"보다 발견하기가 저렴하다는 것을 알아야합니다.
사실 CoW 방법은 단순히 블록 장치를 업데이트하는 것보다 저렴하거나 같습니다. 우리가 블록 장치를 말하지 않았다면 또 다른 이야기가 될 것입니다. 어딘가에 테이프로 작성되었습니다.