파일의 크기와 디스크에서 차지하는 공간은 항상 일치하지 않을 수 있다. 이는 파일이 0바이트 시퀀스를 포함하고 있을 경우, 파일 시스템이 디스크 공간을 절약하기 위해 이를 실제로 기록하지 않기 때문이다. 이러한 파일을 Sparse file이라고 한다.
Sparse file은 파일 내에 0바이트로 채워진 빈 데이터 블록이 많을 때, 해당 블록을 실제 디스크에 저장하지 않고 메타데이터를 통해 관리하는 파일이다. 파일 시스템이 Sparse file을 읽을 때는 빈 블록을 자동으로 0바이트 블록으로 변환하여 반환한다. 따라서 "파일 시스템이 인식하는 파일의 크기"와 "실제 파일이 차지하는 디스크 공간"이 다를 수 있다.
파일의 크기를 확인하는 방법과 실제 디스크에서 차지하는 공간을 확인하는 방법은 다르다.
ls -l, ll 명령어 사용du, df 명령어 사용다음 예제를 통해 Sparse file이 어떻게 동작하는지 확인할 수 있다.
[root@test ~]# dd if=/dev/zero of=sparse.img bs=1M count=1 seek=200
[root@test ~]# ll -lh sparse.img
-rw-r--r-- 1 root root 201M 7월 28 15:33 sparse.img
[root@test ~]# cp --sparse=never sparse.img unsparse.img
[root@test ~]# ll -lh *.img
-rw-r--r-- 1 root root 201M 7월 28 15:33 sparse.img # 원본 파일
-rw-r--r-- 1 root root 201M 7월 28 15:35 unsparse.img # sparse 제거 파일
파일 시스템에서는 두 파일의 크기를 동일하게 인식한다.
[root@test ~]# du -h *.img
1.0M sparse.img # 원본 파일
201M unsparse.img # sparse 제거 파일
Sparse file은 1.0MB만 차지하지만, 일반 파일은 201MB를 차지한다.
ls -s 옵션으로 크기 비교[root@test ~]# ls -lhs *.img
1.0M -rw-r--r-- 1 root root 201M 7월 28 15:33 sparse.img
201M -rw-r--r-- 1 root root 201M 7월 28 15:35 unsparse.img
위 결과에서 좌측 숫자는 디스크에서 차지하는 공간, 우측 숫자는 파일의 크기이다.
Sparse file은 파일 크기를 줄이는 유용한 기능이지만, 일부 백업 소프트웨어나 파일 시스템이 이를 제대로 지원하지 않을 수 있다. 따라서 Sparse file을 다룰 때는 cp --sparse 옵션을 사용하여 복사 방법을 조정하고, du, ls -s 명령어를 활용하여 디스크 사용량을 확인하는 것이 중요하다.