Linux Kernel

===============================================================================

概述:

  • 文章将主要介绍Linux 内核的相关信息,包括内核各组成部分的详细介绍,其中有内核信息的获取命令,uname;内核模块管理类命令:lsmod,modinfo,modprobe,insomd,rmmod;ramdisk生成的相关命令,mkinitrd和dracut命令;以及linux中的两个为文件系统 /proc和/sys。最后是内核的简单编译。

===============================================================================

ldd 命令

功能:

  • 打印二进制应用程序所依赖的库文件

用法:

  • ldd [OPTION]... FILE...(二进制文件)

演示:

 1.查看/bin/ls所依赖的库文件

[root@centos7 ~]# ldd /bin/ls
	linux-vdso.so.1 =>  (0x00007fffc03c0000)
	libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f4caf3ce000)
	libcap.so.2 => /lib64/libcap.so.2 (0x00007f4caf1c9000)
	libacl.so.1 => /lib64/libacl.so.1 (0x00007f4caefbf000)
	libc.so.6 => /lib64/libc.so.6 (0x00007f4caebfe000)
	libpcre.so.1 => /lib64/libpcre.so.1 (0x00007f4cae99d000)
	liblzma.so.5 => /lib64/liblzma.so.5 (0x00007f4cae777000)
	libdl.so.2 => /lib64/libdl.so.2 (0x00007f4cae573000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f4caf60a000)
	libattr.so.1 => /lib64/libattr.so.1 (0x00007f4cae36e000)
	libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f4cae151000)

 2.取库文件的路径,如下:

[root@centos7 ~]# ldd /bin/ls |grep -o "/lib64[^[:space:]]*"
/lib64/libselinux.so.1
/lib64/libcap.so.2
/lib64/libacl.so.1
/lib64/libc.so.6
/lib64/libpcre.so.1
/lib64/liblzma.so.5
/lib64/libdl.so.2
/lib64/ld-linux-x86-64.so.2
/lib64/libattr.so.1
/lib64/libpthread.so.0

Linux Kernel

内核设计体系:单内核,微内核

  • Linux 为单内核设计,但充分借鉴了微内核体系设计的优点;为内核引入了模块化机制(高度模块化);

内核的组成部分:

 kernel

  • 内核核心,一般为bzp_w_picpath,通常位于/boot目录,名称为 vmlinuz-VERSION-release

kernel object:

  • 内核对象,即内核模块,一般放置于 /lib/modules/VERSION-release

内核编译的三种选择

  • [ ]:N,不编译此功能

  • [M]:Module ,编译成内核模块,用到时再装载

  • [*]:Y,编译进内核核心,即所有人都用的功能才会编辑进去

内核模块支持动态装载和卸载

注意:

  • 内核模块与内核核心版本一定要严格匹配

ramdisk

  • 辅助性文件,并非必须,这取决于内核是否能直接驱动rootfs所在的设备

ramdisk 可以加载的内容如下:

  • 目标设备驱动:例如SCSI设备的驱动;

  • 逻辑设备驱动:例如LVM设备的驱动;

  • 文件系统驱动:例如xfs文件系统;

  • ramdisk是一个简装版的根文件系统,之后要进行根切换,挂载真正的根文件系统。    


演示:

[root@centos7 ~]# ls /lib/modules/3.10.0-327.el7.x86_64/
build   modules.alias      modules.builtin      modules.dep.bin  modules.modesetting  modules.softdep      source   weak-updates
extra   modules.alias.bin  modules.builtin.bin  modules.devname  modules.networking   modules.symbols      updates
kernel  modules.block      modules.dep          modules.drm      modules.order        modules.symbols.bin  vdso
[root@centos7 ~]# uname -r  # 内核模块与核心版本要完全匹配
3.10.0-327.el7.x86_64

 1.uname(内核信息获取)

语法

  • uname [OPTION]...

选项:

  • -r:内核的release号;

  • -n:主机名;

  • -a:显示所有信息;

文件:

  • /boot/vmlinuz-VERSION-release

演示:

[root@CentOS6 ~]# uname -n  # 显示主机名,同hostname
CentOS6.localdomain

[root@CentOS6 ~]# hostname
CentOS6.localdomain

