内核编译原理详解:
单内核体系的设计,但充分的借鉴了微内核设计体系的优点,为内核引入模块化机制
内核的组成部分:
kernel : 内核核心,一般为 bzImage ,通常在 /boot 目录下,名称为 vmlinuz-VERSION-RELEASE;
kernel object : 内核对象,一般放置于 /lib/modules/VERSION-RELEASE/ 目录下
[] :N #没有选中
[M] : M #模块化,不放到内核里
[*] : Y #直接打到核心了
辅助文件 :
ramdisk
initrd
initramfs
uname 命令:
uname [options]...
-n :显示节点名称
-r :显示VERSION-RELEASE;
-a :显示所有信息
lsmod 命令:
显示由核心已经装载的内核模块
显示的内容来自于: /proc/modules 文件
modinfo 命令:
显示模块的详细描述信息
modinfo [-k kernel] [modulename | filename ...]
-n : 只显示模块文件路径
-p : 显示模块参数
-a : author
-d : description
-l : license
- lsmod|grep xfs
- modinfo xfs
modprobe 命令:装载或卸载内核模块
modprobe [ -C config-file ] [modulename] [module parame-ters...]
配置文件: /etc/modprobe.conf ; /etc/modprobe.d/*.conf
modprobe [-r] modulename 卸载内核
depmod 命令:
内核模块依赖关系文件及系统信息映射文件的生成工具
装载或卸载内核模块
insmod 命令: 指定模块文件,不自动解决依赖模块
- insmod [filename] [module options...]
-
- insmod `modinfo -n exportfs`
-
- insmod `modinfo -n xfs`
rmmod 命令 :卸载模块
- rmmod [modulename]
-
- rmmod xfs
/proc 目录:
内核把自己内部状态信息及统计信息,以及可配置参数通过proc伪文件系统加以输出
参数 : 只读 :输出信息
可写 : 可接受用户指定'新值'来实现对内核某功能或特性的配置
/proc/sys
(1) sysctl 命令用于查看或设定此目录中诸多参数
- sysctl -w path.to.parameter=VALUE
-
- sysctl -w kernel.hostname=nineven.com
(2) echo 命令通过重定向方式也可以修改大多参数的值
- echo "VALUE" > /proc/sys/path/to/parameter
-
- echo "websrv" > /proc/sys/kernel/hostname
sysctl 命令:
默认配置文件: /etc/sysctl.conf
(1) 设置某参数
sysctl -w parameter=VALUE
(2) 通过读取配置文件设置参数
sysctl -p [/path/to/conf_file]
内核中的路由转发:
/proc/sys/net/ipv4/ip_forward
常用的几个参数:
- net.ipv4.ip_forward
-
- net.ipv4.icmp_echo_ignore_all
vm.drop_caches #清空缓存
若果想永久生效,需要改配置文件
- /etc/systclt.conf #修改并保存配置文件
-
- systctl -p #重新读取配置文件,使之生效
/sys 目录:
sysfs : 为用户使用的伪文件系统,输出内核识别出的各硬件设备的相关属性信息,也有内核对硬件特性的设定信息,有些参数是可以修改的,用于调整硬件工作特性
udev : 通过此路径下输出的信息动态为各设备创建所需要设备文件,udev 是运行用户空间程序
专用工具 : udevadmin hotplug
udev 为设备创建设备文件时,会读取其事先定义好的规则文件,一般在 /etc/udev/rules.d 及 /usr/lib/udev/rules.d 目录下
ramdisk 文件的制作:
(1) mkinitrd 命令
为当前正在使用的内核重新制作 ramdisk 文件
mkinitrd /root/initramfs-`uname -r`.img `uname -r`
(2) dracut 命令
为当前正在使用的内核重新制作 ramdisk 文件
dracut /boot/initramfs-$(uname -r).img $(uname -r)
前提:
(1) : 准备好开发环境
(2) : 获取目标主机上硬件设备的相关信息
(3) : 获取目标主机系统功能的相关信息
例如 : 需要启用相应的文件系统
(4) : 获取内核源代码包
开发包组(CentOS 6):
Service Platform Development
Development Tools
目标主机硬件设备相关信息:
CPU :
- cat /proc/cpuinfo
-
- lscpu
PCI :
- lspci [-v|-vv]
-
- lsusb [-v|-vv]
-
- lsblk 块设备
了解全部硬件设备信息
hal-device
内核编译安装系统:
安装开发包组
下载源码
.config :准备文本配置文件
make menuconfig :配置内核选项
make [-j #]
make modules_install :安装模块
make install :安装内核相关文件
安装 bzImage 为 /boot/vmlinuz-VERSION-RELEASE
生成initramfs文件
编辑grub的配置文件
编译安装内核的实例:
- 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
-
- make modules_install
-
- make install
-
- reboot
若中途出现错误,一定要及时解决,否则可能导致编译失败
操作详解:
(1)配置内核选项
支持"更新"模式进行配置:make help
(a) make config : 基于命令行以遍历的方式去配置内核中可配置的每个选项
(b) make menuconfig : 基于cruse的文本窗口界面
(c) make gconfig : 基于GTK(GNOME)环境窗口界面
(d) make xconfig : 基于QT(KDE)环境的窗口界面
支持"全新配置"模式进行配置:
(a) make defconfig : 基于内核为目标平台提供的"默认"配置进行配置
(b) make allyesconfig : 所有选项均回答为"yes"
(c) make allnoconfig : 所有选项均回答为"no"
(2)编译
全编译: make [-j #] :#指cpu核心数
编译内核的一部分功能:
(a) 只编译某子目录中的相关代码:
cd /usr/src/linux
make dir/
(b) 只编译一个特定的模块
cd /usr/src/linux
make dir/file.ko
例如:只为e1000编译驱动
# drivers/net/ethernet/intel/e1000/e1000.ko
如何交叉编译内核:
编译的目标平台与当前平台不相同 : make ARCH=arch_name
获取特定目标平台的使用帮助:
make ARCH=arch_name help
make ARCH=arm help
如何重新编译内核:
在已经执行过的编译操作的内核源码重新编译需要事先执行清理操作
make clean : 清理大多数编译生成的文件,但会保留config文件等
make mrproper : 清理所有编译生成的文件,config及某些备份文件
make distclean : mrproper,patches以及编辑器备份文件
首先,先去官网下载一个内核,官网 The Linux Kernel Archives
我直接下载的是最新版的,下载链接如下
https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.7.3.tar.xz
(1)先安装开发包组 Development tools
参数自己可以修改,安装自己的需求,我新增了支持ntfs功能
存储空间还可以,至少预留10G的空间,因为编译会生成好多临时文件
报错了,解决
恩,正在编译中,发现cpu快要爆了
竟然消耗了8.2G的存储空间,太占空间了
进入系统查看
查看新增加的功能是否支持ntfs
恩,已经成功实现该功能