본문 바로가기

Android

Sparse file

sparse file

파일 시스템에서 공간을 절약하는 방법

Sparse file는 파일 시스템에서 데이터를 효율적으로 저장하기 위한 방법 중 하나이다.
파일의 데이터 중에서 연속된 의미없는 값(empty data)는 실제로 디스크에 저장하지 않고, 그 영역에 대한 정보(metadata)만 저장한다.
의미있는 데이터 영역만 저장되게 하고, 나중에 접근할 때는 마치 빈 값들이 저장되어 있는 것처럼 처리하는 기술이다.

동작 원리

Sparse File의 핵심은 "데이터가 없는 부분(0으로 채워진 부분)을 실제로 저장하지 않는다"는 것이다.
예를 들어, 1GB 크기의 파일을 만들었는데 그중 100MB만 데이터로 채워져 있고 나머지 900MB는 0이라면, 일반 파일 시스템에서는 1GB 전체를 디스크에 할당한다.
하지만 Sparse File은 이 900MB의 빈 공간을 디스크에 기록하지 않고도 파일 크기를 1GB로 보여줄 수 있다.
이렇게 하면 실제로 데이터가 저장된 부분만 디스크에 기록되므로, 많은 공간을 절약할 수 있다.

특징

  • 디스크 공간 절약: 대량의 0 데이터를 저장하지 않기 때문에, 실제로 파일 크기에 비해 훨씬 적은 공간을 차지한다.
  • 빠른 파일 생성: 빈 공간을 실제로 기록할 필요가 없으므로, 큰 파일을 생성하는 속도가 빠르다.
  • 나중에 공간 할당: 빈 공간으로 남겨뒀던 부분에 나중에 데이터를 기록하면 그때서야 디스크 공간이 할당된다. 이 덕분에 필요할 때만 공간을 쓰는 게 가능하다.
  • 파일 시스템 오버헤드: Sparse file을 읽고 쓸 때 파일 시스템은 실제 데이터가 있는 부분과 없는 부분을 구분하고 처리해야 하므로, 일반 파일보다 더 많은 시스템 자원을 소모한다.
  • 파일 시스템 호환성: Sparse File을 사용하려면 파일 시스템이 이를 지원해야 한다. (NTFS, APFS, EXT4)
  • Fragmentation: 파일 내에 빈 공간이 분산되어 있어 파일 시스템의 파편화를 가속화할 수 있다.
  • 특수한 처리 필요: 일반 파일과 다른 특성을 가지므로, 파일 복사, 이동, 삭제 등의 작업을 수행할 때 sparse file을 지원하지 않는 툴을 사용할 경우 문제가 발생할 수 있다.
  • Increased Risk of Corruption: 파일 구조의 특성상 파일 시스템의 오류나 하드웨어 고장으로 인해 데이터가 손상될 위험이 더 높다.

사용 예시

Sparse File은 주로 대용량 파일을 다루는 환경에서 많이 사용된다고 한다.

  • 디스크 공간이 부족하고 대부분의 파일 공간이 빈 경우: 가상 머신 이미지, 백업 이미지, 로그 파일 등
  • 파일 크기가 자주 변하는 경우: 데이터베이스 파일이나 압축 파일 등

Sparse File 확인 방법 (wikipedia 예제)

Sparse File인지 확인하려면, Linux에서는 ls -ls 명령어를 사용해볼 수 있다.
-s, --size print the allocated size of each file, in blocks
이 명령어를 입력하면 파일의 실제 크기와 할당된 디스크 공간을 비교할 수 있는데, 예를 들어 1GB 크기의 파일이 실제로는 100MB만 할당되어 있다면 Sparse File일 가능성이 크다.

 

Creation

$ dd of=sparse-file bs=5M seek=1 count=0
0+0 records in
0+0 records out
0 bytes copied, 7.5452e-05 s, 0.0 kB/s
$ ls -ls sparse-file
0 -rw-rw-r-- 1 user user 5242880 10월 16 15:23 sparse-file

ddftruncate를 사용하는 동작으로 인해 sparse file로 저장되어 실제 디스크 사용 공간이 0 block 으로 나온다.

 

Copying

$ cp sparse-file copied-sparse-file
$ ls -ls copied-sparse-file
0 -rw-rw-r-- 1 user user 5242880 10월 16 15:25 copied-sparse-file

cp가 sparse file을 인식하여 자동으로 처리하기 때문에 복사에 문제가 없으나 이를 지원하지 않았다면 0으로 채워진 파일로 복사되었을 것이다.

ls --help의 내용

--sparse=WHEN            control creation of sparse files. See below

By default, sparse SOURCE files are detected by a crude heuristic and the
corresponding DEST file is made sparse as well.  That is the behavior
selected by --sparse=auto.  Specify --sparse=always to create a sparse DEST
file whenever the SOURCE file contains a long enough sequence of zero bytes.
Use --sparse=never to inhibit creation of sparse files.

Android libsparse

libsparse는 안드로이드에서 sparse file을 생성할때 사용하는 라이브러리이다.

https://android.googlesource.com/platform/system/core/+/refs/heads/main/libsparse/

img2simg 실행파일로 빌드되어 사용된다.

https://android.googlesource.com/platform/system/core/+/refs/heads/main/libsparse/img2simg.cpp

 

참고:
https://en.wikipedia.org/wiki/Sparse_file

 

Sparse file - Wikipedia

From Wikipedia, the free encyclopedia Type of computer file A sparse file: The empty bytes do not need to be saved and can be represented instead by metadata. In computer science, a sparse file is a type of computer file that attempts to use file system sp

en.wikipedia.org

 

'Android' 카테고리의 다른 글

AOSP에 디바이스를 추가하는 과정.  (0) 2025.02.19
AOSP build nsjail error  (0) 2025.02.12
Sparse file header  (0) 2024.11.14
Android partitions  (3) 2024.10.18