커널을 컴파일 할 때 initrd의 크기를 줄이는 방법은 무엇입니까?


13

내 커널을 컴파일 할 때 기본적으로 내가하는 일은 다음과 같습니다.

  1. www.kernel.org에서 소스를 다운로드하여 압축 해제하십시오.

  2. 이전 .config을 소스에 복사 make menuconfig하고 새 옵션을 감시하고 새 커널 정책에 따라 구성을 수정합니다.

  3. 그런 다음 컴파일합니다. make -j 4

  4. 마지막으로 설치합니다 su -c 'make modules_install && make install'.

  5. 몇 가지 테스트를 거친 후 이전 커널 ( /boot및에서 /lib/modules)을 제거하고 새 커널로 완전히 실행합니다 (이 마지막 단계는 여러 번 생명을 구했습니다! 팁입니다 !).

문제는 항상 /boot/initrd.img-4.x.x배포판에 비해 큰 것을 얻는다 는 것입니다. /boot/예를 들어 현재 디렉토리 의 내용은 다음과 같습니다 .

# ls -alFh
total 243M
drwxr-xr-x  5 root root 4.0K Mar 16 21:26 ./
drwxr-xr-x 25 root root 4.0K Feb 25 09:28 ../
-rw-r--r--  1 root root 2.9M Mar  9 07:39 System.map-4.4.0-1-amd64
-rw-r--r--  1 root root 3.1M Mar 11 22:30 System.map-4.4.5
-rw-r--r--  1 root root 3.2M Mar 16 21:26 System.map-4.5.0
-rw-r--r--  1 root root 170K Mar  9 07:39 config-4.4.0-1-amd64
-rw-r--r--  1 root root 124K Mar 11 22:30 config-4.4.5
-rw-r--r--  1 root root 126K Mar 16 21:26 config-4.5.0
drwxr-xr-x  5 root root  512 Jan  1  1970 efi/
drwxr-xr-x  5 root root 4.0K Mar 16 21:27 grub/
-rw-r--r--  1 root root  19M Mar 10 22:01 initrd.img-4.4.0-1-amd64
-rw-r--r--  1 root root 101M Mar 12 13:59 initrd.img-4.4.5
-rw-r--r--  1 root root 103M Mar 16 21:26 initrd.img-4.5.0
drwx------  2 root root  16K Apr  8  2014 lost+found/
-rw-r--r--  1 root root 3.5M Mar  9 07:30 vmlinuz-4.4.0-1-amd64
-rw-r--r--  1 root root 4.1M Mar 11 22:30 vmlinuz-4.4.5
-rw-r--r--  1 root root 4.1M Mar 16 21:26 vmlinuz-4.5.0

아시다시피, initrd.img파일 크기는 배포 한 파일 크기 보다 약 10 배 더 큽니다.

커널을 컴파일 할 때 어떤 문제가 있습니까? 그리고 어떻게 내 크기를 줄일 수 initrd.img있습니까?


wiki.gentoo.org/wiki/… 그리고 그것이 어떻게 그렇게 큰지 보십시오. 수많은 커널 모듈이나 라이브러리 일 수도 있고 아니면 다른 것일 수도 있습니다. 아카이브의 내용을 보지 않으면 추측 일뿐입니다.
frostschutz

답변:


19

모든 커널 모듈이 제거되지 않았기 때문입니다. 크기를 줄이십시오.

이 명령을 사용하십시오 :

SHW@SHW:/tmp# cd /lib/modules/<new_kernel>
SHW@SHW:/tmp# find . -name *.ko -exec strip --strip-unneeded {} +

크기가 크게 줄어 듭니다. 위의 명령을 실행 한 후 initramfs / initrd 생성을 진행할 수 있습니다


와우, 나는 모듈을 스트리핑하면 initrd이미지 의 크기를 10으로 나눌 수는 없었지만 ... 고마워, 잘 작동했습니다!
perror

{}와 사이에 공백이 있어야합니다 +.
phk

15

나는 모듈을 제거하는 가장 좋은 방법이 무엇인지 알기 위해 문제에 대한 추가 연구를했으며 여기에 내가 찾은 전체 프로세스가 있습니다 (여전히 SHW가 답을 얻었지만 내가 찾은 프로세스는 다소 표준화되었습니다).

  1. 소스를 다운로드하여 www.kernel.org압축 해제하십시오.

  2. 이전 .config소스를 복사 하고 a make menuconfig를 수행 하여 새 옵션을 감시하고 새 커널 정책에 따라 구성을 수정하십시오.

  3. 그런 다음 컴파일하십시오.

    $> make -j 4
    
  4. 마지막으로 설치하십시오.

    $> su -c 'make INSTALL_MOD_STRIP=1 modules_install && make install'
    
  5. 몇 가지 테스트 후, 이전 커널 /boot/lib/modules디렉토리 에서 제거하십시오 .

INSTALL_MOD_STRIP설정되면 1a를 strip --strip-debug획기적으로 크기를 줄이기에 충분하다 모듈을 설치할 때.

INSTALL_MOD_STRIP 를 참조하십시오 Documentation/kbuild/kbuild.txt.


7

당신은 또한 당신의 구성을 변경할 수 있습니다 initramfs.conf

에서 파일 찾기 /etc/initramfs-tools/initramfs.conf

여기 MODULES=most에는 initrd 이미지에 대한 대부분의 모듈이 포함되어 있다는 설정 이 있습니다.

이를 변경 MODULES=dep하여 initramfs 생성기가 어떤 모듈을 포함할지 추측합니다.

initramfs.conf 맨 페이지를 확인 하십시오 .

참고 1 : 위의 단계를 수행 한 후 initramfs 이미지의 크기가 282MB에서 99MB로 줄었습니다 (여전히 크지 만 크게 개선되었습니다).

참고 2 :에서 커널 모듈을 제거하려고했습니다 /lib/modules/<kernel version>. OS 업데이트에서 제공하는 모듈이 제거되어 (크기 = 211MB) 해당 intiramfs 이미지는 약 15MB입니다. 내가 컴파일 한 바닐라 커널의 모듈을 제거한 후 폴더의 크기는 185MB이고 intramfs 이미지는 16MB였습니다. 따라서 모든 최적화 후 크기가 282MB에서 16MB로 줄었습니다! 벗기려면이 코드를 사용하십시오.

find /lib/modules/<kernel_release>/ -iname "*.ko" -exec strip --strip-unneeded {} \;

위의 코드 <kernel_release>에서 모듈을 제거하려는 커널 버전으로 바꿉니다.

자세한 내용은이 링크 를 참조 하십시오 .

위의 코드는 sudo또는su

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.