系统启动和内核管理
linux的组成
kernel实现进程管理,内存管理,网络管理,驱动程序,文件系统,安全功能等功能
rootfs包括程序和glibc库:简称根文件系统
程序:二进制执行文件
库:函数集合,function,调用接口(头文件负责描述)
内核设计流派
宏内核(monolithic kernel):又称单内核和墙内核,unix,linux
把所有系统服务当放到内核里,所有功能集成于同一个程序,分层实现不同功能,系统庞大复杂,linux其实在单内核实现了模块化,也就相当于吸收了微内核的优点
微内核(micro kernel):windows,solaris,harmonyOS
简化内核功能,在内核之外的用户态尽可能多地实现系统服务,同时加入相互之间的安全保护,每种功能使用一个单独子系统的实现,将内核功能移到用户空间,性能差
centos6启动流程
1.加载BIOS的硬件信息,获取第一个启动设备
2.读取第一个启动设备MBR的引导加载程序(grub)的启动信息
3.加载核心操作系统的核心信息,核心开始解压缩,并尝试驱动所有的硬件设备
4.核心执行init程序,并获取默认的运行情况
5.init程序执行/etc/rc.d/rc.sysinit文件,重新挂载根文件系统
6.启动核心的外挂模块
7.init执行运行的各个批处理文件(script)
8.init执行/etc/rc.d/rc.local
9.执行/bin/login城西,等待用户登录
10.登录之后开始以shell控制主机
硬件启动post
post:power-on-self-test,加电自检,是BIOS功能的一个主要部分,负责完成对CPU,主板,内存,硬盘子系统,显示子系统,串并行接口,键盘等硬件情况的检测
主板的ROM:BIOS,Basic Input and output system,保存着有关计算机系统最重要的基本输入输出程序,系统信息设置,开机加电自检程序和系统启动自举程序等
主板的RAM:CMOS互补金属化物半导体,保存各项参数的设定,接次序查找引导设备,第一个有引导程序的设备为本次启动设备
启动加载bootloader
grub功能和组成
bootloader:引导加载器,引导程序
windows,ntloader,仅是启动OS
Linux:功能丰富,提供菜单,允许用户选择要启动系统或不同的内核版本,把用户选定的内核装载到内存中的特定空间中,解压,展开,并把系统控制权移交到内核
Linux的bootloader
LILO:linux loader,早期的bootloader,功能单一
GRUB:grand unified bootloader,centos5,6grub0.97:grub legacy,centos7以后使用grub2.02
GRUB启动阶段
primary boot loader:
1st stage:MBR的前446个字节
1.5st stage:MBR之后的扇区,让stage1中的bootloader能识别到stage2所在的分区上的文件系统
secondary boot loader:2nd stage,分区文件/boot/grub/
centos6 grub安装
grub-install /dev/DISK
grub legacy管理
配置文件:/boot/grub/grub.conf <------ /etc/grub.conf
stage2及内核等通常放置于一个基本磁盘分区
grub legacy 功能:
1.提供启动菜单,并提供交互式接口
a.内核参数
e.编辑模式,用于编辑菜单
c.命令模式,交互式接口
2.加载用户选择的内核和操作系统
允许传递参数给内核
可隐藏启动菜单
3.为菜单提供保护机制
为编辑启动菜单进行认证
为启用内核或操作系统进行认证
grub的命令接口
help:获取帮助列表
help keyword :详细帮助信息
find (hd#,#)/path/to/somefile
root (hd#,#)
kernel /path/to/somefile: 设定本次启动的内核文件,额外还可以添加许多内核支持使用的cmdline参数
initrd /path/to/initRAMFS_FILE:设定为选定的内核提供额外文件的ramdisk
boot:引导启动选定的内核
/proc/cmdline 内核参数
grub legacy识别硬盘设备
(hd#,#)
hd#:磁盘编号,用数字表示,从0开始编号
#:分区编号,用数字表示,从0开始编号
实例(hd0,0)表示第一块硬盘,到第一个分区
加载kernel
kernel自身初始化过程
RAMDISK 内存盘,虚拟硬盘
1.探测可识别到的所有硬件设备
2.加载硬件驱动程序(借助于ramdisk加载驱动)
3.以只读方式挂载根文件系统
4.运行用户空间的第一个应用程序:/sbin/init
linux内核特点:
支持模块化:.ko(内核模块),如文件系统,硬件驱动
支持内核模块的动态加载和卸载
ramdisk文件的制作:
mkinitrd命令
mkinitrd /boot/initramfs-$(uname -r).img $(uname -r)
dracut命令
dracut /boot/initramfs-`uname -r`.img `uname -r`
init初始化
systemd:systemd,centos7
配置文件:/etc/systemd/system
/usr/lib/systemd/system
运行级别
为系统运行或维护等目的而设定;0-6:7个级别,一般用3,5做为默认级别
0:关机
1:单用户模式(root自动登录)single,维护模式
2.多用户模式,启动网络功能,但不会启动NFS,维护模式
3.多用户模式,正常模式,交互界面
4.预留级别,可同3级别
5.多用户模式,正常模式,图形界面
6.重启
查看级别:
who -r
runlevel
/etc/rc.d/rc 控制服务脚本的开机自启动运行
说明:
rc N ---> 意味着读取/etc/rc.d/rcN.d/
K:k##:##运行次序;数字越小,越先运行,数字越小的服务,通常为依赖到别的服务
S:s##:##运行次序;数字越小,越先运行,数字越小的服务,通常为被依赖到的服务
配置服务开机启动
chkconfig命令管理服务
--list 查看所有级别的启动或关闭设定情形:
--add 添加服务
--del 删除服务
ntsysv
sync 立即写入磁盘
非独立服务
服务分为独立服务和非独立服务
静态(Transient)服务被超级守护进程所管理,也成为非独立服务
进入的请求首先被xinetd代理
配置文件
/etc/xinetd.conf
/etc/xinetd.d/<service>
用chkconfig控制非独立服务开机启动
chkconfig tftp on
开机启动文件rc.local
/etc/rc.local
/etc/rc.d/rc.local
注意:正常级别下,最后启动一个服务599local没有链接至/etc/rc.d/init.d一个服务脚本,而是指向了/etc/rc.d/rc.local脚本
不便或不需写为服务脚本放置于/etc/rc.d/init.d目录,且邮箱开机时自动运行的命令,可直接放置于/etc/rc.d/rc.local文件中
/etc/rc.d/rc.local在指定运行级别脚本后运行
注意:默认ubuntu无/etc/rc.local文件,可以创建此脚本文件并添加执行权限,rc.local的首行必须有shebang机制
Centos启动过程总结
post
boot loader
vmlinux(initramfs.img)
rootfs
/sbin/init
/etc/inittab 设置默认运行级别
/etc/rc.d/rc.sysinit 运行系统初始脚本完成系统初始化
/etc/rc#.d/sxxxx 启动需要启动服务关闭对应下需要关闭的服务
/etc/rc.d/rc.local
设置登录终端
/proc 目录和内核参数管理
/proc目录:内核把自己的内部状态信息及统计信息,以及可配置参数通过proc伪文件系统加以输出
内核参数:
只读:只用于输出信息
可写:可接受用户指定”新值“来实现对内核某功能或特性的配置
sysctl命令 查看或设定此目录中诸多参数
-w 临时设置某参数
-p 读取配置文件设置参数
查看指定参数当前值
sysctl /path/to/conf_file
-a 查看所有生效参数
常用的内核参数
net.ipv4.ip_forword
net.ipv4.icmp_echo_ignore_all 禁止ping
net.ipv4.ip+nonlocal_bind #允许应用程序可以监听本地不存在的IP
vm.drop_caches 3 清除缓存
fs.file-max=##### 全局打开文件的最大数
vm.overcommit_memory = 0
0表示内核将检查是否有足够可用内存供应用进程使用,如果有足够的可用内存·,内存申请允许,否则内存申请失败,并把错误返回给应用进程
1表示内核允许分配所有的物理内存,而不管当前的内存状态如何
2表示内核允许分配超过所有物理内存和交换空间总和的内存
vm.swappiness = 10
禁用IPv6
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
/sys目录
使用sysfs文件那系统,为用户使用的伪文件系统,输出内核识别出的各硬件设备的相关属性信息,也有内核对硬件特性的设定信息,有些参数是可以修改的,用于调整硬件工作特性
udev通过此路径下输出的信息动态为各设备创建所需的设备文件,udev是运行用户空间程序
专用工具:udevadmin,hotplug
udev为设备创建设备文件时,会读取其事先定义好的规则文件,一般在/etc/udev/rules.d及/usr/lib/udev/rules.d/目录下
内核版本
运行中的内核
uname命令:print system infomation
-n 显示节点名称
-r 显示version
-a 显示所有信息
内核模块命令
lsmod命令:
显示由核心已经装载的内核模块
显示的内容来自于:/proc/modules文件
modinfo命令
功能:管理内核模块
-n 只显示模块文件路径
-p 显示模块参数
-a 作者
-d 描述
编译内核准备:
1. 准备好开发环境
2. 获取目标主机上硬件设备的相关信息
3. 获取目标主机系统功能的相关信息,例如:需要启动相应的文件系统
4. 获取内核源代码包
systemd特性
systemd:从centos7版本之后开始用systemd实现init进程,系统启动和服务守护进程管理器,负责在系统启动或运行时,激活系统资源,服务进程和其他进程
systemd新特性
1.系统引导时实现服务并启动
2.按需启动守护进程
3.自动化的服务依赖关系管理
4.同时采用socket式D-Bus总线式激活服务
5.socket与服务程序分离
6.向后兼容sysv init脚本
7.使用systemctl命令管理,systemctl命令固定不变,不可扩展,非由systemd启动的服务
8.系统状态快照
systemd核心概念:unit(单元)
查看unit类型:systemctl -t help
service unit:文件扩展名为.service,用于定义系统服务
socket unit:.socket,定义进程间通信用的socket文件,也可在系统启动时,延迟启动服务,实现按需启动
target unit:文件扩展名为.target,用于模拟实现运行级别
device unit:.device,用于定义内核识别的设备
mount unit:.mount,定义文件系统挂载点
snapshot unit:snapshot,管理系统快照
swap unit:.swap,用于表示swap设备
automount unit:.automount,文件系统的自动挂载点
path unit:path,用于定义文件系统中的一个文件或目录使用,常用于当文件系统变化时,延迟激活服务,如:spool目录
unit的配置文件
/usr/lib/systemd/system 每个服务最主要的启动脚本设置,类似于之的/etc/init.d/
/lib/systemd/system ubuntu的对应目录
/run/systemd/system 系统执行过程中所产生的服务脚本,比上面目录有限运行
/etc/systemd/system 管理员建立的执行脚本,类似于/etc/rc#.d/sxx的功能。比上面目录优先运行
systemctl管理系统服务service unit
命令:
systemctl command name.service
start | stop | restart | status |
mask 禁止自动和手动启动
unmask 取消禁止
is-active 查看某服务当前激活与否的状态
list-units 查看所有已经激活的服务
list-units --type -all 查看所有服务
enable 设定某服务开机自启,相当于chkconfig name on
disable 设定某服务开机禁止启动,相当于chkconfig name off
list-unit-files --type 查看所有服务的开机自启状态,相当于chkconfig --list
is-enabled 查看服务是否开机自启
列出失败的服务 --failed
enable --now 开机自启
disable --now 停止自启
list-dependencies 查看服务的依赖关系
systemctl kill unitname 杀掉进程
服务状态
loaded unit配置文件已处理
active(running)一次或多此持续处理的运行
active(exited)成功完成一次性的配置
active(waiting)运行中,等待一个事件
inactive 不运行
enabled 开机启动
disabled 开机不启动
static 开机不启动,但可被另一个启动的服务激活
indirect 重定向到别处
service unit文件格式
/etc/systemd/system:系统管理员和用户使用
/usr/lib/systemd/system:发行版打包者使用
unit格式说明:
以“#”开头的行后面的内容会被认为是注释
相关布尔值,1,yes,on,true都是开启,0,no,off,false都是关闭
时间单位都是秒,所以要用毫秒(ms)分钟(m)等须显示说明
service unit file文件通常由三部分组成
unit:定义与unit类型无关的通用选项,用于提供unit的描述信息,unit行为及依赖关系等
service:与特定类型相关的专用类型,此处为service类型
install:定义由“systemctl enable”以及“systemctl disable”命令在实现服务启用或禁用时用到的一些选项
unit段的常用选项
description:描述信息
after:定义unit的启动次序,表示当前unit应该晚于哪些unit启动,其功能与before相反
requires:依赖的其他units,强依赖,被依赖的units无法激活时,当前unit也无法激活
wants:依赖到的其他units,弱依赖
conflicts:定义units间的冲突关系
service段的常用选项:
Type:定义影响Ecerstart及相关参数的功能的unit进程启动类型
· simple:默认值,这个daemon主要由Exerstart接的指令串启动,启动后常驻于内存中
· forking:由Exerstart启动的程序透过spawn延申出其他子进程来作为此daemon的主要服务,原生父进程在启动后就会终止
· oneshot:与simple类似,不过这个程序在工作完毕后就结束了,不会常驻在内存中
· dbus:与simple类似:但这个daemon必须要在取得一个D-Bus的名称后,才会继续运作,因此通常也要同时设定BusNname=才行
· notify:在启动完成后会发送一个通知消息,还需要配合notifyAccess来让systemd接受消息
· idle:与simple类似,要执行这个daemon必须要所有的工作都顺利完毕后才会执行,这类的daemon通常时开机到最后才会执行即可的服务
Environmenfile:环境配置文件
Execstart:指明启动unit要运行命令或脚本的绝对路径
Execstartpre:Execstart前运行
ExecstartPost:Execstart后运行
Execstop:指明停止unit要运行的命令或脚本
Restartsec:设置在重启服务(restart=)前暂停多长时间,默认值是100毫秒(100ms),如果未指定时间单位,那么将重视以秒为单位,例如设为”20“等价于设为“20s”。
Privatetmp:设定为yes时,会在生成/tmp/systemd-private-UUID-NAME.service-xxxxx/tmp/目录
Install段常用的选项:
alias:别名,可使用systemctl command alias.service
requiredBy:被那些units所依赖,强依赖
wantedBy:被哪些units所依赖,弱依赖
Also:安装本服务的时候还要安装别的相关服务
注意:对于新建的unit文件,或者修改了的unit文件,要通知systemd重载此配置文件,而后可以选择重启
systemctl daemon-reload 重新加载systemd管理器配置
运行级别
taget units:相当于centos 6之前的runlevel,unit配置文件;.target
查看依赖性:systemctl list-dependencies name.target
级别切换:相当于init N
systemctl isolate name.target
进入默认target
systemctl default
注意:只有/lib/systemd/system/*target文件中Allowlsolate=yes才能切换(修改文件需执行systemctl daemon-reload才能生效)
获取默认运行级别,相当于查看/etc/inittab
设置内核参数
设置内核参数,只影响当此启动
启动时,到启动菜单,按e键,找到linux开头的行后添加systemd.unit=desired.target
centos7之后版本引导顺序
1.UEFI或BIOS初始化,运行POST开机自检
2.选择启动设备
3.引导装载程序,centos7是grub2加载装载程序的配置文件
/etc/grub.d/
/etc/default/grub
/boot/grub2/grub.cfg
4.加载initramfs驱动模块
5.加载内核选项
6.内核初始化,centos7使用systemd代替init
7.执行initrd.target所有单元,包括挂载/etc/fstab
8.从initramfs根文件系统切换到磁盘根目录
9.systemd执行默认target配置,配置文件/etc/systemd/system/default.target
10.systemd启动sysinit.target初始化系统及basic.target准备操作系统
11.systemd执行multi-user.target下的本机于服务器服务
12.systemd执行multi-user.target下的/etc/rc.d/rc.local
13.systemd执行multi-user.target下的getty.target及登录服务
14.systemd执行graphical需要的服务
通过systemd-analyze工具可以了解启动的详细过程
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)