当我编译自己的内核时,基本上我所做的如下:
我从 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
,这足以大幅减小体积。
看:安装_MOD_STRIP在Documentation/kbuild/kbuild.txt
。
答案3
您还可以更改您的配置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,intramfs 映像为 16 MB。因此,经过所有优化后,大小从 282 MB 降至 16 MB!对于剥离使用此代码
find /lib/modules/<kernel_release>/ -iname "*.ko" -exec strip --strip-unneeded {} \;
在上面的代码中替换<kernel_release>
为您想要从中删除模块的内核版本。
更多讨论请查看此关联。
上面的代码必须运行为sudo
或su