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 실측 아님):

축끄는 쪽매뉴얼이 말하는 맥락
Initsystemd → BusyBox init(기본)systemd는 dbus·udev 등 큰 의존을 끌어옴. 대부분 임베디드에는 BusyBox init 권장
/deveudev → devtmpfs only 또는 devtmpfs + mdev개발자 권장: 먼저 devtmpfs only, 유저스페이스 통지·펌웨어가 필요하면 mdev
Target packages앱·라이브러리·네트워크 데몬 중 실제로 안 쓰는 항목보드 upstream 설정은 BusyBox-only 기본을 권함
Filesystem images쓰지 않는 이미지 포맷(여러 포맷 동시 ON)필요한 포맷만
Toolchain extras타깃에 불필요한 C++/locale/RPC 등(uClibc 옵션 등)툴체인 옵션을 바꾸면 전체 재빌드가 필요한 경우가 많음
Debug on targetgdbserver·스트립 완화 등 배포 이미지에 불필요하면 OFFFAQ: 타깃에 컴파일러·헤더·문서를 두지 않는 것이 Buildroot 방향

실무 순서 예:

  1. 부팅에 필요한 최소 — toolchain · kernel(필요 시) · bootloader(필요 시) · BusyBox · 필요한 rootfs 포맷.
  2. Init·/dev — BusyBox init + 가벼운 /dev부터. systemd/eudev는 “정말 필요할 때”.
  3. Target packages — 메뉴에서 검색(/)으로 심볼을 찾고, help를 읽은 뒤 OFF.
  4. 크기 확인은 그래프 — make graph-size(클린 풀빌드 후)로 패키지별 기여를 본다. 창작 “우리 보드 N MB” 숫자는 쓰지 않습니다.
  5. 서브시스템 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'

실무 규칙:

  1. 끄기 전에 역의존 — show-rdepends로 “누가 이 패키지를 쓰는지”를 먼저 봅니다.
  2. OFF ≠ 디스크에서 삭제 — 매뉴얼: 패키지 제거 시 Buildroot는 특별 동작을 하지 않습니다. 깨끗한 루트fs가 필요하면 풀 재빌드.
  3. 선택적 기능 — openssl을 나중에 켠 뒤 ctorrent를 안 다시 빌드하면 SSL이 안 붙는 예가 매뉴얼에 있습니다. 끄는 방향도 대칭으로 생각하십시오.
  4. 메뉴에 안 보인다고 “삭제됨”이 아님 — FAQ: 트리에 있어도 의존 때문에 숨겨질 수 있습니다.

한 줄 정리: 최소 구성은 의존 그래프를 읽으면서 줄이고, 줄인 뒤에는 클린 풀빌드로 “남아 있는 파일” 착시를 없앱니다.

재현 방법은?

한 줄 답: 동작하는 .config가 있으면 make savedefconfig로 기본값과 같은 항목을 벗겨 최소 defconfig를 만듭니다. configs/<name>_defconfig에 두고 make <name>_defconfig로 다시 올립니다. 경로를 지정하려면 BR2_DEFCONFIG=를 씁니다.

매뉴얼 Storing the Buildroot configuration 요지:

  1. make savedefconfig — 기본값인 옵션을 제거한 최소 설정을 씀. 기본 출력 파일명은 소스 트리 루트의 defconfig.
  2. 다른 경로 — make savedefconfig BR2_DEFCONFIG=<path> 또는 설정 안의 BR2_DEFCONFIG.
  3. 권장 위치 — configs/<boardname>_defconfig. 그러면 make list-defconfigs에 보이고 make <boardname>_defconfig로 로드.
  4. 임의 경로 — make defconfig BR2_DEFCONFIG=<path>.
  5. 커널·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

주의:

  1. .config 전체를 커밋하지 말고 savedefconfig 결과를 버전 관리하는 것이 매뉴얼이 가리키는 방향입니다(기본값 노이즈 제거).
  2. 일부 in-tree configs/*_defconfig가 BR2_DEFCONFIG를 심어 두면, make <board>_defconfig 후 savedefconfig가 원본을 덮어쓸 수 있습니다. 막을 때는 BR2_DEFCONFIG를 비우거나 make savedefconfig BR2_DEFCONFIG=defconfig처럼 명시 경로를 쓰십시오(커뮤니티 문서화 논의와 동일 요지).
  3. upstream에 보드를 넣을 때는 고정 버전/커밋 해시를 쓰고 “latest”를 피하라고 매뉴얼이 말합니다. 제품 defconfig도 같은 습관이 재현에 유리합니다.
  4. 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으로 충분한지를 먼저 판단하십시오.

출처