내 커널을 컴파일할 때 기본적으로 수행하는 작업은 다음과 같습니다.
www.kernel.org에서 소스 코드를 다운로드하고 압축을 풀었습니다.
이전 내용을
.config
소스 코드에 복사하고make menuconfig
새로운 옵션을 관찰하고 커널의 새로운 정책에 따라 구성을 수정하는 작업을 수행했습니다.그런 다음 이를 컴파일합니다.
make -j 4
마지막으로 설치했습니다:
su -c 'make modules_install && make install'
./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
?
답변1
이는 커널 모듈이 제거되지 않았기 때문입니다. 크기를 줄이려면 껍질을 벗겨야 합니다.
다음 명령을 사용하십시오.
SHW@SHW:/tmp# cd /lib/modules/<new_kernel>
SHW@SHW:/tmp# find . -name *.ko -exec strip --strip-unneeded {} +
이렇게 하면 크기가 크게 줄어듭니다. 위 명령을 실행한 후 계속해서 initramfs/initrd를 생성할 수 있습니다.
man strip
--strip-unneeded Remove all symbols that are not needed for relocation processing.
답변2
나는 모듈을 제거하는 가장 좋은 방법이 무엇인지 이해하기 위해 이 질문에 대해 몇 가지 추가 조사를 수행했으며 여기에 내가 찾은 전체 프로세스가 있습니다(여전히 SHW가 답을 가져왔지만 내가 찾은 프로세스는 다소 표준화되었습니다).
소스코드를 다운로드
www.kernel.org
하고 압축을 푼다.이전 내용을
.config
소스 코드에 복사하고 다음을 수행하여make menuconfig
새 옵션을 관찰하고 커널의 새 정책에 따라 구성을 수정합니다.그런 다음 컴파일하십시오.
$> make -j 4
마지막으로 설치합니다.
$> su -c 'make INSTALL_MOD_STRIP=1 modules_install && make install'
몇 가지 테스트 후에
/boot
및/lib/modules
디렉토리에서 이전 커널을 제거하십시오.
INSTALL_MOD_STRIP
설정은 모듈을 설치할 때 1
하나를 추가하는데 strip --strip-debug
, 이는 크기를 크게 줄이는 데 충분합니다.
바라보다:INSTALL_MOD_STRIP존재하다 Documentation/kbuild/kbuild.txt
.
답변3
구성을 변경할 수도 있습니다.initramfs.conf
파일을 찾아보세요/etc/initramfs-tools/initramfs.conf
MODULES=most
initrd 이미지에 대부분의 모듈이 포함되어 있다는 설정이 있습니다 .
MODULES=dep
initramfs 생성기가 포함할 모듈을 추측하도록 이를 변경합니다 .
initramfs.conf 맨페이지 보기여기.
참고 1: 위 단계를 수행한 후 initramfs 이미지의 크기가 282MB에서 99MB로 줄었습니다. (이것은 여전히 충분하지만 상당한 개선입니다)
참고 2: 또한 /lib/modules/<kernel version>
. 운영 체제 업데이트에서 제공하는 모듈은 제거되므로(크기 = 211MB) 해당 intiramfs 이미지는 약 15MB입니다. 내 자신이 컴파일한 바닐라 커널용 모듈을 제거한 후 폴더 크기는 185MB이고 inramfs 이미지는 16MB였습니다. 따라서 모든 최적화 후에 크기가 282MB에서 16MB로 줄었습니다! 제거하려면 이 코드를 사용하세요.
find /lib/modules/<kernel_release>/ -iname "*.ko" -exec strip --strip-unneeded {} \;
위 코드에서 <kernel_release>
모듈을 제거하려는 커널 버전으로 바꾸세요.
자세한 내용은 다음을 참조하세요.협회.
위의 코드는 다음과 같이 실행되어야 합니다 sudo
.su