您的位置:首页 > 运维架构 > Linux

Linux 自学笔记——内核管理初步及编译

2017-09-07 22:59 483 查看
Linux Kernel:
内核设计体系:单内核、微内核;
内核的组成部分:
1.Kernel:内核核心,一般为bzimage,通常位于/boot目录,名称为vmlinuz-VERSION-release;



2.Kernel object:内核对象,即内核模块,一般放置于/lib/modules/VERSION-release/,maninfo命令通过读取此文件的信息以显示相关信息;



内核模块与内核核心版本一定要严格匹配;
[]:N;
[M]:Module,编译进模块中;
[*]:Y,编译进内核核心;
内核特性:动态装载和卸载;
Note:有些功能要么编译进内核,要么不编译
3.ramdisk:辅助性文件,并非必须,这取决于内核是否能直接驱动rootfs所在的设备;
目标设备驱动,例如SCCI设备的驱动;
逻辑设备驱动,例如LVM设备的驱动;
文件系统,例如xfs文件的系统;
ramdisk:是一个简装版的根文件系统;
ldd命令:
ldd- print shared library dependencies 打印二进制应用程序所依赖的库文件;
ldd[OPTION]... FILE...
显示:1.所依赖库文件名称=>所依赖库文件路径(对应内存载入符号链接映射指向)
2.整个系统调用库的入口



内核信息获取:
uname命令:
uname- print system information
格式: uname [OPTION]...



-a:显示所有信息
-n:显示主机名;
-r:显示内核的release号;
-v:显示内核版本号;



文件:/boot/vmlinuz-VERSION-release
模块信息获取和管理:
lsmod命令:
lsmod- program to show the status of modules in the Linux Kernel 显示由内核已经装载的内核模块;



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



modinfo命令:
modinfo- program to show information about a Linux Kernel module显示内核模块的详细信息
modinfo[-F field] [-k kernel] [modulename|filename...]
-F field:仅显示指定字段的信息;
-n:显示文件路径;
-a:author
-d:description
-l:license
-k:显示指定的内核版本模块



