per*_*ror 23 compiling linux-kernel
当我编译自己的内核时,基本上我所做的如下:
我从 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
Run Code Online (Sandbox Code Playgroud)
您可能已经注意到,我的initrd.img
文件大小比我的发行版中的文件大 10 倍左右。
那么,我在编译内核时是否做错了什么?而且,我怎样才能减少我的大小initrd.img
?
SHW*_*SHW 31
这是因为所有内核模块都没有被剥离。您需要将其剥离以减小其大小。
使用这个命令:
SHW@SHW:/tmp# cd /lib/modules/<new_kernel>
SHW@SHW:/tmp# find . -name *.ko -exec strip --strip-unneeded {} +
Run Code Online (Sandbox Code Playgroud)
这将大大减小尺寸。执行上述命令后,您可以继续创建 initramfs/initrd
man strip
Run Code Online (Sandbox Code Playgroud)--strip-unneeded Remove all symbols that are not needed for relocation processing.
per*_*ror 28
我对这个问题做了一些额外的研究,以了解剥离模块的最佳方法是什么,这是我发现的完整过程(仍然 SHW 确实带来了答案,但我发现的过程在某种程度上更加标准化):
下载源代码www.kernel.org
并解压。
将你之前的复制.config
到源代码中,并make menuconfig
观察新选项并根据内核的新策略修改配置。
然后,编译它:
$> make -j 4
Run Code Online (Sandbox Code Playgroud)最后,安装它:
$> su -c 'make INSTALL_MOD_STRIP=1 modules_install && make install'
Run Code Online (Sandbox Code Playgroud)经过几次测试后,从/boot
和/lib/modules
目录中删除旧内核。
在INSTALL_MOD_STRIP
设置时1
添加strip --strip-debug
安装模块,这也足以大大降低大小时。
请参阅:INSTALL_MOD_STRIP在Documentation/kbuild/kbuild.txt
。
soh*_*154 10
您还可以更改您的配置 initramfs.conf
找到文件在 /etc/initramfs-tools/initramfs.conf
有一个设置表明MODULES=most
这包括您的 initrd 映像中的大多数模块。
将其更改为MODULES=dep
这将使 initramfs 生成器猜测要包含哪些模块。
在此处查看 initramfs.conf 的联机帮助页。
注意 1:执行上述步骤后,我的 initramfs 映像的大小从 282 MB 减少到 99 MB。(这仍然足够大,但这是一个显着的改进)
注意 2:我还尝试在/lib/modules/<kernel version>
. 操作系统更新提供的模块被剥离(大小 = 211 MB),因此相应的 intiramfs 映像约为 15 MB。剥离我自己编译的 vanilla 内核的模块后,文件夹的大小为 185 MB,内部映像为 16 MB。所以在所有优化之后,大小从 282 MB 降到了 16 MB!!对于剥离使用此代码
find /lib/modules/<kernel_release>/ -iname "*.ko" -exec strip --strip-unneeded {} \;
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,替换<kernel_release>
为您希望从中剥离模块的内核版本。
有关更多讨论,请查看此链接。
上面的代码必须作为sudo
或运行su