[root@CentOS6 ~]# uname -r  # 显示内核的release号
2.6.32-642.el6.x86_64

[root@CentOS6 ~]# uname -v  # 显示编译的版本号
#1 SMP Tue May 10 17:27:01 UTC 2016

[root@CentOS6 ~]# uname -a  # 显示所有的信息 
Linux CentOS6.localdomain 2.6.32-642.el6.x86_64 #1 SMP Tue May 10 17:27:01 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

内核模块管理相关命令

 1.lsmod 

lsmod:

功能:

  • 查看当前内核已经装载的模块

显示的内核来自于 /proc/modules

查找指定的模块:

  • lsmod |grep MOD_NAME

演示:

# 查看系统已经装载的模块
[root@centos7 ~]# lsmod
Module                  Size  Used by
dm_mirror              22135  0 
dm_region_hash         20862  1 dm_mirror
dm_log                 18411  2 dm_region_hash,dm_mirror
dm_mod                113292  2 dm_log,dm_mirror
snd_seq_midi           13565  0 
snd_seq_midi_event     14899  1 snd_seq_midi
coretemp               13435  0 
crc32_pclmul           13113  0 
snd_ens1371            25243  1 
ghash_clmulni_intel    13259  0 
snd_rawmidi            30871  2 snd_ens1371,snd_seq_midi
snd_ac97_codec        130605  1 snd_ens1371
ppdev                  17671  0 
ac97_bus               12730  1 snd_ac97_codec
pcspkr                 12718  0 
snd_seq                66691  2 snd_seq_midi_event,snd_seq_midi
snd_seq_device         14356  3 snd_seq,snd_rawmidi,snd_seq_midi
vmw_balloon            13415  0 
snd_pcm               105835  2 snd_ac97_codec,snd_ens1371
cryptd                 20359  1 ghash_clmulni_intel
snd_timer              29639  2 snd_pcm,snd_seq
snd                    83425  9 snd_ac97_codec,snd_timer,snd_pcm,snd_seq,snd_rawmidi,snd_ens1371,snd_seq_device
soundcore              15047  1 snd
shpchp                 37032  0 
sg                     40721  0 
vmw_vmci               67106  0 
i2c_piix4              22106  0 
parport_pc             28165  0 
parport                42348  2 ppdev,parport_pc
nfsd                  302418  1 
auth_rpcgss            59343  1 nfsd
nfs_acl                12837  1 nfsd
serio_raw              13462  0 
vmwgfx                176029  1 
drm_kms_helper        125008  1 vmwgfx
ttm                    93441  1 vmwgfx
mptspi                 22542  4 
ata_piix               35038  0 
scsi_transport_spi     30732  1 mptspi
drm                   349210  4 ttm,drm_kms_helper,vmwgfx
e1000                 149323  0 
libata                218730  3 pata_acpi,ata_generic,ata_piix
mptscsih               40150  1 mptspi
i2c_core               40582  3 drm,i2c_piix4,drm_kms_helper
mptbase               105960  2 mptspi,mptscsih

 2.modinfo

modinfo:

功能:

  • 显示模块的详细描述信息

语法:

  • modinfo [ -k kernel ] [ modulename|filename... ]

选项:

  • -n:只显示模块文件路径;

  • -p:显示模块参数;

  • -F:仅显示指定字段的信息;

  • -a:author;

  • -d:description;

  • -l:license;

演示:

[root@centos7 ~]# modinfo ext4
filename:       /lib/modules/3.10.0-327.el7.x86_64/kernel/fs/ext4/ext4.ko
license:        GPL
description:    Fourth Extended Filesystem
author:         Remy Card, Stephen Tweedie, Andrew Morton, Andreas Dilger, Theodore Ts'o and others
alias:          fs-ext4
alias:          ext3
alias:          fs-ext3
alias:          ext2
alias:          fs-ext2
rhelversion:    7.2
srcversion:     DB48BDADD011DE28724EB21
depends:        mbcache,jbd2   # 表示被此模块所依赖的其他模块
intree:         Y
vermagic:       3.10.0-327.el7.x86_64 SMP mod_unload modversions 
signer:         CentOS Linux kernel signing key
sig_key:        79:AD:88:6A:11:3C:A0:22:35:26:33:6C:0F:82:5B:8A:94:29:6A:B3
sig_hashalgo:   sha256

 3.modprobe和depmod

