我正在使用 Linux Mint 13 MATE 32 位,我正在尝试构建内核(主要是为了体验和乐趣)。
目前,我喜欢使用与预编译内核相同的配置来构建它,因此首先我安装了预编译内核 3.16.0-031600rc6kernel.ubuntu.com,成功启动。
然后我从下载了 3.16.rc6 内核内核.org,解压它,将其配置为使用现有预编译内核中的配置:
$ make oldconfig
它没有问我任何事情,因此,预编译的内核包含所有必要的信息。然后我构建了它(大约花了 6 个小时):
$ make
然后安装:
$ sudo make modules_install install
然后我启动了手动编译的内核,它可以工作,但启动过程有点慢。但后来我发现所有的二进制文件(/boot/initrd.img-3.16.0-rc6
以及其中的所有*.ko
模块/lib/modules/3.16.0-rc6/kernel
都比预编译版本大10倍左右!比如说,initrd.img-3.16.0-rc6
是160 658 665
字节,但预编译的initrd.img-3.16.0-031600rc6-generic
是16 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 -h
从 185 MB 增加到 13 MB。
请记住,除了使用磁盘空间之外,这并不像看起来那么重要。正常运行时不会加载调试符号,因此无论文件大小如何,内存中每个模块的实际大小可能都是相同的.ko
。我认为唯一显着的区别是它的大小initramfs
,唯一的区别是解压缩文件系统所需的时间。即,如果您使用未压缩的initramfs,没关系。
strip --strip-all
也有效,并file
以任何一种方式正确报告它们stripped
。为什么它说not stripped
适用于发行版仍然是个谜。
答案2
在你之后make oldconfig
,做一个make vmlinuz
.我想你会发现预编译的内核是一个“可执行的bzImage”,这意味着它被压缩在磁盘上。如果您仔细观察启动消息,您会发现它在此过程的早期就解压缩了内核。