Buildroot defconfig 최소 줄이기 — 끄기·의존·savedefconfig
Buildroot에서 작은 이미지를 노릴 때 .config를 손으로 줄이는 것과 재현 가능한 defconfig를 남기는 것은 다른 문제입니다. 메뉴에서 패키지를 끄는 것만으로는 부족하고, 무엇을 끄는지 · 의존이 어떻게 깨지는지 · savedefconfig로 어떻게 다시 올리는지를 한 줄로 맞춰 두는 편이 안전합니다.
이 글의 축은 셋뿐입니다. 무엇을 끄나? · 의존이 깨지면? · 재현 방법은? 보드별 실측 MB·가격·창작 현장 후기·제휴는 없습니다.
근거는 Buildroot user manual — 특히 Storing the Buildroot configuration(savedefconfig), make tips, Graphing the dependencies, Understanding when a full rebuild is necessary, FAQ Why are some packages not visible, Adding support for a particular board입니다.
무엇을 끄나?
한 줄 답: “플래시가 작아서”가 아니라 제품에 필요 없는 Target packages·무거운 init·불필요한 이미지 포맷·디버그/호스트 전용 옵션부터 끕니다. upstream 보드 defconfig 관행도 기본 BusyBox userspace 수준으로 최소를 권합니다(애플리케이션 패키지는 제품마다 다르므로 보드 설정에 넣지 않음).
끄기 후보 축(매뉴얼·관행; 특정 SoC 실측 아님):
| 축 | 끄는 쪽 | 매뉴얼이 말하는 맥락 |
|---|---|---|
| Init | systemd → BusyBox init(기본) | systemd는 dbus·udev 등 큰 의존을 끌어옴. 대부분 임베디드에는 BusyBox init 권장 |
/dev | eudev → devtmpfs only 또는 devtmpfs + mdev | 개발자 권장: 먼저 devtmpfs only, 유저스페이스 통지·펌웨어가 필요하면 mdev |
| Target packages | 앱·라이브러리·네트워크 데몬 중 실제로 안 쓰는 항목 | 보드 upstream 설정은 BusyBox-only 기본을 권함 |
| Filesystem images | 쓰지 않는 이미지 포맷(여러 포맷 동시 ON) | 필요한 포맷만 |
| Toolchain extras | 타깃에 불필요한 C++/locale/RPC 등(uClibc 옵션 등) | 툴체인 옵션을 바꾸면 전체 재빌드가 필요한 경우가 많음 |
| Debug on target | gdbserver·스트립 완화 등 배포 이미지에 불필요하면 OFF | FAQ: 타깃에 컴파일러·헤더·문서를 두지 않는 것이 Buildroot 방향 |
실무 순서 예:
- 부팅에 필요한 최소 — toolchain · kernel(필요 시) · bootloader(필요 시) · BusyBox · 필요한 rootfs 포맷.
- Init·/dev — BusyBox init + 가벼운
/dev부터. systemd/eudev는 “정말 필요할 때”. - Target packages — 메뉴에서 검색(
/)으로 심볼을 찾고, help를 읽은 뒤 OFF. - 크기 확인은 그래프 —
make graph-size(클린 풀빌드 후)로 패키지별 기여를 본다. 창작 “우리 보드 N MB” 숫자는 쓰지 않습니다. - 서브시스템 config — BusyBox/kernel을 바꿨다면
BR2_PACKAGE_BUSYBOX_CONFIG/BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE경로를 맞춘 뒤busybox-update-config/linux-update-defconfig등으로 별도 저장(매뉴얼 Storing the configuration of other components).
하지 말 것: 특정 보드의 “이 옵션만 끄면 N KB” 같은 창작 footprint로 일반화하기. 크기는 libc·스트립·선택한 패키지·이미지 포맷의 함수입니다.
의존이 깨지면?
한 줄 답: 메뉴에서 안 보이면 의존 미충족이고, 이미 빌드된 패키지를 끄면 파일이 자동으로 안 지워지며, 선택적 의존을 빼도 의존 패키지가 자동 재빌드되지 않습니다. graph-depends / show-rdepends로 역의존을 보고, 의심되면 make clean all로 풀 재빌드하십시오.
깨짐·혼란이 나는 축(매뉴얼):
| 증상 | 원인 축 | 대응 |
|---|---|---|
| 패키지가 메뉴에 없음 | 의존(툴체인 옵션 포함) 미충족 | /로 심볼 검색 → unmet dependency를 재귀적으로 ON. 툴체인 옵션이면 풀 재빌드 |
패키지 OFF 후에도 target/에 남음 | Buildroot는 설치 파일 추적을 하지 않음 | 풀 재빌드로 제거. FAQ·rebuild 절이 이를 명시 |
| 라이브러리 OFF 후 앱이 깨짐 | 선택적 의존을 쓰던 패키지가 재빌드되지 않음 | 해당 패키지 *-reconfigure/*-rebuild 또는 make clean all |
| A를 끄니 B가 같이 사라짐 | B가 A를 강제 select/의존 | make <pkg>-show-rdepends / graph-rdepends로 역의존 확인 |
| 부분 빌드만 반복하다 실패 | 아키텍처·툴체인·스켈레톤 변경 후 미클린 | 매뉴얼 thumb rule: 아키텍처·툴체인 변경 시 완전 재빌드 |
의존을 눈으로 보는 명령:
# 전체 / 패키지 의존 그래프 (graphviz 필요)
make graph-depends
make <pkg>-graph-depends
# 텍스트로 1차·재귀 의존 / 역의존
make <pkg>-show-depends
make <pkg>-show-recursive-depends
make <pkg>-show-rdepends
make <pkg>-show-recursive-rdepends
# 내부 변수 덤프 예
make -s printvars VARS='BUSYBOX_%DEPENDENCIES'
실무 규칙:
- 끄기 전에 역의존 —
show-rdepends로 “누가 이 패키지를 쓰는지”를 먼저 봅니다. - OFF ≠ 디스크에서 삭제 — 매뉴얼: 패키지 제거 시 Buildroot는 특별 동작을 하지 않습니다. 깨끗한 루트fs가 필요하면 풀 재빌드.
- 선택적 기능 — openssl을 나중에 켠 뒤 ctorrent를 안 다시 빌드하면 SSL이 안 붙는 예가 매뉴얼에 있습니다. 끄는 방향도 대칭으로 생각하십시오.
- 메뉴에 안 보인다고 “삭제됨”이 아님 — FAQ: 트리에 있어도 의존 때문에 숨겨질 수 있습니다.
한 줄 정리: 최소 구성은 의존 그래프를 읽으면서 줄이고, 줄인 뒤에는 클린 풀빌드로 “남아 있는 파일” 착시를 없앱니다.
재현 방법은?
한 줄 답: 동작하는 .config가 있으면 make savedefconfig로 기본값과 같은 항목을 벗겨 최소 defconfig를 만듭니다. configs/<name>_defconfig에 두고 make <name>_defconfig로 다시 올립니다. 경로를 지정하려면 BR2_DEFCONFIG=를 씁니다.
매뉴얼 Storing the Buildroot configuration 요지:
make savedefconfig— 기본값인 옵션을 제거한 최소 설정을 씀. 기본 출력 파일명은 소스 트리 루트의defconfig.- 다른 경로 —
make savedefconfig BR2_DEFCONFIG=<path>또는 설정 안의BR2_DEFCONFIG. - 권장 위치 —
configs/<boardname>_defconfig. 그러면make list-defconfigs에 보이고make <boardname>_defconfig로 로드. - 임의 경로 —
make defconfig BR2_DEFCONFIG=<path>. - 커널·BusyBox 등 — Buildroot defconfig와 별도로
linux-update-defconfig/busybox-update-config등으로 저장(경로 옵션을 먼저 만들고 파일을 생성할 것).
재현 루틴 예:
# 1) 최소로 다듬은 뒤 저장
make menuconfig # 또는 nconfig / xconfig
make savedefconfig BR2_DEFCONFIG=configs/myproduct_defconfig
# 2) 다른 트리·CI에서 동일 설정 로드
make myproduct_defconfig
# 또는: make defconfig BR2_DEFCONFIG=/path/to/myproduct_defconfig
# 3) 목록 확인
make list-defconfigs
# 4) 깨끗한 재현 빌드
make clean all
주의:
.config전체를 커밋하지 말고savedefconfig결과를 버전 관리하는 것이 매뉴얼이 가리키는 방향입니다(기본값 노이즈 제거).- 일부 in-tree
configs/*_defconfig가BR2_DEFCONFIG를 심어 두면,make <board>_defconfig후savedefconfig가 원본을 덮어쓸 수 있습니다. 막을 때는BR2_DEFCONFIG를 비우거나make savedefconfig BR2_DEFCONFIG=defconfig처럼 명시 경로를 쓰십시오(커뮤니티 문서화 논의와 동일 요지). - upstream에 보드를 넣을 때는 고정 버전/커밋 해시를 쓰고 “latest”를 피하라고 매뉴얼이 말합니다. 제품 defconfig도 같은 습관이 재현에 유리합니다.
- BusyBox/kernel config 파일을 가리키기 전에 빈 파일이라도 만들어 두십시오. 없으면 Buildroot가 접근하다 실패합니다.
하지 말 것: 보드 이름을 붙인 채 실측하지 않은 이미지 크기·가격을 defconfig 설명에 적기. 이 글은 절차만 다룹니다.
FAQ
savedefconfig와 linux-savedefconfig는 같나요?
다릅니다. make savedefconfig는 Buildroot .config를 줄입니다. linux-savedefconfig / linux-update-defconfig는 커널 설정을 BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE 쪽으로 저장합니다(리눅스가 켜져 있을 때).
패키지를 껐는데 이미지가 안 줄어요.
OFF만으로는 output/target의 기존 파일이 안 지워질 수 있습니다. make clean all 후 다시 빌드하고, 필요하면 make graph-size로 기여를 확인하십시오.
메뉴에 없는 패키지는 트리에서 삭제된 건가요?
대개 아닙니다. FAQ: 의존 미충족으로 숨겨진 경우가 많습니다. / 검색으로 심볼과 depends를 보십시오.
systemd를 끄면 무엇이 가벼워지나요?
매뉴얼은 systemd가 dbus·udev 등 큰 의존 집합을 가져온다고 설명합니다. 정확한 MB는 설정마다 다르므로 숫자 창작 없이, BusyBox init으로 충분한지를 먼저 판단하십시오.
출처
- Buildroot user manual — Storing the Buildroot configuration —
savedefconfig,BR2_DEFCONFIG,configs/<name>_defconfig - Storing the configuration of other components — linux/busybox/u-boot update-defconfig·update-config
- make tips —
list-defconfigs, package menuconfig 가용 조건 - Graphing the dependencies / package
show-*-depends— 의존·역의존 - Understanding when a full rebuild is necessary — 패키지 제거·선택적 의존
- FAQ: packages not visible — 의존으로 숨김
- Buildroot configuration — init system & /dev management — BusyBox init·systemd·mdev·eudev 권장 순서
- Adding support for a particular board — 최소 BusyBox 보드 defconfig ·
savedefconfig