스파스 파일은 애플리케이션에 얼마나 투명합니까?

스파스 파일은 애플리케이션에 얼마나 투명합니까?

스파스 파일의 개념을 이해하기를 바랍니다. 나도 cp순서는 알아--sparse=...

그러나 실제 응용 프로그램을 검색할 때 일반 OS 파일 I/O API를 사용하여 파일을 읽고 쓰는 응용 프로그램의 투명성 수준에 대한 모호한 설명을 발견했습니다. (극히 낮은 수준이 아니라 fopen(), fclose()만 의미합니다. 등)

블로그를 읽을 때 깨끗하지 않았으며 설명에서는 애플리케이션(예: 테스트 편집기)이 명시적으로 0을 써서 희소 파일을 "손상"시킬 수 있는 방법에 대해 설명합니다. 스파스 파일이 있고 응용 프로그램이 0을 쓰면 파일이 물리적으로 저장되지 않는다는 것이 요점이라고 생각합니다. 애플리케이션은 이를 알거나 공백과 같은 문제를 처리할 필요가 없습니다. 이는 파일 시스템의 책임입니다.

질문

희소 파일이 있다고 가정합니다. 그것은 완전히 될 것입니다투명한적용하다? 첫 번째 바이트가 0이 아니고 다른 모든 바이트가 0인 1G 스파스 파일이 있다고 가정합니다. "일반" 응용 프로그램이 파일을 열면 파일을 열 수 있고 길이가 1G임을 확인하고 중간(0.5G)을 찾을 수 있습니다. 왜냐하면 희박하지 않고 중간에 0이 아닌 바이트를 쓸 수 있기 때문입니다. , 닫으세요. 파일 시스템에 부족한 상태로 남아 있을 것입니다. 그렇죠?

파일이 "자동으로" 희소하게 됩니까? 내 말은, 응용 프로그램이 파일을 생성하고 0을 여러 개 쓴 다음 쓴다는 것입니다. 희소합니까? 그렇지 않은 경우 응용 프로그램은 어떻게 파일을 스파스 파일로 생성해야 합니까?

답변1

대부분의 경우 스파스 파일은 프로그램에 투명하며 프로그램은 처리 중인 파일이 스파스 파일인지 여부를 신경 쓸 필요가 없습니다.

희소 파일은 0을 쓰는 대신 블록을 건너뛰고 파일에 구멍을 만들어 생성됩니다. 프로그램인 경우파일 끝 이후의 위치 찾기, 그러면 파일 크기가 업데이트됩니다(더 많은 데이터를 기록하여). 또는"잘라내기" 파일포함된 데이터보다 길면 결과 파일은 희소 파일이 됩니다(기본 파일 시스템이 희소 파일을 지원하는 경우).

희소 파일은 읽을 때 투명하지만(구멍은 0으로 읽음) 쓸 때는 투명하지 않습니다. 블록에 데이터를 쓰면 할당이 강제되고 결국 쓰기가 됩니다. 특히 이는 기본 파일 시스템이 가득 차면 파일 길이를 변경하지 않고 파일에 쓰는 것이 실패할 수 있음을 의미합니다. 이것아니요이는 코드 작성 파일이 희소 파일의 특별한 경우를 가져야 함을 의미합니다. 이는 예상대로 모든 쓰기에서 오류가 처리되어야 함을 의미합니다.

리눅스 구현lseek파일의 취약점을 분석할 수 있도록 확장이 제공됩니다.

파일은 자동으로 희박해지지 않습니다. 이것이 바로 GNU 옵션이 존재하는 이유입니다 cp. 이 옵션은 자체적으로 제로 실행을 감지하고 대상에 기록하는 대신 대상에 구멍을 생성하도록 --sparse구성됩니다 . cp파일이 자동으로 희박해지면 이 작업을 수행할 필요가 없습니다.

귀하의 시나리오에서 처음에 1바이트의 데이터가 있는 1G 파일에는 해당 바이트를 포함하는 디스크 블록이 있고 그 뒤에는 블록에 맞는 만큼의 0이 표시됩니다. 파일의 나머지 부분은 큰 구멍이 될 것입니다. 파일 중간에 0을 쓰면 블록이 할당되고 0으로 채워집니다. 그러면 파일에는 블록, 거의 0.5G의 구멍, 또 다른 블록 및 또 다른 구멍이 포함됩니다.

관련 정보