Build A Minimal Linux Kernel

本文详细介绍了如何通过去除不必要的内核模块和特性,构建一个尽可能小的Linux内核,以减少无盘服务器的启动时间。通过对比最小配置文件与正常配置文件,并在QEMU中进行测试,最终成功构建了一个2.7MB的精简内核,显著提高了无盘服务器的启动效率。

Build-A-Minimal-Linux-Kernel

Leave out the unnecessary kernel module and features to make a minimal kernel as possible as one can

Reason for thus a project

When I am to set up a diskless linux server on my local network, I notice that the linux kernel in general distrubtion is about 4.7M. When the PXE download the kernel for the diskless enveriment, the tftpd speed is only thundreds Kbyte/s, so I immediately realize that if I can build a more minimal kernel, the bootup time of the diskless server maybe decrease a lot. I search which features are not necessory for boot a linux on a network filesystem(NFS), and I get many useful instructions. However, it fails to bootup when I finish the compiling. Unfortunately, I could get no sense which configuration casue the problem. The bootup procedure can give little or even no information.

To do

I write a shell batch with these steps: 1. compare the minimal configuration file(with which, the corresponding kernel cannot bootup) and the normal config file(just from a distrubtion). 2.separate both the two configuration file with same sections, replace each fraction of the normal config file with the 'fatal' one. 3.comiple and test the kernel in QEMU, if it success to boot, try to replace more following that in step2. '-curses' '-std:mon' are some usefull option when testing the kernel with QEMU.

Results

My final successful diskless linux kernel is 2.7M.

For others, some one make up a 744KB kernel. (http://linuxman.blog.ccidnet.com/blog-htm-do-showone-uid-60710-type-blog-itemid-293122.html)

Build directory for the kernel ------------------------------ When compiling the kernel, all output files will per default be stored together with the kernel source code. Using the option ``make O=output/dir`` allows you to specify an alternate place for the output files (including .config). Example:: kernel source code: /usr/src/linux-4.X build directory: /home/name/build/kernel To configure and build the kernel, use:: cd /usr/src/linux-4.X make O=/home/name/build/kernel menuconfig make O=/home/name/build/kernel sudo make O=/home/name/build/kernel modules_install install Please note: If the ``O=output/dir`` option is used, then it must be used for all invocations of make. Configuring the kernel ---------------------- Do not skip this step even if you are only upgrading one minor version. New configuration options are added in each release, and odd problems will turn up if the configuration files are not set up as expected. If you want to carry your existing configuration to a new version with minimal work, use ``make oldconfig``, which will only ask you for the answers to new questions. - Alternative configuration commands are:: "make config" Plain text interface. "make menuconfig" Text based color menus, radiolists & dialogs. "make nconfig" Enhanced text based color menus. "make xconfig" Qt based configuration tool. "make gconfig" GTK+ based configuration tool. "make oldconfig" Default all questions based on the contents of your existing ./.config file and asking about new config symbols. "make silentoldconfig" Like above, but avoids cluttering the screen with questions already answered. Additionally updates the dependencies. "make olddefconfig" Like above, but sets new symbols to their default values without prompting. "make defconfig" Create a ./.config file by using the default symbol values from either arch/$ARCH/defconfig or arch/$ARCH/configs/${PLATFORM}_defconfig, depending on the architecture. "make ${PLATFORM}_defconfig" Create a ./.config file by using the default symbol values from arch/$ARCH/configs/${PLATFORM}_defconfig. Use "make help" to get a list of all available platforms of your architecture. "make allyesconfig" Create a ./.config file by setting symbol values to 'y' as much as possible. "make allmodconfig" Create a ./.config file by setting symbol values to 'm' as much as possible. "make allnoconfig" Create a ./.config file by setting symbol values to 'n' as much as possible. "make randconfig" Create a ./.config file by setting symbol values to random values. "make localmodconfig" Create a config based on current config and loaded modules (lsmod). Disables any module option that is not needed for the loaded modules. To create a localmodconfig for another machine, store the lsmod of that machine into a file and pass it in as a LSMOD parameter. target$ lsmod > /tmp/mylsmod target$ scp /tmp/mylsmod host:/tmp host$ make LSMOD=/tmp/mylsmod localmodconfig The above also works when cross compiling. "make localyesconfig" Similar to localmodconfig, except it will convert all module options to built in (=y) options. You can find more information on using the Linux kernel config tools in Documentation/kbuild/kconfig.txt. - NOTES on ``make config``: - Having unnecessary drivers will make the kernel bigger, and can under some circumstances lead to problems: probing for a nonexistent controller card may confuse your other controllers. - A kernel with math-emulation compiled in will still use the coprocessor if one is present: the math emulation will just never get used in that case. The kernel will be slightly larger, but will work on different machines regardless of whether they have a math coprocessor or not. - The "kernel hacking" configuration details usually result in a bigger or slower kernel (or both), and can even make the kernel less stable by configuring some routines to actively try to break bad code to find kernel problems (kmalloc()). Thus you should probably answer 'n' to the questions for "development", "experimental", or "debugging" features. ——详述一下这段话的步骤
最新发布
08-09
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值