Linux 커널 수동 빌드: 생성된 바이너리는 사전 컴파일된 바이너리보다 10배 더 큽니다.

Linux 커널 수동 빌드: 생성된 바이너리는 사전 컴파일된 바이너리보다 10배 더 큽니다.

저는 Linux Mint 13 MATE 32비트를 사용하고 있으며 커널을 빌드하려고 합니다(주로 경험과 재미를 위해).

현재는 미리 컴파일된 커널과 동일한 구성을 사용하여 빌드하는 것을 좋아하므로 먼저 미리 컴파일된 커널 3.16.0-031600rc6을 설치했습니다.kernel.ubuntu.com, 성공적으로 시작되었습니다.

그런 다음 3.16.rc6 커널을 다음에서 다운로드했습니다.kernel.org, 압축을 풀고 기존 사전 컴파일된 커널의 구성을 사용하도록 구성합니다.

$ make oldconfig

나에게 아무것도 묻지 않았기 때문에 미리 컴파일된 커널에는 필요한 모든 정보가 포함되어 있습니다. 그런 다음 빌드했습니다(약 6시간 소요).

$ make

그런 다음 다음을 설치하십시오.

$ sudo make modules_install install

그런 다음 수동으로 컴파일된 커널을 부팅했는데 작동했지만 부팅 프로세스가 약간 느렸습니다. 그러나 나는 모든 바이너리( 및 그 안에 포함된 모든 모듈 /boot/initrd.img-3.16.0-rc6) 가 사전 컴파일된 버전보다 약 10배 더 크다는 것을 발견했습니다. bytes 와 비슷 하지만, 사전 컴파일된 바이너리는 모든 모듈 이 비슷하게 더 컸습니다.*.ko/lib/modules/3.16.0-rc6/kernelinitrd.img-3.16.0-rc6160 658 665initrd.img-3.16.0-031600rc6-generic16 819 611*.ko

왜 이런거야? 빌드에 특별한 옵션을 지정하지 않았습니다(위에서 언급한 것과 똑같은 명령을 입력했습니다). "올바르게" 구축하는 방법은 무엇입니까?

답변1

결국 file그것은 디버깅 기호입니다. LKML에 이 문제에 대한 스레드가 있습니다.시도하도록 유도:

make INSTALL_MOD_STRIP=1 modules_install

짜잔, /lib/modules/x.x.x이전 디렉토리 내에서의 비교:

> ls -hs kernel/crypto/anubis.ko 
112K kernel/crypto/anubis.ko

후에:

> ls -hs kernel/crypto/anubis.ko 
16K kernel/crypto/anubis.ko

.config또한 보고된 총 디렉터리 크기(동일한 디렉터리 사용)가 du -h185MB에서 13MB로 늘어났습니다.

디스크 공간을 사용하는 것 외에는 보이는 것만큼 중요하지 않다는 점을 명심하세요. 정상 작동 중에는 디버깅 기호가 로드되지 않으므로 메모리에 있는 각 모듈의 실제 크기는 파일 크기에 관계없이 동일할 가능성이 높습니다 .ko. 유일한 중요한 차이점은 크기라고 생각합니다 initramfs. 유일한 차이점은 파일 시스템의 압축을 푸는 데 걸리는 시간입니다. 즉, 다음을 사용하면압축되지 않은initramfs는 중요하지 않습니다.

strip --strip-all또한 작동하며 file어느 쪽이든 올바르게 보고합니다 stripped. 배포판에 적용된다고 말하는 이유는 not stripped여전히 미스터리입니다.

답변2

make oldconfig그렇게 하고 나면 make vmlinuz미리 컴파일된 커널이 "실행 가능한 bzImage"라는 것을 알게 될 것입니다. 이는 디스크에 압축되어 있음을 의미합니다. 부팅 메시지를 자세히 살펴보면 프로세스 초기에 커널의 압축이 풀린다는 것을 알 수 있습니다.

관련 정보