【Linux】【Basis】Kernel
Linux Kernel:
CentOS启动流程:POST --> Bootloader(BIOS, MBR) --> Kernel(initrd) --> rootfs --> switch_root --> /sbin/init
root (hd0,0)
kernel
initrd
ldd命令:
- print shared library dependencies
ldd [OPTION]... FILE...
内核设计体系:单内核、微内核
Linux:单内核设计,但充分借鉴了微内核体系的设计的优点;为内核引入了模块化机制;
内核的组成部分:
kernel:内核核心,一般为bzImage,通常位于/boot目录,名称为vmlinuz-VERSION-release;
kernel object:内核对象,即内核模块,一般放置于/lib/modules/VERSION-release/
内核模块与内核核心版本一定要严格匹配;
[ ]:N
[M]:Module
[*]:Y,编译进内核核心
内核:动态装载和卸载;
ramdisk:辅助性文件,并非必须,这取决于内核是否能直接驱动rootfs所在的设备;
目标设备驱动,例如SCSI设备的驱动;
逻辑设备驱动,例如LVM设备的驱动;
文件系统,例如xfs文件系统;
ramdisk:是一个简装版的根文件系统;
内核信息获取:
uname命令:
- print system information
格式:uname [OPTION]...
-r:内核的release号
-n:主机名
文件:/boot/vmlinuz-VERSION-release
模块信息获取和管理:
lsmod命令:
- Show the status of modules in the Linux Kernel
显示的内核来自于/proc/modules
modinfo命令:
- Show information about a Linux Kernel module
modinfo [-F field] [-k kernel] [modulename|filename...]
-F field: 仅显示指定字段的信息;
-n:显示文件路径;
modprobe命令:
- Add and remove modules from the Linux Kernel
格式:modprobe [-r] module_name
模块的动态装载:modprobe module_name
动态卸载:modprobe -r module_name
depmod命令:
- Generate modules.dep and map files.
内核模块依赖关系文件的生成工具;
模块的装载和卸载的另一组命令:
insmod命令:
insmod [filename] [module options...]
filename:模块文件的文件路径;
rmmod命令:
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 for generating an initramfs image
# dracut [OPTION...] [<image> [<kernel version>]]
示例: ~]# dracut /boot/initramfs-$(uname -r).img $(uname -r)
内核信息输出的伪文件系统:
/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=value
(2) 文件系统命令(cat, echo)
查看:
# cat /proc/sys/PATH/TO/SOME_KERNEL_FILE
设定:
# echo "VALUE" > /proc/sys/PATH/TO/SOME_KERNEL_FILE
注意:上述两种方式的设定仅当前运行内核有效;
(3) 配置文件:/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/目录下;
回顾:内核
内核的组成部分:kernel, kernel object, ramdisk
kernel: uname
kernel object: lsmod, modinfo, modprobe, insmod, rmmod, depmod
ramdisk:mkinitrd, dracut
启动流程: POST --> BootSequence(BIOS) --> Bootloader (MBR) --> kernel (ramdisk) --> rootfs (switch_root) --> /sbin/init (/etc/inittab, /etc/init/*.conf, /usr/lib/systemd/system/)--> 默认运行级别、系统初始化、关闭及启动服务、启动终端(图形终端)
grub:
1st stage:mbr
1_5 stage: mbr之后的扇区
2nd stage:/boot/grub/
加密:编辑、内核
编译内核:
程序包的编译安装:
./configure, make, make install
前提:开发环境(开发工具,开发库),头文件:/usr/include
开源:源代码 --> 可执行格式
发行版:以“通用”的目标;
前提:
(1) 准备好开发环境;
(2) 获取目标主机上硬件设备的相关信息;
(3) 获取到目标主机系统功能的相关信息,例如要启用的文件系统;
(4) 获取内核源代码包:www.kernel.org
准备开发环境:
CentOS 6.7:
包组:
Development Tools
Server Platform Development
CentOS 7:
包组:
Development Tools
Server Platform Development
包:
ncurses-devel
获取目标主机上硬件设备的相关信息:
CPU:
~]# cat /proc/info
~]# lscpu
~]# x86info -a
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 -s linux-3.10.67 linux
~]# cd linux
~]# make menuconfig 配置内核选项
~]# make [-j #] 编译内核,可使用-j指定编译线程数量
~]# make modules_install 安装内核模块
~]# make install 安装内核
重启系统,选择使用新内核;
screen命令:
打开screen: ~]# screen
拆除screen: Ctrl+a, d
列出screen: ~]# screen -ls
连接至screen: ~]# screen -r SCREEN_ID
关闭screen: ~]# exit
过程的详细说明:
(1) 配置内核选项
支持“更新”模式进行配置:在已有的.config文件的基础之上进行“修改”配置;
(a) make config:基于命令行以遍历的方式去配置内核中可配置的每个选项;
(b) make menuconfig:基于cureses的文本配置窗口;
(c) make gconfig:基于GTK开发环境的窗口界面; 包组“桌面平台开发”
(d) make xonfig:基于QT开发环境的窗口界面;
支持“全新配置”模式进行配置:
(a) make defconfig:基于内核为目标平台提供的“默认”配置为模板进行配置;
(b) make allnoconfig:所有选项均为“no”;
(2) 编译
(a) 多线程编译:make [-j #]
(b) 编译内核中的一部分代码:
(i) 只编译某子目录中的相关代码:
# cd /usr/src/linux
# make path/to/dir/
(ii)只编译一个特定的模块
# cd /usr/src/linux
# make path/to/dir/file.ko
(c) 如何交叉编译:
目标平台与当前编译操作所在的平台不同;
# make ARCH=arch_name
要获取特定目标平台的使用帮助:
# make ARCH=arch_name help
(3) 如何在执行过编译操作的内核源码树上做重新编译:
事先清理操作:
# make clean:清理编译生成的绝大多数文件,但会保留config,及编译外部模块所需要的文件;
# make mrproper:清理编译生成的所有文件,包括配置生成的config文件及某些备份文件;
# make distclean:相当于mrproper,额外清理各种patches以及编辑器备份文件;
【Linux】【Basis】Kernel的更多相关文章
- 【Linux探索之旅】第二部分第二课:命令行,世界尽在掌握
内容简介 1.第二部分第二课:命令行,世界尽在掌握 2.第二部分第三课预告:文件和目录,组织不会亏待你 命令行,世界尽在掌握 今天的标题是不是有点霸气侧漏呢? 读者:“小编,你为什么每次都要起这么非主 ...
- 【Linux探索之旅】第一部分第五课:Unity桌面,人生若只如初见
内容简介 1.第一部分第五课:Unity桌面,人生若只如初见 2.第一部分第六课预告:Linux如何安装在虚拟机中 Unity桌面,人生若只如初见 不容易啊,经过了前几课的学习,我们认识了Linux是 ...
- 两款【linux字符界面下】显示【菜单】,【选项】的powershell脚本模块介绍
两款[linux字符界面下]显示[菜单],[选项]的powershell脚本模块介绍 powershell linux ps1 menu choice Multiselect 传教士 菜单 powe ...
- 【Linux探索之旅】第二部分第五课:用户和权限,有权就任性
内容简单介绍 .第二部分第五课:用户和权限,有权就任性 2.第二部分第六课预告:Nano,刚開始学习的人的文本编辑器 用户和权限.有权就任性 今天的标题也挺任性的啊,虽说小编是一个非常本分的人(真的吗 ...
- 【Linux探索之旅】开宗明义+第一部分第一课:什么是Linux?
内容简介 1.课程大纲 2.第一部分第一课:什么是Linux? 3.第一部分第二课预告:下载Linux,免费的噢! 开宗明义 我们总听到别人说:Linux挺复杂的,是给那些追求逼格的程序员用的.咱 ...
- 【LINUX/UNIX网络编程】之简单多线程服务器(多人群聊系统)
RT,Linux下使用c实现的多线程服务器.这个真是简单的不能再简单的了,有写的不好的地方,还希望大神轻拍.(>﹏<) 本学期Linux.unix网络编程的第四个作业. 先上实验要求: [ ...
- 【LINUX/UNIX网络编程】之使用消息队列,信号量和命名管道实现的多进程服务器(多人群聊系统)
RT,使用消息队列,信号量和命名管道实现的多人群聊系统. 本学期Linux.unix网络编程的第三个作业. 先上实验要求: 实验三 多进程服务器 [实验目的] 1.熟练掌握进程的创建与终止方法: 2 ...
- 【Linux/unix网络编程】之使用socket进行TCP编程
实验一 TCP数据发送与接收 [实验目的] 1.熟练掌握套接字函数的使用方法. 2.应用套接字函数完成基本TCP通讯,实现服务器与客户端的信息交互. [实验学时] 4学时 [实验内容] 实现一个服务器 ...
- 【Linux探索之旅】第一部分第二课:下载Linux,免费的噢
内容简介 1.第一部分第二课:下载Linux,免费的噢 2.第一部分第三课预告:测试并安装Ubuntu 下载Linux,免费的噢 大家好,上一课我们认识了非常“霸气侧漏”的Linux操作系统. 也知道 ...
- 【Linux探索之旅】第一部分第三课:测试并安装Ubuntu
内容简介 1.第一部分第三课:测试并安装Ubuntu 2.第一部分第四课预告:磁盘分区 测试并安装Ubuntu 大家好,经过前两个比较偏理论(是否想起了带着瓜皮帽,手拿折扇的老学究,或者腐儒)的课程, ...
随机推荐
- uni-app map组件关于marker标记点动态设置的问题
marker是Array类型,赋值的时候只能对整个数组进行更改赋值,不能只改变内部的对象,亲测Vue.$set()也不行 this.marker = [ { latitude: 39.90, long ...
- java框架面试高频问题(SpringMVC)
1.SpringMVC是什么? 请说出你对它的理解? SpringMVC是Spring将Web层基于MVC封装后的框架. 在没有SpringMVC之前,Web层的Servlet负责的事情很多,很杂. ...
- Linux基础一:基础命令
Linux是什么,是干什么用的? 1.Linux是一个操作系统,电脑=软件+硬件,而操作系统就是特殊的软件 2.Linux系统内一切皆文件 3.bash shell 是红帽默认的shell(shell ...
- 菜鸡的Java笔记 第十一 - java 封装性
1.1封装的基础实现. 封装是把过程和数据包围起来,对数据的访问只能通过已定义的接口.面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治.封装的对象,这些对象通过一个受保 ...
- Swift-技巧(六)设置按钮状态并更改
摘要 按钮是一个宝藏控件,可以在设置的时候就对不同的状态添加图片.文本,甚至更改背景.在不同的展示场景中更改到不同的状态显示就好.恰恰是如何更改状态着实让我懵了一阵,所以记录一下过程.如果没有兴趣了解 ...
- vue3 学习笔记 (四)——vue3 setup() 高级用法
本篇文章干货较多,建议收藏! 从 vue2 升级到 vue3,vue3 是可以兼容 vue2 的,所以 vue3 可以采用 vue2 的选项式API.由于选项式API一个变量存在于多处,如果出现问题时 ...
- 常见HTTP请求错误码
一些常见的状态码为: 200 - 服务器成功返回网页404 - 请求的网页不存在503 - 服务不可用详细分解: 1xx(临时响应)表示临时响应并需要请求者继续执行操作的状态代码. 代码 说明100 ...
- [省选联考 2021 A/B 卷] 宝石
大概是一眼看出来是这个给定序列在树上序列上按顺序跑最大匹配. 然后考虑维护向上和向下的链的值. 大概的做法是用倍增维护,考虑\(f_{u,i}\)是\(c_u\)在序列里的位置向后匹配\(2^i\)位 ...
- Anaconda 安装与卸载
Anaconda是一个免费开源的Python和R语言的发行版本,用于计算科学(数据科学.机器学习.大数据处理和预测分析),Anaconda致力于简化软件包管理系统和部署.Anaconda的包使用软件包 ...
- [linux] rm -rf删除软链接无权限?
一个很简单的命令,使用频率非常高,但一没注意就会失策. 我将别人盘下的list目录软连接到自己盘中,想要删除时: rm -rf list/ #输入时自然地用tab键补全 结果: 试了多次也删除不了,最 ...