파일 공간 미리 할당하기

비단 비트토런트(BitTorrent)나 어뮬(aMule) 같은 P2P 응용 프로그램이 아니라도 파일 크기를 (대략이라도) 미리 알고 있을 경우, 디스크 공간을 미리 할당해서 단편화(fragmentation)를 줄이는 것은 물론 용량 부족으로 인한 쓰기 오류를 미리 막는 기법은 종종 필요합니다.

예전에는 이를 위해 파일을 생성한뒤 원하는 크기의 0으로 채워진 파일을 미리 만들어 두는 무식한 방법을 사용하거나, lseek() 함수를 이용해 원하는 크기만큼 뒤로 이동한 뒤 더미 1바이트르 쓰는 기법 등을 사용했습니다. 물론 이 기법은 지금도 유용합니다.

그런데 요즘 리눅스 커널에서 주로 사용하는 파일시스템이 이런 기능을 근본적으로 지원하게 되면서 쉽게 사용할 수 있는 API가 추가되었는데, 다름아닌 fallocate() / posix_fallocate() 함수입니다. 매뉴얼에 의하면 리눅스 커널 2.6.23 버전, glibc 2.10 버전 이후부터 btrfs, ext4, ocfs2, xfs 파일시스템에서 지원한다고 하는데, 해당 파일시스템이 직접 지원하지 않을 경우 커널이 알아서 비효율적인 방법으로 처리해 주는 것 같습니다.

터미널이나 콘솔에서 직접 지정한 크기의 파일을 만들 수 있는 fallocate 명령어도 요즘 리눅스 배포판에는 기본적으로 포함되어 있습니다. 사용해 보면 알겠지만, 아무리 큰 파일도 매우 빨리 만들어 줍니다. 그리고, 매뉴얼에는 명시되어 있지 않지만, 큰 파일을 지원하기 위한 fallocate64() / posix_fallocate64() 함수도 사용할 수 있습니다. 자세한 함수와 명령어 사용법은 매뉴얼(man) 페이지를 참고하면 쉽게 알 수 있기 때문에 자세한 사용법은 생략합니다.

참고로, 멀티플랫폼 비트토런트 클라이언트인 Transmission 소스 를 보면 다양한 플랫폼에서 동일한 기능을 어떻게 사용하는지 알 수 있습니다.

comments powered by Disqus

Related