《鸟哥的Linux私房菜》读书笔记:Linux内核编译和管理
1.内核简介与获取内核源代码
1.1 什么是内核
- kernel:内核(kernel)是整个操作系统的最底层,他负责了整个硬件的驱动,以及提供各种系统所需的内核功能,包含防火墙机制、是否支持LVM或Quota等文件系统。若你的内核不能识别某个最新的硬件,那该硬件也就无法被驱动,你当然也就无法使用该硬件。其实内核就是系统上面的一个档案而已, 这个档案包含了驱动主机各项硬件的侦测程序和驱动模块。内核档案一般放在
/boot/vmlinuz
目录下 - 内核模块(Kernel module)的用途:将一些不常用的类似驱动程序的东西独立出内核,编译成为模块,在不更换内核,重新编译内核的前提下,内核可以在系统正常运作的过程当中加载这个模块到内核的支持。放置的目录为
/lib/modules/$(uname -r)/kernel/
1.2 为什么更新内核
内核的编译重点在于你要你的Linux做什么。如果没有必要的工作,就不需要加在你的内核当中!这样才能让Linux跑得更稳、更顺畅。这也是为什么我们要编译内核的最主要原因了。
- 内核编译可能的目的:
- 新功能的需求
- 原本内核太过臃肿
- 和硬件搭配的稳定性
- 其他需求(如嵌入式系统)
重新编译内核虽然可以针对你的硬件作优化的步骤,不过由于这些优化的步骤对于整体效能的影响是很小的, 因此如果是为了增加效能来编译内核的话,基本上,效益不大。然而,如果是针对系统稳定性来考虑的话, 那就有充分的理由来重新编译内核。由于内核的主要工作是在控制硬件,所以编译内核前, 请先了解一下你的硬件配备,与你这部主机的未来功能。由于内核是越简单越好,所以叧要将这部主机的未来功能给他编进去就好了。
1.3 内核源代码的解压缩、安装和观察
- 内核源代码的解压缩和放置目录:内核原始码一般建议放在
/usr/src/kernels/
目录底下。tar -jxvf linux-X.X.XX.X.tar.bz2 -C /usr/src/kernels/
。此时会在 /usr/src/kernels底下产生一个新的目录,那就是 linux-X.X.XX.X这个目录。 - 内核源代码下的次目录:
- arch:和硬件平台有关的项目,大部分指的是CPU的类别,例如 x86, x86_64,Xen虚拟支持等。
- block:和成组设备较相关的设定数据,区块数据通常指的是大量储存媒体。还包括类似ext3等文件系统的支持是否允许等。
- crypto:内核所支持的加密的技术,例如md5或者是des等等。
- Documentation:和内核有关的一堆说明文件,若对内核有极大的兴趣,要瞧瞧这里。
- drivers:一些硬件的驱动程序,例如显示适配器、网络卡、PCI 相关硬件等等;
- firmware:一些旧式硬件的微脚本 (固件) 数据;
- fs:内核所支持的filesystems,例如vfat,reiserfs,nfs 等等;
- include:一些可让其他过程调用的标头 (header) 定义数据;
- init:一些内核初始化的定义功能,包括挂载和init程序的呼叫等;
- ipc:定义Linux操作系统内各程序的沟通;
- kernel :定义内核的程序、内核状态、线程、程序的排程 (schedule)、程序的信号 (signle) 等
- lib:一些函数库;
- mm :和内存单元有关的各项数据,包括swap和虚拟内存等;
- net:和网络有关的各项协议数据,还有防火墙模块 (net/ipv4/netfilter/*) 等等;
- security:包括selinux等在内的安全性设定;
- sound:和音效有关的各项模块;
- virt:和虚拟化机器有关的信息,目前内核支持的是 KVM (Kernel base Virtual Machine)
这些数据先大致有个印象即可,至少未来如果你想要使用patch的方法加入额外的新功能时,你要将你的源代码放在哪,这里就能够提供一些指引了。当然,最好还是跑到Documentation那个目录下去瞧瞧正确的说明, 对你的内核编译会更有帮助。
2.内核编译的前处理和内核功能选择
内核的目的在于管理硬件和提供系统核心功能,因此你必须要先找到你的系统硬件,并且规划你的主机未来的任务,这样才能够编译出适合你这部主机的内核。所以,整个内核编译的重要工作就是挑选你想要的功能。
2.1 硬件环境查看和核心功能要求
- 硬件环境查看:通过/proc/cpuinfo和lspci观察
2.2 保持干净源代码:make mrproper
了解了硬件相关的数据后,我们还得要处理一下内核源代码底下的残留文件才行。假如我们是第一次编译,但是我们不清楚到底下载下来的源代码当中有没有保留目标档案 (*.o) 以及相关的配置文件存在, 此时我们可以透过后面的命令来处理掉这些编译过程的目标档案以及配置文件:make mrproper
这个命令会将你以前进行过的核心功能选择档案也删除,所以几乎只有第一次执行核心编译前才进行这个动作,其余的时刻,你想要删除前一次编译过程的残留数据, 叧要下达:make clean
2.3 开始挑选核心功能:make XXconfig
/boot/ 底下存在一个名为config-xxx 的档案。那个档案其实就是核心功能列表文件。我们底下要进行的操作,其实就是做出该档案。而我们后续所要进行的编译操作,其实也就是透过这个档案来处理的。核心功能的挑选,最后会在 /usr/src/kernels/linux-X.X.XX.X/底下产生一个名为.config的隐藏文件, 这个文件就是 /boot/config-xxx 的档案。你可以透过非常多的方法来建立这个档案,常见的方法有:
- make menuconfig:最常使用的,是文本模式底下可以显示类似图形接口的方式,不需要启动X Window 就能够挑选核心功能选单
- make oldconfig:透过使用已存在的 ./.config档案内容,使用该档案内的设定值为默认值,将新版本核心内的新功能选项列出让用户选择,可以简化核心功能的挑选过程!对于作为升级核心源代码后的功能挑选来说,是非常好用的一个项目!
- make xconfig:透过以Qt为图形接口基础功能的图形化接口显示,需要具有X window的支持。例如KDE就是透过Qt来设计的X Window,因此你如果在KDE画面中,可以使用此一项目。
- make gconfig:透过以Gtk为图形接口基础功能的图形化接口显示,需要具有X window的支持。例如GNOME就是透过Gtk来设计的 X Window,因此你如果在GNOME画面中,可以使用此一项目。
- make config:最老的功能挑选方法,每个项目都以条列式一条一条的列出让你选择,如果设定错误只能够再次选择,不推荐使用。
2.4 核心功能的详细选项配置参考《鸟哥的linux私房菜》
3.内核的编译与安装
3.1 编译内核与内核模块
- 内核和内核模块需要先编译起来,你可以先使用make help去查阅一下所有可用编译参数, 就会知道有底下这些基本功能:
- make vmlinux #未经压缩的核心
- make modules #仅内核模块
- make bzImage #经压缩过的核心(预设)
- make all #进行上述的三个动作
- 基本上我们会进行的操作:
- make clean #先清除暂存档
- make bzImage #先编译核心
- make modules #再编译模块
3.2 实际安装模块
我们知道模块是放置到 /lib/modules/$(uname -r) 目录下的,如果同一个版本的模块被反复编译后来安装时,会产生冲突。解决办法:
- 先将旧的模块目录更名,然后才安装核心模块到目标目录去
- 在make menuconfig时,那个General setup内的Local version修改成新的名称
安装模块到正确的目标目录:make modules_install
,最终会在/lib/modules底下建立起你这个核心的相关模块。
3.3 开始安装新核心和多重核心选单 (grub)
- 移动核心到/boot并保留旧核心档案
cp /usr/src/kernels/linux-X.X.XX.X/arch/x86/boot/bzImage /boot/vmlinuz-X.X.XX.XXXX
#实际内核cp /usr/src/kernels/linux-X.X.XX.X/.config /boot/config-X.X.XX.XXXX
#备份配置文件
- 建立相对应的 Initial Ram Disk (initrd):
mkinitrd -v /boot/initrd-X.X.XX.XXXX.img X.X.XX.XXXX
- 编辑开机选单 (grub):编辑/boot/grub/menu.lst(具体配置参考)
总结:内核编译的步骤和内核的删除
- 内核编译的步骤:
- 先下载内核源代码(例如SPRM)
- 以下以Tarball来处理,解开原始码到/usr/src/kernels目录下
- 先进行旧数据删除:make mrproper
- 开始挑选核心功能,可以利用
make menuconfig
、make oldconfig
、make gconfig
等等 - 清除过去的中间暂存盘资料:
make clean
- 开始内核文件和内核模块的编译:
make bzImage
、make modules
- 开始内核模块的安装:
make modules_install
- 开始内核文件的安装,可以使用的方式有:
make install
或者是透过手动的方式复制核心档案到/boot/grub当中 - 建立initrd档案;
- 修改/boot/grub/menu.lst档案
- 内核的删除:
- 首先,可以将源代码删除:rm -rf /usr/src/kernels/linux-X.X.XX
- 然后,删除掉内核模块的目录: rm -rf /lib/modules/X.X.XX
- 最后删除掉/boot/内的内核档案和initrd档案,以及/boot/grub/menu.lst内的title训定即可。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。