modprobe:

功能:

  • 模块的装载与卸载

语法:

  • modprobe [-r] module_name...

装载模块:

  • modprobe module_name... (会自动解决模块间的依赖关系)

卸载模块:

  • modprobe -r  module_name...

depmod:

  • 内核模块依赖关系文件及系统信息映射文件的生成工具

演示:

[root@CentOS6 ~]# lsmod |grep btrfs  # 查找指定的模块
[root@CentOS6 ~]# modprobe btrfs     # 装载模块
[root@CentOS6 ~]# lsmod |grep btrfs
btrfs                 786956  0 
zlib_deflate           21629  1 btrfs
lzo_decompress          2343  1 btrfs
lzo_compress            2368  1 btrfs
libcrc32c               1246  1 btrfs
[root@CentOS6 ~]# modprobe -r btrfs  # 卸载模块
[root@CentOS6 ~]# lsmod |grep btrfs

 4.模块装载和卸载的另一组命令(insmod、rmmod)

insmod:装载模块

语法:

  • insmod[ filename ] [ module options... ] (这里不会自动解决模块间的依赖关系)

  • filename:为模块文件的文件路径;

rmmod:装载模块

语法:

  • rmmod [ modulename]   直接指明模块名称卸载就可以。

演示:

[root@centos7 ~]# lsmod |grep btrfs
[root@centos7 ~]# insmod btrfs # 不能直接装载,需要指明模块的文件路径
insmod: ERROR: could not load module btrfs: No such file or directory
[root@centos7 ~]# modinfo -n btrfs  
/lib/modules/3.10.0-327.el7.x86_64/kernel/fs/btrfs/btrfs.ko
[root@centos7 ~]# insmod `modinfo -n btrfs`
insmod: ERROR: could not insert module /lib/modules/3.10.0-327.el7.x86_64/kernel/fs/btrfs/btrfs.ko: Unknown symbol in module   # 有依赖关系,不能安装

ramdisk文件管理

ramdisk

  • ramdisk--> ramfs 提高速度(完成对真正根文件系统的驱动加载)

CentOS 5:

  • initrd,

  • 工具程序:mkinitrd

CentOS 6:

  • initramfs,

  • 工具程序:mkinitrd,dracut

为当前正在使用的内核重新制作ramdisk

mkinitrd 命令:

  • mkinitrd /boot/initramfs-$(uname-r).img $(uname-r)

选项:

  • --with=<module>:除了默认的模块之外需要装载至initramfs中的模块;

  • --preload=<module>:initramfs所提供的模块需要预先装载的模块;

dracut

  • dracut /boot/initramfs-$(uname-r).img $(uname-r)

注意:

  • dracut 命令较为底层,建议使用mkinitrd。

Linux Kernel_shared

演示:

1.mkinitrd 命令

[root@centos7 ~]# mv /boot/initramfs-3.10.0-327.el7.x86_64.img /tmp  # 移除
[root@centos7 ~]# mkinitrd /boot/initramfs-$(uname -r).img $(uname -r)  #创建
[root@centos7 ~]# ls /boot
config-3.10.0-327.el7.x86_64                             initramfs-3.10.0-327.el7.x86_64.img  vmlinuz-0-rescue-2044869cb7454de39dc9ec0daa7a8588
grub                                                     initrd-plymouth.img                  vmlinuz-3.10.0-327.el7.x86_64
grub2                                                    symvers-3.10.0-327.el7.x86_64.gz
initramfs-0-rescue-2044869cb7454de39dc9ec0daa7a8588.img  System.map-3.10.0-327.el7.x86_64
[root@centos7 ~]#

2.dracut命令

[root@centos7 ~]# rm -f /boot/initramfs-3.10.0-327.el7.x86_64.img 
[root@centos7 ~]# dracut /boot/initramfs-$(uname -r).img $(uname -r)
[root@centos7 ~]# ls /boot
config-3.10.0-327.el7.x86_64
grub
grub2
initramfs-0-rescue-2044869cb7454de39dc9ec0daa7a8588.img
initramfs-3.10.0-327.el7.x86_64.img
initrd-plymouth.img
symvers-3.10.0-327.el7.x86_64.gz
System.map-3.10.0-327.el7.x86_64
vmlinuz-0-rescue-2044869cb7454de39dc9ec0daa7a8588
vmlinuz-3.10.0-327.el7.x86_64

