Linux下编译内核
内核编译:
编译内核就是把内核的相关文件重新生成。
内核编译前期准备:
Linux kernel下载网址:https://www.kernel.org/下载需要编译的内核版本。
在虚拟机中安装开发工具包组:Development Tools,可以使用yum grouplist 查找。
[root@centos7 cd]# yum -y groupinstall –disablerepo=mage "Development Tools"
在虚拟机中安装ncurses包。
[root@centos7 cd]# yum -y install –disablerepo=mage ncurses*
编译内核虚拟机环境:centos 7。
编译之前确认本机硬件信息 (普通编译、交叉编译)。
Linux内核设计体系:
Linux内核采用单内核体系设计、但充分借鉴了微内核设计体系的优点,为内核引入模块化机制。
Linux内核组成部分:
kernel:内核的核心文件,通常放置在/boot目录下,名称为vmlinuz-VERSION-RELEASE;
示例:
[root@centos6 ~]# ls /boot
config-2.6.32-642.el6.x86_64 grub lost+found System.map-2.6.32-642.el6.x86_64
efi initramfs-2.6.32-642.el6.x86_64.img symvers-2.6.32-642.el6.x86_64.gz
vmlinuz-2.6.32-642.el6.x86_64
[root@centos6 ~]#
kernel object:内核对象,一般放置在/lib/modules/version-release/目录下,大部分为以.ko结尾的驱动模块文件。
查看内核版本:
uname命令:
uname – print system information
uname [OPTION]…
-n:显示主机名称;
-r:显示版本信息;
-a:显示所有信息;
示例:
[root@centos6 Desktop]# uname -r
2.6.32-642.el6.x86_64
[root@centos6 Desktop]#
内核模块命令:
lsmod命令:
显示由核心已经装载的内核模块;显示的内容来自于/proc/modules文件。
示例:
[root@centos6 Desktop]# lsmod | grep "ext4"
ext4 379655 3
jbd2 93252 1 ext4
mbcache 8193 1 ext4
[root@centos6 Desktop]#
modinfo命令:
显示模块的详细描述信息;
modinfo [ -0 ] [ -F field ] [ -k kernel ] [ modulename|filename… ]
-n:显示模块文件路径;
-p:显示模块参数;
-a:显示作者信息;
-d:显示驱动文件描述信息;
-l:查看许可证;
示例:
[root@centos6 Desktop]# modinfo -n e1000
/lib/modules/2.6.32-642.el6.x86_64/kernel/drivers/net/e1000/e1000.ko
[root@centos6 Desktop]#
内核模块管理:
modprobe命令:
装载或卸载内核模块;
选项:
-l:列出所有装载的内核模块;
-r:下载内核模块; 或 rmmod命令
示例:
[root@centos6 Desktop]# modprobe -r e1000
[root@centos6 Desktop]# lsmod | grep e1000
[root@centos6 Desktop]# modprobe e1000
[root@centos6 Desktop]# lsmod | grep e1000
e1000 134863 0
[root@centos6 Desktop]#
depmod命令:
内核模块依赖关系文件及系统信息映射文件的生成工具,不要随便执行。
insmod命令:指定模块文件,不自动解决依赖模块,需手动解决依赖关系。
insmod `modinfo -n exportfs`
insmod `modinfo -n xfs`
rmmod命令:
rmmod [modulename]
示例:卸载xfs模块驱动
rmmod xfs
/proc目录:
内核把自己内部状态信息及统计信息,以及可配置参数通过proc伪文件系统加以输出。
参数:只读:输出信息
可写:可接受用户指定的新值来实现对内核某功能或特性的配置。
sysctl命令:用于查看或修改修改/proc/sys目录中的诸多参数。修改的参数临时生效。
选项:
-a:查看所有参数;
-w:临时设置某一参数;
-p:重新读取/etc/stsctl.conf配置文件,使其参数更改生效。
内核中的路由转发:
/proc/sys/net/ipv4/ip_forward
常用的几个参数:
net.ipv4.ip_forward 开启/禁用路由转发
net.ipv4.icmp_echo_ignore_all 开启/禁用ping命令
vm.drop_caches=3 清理内存cache。
kernel.shmall 默认16G,有时需要调大,充分发挥机器硬件性能。
示例:设置临时开启路由转发功能。等同于 echo命令设置。
1)[root@centos6 Desktop]# sysctl -w net.ipv4.ip_forward=1
net.ipv4.ip_forward = 1
[root@centos6 Desktop]#
2)echo命令:设置临时关闭路由转发功能。
[root@centos6 Desktop]# echo "0" > /proc/sys/net/ipv4/ip_forward
[root@centos6 Desktop]# cat /proc/sys/net/ipv4/ip_forward
0
[root@centos6 Desktop]#
/sys目录:
sysfs:为用户使用的伪文件系统,输出内核识别出的各硬件设备的相关属性信息,也有内核对硬件特性的设定信息,有些参数是可以修改的,用于调整硬件工作特性。
udev通过此路径下输出的信息动态为各设备创建所需要设备文件,udev是运行用户空间程序。
专用工具:udevadmin hotplug
udev为设备创建设备文件时,会读取其事先定义好的规则文件,一般在/etc/udev/rules.d及/usr/lib/udev/rules.d目录。
ramdisk管理:
mkinitrd命令:
为当前正在使用的内核重新制作ramdisk文件;需在急救模式下操作。
mkinitrd initramfs-`uname -r `.img `uname -r`
dracut命令:
为当前正在使用的内核重新制作ramfs文件;需在急救模式下操作。
dracut initramfs-`uname -r `.img `uname -r`
编译内核:
(1)准备好开发环境。
(2)获取目标主机上硬件设备的相关信息。
(3)获取目标主机系统功能的相关信息。
(4)获取内核源代码包。https://www.kernel.org/
开发环境准备:
包组:
1、Development Tools 开发工具包。
2、在虚拟机中安装make menuconfig依赖的ncurses包。
ncurses-5.9-13.20130511.el7.x86_64
目标主机硬件设备相关信息:
CPU:
#cat /proc/cpuinfo 查看CPU信息
# lscpu 查看CPU信息
#arch 查看架构
硬件设备:
pci设备:
lspci -v
lsusb -v
lsblk 块设备
内核编译安装:
安装开发包组;
下载源码文件;
.config:准备文本配置文件;
make menuconfig:配置内核选项;
make [-j #] :编译内核 ,使用#个CPU并发编译;
make modules_install:安装驱动模块至/lib/modules/目录下。
make install :安装内核相关文件。
(1)安装内核文件到本机/boot目录下。
(2)生成initramfs伪根文件系统。
(3)编辑/boot/grub2/grub.cfg配置文件
编译内核:
配置内核选项:
支持“更新”模式进行配置:make help
1)make config:基于命令行以遍历的方式去配置内核中可以配置的每个选项;
2)make menuconfig:基于ncurses的文本窗口界面;
3)make gconfig:基于GTK(GNOME)环境窗口界面;
4)make xconfig:基于QT(KDE)环境的窗口界面;
支持“全新配置”模式进行配置
1)make defconfig:基于内核为目标平台提供的“默认”配置进行配置;
2)make allyesconfig:所有选项均回答为“yes”;
3)make allnoconfig:所有的选项均回答为“no”;
内核编译:
全编译:make [-j #]
编译内核的一部分功能:
1)只编译某目录中的相关代码:
示例:编译打开内核对ntfs文件系统功能以模块化方式支持,同时支持写权限。
[root@centos7 ~]# cd /usr/src/linux
[root@centos7 linux]# make fs/ntfs/ntfs.ko (其中文件名需要自己写,事先不存在)
2)只编译一个特定的模块:
示例:只编译e1000驱动模块;
[root@centos7 ~]# cd /usr/src/linux
[root@centos7 linux]# make drivers/net/ethernet/intel/e1000/e1000.ko
如何交叉编译:
编译的目标平台与当前平台不相同;
#make ARCH=arch_name
例如:
#make ARCH=arm
要获取特定目标平台的使用帮助;
#make ARCH=arch_name help
例如:
#make ARCH=arm help
在已经执行过编译操作的内核源代码中做重新编译,需要事先做清理操作:
make clean:清理大多数编译生成的文件,但会保留config文件等。
make mrproper:清理所有编译生成的文件,config及某些备份文件。
make distclean:清理所有编译生成的文件基本清理到编译前的状态。
开始编译内核:
内核编译前期准备:
Linux kernel下载网址:https://www.kernel.org/下载需要编译的内核版本。
在虚拟机中安装开发工具包组:Development Tools,可以使用yum grouplist 查找。
[root@centos7 cd]# yum -y groupinstall –disablerepo=mage "Development Tools"
在虚拟机中安装make menuconfig依赖的ncurses包。
[root@centos7 cd]# yum -y install –disablerepo=mage ncurses*
编译内核虚拟机环境:centos 7。
编译之前确认本机硬件信息 (普通编译、交叉编译)。
1)将下载好的kernel文件copy到root目录下。
[root@centos7 ~]# ll -h linux-3.18.42.tar.xz
-rwxrw-rw-. 1 root root 78M sep 20 21:50 linux-3.18.42.tar.xz
[root@centos7 ~]#
2)在虚拟机中安装开发工具包组:Development Tools,可以使用yum grouplist 查找。
[root@centos7 cd]# yum -y groupinstall –disablerepo=mage "Development Tools"
3)解压linux-3.18.42.tar.xz内核包到/usr/src目录下。
[root@centos7 ~]# tar xvf linux-3.18.42.tar.xz -C /usr/src
4)cd到/usr/src目录下,为linux-3.18.42创建软链接。
[root@centos7 ~]# cd /usr/src/
[root@centos7 src]# ln -s linux-3.18.42/ linux
[root@centos7 src]# ll
total 4
drwxr-xr-x. 2 root root 6 jun 9 2014 debug
drwxr-xr-x. 3 root root 34 sep 20 22:12 kernels
lrwxrwxrwx. 1 root root 14 sep 20 23:16 linux -> linux-3.18.42/
drwxrwxr-x. 23 root root 4096 sep 17 18:55 linux-3.18.42
查看解压缩后的内核文件大小。
[root@centos7 src]# cd linux
[root@centos7 linux]# du -sh .
633M .
[root@centos7 linux]#
5)拷贝本机/boot/config-3.10.0-229.el7.x86_64内核编译模板文件到/usr/src/linux/.config
编译内核时默认会对这个.config文件。
[root@centos7 linux]# cp -rf /boot/config-3.10.0-229.el7.x86_64 /usr/src/linux/.config
[root@centos7 linux]# wc -l .config
5310 .config
[root@centos7 linux]#
6)在/usr/src/linux/目录下执行make menuconfig对.config文件进行更改操作。
1)make menuconfig 是依赖于ncurses包的,如果没有安装需要进行安装。
[root@centos7 linux]# yum -y install –disablerepo=mage ncurses*
2)在/usr/src/linux/目录下执行make menuconfig对.config文件进行更改操作。
[root@centos7 linux]# make menuconfig
general setup 配置:补充kernel version后的version info
关闭蓝牙
打开内核对ntfs文件系统功能以模块化方式支持,同时支持写权限。
执行exit到首页,再次执行exit退出,并选择yes保存操作更改。
现在在看一下/usr/src/linux/.config文件的大小。
root@centos7 linux]# du -sh .
634M .
[root@centos7 linux]#
这时我们发现比更改前多了1M。
7)使用make命令开始对内核编译。
make -j # 指定本机编译内核CPU的个数,并行编译。
查看本机CPU个数:
[root@centos7 linux]# lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 4
On-line CPU(s) list: 0-3
Thread(s) per core: 1
……………………….
[root@centos7 linux]#
开始编译内核:Need to wait for a period of time
[root@centos7 linux]# make -j 4
查看编译后的/usr/src/linux目录大小:
[root@centos7 linux]# du -sh .
7,0G .
[root@centos7 linux]#
查看是否编译生成了ntfs.ko文件
[root@centos7 linux-3.18.42]# find -name "*.ko" | grep "ntfs"
./fs/ntfs/ntfs.ko
[root@centos7 linux-3.18.42]#
8)安装模块至 /lib/modules目录下。
[root@centos7 linux]# make modules_install
9)安装内核相关文件。
(1)安装内核文件到本机/boot目录下。
(2)生成initramfs伪根文件系统。
(3)编辑/boot/grub2/grub.cfg配置文件
[root@centos7 linux]# make install (一条命令,以上三步全部搞定)
sh ./arch/x86/boot/install.sh 3.18.42-zhengyibolinux arch/x86/boot/bzImage \
System.map "/boot"
[root@centos7 linux]#
到/boot目录下查看发现已经多了一个内核文件。
到/boot/grub2/grub.cfg文件中查看发现已经多了一个新内核信息。
10)重启 reboot,使用新内核启动。
原创文章,作者:zhengyibo,如若转载,请注明出处:http://www.178linux.com/48371