본문 바로가기

Linux

[linux] 특정 크기의 파일 만들기

앞으로 티스토리 대신 blog.stackframe.dev에서 블로깅을 합니다. 이 블로그는 남겨 둘 예정입니다.

리눅스에서 파일 처리를 할 때 미리 공간을 확보하거나 내부 마운트를 하기 위해 일정 크기의 파일을 만들어야 할 경우가 있습니다. 리눅스를 공부해 보신 분이라면 아래와 같은 명령을 떠올리실지도 모르겠습니다.

dd if=/dev/zero of=test_file.img bs=4M count=256

/dev/zero 특수 장치에서 4M씩 읽어서 test_file.img에 쓰는 명령이라 속도가 느립니다.

 

제 컴퓨터에서 실행했을 때 13초가 걸렸습니다.

 

다행히도 이런 문제를 해결하기 위한 것인지 리눅스에서 truncate, ftruncate라는 system call을 제공합니다. truncate system call은 파일 쓰기 대신 inode를 수정하여 파일 크기를 변경합니다. 그러므로 dd보다 더욱 빨리 수행될 수 있습니다. 그리고 이 system call을 사용하는 truncate란 명령어도 GNU coreutils에 포함되어 있으므로 어떤 리눅스 시스템에서도 사용가능합니다.

truncate [OPTIONS] file_name

 

truncate(8) 명령에는 옵션이 6개가 있지만 사실상 쓰이는건 하나 뿐입니다.

-s [file_size]
파일 사이즈를 설정합니다. 바이트를 의미하며 단위를 입력할 수도 있습니다.(K,M,G,T,P,E,Z,Y)는 각각 (2^10)^n을 의미합니다. (KB,MB,GB... 처럼 B가 붙는다면 (10^3)^n으로 계산됩니다.)

 

B가 붙고 안붙고의 차이는 저장장치 용량 표기와 실제 용량의 차이에 대해 이해하고 있으면 바로 아실 수 있으실겁니다. 그러므로 예제로 5기가바이트의 크기 파일을 만들고 싶다면 truncate -s 5GB test_file.img 를, 5기비바이트 크기의 파일을 만들고 싶다면 truncate -s 5G test_file.img 명령을 실행하면 됩니다.

 

 

만약 존재하는 파일 이름을 입력했다면 그 파일은 커지거나 작아지고, 커진 경우에는 그만큼 0으로 초기화된 데이터가 뒤에 붙습니다. 존재하지 않는 파일이라면 입력한 크기만큼 0으로 초기화된 파일이 생성됩니다.