内核信息输出的伪文件系统:/proc,/sys

 1./proc目录             

/proc作用及参数:

  • 内核状态和统计信息的输出接口;同时还提供一个配置接口,/proc/sys

参数:

  • 只读:信息输出。例如:/proc/#/*  只是用来输出某进程的相关信息;

  • 可写:可接受用户指定一个“新值”来实现对内核某功能或特性的配置;/proc/sys

/proc/sys 参数和文件系统是有映射关系的

  • 例如:net/ipv4/ip_forwad 相当于 net.ipv4.ip_forward

伪文件系统的的特点及修改其值的方法:

特点:

  • 不能够直接使用编辑器编辑;但是可以通过以下方式修改:

修改其值得方式:

文件系统命令(cat,echo

  • 查看:cat /proc/sys/PATH/TO/SOMR_KERNEL_FILE

  • 设定:echo "NEW_Value" > /proc/sys/path/to/somefile

sysctl命令:专用于查看或设定/proc/sys目录下参数的值;

  • 语法:sysctl [options] [variable[=value]]

  • 查看:# sysctl -a (查看所有) # sysctl variable(查看指定值)

  • 修改其值:# sysctl -w variable=value  

以上两种方式的设定仅当前运行内核有效,要想永久生效,就要写入到配置文件当中。

内核参数配置文件:

  • /etc/sysctl.conf ,/etc/sysctl.d/*.conf 

注意:

  • 此种设定不能立即生效,但重启系统后一直有效,为了不重启系统而生效的方式:# sysctl -p

内核参数:

  • net.ipv4.ip_forward:核心转发功能

  • vm.drop_caches:缓存

  • kernel.hostname:主机名

  • net.ipv4.icmp_echo_ignore_all:忽略所有发往本主机的ping操作             

演示:

 1.修改及查看其值的方法:

[root@centos7 ~]# sysctl net.ipv4.ip_forward  
net.ipv4.ip_forward = 0
[root@centos7 ~]# sysctl -w net.ipv4.ip_forward=1  # 修改其值
net.ipv4.ip_forward = 1

[root@centos7 ~]# uname -n
centos7

# sysctl 修改其值,注意参数和文件系统的映射关系,这里是简装形式
[root@centos7 ~]# sysctl -w kernel.hostname=taotao 
kernel.hostname = taotao     

# 查看其值
[root@centos7 ~]# uname -n
taotao
[root@centos7 ~]# cat /proc/sys/kernel/hostname 
taotao

# echo 命令修改主机名
[root@centos7 ~]# echo "centos7" > /proc/sys/kernel/hostname 
[root@centos7 ~]# uname -n
centos7

 2.修改配置文件:

[root@centos7 ~]# vim /etc/sysctl.conf  # 修改配置文件 
  1 # System default settings live in /usr/lib/sysctl.d/00-system.conf.
  2 # To override those settings, enter new settings here, or in an /etc/sysctl.d/<name>.conf file
  3 #
  4 # For more information, see sysctl.conf(5) and sysctl.d(5).
  5 net.ipv4.ip_forward = 1  # 添加一行
  
[root@centos7 ~]# cat /proc/sys/net/ipv4/ip_forward  # 查看其值发现并没有改变
0
[root@centos7 ~]# sysctl -p # 不用重启,直接生效
net.ipv4.ip_forward = 1
[root@centos7 ~]# cat /proc/sys/net/ipv4/ip_forward
1

3.内核参数:

[root@centos7 ~]# cat /proc/sys/net/ipv4/icmp_echo_ignore_all
0
[root@centos7 ~]# echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
[root@centos7 ~]# cat /proc/sys/net/ipv4/icmp_echo_ignore_all
1

 2./sys目录:

sysfs:

  • 输出内核识别出的个硬件设备的相关属性信息,也有内核对硬件的可设置参数;对这些参数的修改,即可定制硬件设备工作特性;

udev:

  • 通过读取/sys目录下的硬件设备信息按需为各硬件设备创建设备文件;udev是用户空间程序;专用工具:devadmin,jostplug;

  • udev 为设备创建文件时,会读取其事先定义好的规则文件,一般在 /etc/udev/rules.d/ 目录下;

       如修改网卡名对应的规则文件为:/etc/udev/rules.d/70-persistent-net.rules

演示:

[root@centos7 ~]# ls /sys
block  bus  class  dev  devices  firmware  fs  hypervisor  kernel  module  power
[root@CentOS6 ~]# vim /etc/udev/rules.d/70-persistent-net.rules 
  
  1 # This file was automatically generated by the /lib/udev/write_net_rules
  2 # program, run by the persistent-net-generator.rules rules file.
  3 #
  4 # You can modify it, as long as you keep each rule on a single
  5 # line, and change only the value of the NAME= key.
  6 
  7 # PCI device 0x8086:0x100f (e1000)
  8 SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0c:29:e4:5e:4d", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"
  9 
 10 # PCI device 0x8086:0x100f (e1000)
 11 SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0c:29:e4:5e:57", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1"



内核编译



 1.程序包的编译安装:

步骤:

  • ./configure

  • make;

  • make install

前提:

  • 开发环境(开发环境,开发库),头文件:usr/include

开源:源代码-->可执行格式

发行版:以“通用”的目标

 2.内核编译:

前提:

1)准备好开发环境;

2)获取目标主机上硬件设备的相关信息;

3)获取到目标主机系统功能的相关信息,例如,要启用的文件系统

4)获取内核源码包:www.kernel.org

准备开发环境:

CentOS 6,7:包组:

  • Development Tools

  • Server Platform Development

目标主机硬件相关信息:

CPU:# cat /proc/cpuinfo

  • # x86info -a

  • # lscpu

PCI:# lspci -v,-vv

  • # lsusb -v,-vv

  • # lsblk 块设备

了解全部硬件设备信息

  • # hal-device

 3.编译步骤:

  • tar xf linux-3.10.67.tar.xz -C /usr/src

  • cd /usr/src

  • ln -sv linux-3.10.67 linux

  • cd /usr/src/linux

  • cp /boot/config-$(uname -r) ./.config

  • make help

  • make menuconfig 配置内核选项

  • make [-j 2] 编译内核,可使用-j指定编译线程数量

  • make modules_install 安装内核模块

  • make install  安装内核核心

  • reboot 重启系统,选择使用新内核

演示过程如下:

 1.获取源码包(www.kernel.org),选择要编译的版本,为了保障能够成功编译,建议不要使用跨版本太大的源码包;
Linux Kernel_二进制_02


2.准备开发环境(相关开发工具包),以及查看自己的主机硬件相关信息是否可以符合;

3.解压到 /usr/src 目录下;

  • tar xf linux-3.10.67.tar.xz -C /usr/src

[root@centos7 ~]# ls
2016-09-11-16-52-39  bin      Documents  f1          httpd-2.2.29          linux-3.18.41.tar.xz # 获取的源码包  Music     Public     Templates
anaconda-ks.cfg      Desktop  Downloads  hanshu3.sh  httpd-2.2.29.tar.bz2  mbox                  Pictures  select.sh  Videos
[root@centos7 ~]# tar xvf linux-3.18.41.tar.xz -C /usr/src  # 解压到/usr/src目录下
[root@centos7 ~]# ls /usr/src
debug  kernels  linux-3.18.41 # 解压的源码包

4.进到/usr/src目录中,并创建一个软链接;

[root@centos7 ~]# cd /usr/src
[root@centos7 src]# ls
debug  kernels  linux-3.18.41
[root@centos7 src]# ln -s linux-3.18.41/ linux   # 创建软链接
[root@centos7 src]# ls
debug  kernels  linux  linux-3.18.41
[root@centos7 src]# cd linux # 进到目录中去
[root@centos7 linux]# ls
arch   COPYING  crypto         drivers   fs       init  Kbuild   kernel  MAINTAINERS  mm   README          samples  security  tools  virt
block  CREDITS  Documentation  firmware  include  ipc   Kconfig  lib     Makefile     net  REPORTING-BUGS  scripts  sound     usr
[root@centos7 linux]# du -sh . # 查看大小
631M	.

5.复制/boot下的以config开头的文件作为模板文件到/usr/src/linux/.config ;

  • # cp /boot/config-3.10.0-327.el7.x86_64 /usr/src/linux/.config

[root@centos7 linux]# cp /boot/config-3.10.0-327.el7.x86_64 /usr/src/linux/.config #复制模板文件
[root@centos7 linux]# ls -a
.   arch   .config(# 复制的模板文件)  CREDITS  Documentation  firmware  .gitignore  init  Kbuild   kernel  .mailmap     Makefile  net     REPORTING-BUGS  scripts   sound  usr
..  block  COPYING  crypto   drivers        fs        include     ipc   Kconfig  lib     MAINTAINERS  mm        README  samples         security  tools  virt

6.在/usr/src/linux 中使用 # make menuconfig 配置内核选项,选好之后保存退出;

Linux Kernel_library_03


7.打开screen界面,执行 # make [-j 4] 编译内核,可使用-j指定编译线程数量;

Linux Kernel_内核编译_04

 这时可以使用 # htop 查看一下cpu的使用情况,如下所示:cpu占用率急剧升高,负载也变得好大;

Linux Kernel_ldd_05

 

8.编译完成之后,接下来需要执行 # make modules_install 安装内核模块;

[root@centos7 src]# du -sh linux-3.18.41/
7.1G	linux-3.18.41/  # 可以看到编译完成之后,变成了7.1G

[root@centos7 linux]# ls /lib/modules
3.10.0-327.el7.x86_64  # 可以看到这时模块文件只有一个
[root@centos7 linux]# make modules_install # 安装内核模块
[root@centos7 linux]# ls /lib/modules       
3.10.0-327.el7.x86_64  3.18.41-1.0-Taolinux # 可以发现多了一个内核模块

[root@centos7 linux]# ls  /lib/modules/3.18.41-1.0-Taolinux/  # 编译完成,而已看到生成的内核模块文件
build              modules.builtin.bin  modules.softdep
kernel             modules.dep          modules.symbols
modules.alias      modules.dep.bin      modules.symbols.bin
modules.alias.bin  modules.devname      source
modules.builtin    modules.order

Linux Kernel_shared_06


9.执行 # make install 生成内核文件;

[root@centos7 linux]# make install
sh ./arch/x86/boot/install.sh 3.18.41-1.0-Taolinux arch/86/boot/bzlmage \ 
          System.map "/boot"

10.reboot 重启系统,选择使用新内核;

Linux Kernel_ldd_07  

启动之后,查看内核版本如下:

[root@centos7 ~]# uname -r
3.18.41-1.0-Taolinux  # 说明新版内核已经启动,编译成功!

 至此,一个全新的内核就已经编译完成了!!!


编译详细说明


 1.配置内核选项:

支持“更新”模式进行配置:在已有的.config文件的基础之上进行“修改”配置;

(a) make config:基于命令行以遍历的方式去配置内核中可配置的每个选项;

(b) make menuconfig:基于curses的文本窗口界面

(c) make gconfig:基于GTK (GNOME)环境窗口界面

(d) make xconfig:基于QT(KDE)环境的窗口界面

持“全新配置”模式进行配置

(a) make defconfig:基于内核为目标平台提供的“默认”配置进行配置

(b) make allyesconfig:所有选项均回答为“yes“

(c) make allnoconfig:所有选项均回答为"no”

 2.编译:

多线程编译:

  • make [-j #]

编译内核中的一部分代码:

只编译某子目录中的相关代码:

  • # cd /usr/src/linux

  • # make dir/

只编译一个特定的模块:

  • # cd /usr/src/linux

  • # make dir/file.ko

例如:只为e1000编译驱动

       # make drivers/net/ethernet/intel/e1000/e1000.ko

如何交叉编译内核:

编译的目标平台与当前平台不相同;

  • # make ARCH=arch_name

要获取特定目标平台的使用帮助

  • # make ARCH=arch help

 3.如何在执行过编译操作的内核元码树上做重新编译:

需要事先清理操作:

  • # make clean:清理大多数编译生成的文件,但会保留config文件等

  • # make mrproper:清理所有编译生成的文件、config及某些备份文件

  • # make distclean:mrproper、patches以及编辑器备份文件