
CPIO 아카이브 파일이하임2025. 2. 19. 20:06
Table of Contents
서문
공유기 펌웨어 에뮬레이션을 시도하면서 QEMU를 사용하는 방법을 알아보았다. 그러던 중에 QEMU의 -initrd 명령어로 루트 펌웨어 파일을 전달하는 과정에서 파일을 로드할 수 없다는 오류가 발생했다.
따라서 이러한 오류를 해결하기 위해서 알게 된 방법 중 하나가 binwalk를 통해서 추출한 ubifs-root 디렉토리를 cpio 포맷으로 만들어진 아카이브로 압축해서 ‘램 디스크’로 전달하는 방법이었다.
이 과정에서 CPIO에 대해서 알아보면서 글을 작성하게 되었다.
1. CPIO란
CPIO
: CPIO는 “Copy In and Out”의 약자로 파일과 디렉토리를 하나의 아카이브 파일로 만들거나 추출하는 것에 특화된 도구이다.
기능 및 역할
- 단순하게 데이터를 묶거나 푸는 역할을 하는 도구로 다른 압축 도구와 함께 사용하기도 한다.
- 파일 아카이버 유틸리티의 한 종류로 주로 UNIX 계열에서 사용된다.
- 파일 아카이버 유틸리티 (File Archiver Utility)
- 대표적인 파일 유틸리티로는 tar과 cpio 등이 있다.
- 여러 개의 파일과 디렉터리를 하나의 아카이브 파일로 묶거나 아카이브를 해제 또는 추출하는 데 사용하는 도구이다.
- 리눅스 초기화 램디스크를 생성하거나 시스템의 파일 관리를 하는데 중요한 역할을 한다.
2. CPIO 명령어
| 명령어/옵션 | 설명 | 사용 예제 |
| cpio -o (copy-out mode) | 표준 입력으로 받은 파일 리스트를 CPIO 아카이브로 생성 | `find . |
| cpio -i (copy-in mode) | CPIO 아카이브에서 파일 추출 | cpio -i < archive.cpio |
| cpio -t (list mode) | CPIO 아카이브의 내용(파일 목록) 확인 | cpio -t < archive.cpio |
| -H [포맷] | 아카이브 파일 포맷을 지정 (일반적으로 newc를 사용) | `find . |
| --extract | -i와 같음. 파일 추출 | cpio --extract < archive.cpio |
| --create | -o와 같음. 파일 목록으로 아카이브 생성 | `find . |
| --format=[포맷] | -H와 같음. 생성 시 아카이브 포맷 지정 | `find . |
| --gzip | CPIO 아카이브를 gzip으로 압축 | `find . |
3. 활용
CPIO가 사용되는 경우
- 리눅스에서 램디스크를 생성하는 경우
- 램디스크(RAM disk, RAM drive)
- 초기화 램디스크라고도 하는 것 같음. initrd가 그 줄임말일지도
- 커널이 부팅되는 과정에서 루트 파일 시스템을 마운트하기위한 사전 초기화 작업이 필요한데 이러한 작업을 처리할 수 있도록 하는 것이 ‘램디스크’이다.
- 여러 개의 파일이나 디렉토리를 하나의 아카이브로 묶어서 백업하거나 네트워크에서 전송하는 경우
- 손상된 파일을 복원하거나 특정 파일을 추출하는 경우
주의할 특징
- CPIO 아카이브는 압축하는 기능이 아니기 때문에 추가적으로 gzip 등을 이용해야 공간 절약이 가능하다.
- 아카이빙하기위해서는 대상이되는 파일의 목록을 전달해야하기 때문에 find와 같은 명령어와 함께 사용해야한다.
- 파일이 많은 경우에 파일 이름의 길이나 수에 제한이 생길 수 있다.
4. 프로젝트에서 적용
공유기 펌웨어 에뮬레이팅을 하면서 -initrd 옵션에 파일 시스템을 전달하기 위해서 binwalk로 추출된 ubifs-root 디렉토리의 파일과 디렉토리들을 cpio를 이용해서 아카이브로 묶은 다음 gzip을 사용해서 압축했다.
- 다음은 사용한 명령어이다.
find . | cpio -o -H newc | gzip > ../rootfs.cpio.gz
- 명령어를 순서대로 설명하면 다음과 같다.
- 현재 디렉 모든 파일 목록 나열
- 파일 목록 CPIO 형식으로 아카이브 생성
- -H로 아카이브 형식 지정 → newc 형식은 modern CPIO 형식으로 파일 이름 길이 제한이 없다는 특징이 있음. QEMU에서 초기화 램디스크로 자주 사용됨.
- 생성된 CPIO 파일을 다음과 같은 이름(rootfs.cpio.gz)으로 해당 경로에 gzip 압축해서 저장
실행 화면
- 원하는 디렉토리 안에서 다음과 같이 명령어를 실행하면 압축된 블럭의 갯수를 출력해주며 명령을 완료한다.

- 이후 ubifs-root 디렉토리의 상위 디렉토리에서 다음과 같이 .cpio.gz 파일이 생성된 것을 확인할 수 있다.

결과적으로 아카이빙해서 압축한 파일을 -initrd에 전달해봤지만 에뮬레이팅이 되지 않아서 또 다른 방법으로 루트 파일 시스템을 마운트하는 설정을 알아봐야할 것 같다.
참고
- https://ko.wikipedia.org/wiki/Cpio
- https://www.gnu.org/software/cpio/manual/html_node/Options.html
- https://products.aspose.com/zip/ko/most-common-archives/what-is-cpio/
- https://dawoum.tistory.com/entry/cpio
- https://blog.naver.com/01191879872/10016619704
- https://starrykss.tistory.com/1741
- https://itwiki.kr/w/리눅스_cpio#google_vignette
'이하임' 카테고리의 다른 글
| Fuzzer 조사 - Fuzzing과 Fuzzer에 대한 이해 (0) | 2025.04.27 |
|---|---|
| ASLR에 대해서 (0) | 2025.02.12 |
| python의 버전 관리를 위한 pyenv 설치 및 사용법 (0) | 2025.01.09 |
| .ubi에서 파일 시스템 추출 (0) | 2024.11.12 |

@stellarflare :: stellarflare 님의 블로그
stellarflare 님의 블로그 입니다.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!