modprobe命令:
-Add and remove modules from the Linux Kernel
modprobe[ -C confile-file] [modulename] [moduleparame-ters…]
配置文件:/etc/modprobe.conf,/etc/modprobe.d/*.conf



格式:modprobe [-r] module_name
模块的动态装载:modprobe module_name
动态卸载:modprobe -r module_name



Note:对正在使用的模块不要轻易卸载;此命令自动解决依赖关系;
depmod命令:
depmod- program to generate modules.dep and map files.
内核模块依赖关系的生成工具;
depmod[-Anea]
-A:只分析比modules.dep记录还新的内核模块,才会更新
-n:不写入modules.dep只输出到屏幕;
-e:显示目前已经加载的不可执行的模块名称;
-a:分许所有模块;
模块装载卸载的另外一种方式:
insmod命令:
insmod - simple program to insert a moduleinto the Linux Kernel
insmod[ filename ] [ module options... ]
filename:模块文件的文件路径;(内核模块的绝对路径,一般以.ko文件结尾)
rmmod命令:
rmmod- simple program to remove a module from the Linux Kernel
rmmod [module_name]
ramdisk文件的制作:
(1)mkinitrd命令
为当前使用中的内核重新制作ramdisk文件
# mkinitrd [OPTION...][<initrd-image>] <kernel-version>
--with=<module>:除了默认的模块之外需要装载至initramfs中的模块;--preload=<module>:initramfs所提供的模块需要预先装载的模块; ~]#mkinitrd /boot/initramfs-$(uname -r).img $(uname -r)



(2)dracut命令:
- low-level tool forgenerating an initramfs image
# dracut [OPTION...][<image> [<kernel version>]]
示例: ~]# dracut/boot/initramfs-$(uname -r).img $(uname-r) 用法和mkinitrd一样;
内核信息输出的伪文件系统:
/proc:内核状态和统计信息的输出接口,同时,还提供一个配置接口,/proc/sys



参数:
只读:信息输出,例如/proc/#/*
只写:可接受用户指定一个“新值”来实现对内核某功能或特性的配置:/proc/sys/
/proc/sys:
net/ipv4/ip_forward 相当于 net.ipv4.ip_forward



1) sysctl命令:专用于查看或设定/proc/sys目录下参数的值;sysctl [options] [variable[=value]] 查看: #sysctl -a

#sysctl variable

修改其值: #sysctl -w variable=value2) 文件系统命令(cat,echo)查看: #cat/proc/sys/PATH/TO/SOME_KERNEL_FILE设定: #echo“VALUE” > /proc/sys/PATH/TO/SOME_KERNEL_FILE3) 配置文件:/etc/sysctl.conf,/etc/sysctl.d/*.conf;立即生效的方式:sysctl -p [/PATH/TO/CONFIG_FILE]

内核参数:
net.ipv4.ip_forward:核心转发;
vm.drop_caches:
kernel.hostname:主机名;
net.ipv4.icmp_echo_ignore_all:忽略所有ping操作;
/sys目录;



sysfs:输出内核识别出的各硬件设备的相关属性信息,也有内核对硬件特性的可设置参数;对此些参数的修改,即可定制硬件设备工作特性;
udev;通过读取/sys目录下的硬件设备信息按需为各硬件设备创建设备文件;udev是用户空间程序;专用工具:devadmin,hotplug;
udev为设备创建文件时,会读取其事先定义好的规则文件,一般在/etc/udev/rules.d/目录下,以及/usr/lib/udev/rules.d目录下;

编译内核:
程序包的编译安装:./configure, make,make install前提:开发环境(开发工具,开发库),头文件:/usr/include开源:源代码—>可执行格式 发行版:以“通用”的目标;前提:1) 准备好开发环境;2) 获取目标主机上的硬件设备的相关信息;3) 获取到目标主机系统的功能的相关信息,例如要启用的文件系统;4) 获取内核源代码包:www.kernel.org准备开发环境: Centos6.6: 包组: Development Tools Server Platform Development Centos 7: 包组: Development Tools Server Platform Development 包: ncures-devel 获取目标主机上硬件设备的相关信息:
CPU:
~]#cat /proc/cpuinfo



~]#lscpu



~]#x86info –a x86info需要先手动安装才能使用



PCI设备:
~]#lspci
-v:详细显示信息
-vv



~]#lsusb
-v:详细显示usb信息
-vv



~]#lsblk



了解全部硬件设备信息:
~]#hal-device
内核编译过程:
1. 准备好开发环境,安装好“DevelopmentTools”“Server Platform Development”组件;2. 从kernel官网上下在内核;

3. 下载好内核之后将文件解压缩归档至/usr/src目录;

4. 创建链接文件;

5. 准备配置文件;

6. 配置内核选项;

1)给内核加一个名称,依次选中Generalsetup-->Local version – append to kernel release;

2)选择启动的内核模块,在打开这个配置的第一个界面依次选择File systems -->DOS/FAT/NT file systems-->NTFS file systemssupport,如图所示,利用空格键选中,[]表示不编译,[M]表示编译至模块中,[*]表示编译至内核中。本次测试选中NTFS模块;

3)退出保存,比较配置前后区别;

7. 安装编译; 1) 编译内核,可使用make –j #指定编译线程数量,因为远程编译可能终端断开就前功尽弃了,所以 使用screen命令就可以不用担心编译中断了;



2) 安装内核模块;



3) 安装内核;最后一步在虚拟机里出现报错,为can’tfind modules…可忽略
#make install;



8. 编辑grub配置文件,将default=1改为default=0,随后重启系统;


screen命令:打开screen:~]# screen拆除screen: Ctrl+a, d列出screen: ~]# screen -ls连接至screen: ~]# screen -r SCREEN_ID关闭screen: ~]# exit编译安装内核的详细说明:
1. 大概安装步骤: 1) 安装开发包组
2) 下载源码文件
3) .config:准备文本配置文件
4) makemenuconfig:配置内核选项
5) make[-j #]
6) makemodules_install:安装模块
7) makeinstall :安装内核相关文件
安装bzImage为/boot/vmlinuz-VERSION-RELEASE(去boot目录下查看)
生成initramfs文件
8) 编辑grub的配置文件
2. 配置内核选项 支持“更新”模式进行配置:在已有的.config文件的基础之上进行修改配置;a) make config:基于命令行以遍历的方式去配置内核中可配置的每个选项;b) make menuconfig:基于cureses的文本配置窗口;c) make gconfig:基于GTK开发环境的窗口界面;包组“桌面平台开发”d) make xonfig;基于QT开发环境窗口界面; 支持“全新配置”模式进行配置:a) make defconfig:基于内核为目标平台提供的“默认”配置为模板进行配置;b) make allnoconfig:所有选项均为“no”3. 编译 a) 多线程编译:make [-j #]
b) 编译内核中的一部分代码:

i只编译某子目录中的相关代码:
# cd /usr/src/linux
# make path/to/dir/

ii只编译一个特定的模块:
# cd /usr/src/linux
# make path/to/dir/file.ko
例如:只为e1000编译驱动:
#make drivers/net/ethernet/intel/e1000/e1000.ko
c) 如何交叉编译:
目标平台与当前编译操作所在的平台不同;
# make ARCH=arch_name
要获取特定目标平台的使用帮助:
# make ARCH=arch_name help
4. 如何在执行过编译操作的内核源码树上做重新编译:事先清理操作: # make clean:清理编译生成的绝大多数文件,但会保留config,及编译外部模块所需要的文件; # make mrproper:清理编译生成的所有文件,包括配置生成的config文件及某些备份文件; # make distclean:相当于mrproper,额外清理各种patches以及编辑器备份文件;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linux kernel 内核管理