U盘中打造属于自己的Linux (三) :内核编译(中)大刀向内核的头上砍去
作者: 西玛哒 分类: IT悟语, Linux, 老西常谈 标签: Linux 评论: 0
## 接上文 我们了解了makefile的使用方法和make命令
//———————————
开始本章之前,强调两点,首先进行操作不要在熄灯之后,没电了后果自负。
其次,你的宿主机内要有起码2~3个G的自由空间在你的工作目录下,别被5X.XXMB的内核骗了! 编译产生的中间文件有如滔滔江水绵绵不绝……..
//——————————–
现在我们就可以随心所欲的对手中的内核进行操作了,在将其制作成为“成品”之前,我们可以随意制造“模具”以便让我们的Linux内核用于不同的用途。
我们以一个默认配置的内核开始 了解一些常用的内核配置:
#make defconfig
我们以默认的为底 起码能用。
#make menuconfig
出现内核配置选单:
ok 这就是传说中的高手、牛人们与内核战斗,获得各种有超级通途的神奇内核的地方。
我们不一定立刻成为牛人,但我们可以跟着牛人们总结出来的东西走,网上有N多关于内核编译选项设置的,我们随便找一些看看,发现很多东西都是用在嵌入式上的。
我们知道 内核要做的一件重要的事情就是识别并支持机器上的各种硬件设备,向用户提供操作这些设备工作的应用接口,使用户可以用程序(命令)来调用硬件,实现相应的功能。
因此,我们需要根据我们的需求进行修改配置我们的内核,我们回想一下需求:
1、U盘上用的Linux,因此需要较强的适应性,得能够识别大部分的硬件才行。
2、ext2 文件支持要有。
3、之后要用到独立的内核 所以支持选项一定要配置进去:
##############################
以下内容建立在默认配置的基础上:
选择相应的配置时,有三种选择,它们分别代表的含义如下:
“Y” / “*”- 将该功能编译进内核
“N” /“-”- 不将该功能编译进内核
“M”- 将该功能编译成可以在需要时动态插入到内核中的模块。
一般通过空格键或回车键控制选项是否选中。
需要我们重点配置的选项如下:
文件系统:
File systems—>
[*] Ext2 journalling file system support
[*] Ext2 Security Labels
…….附近的选项请酌情选取
内核模块支持:
Load module support->
/ Enable loadable module support /
* Automatic kernel loading ;
硬件支持 主要是磁盘:
Device Driver
|—->SCSI device support
|—->SCSI disk support
|—–>verbose SCSI error reporting (不是必须的,但可方便问题定位)
|—–>SCSI low-level drivers
|—->Serial ATA (SATA) support
…………
其余大部分的内核我们不用涉及其用法,因为我们强调可移植性,而我们的U盘空间不是很苛刻,因此我们用bzImage 的格式做一个大内核 ,选项中尽量使用原有的配置,将硬件设备的支持直接编入内核之中,可以保证我们之后能正常使用,当然这违背我们精致的原则,因此 本懒人向勤劳的人们提供如下链接:
http://lamp.linux.gov.cn/Linux/kernel_options.html
这是关于整个内核配置选项的详细介绍 大家可以一步步的走一下。
按之前的配置 我们在menu状态下完成配置后,就可以按exit按钮退出,会提示你保存.config 文件。
完成后就可以进行编译了。
make语句用法已经叙述过,在此不再详述:
(# make menuconfig 之后:)
# make bzImage
刷屏啊………………………………..
建议你去吃饭… 反正要很久
如果不报错退出,那么恭喜 再次看见
#
的时候 你的bzImage 就已经完成了。
从提示上应该看得出 你的成品被放于:
# /arch/i386/boot/bzImage 它其实是一个链接到
# /arch/x86/boot/bzImage …… i386< x86 算是这个平台的一个子集吧。
这就是我们传说中的内核了,如你所见,它是用来启动的,这个文件名称可以随便定,但是最好起一个标准点的名字,比如:UsbLinux.kernel 将它复制到我们的工作目录 也就是U盘下。
( pwd …../kernel/linux-XXXXX./)
#cp /arch/i386/boot/bzImage /mnt/usb/boot/Usblinux.kernel (复制并重命名)
这个文件的用法之后再说,只是我们获得了grub.conf 和menu.lst 的一个重要参数
kernel XXXXXXX
用vi 打开上述文件,参照之前讲过的内容修改就是了。
这时候其实真正的linux系统部分已经在你的U盘中写完了。
下章将介绍与initrd相关的内核编译部分。
##############################################
以下是关于内核make和宿主系统换内核的一些扩展,与U盘Linux无关。
正常的电脑在下载源码包之后,一般需要对源码进行一下优化,与U盘linux不同,宿主机的硬件是固定的,因此在选择时一般针对自己电脑的配置进行修改:
下面是一个有关配置的介绍链接:
http://soft.yesky.com/os/lin/370/2018870_1.shtml
还有人用相关工具进行优化,这里不说了。
我们在# make menuconfig
# make bzImage
之后,只是声称了启动内核,但是我们在配置中选为M的,也就是需要module的部分并没有编译出来。
其实,make系列命令真正常用的用途是,在宿主机内编译整个内核后,将成品内核部署到宿主机的指定位置,我们只是借用了生成的bzImage而已,而且我们默认选项中,大部分硬件支持是以*配置选择,就是不需要模块支持编译的,因此不会用到Modules。
这里我们看看,正常这之后我们换内核的流程。
#make modules //根据我们的选择,编译我们需要的模块部分。
#make modules_install // 我们编译模块的成品,也就是内核要用到得模块 将安装到指定位置,这个位置我们在内核配置中可以找到,但我们要知道,默认的系统标准位置是:
/lib/modules/…….
###
模块在系统中的标准目录位于/lib/modules/x.y.z,后面的x.y.z是版本号,为安全起见,在运行
#make modules_install
之前最好对/lib/modules进行备份。模块通常是带有扩展名.o的文件,使用命令#lsmod可以对当前内核的模 块进行列表。
###
还记得,我们之间说过,我当前的系统内核叫做:
2.6.28-11-generic
这里我们想要换内核,由于模块已经放到指定位置,其实我们只需要用新生成的 内核和相关文件替换掉我们原有的内核就可以,这里make给了我们一步到位的方法:
#make install
上面的命令"make install"将:
(1)把压缩内核映象拷贝到/boot目录下, 并创建相应的System.map符号链接;
(2)修改bootloader的配置文件;
(3)调用mkinitrd程序创建内核的initrd映象. 对于GRUB而言, 将在/boot/grub/grub.conf配置文件增加如下类似的配置行:
title Red Hat Linux (2.***)
root(hd0, 1)
kernel /boot/vmlinuz-2.*** ro root=LABEL=/
initrd /boot/initrd-2.***.img
这样新的内核就安装好了,重启系统,在grub选单下,就会看到新的内核配置
Ubuntu 9.04 XXX 2.6.28-11-generic
Ubuntu 9.04 XXX 2.6.29-2 //新内核。
为了方便管理,我们介绍一下dpkg命令,dpkg 是Debian的软件包管理系统,参数大家自己查看,这里只说其查看内核的方法:
# dpkg –get-selections | grep linux
获得软件包信息 输送结果 查找字串 其中包含 linux 关键字
这里会列出你安装过的带linux关键词的软件包 包括所有的内核
linux-generic install
linux-headers-2.6.28-11 install
linux-headers-2.6.28-11-generic install
linux-headers-generic install
linux-image-2.6.28-11-generic install
linux-image-generic install
linux-libc-dev install
linux-restricted-modules-2.6.28-11-generic install
我们想要删除不用的内核 就要执行以下命令:
# apt-get remove linux-image-2.6.28-11-generic
这样就可以实现自动删除内核文件了,还可以释放磁盘空间。
参考文献:http://os.yesky.com/lin/88/7535588.shtml
#############################################
| anyShare分享到: | |
| |





