内核
单内核体系设计、但充分借鉴了微内核设计体系的优点,为内核引入模块化机制。
内核组成部分:
kernel:内核核心,一般为bzimage,通常在/boot目录下,名称为vmlinuz
kernel object:内核对象一般有三种选择,一般放置于/lib/modules/VERSION-RELEASE/
[ ]:N 不选择
[ ]:M 选择编译为模块
[ ]:Y 直接选择成为核心组成部分
辅助文件:ramdisk有以下两种
initrd
initramfs
运行中的内核;
uname命令
uname - print system information
uname [OPTION]...
-a:显示所有信息
-s:显示内核即操作系统名称
-n:显示主机节点名称
-r:内核的版本号和release号
-v:显示内核的版本制作信息
-p:显示处理器架构信息
-m:显示内核所在的硬件平台名称
-o:显示操作系统名称
模块:
lsmod命令
显示由核心已经装载的内核模块
lsmod显示的信息来自于cat /proc/modules文件
modinfo:查看模块的详细信息
eg:modinfo ext4
modinfo [ -0 ] [ -F field ] [ -k kernel ] [ modulename|filename... ]
-k:显示指定内核的详细信息
-p:显示模块参数
-n:只显示模块文件路径
-a:只显示模块作者
-d:显示decription
-l:license
modprobe:装载或卸载内核模块
modprobe [ -C config-file ] [ modulename ] [ module parameters... ]
默认配置文件:/etc/modprobe.conf,/etc/modprobe.d/*.conf
-n:用作测试
-q:静默模式
-r:移除模块
-C:指明读取模块的配置文件路径
modprobe -r [ modulename... ] 卸载某模块
depmod:内核模块依赖关系文件及系统信息映射文件的生成工具;
装载或卸载内核模块:
insmod:装载模块(不解决依赖性关系)
insmod [ filename ] [ module options... ]
rmmod:卸载模块
rmmod [ modulename ]
/proc目录:内核把自己内部状态信息及统计信息,以及可配置参数通过proc伪文件系统加以输出
参数:
只读:输出信息
可写:可接受用户指定“新值”来实现对内核某功能或特性的配置
/proc/sys
(1)sysctl命令用于查看或设定此目录中诸多参数
sysctl -w path.to.parameter=VALUE
sysctl -w kernel.hostname=danran.com
(2)echo命令通过重定向的方式也可以修改大多数参数的值
echo "VALUE" > /proc/sys/path/to/parameter
sysctl
配置文件:/etc/sysctl.conf
(1)设置参数
sysctl -w parameter=VALUE
(2)通过读取配置文件件设置参数生效
sysctl -p [/path/to/conf_file]
内核中的路由转发
sysctl -w /proc/sys/net/ipv4/ip_forword=1
常用的参数:
net.ipv4.ip_forword
kernel.hostname
sysctl -w vm.drop_caches=1 清理系统缓存
/sys目录:
sysfs:输出内核识别出的各硬件设备的相关属性信息,也有内核对硬件特性的设定信息,有些参数是可以修改的,用于调整硬件工作特性。
udev:通过此路径下输出的信息动态为各设备创建所需要设备文件,udev是运行用户空间程序:专用工具:udevadmin,hotplug
udev为设备创建设备文件时,会读取其事先定义好的规则文件,一般在/etc/udev/rules.d及/usr/lib/udev/rules.d目录下
- ramdisk文件的制作
(1) mkinitrd 为当前正在使用的内核重新制作ramdisk文件
mkinitrd /boot/initramfs-$(uname -r).img $(uname -r) 由当前系统版本生成相应版本的initramfs文件
(2) dracut命令 为当前正在使用的内核重新制作ramdisk文件
dracut /boot/initramfs-$(uname -r).img $(uname -r)
- 编译内核
前提:
(1) 准备好开发环境
(2) 获取目标主机上硬件设备的相关信息
(3) 获取到木变主机系统功能的相关信息,例如要启动的文件系统
准备好开发环境:
包组(Centos 6)
Server Platform Development
Development Tools
目标主机硬件设备的相关信息:
CPU:
cat /proc/cpuinfo
x86info -a
lscpu
PCI
lspci 查看PCI设备的信息
-v
-vv
lsusb 查看usb设备的信息
lsblk 查看块设备的信息
了解全部硬件设备信息
hal-device
简单依据模板文件的制作过程:
tar xf liunx-3*.tar.gz -C /usr/src -C指定指定目录
cd /usr/src
ln -sv linux-3* linux 创建解压文件的软链接linux
cd linux
cp /boot/config-$(uname -r) ./.config 复制boot目录下的config-$(uname -r)文件到当前目录下并命名为.config
make menuconfig 执行编译,配置内核选项
.config 文件文件
make help
screen 打开一个会话
make -j # #可以同内核核心数一致,也可以是核心的两倍,多线程同时编译
make modules——install 安装模块
make install 安装内核
安装bzImage为/boot/vmlinuz-VERSION-RELEASE
生成initramfs文件
编辑grub的配置文件
init 6 重启系统,并测试使用新内核
- 编译内核步骤
(1) 配置内核选项
支持“更新”模式进行配置
(a) make config:基于命令行以遍历的方式去配置内核中可配置的每个选项
(b) make menuconfig:基于curses的文本窗口界面
(c) make gconfig:依赖GTK开发环境的窗口界面
(d) make xconfig:基于QT开发环境的窗口界面
支持“全新配置”模式进行配置
(a) make defconfig:基于内核为目标平台提供的“默认”配置进行配置;
(b) make allnoconfig:所有选项均回答为“no”
(2) 编译
make [-j #]
如何只编译内核中的一部分功能:
(1) 只编译某某子目录中的相关代码
cd /usr/src/linux
make dir/ (只能使用相对路径)
(b) 只编译一个特定的模块
cd /usr/src/linux
make dir/file.ko
eg:只为e1000编译驱动
make drivers/net/ethernet/intel/e1000/e1000.ko
如何交叉编译内核
编译的目标平台与当前平台不相同
make ARCH=arch_name
要获取特定目标平台的使用帮助
make ARCH=arch_name help
- 如何在已经执行过编译操作的内核源码树做重新编译
事先清理操作
make clean:清理大多数编译生成的文件,但会保留config文件等;
make mrproper:清理所有编译生成的文件、config及某些备份文件
make distclen:mrproper、patches以及编辑器备份文件
- screen命令
打开新的screen
screen
退出并关闭screen
exit
剥离当前screen
Ctrla,d
显示所有已经打开的screen
screen -ls
恢复某screen
screen -r [SESSION]
网友评论