Linux Kernel:单内核体系设计,但充分借鉴了微内核设计体系的优点,为内核引入模块化机制
内核的组成部分:
kernel:内核核心,一般为bzimage,通常在/boot目录下,名称为vmlinuz-VERSION-RELEASE
kernel object:内核对象,一般放置于/lib/modules/VERSION-RELEASE/
[ ]:N 不装载
[M]:M 装载为模块
[*]:Y 装载进内核
辅助文件:ramdisk
centos5:initrd
centos6:initramfs
运行中的内核信息查看:uname命令
uname [OPTION]... -n:显示节点名称 -r:显示内核的版本号,VERSION-RELEASE -v:显示内核制作版本信息 -m:显示硬件平台 -p:显示处理器类型,处理器本身的架构 -s:显示操作系统名称 -i:显示硬件平台架构 -o:显示操作系统名称 -a:显示所有信息
1.查看内核版本号
[root@study kernel]# uname -r 2.6.32-754.el6.x86_64
2.查看节点名称
[root@study kernel]# uname -n
study.ckh
3.显示操作系统名称
[root@study kernel]# uname -s
Linux
模块相关命令:
lsmod命令:显示由核心已经装载的内核模块,显示额内容来自于/proc/modules
modinfo命令:显示模块的详细描述信息
modinfo [OPTION] modulename
-n:显示模块文件路径
-p:显示模块参数
-a:auther信息
-d:description
-l:liscense
1.显示模块文件路径
[root@study kernel]# modinfo -n xfs /lib/modules/2.6.32-754.el6.x86_64/kernel/fs/xfs/xfs.ko
modprobe命令:装载或卸载内核模块
配置文件:/etc/modprobe.conf, /etc/modprobe.d/*.conf
-r:卸载模块
1.装载xfs模块
[root@study kernel]# modprobe xfs
2.卸载xfs模块
[root@study kernel]# modprobe -r xfs
depmod命令:
内核模块依赖关系文件及系统信息映射文件的生成工具
装载或卸载内核模块:
insmod命令:
insmod [ filename ][ module options... ]
rmmod
rmmod [ modulename ]
/proc目录:
内核把自己内部状态信息及统计信息,以及可配置参数通过proc伪文件系统加以输出
参数:
只读:输出信息
可写: 可接受用户指定”新值“来实现对内核某功能或特性的配置
/proc/sys
# sysctl -w kernel.hostname=mail.magedu.com
systctl命令用于查看或设定此目录中诸多参数
sysctl -w path.to.parameter=VALUE
echo命令通过重定向的方式也可以修改大多数参数的值
# echo "www.magedu.com" > /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
vm.drop_caches
kernel.hostname
/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)
2.dracut命令
为当前正在使用的内核重新制作ramdisk文件
# dracut /boot/initramfs-$(uname -r).img $(uname -r)
编译内核:
前提:
1.准备好开发环境
2.获取目标主机上硬件设备的相关信息
3.获取到目标主机系统功能的相关信息,例如要启用的文件系统
准备好开发环境
包组:
Server Platform Development
Development Tools
目标主机硬件设备相关信息:
CPU:
# cat /proc/cpuinfo
# x86info -a
# lscpu
PCI设备:
# lspci
-v
-vv
# lsusb
-v
-vv
# lsblk
了解全面硬件设备信息
# hal-device
简单依据模板文件的制作过程
# tar xf linux-3.10.67.tar.xz -C /usr/src
# cd /usr/src
# ln -sv linux-3.10.67
# cd linux
# cp /boot/config-$(uname -r) ./.config
# make menuconfig : 根据可配置的内核选项进行配置
# screen
# make -j # 如果内核多核心编译
# make modules_install 安装模块
# make install 安装内核
重启系统,并测试使用新内核
练习:编译好,并启用之
回顾: 内核组成部分
内核组成部分:
核心: 模块
核心: /boot/vmlinuz-VERSION-RELEASE
模块: /lib/moduules/VERSION_RELEASE/
模块管理的相关命令
lsmod, modinfo, modprobe [r],insmod, rmmod, depmod
内核编译:
[]
[M]
[*]
步骤:
make menuconfig:配置内核选项
.config: 文本文件
make [-j #]: 多内核编译
make modules_install
make install
安装bzImage为/boot/vmlinuz-VERSION-RELEASE
生成initramfs文件
编辑grub的配置文件
Linux内核编译(2)
编译内核的步骤:
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 #]
如何只编译内核中的一部分功能
a.只编译某子目录中的相关代码
# cd /usr/src/linux
# make dir/
b.只编译一个特定的模块
# cd /usr/src/linux
# make dir/file.ko
例如:只为e1000编译驱动
# make drivers/net/ethernet/intel/e1000/e1000.ko
如何交叉编译内核
编译的目标平台与当前平台不相同
# make ARCH=arch_name
要获取特定目标平台的使用帮助
# make ARCH=arch_name help
比如基于arm平台的编译:
# make ARCH=arm viper_defconfig
如何在已经执行过编译操作的内核源码树做重新编译
实现清理操作:
# make clean:清理大多数编译生成的文件,但会保留config文件等
# make mrproper: 清理所有编译生成的文件、config及某些备份文件
# make distclean: mrproper、patches补丁以及编译器备份文件
screen命令
打开新的screen:
# screen
退出并关闭screen
# exit
剥离当前screen
Ctrl+a,d
显示所有已经打开的screen
screen -ls
恢复screen
screen -r [SESSION]
远程关闭正在运行程序的screen:
screen -X -S 73260 quit