###1. 工作区目录结构
在开始我们的整个工程的第一步, 我希望能使用一个整洁的目录结构来保存每一步尝试的结果
mkdir diy-linux
cd diy-linux
mkdir linux-src
mkdir busybox-src
mkdir rootfs
执行完之后, 看起来目录结构是这样的
diy-linux --|
|- linux-src
|- busybox-src
|- rootfs
- linux-src : 用于保存 linux kernel 源码
- busybox-src : 用于保存 busybox 源码
- rootfs : 用于构建根文件系统的挂载点
后续还会添加一些目录和文件用于备份
###2. 下载linux内核
访问 www.kernel.org 下载所需要的版本,也可以直接使用wget来下载, 如 3.10.40
cd linux-src
wget --no-check-certificate http://www.kernel.org/pub/linux/kernel/v3.0/linux-3.10.40.tar.xz
tar Jxvf linux-3.10.40.tar.xz
###3. 配置linux内核
在内核树的根目录中,有一个.config文件,它记录了内核的配置选项,可直接对它进行修改,再运行。在.config文件中,每个配置和选项的值只能为”y”和”m”两者之一,如果不需要这个特性不再支持她,那么可以将对应的选项用”#”注释掉。
在ubuntu 的 /boot/config-'uname -r`中保存了系统中对应版本内核的配置
在内核源码的目录中, 执行 make xxxconfig 来进行内核配置, 常用的配置方式如下:
- make config : 基于文本的最为传统也最为枯燥的配置方式, 但是适用于任何方式, 为每一个内核特性向用户提问,回答“y”,或者“m”,或者“n”,每一次运行都会对所有问题进行提问,不管你之前有没有进行过配置。
- make oldconfig : 类似于“make config”, 但是在现有的.config文件的基础上建立一个配置文件,只会就当前.config文件中没有配置的内核特性向用户提问。在配置好并保存时, 会将之前的.config文件文件备份到.config.old中去, make silentoldconfig 和上面oldconfig一样,但在屏幕上不再出现已在.config中配置好的选项。
- make menuconfig : 基于终端的一种配置方式,提供了文本模式的图形用户界面,用户可以通过光标移动来浏览所支持的各种特性。使用这用配置方式时,系统中必须安装有ncurese库,否则会显示“Unable to find the Ncurses libraies”的错误提示
- make xoncifg : 基于X Winodws的一种配置方式,提供了漂亮的配置窗口,不过只有能够在X Server上使用root用户欲行X应用程序时,才能够使用,它依赖于QT,如果系统中没有安装QT库,则会出现“Unable to find the QT installation”的错误提示
- make gconfig : 与make xocnifg类似,不同的是make gconfig依赖于GTK库
- make defconfig : 按照默认的配置文件arch/i386/defconfig对内核进行配置,生成.config可以用作初始化配置,然后再使用make menuconfig进行定制化配置
- make allyesconfig : 尽量多地使用“y”设置内核选项值,生成的配置中包含了全部的内核特性
- make allmodconfig : 尽可能多的使用“m”设置内核选项值来生成配置文件
- make allnoconfig : 除必须的选项外,其它选项一律不选. (常用于嵌入式系统).
- make localmodconfig : make localmodconfig 会执行 lsmod 命令查看当前系统中加载了哪些模块 (Modules), 并最后将原来的 .config 中不需要的模块去掉,仅保留前面 lsmod 出来的这些模块,从而简化了内核的配置过程,单是该方法仅能使编译出的内核支持当前内核已经加载的模块, 如果你要为特定的机器来配置一个最简的系统, 这个命令很有用
- make localyesconfig : 同“make localmodconfig”一样, 但是会把选中的模块直接build进内核, 而不再是以模块的方式存在
其实”make menuconfig”,”make xconfig” “make gconfig” 的功能相当于”make oldconfig”,只是以字符界面或者不同的图形界面来和用户交互
我们要做的是
cd linux-src/linux-3.10.40
make defconfig
make menuconfig
这一步可能会出现如下的错误:
scripts/kconfig/lxdialog/dialog.h:31:20: fatal error: curses.h: No such file or directory
这是因为缺少 libncurses, 执行如下命令来安装
$ sudo apt-get install libncurses
###4. 打开Ramdisk选项
使用defconfig的话,基本上无需做改动, 但是你还是需要确保以下几条选项被打开以支持ramdisk
General setup -->
Initial Ram filesystem and Ram disk support
Device Drivers -->
Block devices -->
Ram block device support
你必须选择将它们 build-in kernel 而不是编译成模块
###5. 编译linux
直接执行 make -j4 来进行编译
几个常用的编译命令:
- make dep 当你更改了某一个模块的配置后, 另外的模块可能受收到影响,需要rebuild,运行make dep来解决依赖(2.6后不需要此命令了)
- make modules 编译模块
- make bzimage 编译内核压缩文件
执行make -j4
, 编译完成后, 在内核源码下的 arch/x86_64/boot 下面(我安装的是64位版ubuntu),会生成 bzmage 文件