
Linux에서 희소 파일을 조작하는 기능은 무엇입니까? (C로 가정하고, 다른 시스템에 대한 설명은 매우 환영합니다) 예:
- 파일 내부의 일부를 제거하여 파일 내부에 구멍을 뚫습니다.
- 구조 조사(예: 분리된 연속 데이터 블록의 시작과 끝을 나타내는 일련의 쌍 생성)
- 어느 시점에서 블록 범위를 다시 할당하여(즉, 실제 데이터를 이동하지 않고) 파일을 두 개로 분할합니다.
- inode 및 기타 관련 측면을 조사합니까? (기록 중 복사 방식으로 일부 블록을 여러 파일에 할당하는 것이 가능할 수 있습니까?)
문맥:
내 마음에 떠오르고 내가 도착한 원래 질문은 옵션 이후 man rsync
였습니다 --sparse
.
왜 옵션 rsync
이 다음 --sparse
과 충돌합니까 --inplace
?
파일 시스템 호출 API가 제한되어 있습니까?
데이터 구조의 관점에서 볼 때 소스 스파스 파일이 연속되지 않은 데이터 블록의 시퀀스로 표시되면 "r"동기화에서 소스에 존재하지 않는 범위를 대상에서 할당 해제하고 누락된 범위를 할당하고 나머지를 할당할 것으로 예상됩니다. 그에 따라 업데이트합니다(표준 rsync 롤링 해시 알고리즘을 사용하더라도 나머지 모든 시퀀스를 하나로 처리하거나 각각 별도로 실행).
참조:
man rsync
-S, --sparse Try to handle sparse files efficiently so they take up less space on the destination. Conflicts with --inplace because it's
드문드문 방식으로 데이터를 덮어쓸 수는 없습니다.
답변1
스파스 파일은 사용자 공간에 투명하게 설계되었습니다. 사용되지 않은 영역을 찾아서 구멍이 생성되고 0 블록으로 읽혀집니다. 적어도 아직까지는 표준 사용자 공간 API를 사용하여 감지할 수 없습니다.지적했다~에 의해스테판 차젤라스, 적어도 Solaris와 Linux는 SEEK_DATA
및SEEK_HOLE
lseek(2)
사용자 공간 프로그램이 구멍을 찾을 수 있도록 하는 플래그이며 이러한 플래그는POSIX에 추가됨어느 시점에서.
rsync
이는 ' --sparse
와 옵션 간의 비호환성을 설명합니다 --inplace
: 기존 파일에 쓸 때휴대 가능, 기존 데이터에는 구멍을 만들 수 없습니다. --sparse
전체 파일을 다시 작성하고 0의 (긴) 시퀀스를 건너뛰는 방식으로 작동합니다. 이로 인해 OS 및 이를 지원하는 파일 시스템에 희박한 파일이 생성됩니다.
Linux에서는 다음을 사용하여 파일의 희박성에 대한 세부 정보를 검색할 수 있습니다.fiemap
ioctl, 그리고 e2fsprogs
'filefrag(8)
; 보다Linux의 자세한 스파스 파일 정보. 글쓰기 측면에서는 다음을 사용할 수 있습니다.fallocate(2)
(그리고 편리한fallocate(1)
유틸리티)를 사용하여 기존 파일에 구멍을 뚫어 구멍이 전체 블록을 덮는 경우 드물게 만듭니다. 지원은 파일 시스템에 따라 다릅니다. 현재 XFS, btrfs, ext4 및 tmpfs만 이러한 작업을 지원합니다. 최신 커널(4.1 이후) 및매우최신 버전에서는 util-linux
파일에 구멍을 삽입하고 구멍 뒤의 내용을 이동하는 기능을 지원합니다( fallocate -i
, util-linux
곧 출시될 2.30에 도입됨).
마지막 두 가지 질문은 파일 시스템 수술입니다. 이러한 작업을 수행하는 데 사용할 수 있는 일반 시스템 호출이나 ioctl이 있는지 잘 모르겠습니다. reflink
-호환 파일 시스템을 사용하면 파일이 내용을 공유할 수 있습니다. 이는 다음을 사용하여 달성할 수 있습니다.및 ioctlFICLONE
FICLONERANGE
.