kernel 实现进程管理、内存管理、网络管理、驱动程序、文件系统、安全功能等功能
内核设计流派
宏内核(monolithic kernel):又称单内核和强内核,Unix,Linux把所有系统服务都放到内核里,所有功能集成于同一个程序,分层实现不同功能,系统庞大复杂,Linux其实在单内核内核实现了模块化,也就相当于吸收了微内核的优点。
微内核(micro kernel):Windows,Solaris,HarmonyOS简化内核功能,在内核之外的用户态尽可能多地实现系统服务,同时加入相互之间的安全保护,每种功能使用一个单独子系统实现,将内核功能移到用户空间,性能差。
服务器主机开机以后,bios会检测硬件是否正常,然后根据bios中的启动项设置,去找内核文件
硬件启动POST:Power-On-Self-Test,加电自检,是BIOS功能的一个主要部分。负责完成对CPU、主板、内存、硬盘子系统、显示子系统、串并行接口、键盘等硬件情况的检测
主板的ROM:BIOS,Basic Input and Output System,保存着有关计算机系统最重要的基本输入输出程序,系统信息设置、开机加电自检程序和系统启动自举程序等
boot 开机启动顺序: 你可以把内核文件放在何处?
1 . 硬盘
2 . 移动备,u盘 移动硬盘,光驱
3 . 网络启动
mbr (二进制) : 因为 grub 太大 第一个扇区存不下 所有的 grub 程序,所以分为2部分
当从本机硬盘中启动系统时,首先根据硬盘第一个扇区中 MBR(Master Boot Record, 主引导记录)的设置,将系统控制权传递给包含操作系统引导文件的分区;或者直接根据 MBR 记录中的引导信息调用启动菜单(如 GRUB)。 总结:运行放在MBR扇区里的启动 GRUB引导程序
系统类型双西雅图 内核文件 默认值
文件系统的驱动
grub : 根据 grub 配置文件(grub.cfg)中记录的位置, 去找到内核文件 (高级语言)
对于 Linux 操作系统来说,GRUB(GRand Unified Bootloader,统一启动加载器)是 使用最为广泛的多系统引导器程序。系统控制权传递给 GRUB 以后,将会显示启动菜单给 用户选择,并根据所选项(或采用默认值)准备加载 Linux 内核文件,然后将系统控制权转交给 内核。需要注意的是,CentOS 7 采用的是 GRUB2 启动引导器。
总结:GRUB引导程序通过读取GRUB配置文件/boot/grub2/grub.cfg,来获取内核和镜像文件系统的设置和路径位置
grub功能和组成
bootloader: 引导加载器,引导硬件去找到 内核(操作系统的核心)
Windows: ntloader,仅是启动OS
Linux:功能丰富,提供菜单,允许用户选择要启动系统或不同的内核版本;把用户选定的内核装载到内存中的特定空间中,解压、展开,并把系统控制权移交给内核
Linux的bootloader
LILO:LInux LOader,早期的bootloader,功能单一
GRUB: GRand Unified Bootloader, CentOS 5,6 GRUB 0.97: GRUB Legacy, CentOS 7 以后使用GRUB 2.02
GRUB 启动阶段
primary boot loader :
1st stage:MBR的前446个字节 引导 硬件去找 内核
1.5 stage:MBR 之后的扇区,让stage1中的bootloader能识别stage2所在的分区上的文件系统
secondary boot loader :2nd stage,分区文件/boot/grub2/grub.cfg
Linux 内核是一个预先编译好的特殊二进制文件,介于各种硬件资源与系统程序之间, 负责资源分配与调度。内核接过系统控制权以后,将完全掌控整个 Linux 操作系统的运行过 程。在 CentOS 系统中,默认的内核文件位于“/boot/vmlinuz-3.10.0-514.el7.x86_64”。
总结:把内核和镜像文件系统加载到内存中 可以使用
centos 6:
为了完成进一步的系统引导过程,Linux内核首先将系统中的“/sbin/init”程序加载到内 存中运行(运行中的程序称为进程),init 进程负责完成一系列的系统初始化过程,最后等待用户进行登录 总结:加载硬件驱动程序,内核把init进程加载到内存中运行
传统init依赖于串行执行Shell 脚本启动服务,导致效率低下,系统启动速度较慢 排队 systemd能够将更多的服务进程并行启动,并且具有提供按需启动服务的能力,使得启动更少进程,从而提高系统启动速度 大家一起
centos7 :systemd
区别:
init 串行启动后续的程序 一个一个按顺序启动
systemd 是并行启动程序 全都一起启动
linux 操作系统有运行级别 init
0 关机
1 单用户 类似于 windows 的急模式
2 字符界面 少些功能
3 字符界面
4 字符界面
5 图形界面
6 重启
runlevel 查看当前运行级别
systemctl get-default 查看默认的运行级别
systemctl set-default 设置默认的级别
bios加电自检 ----- mbr----- grub ---- 加载内核文件 ------ 启动第一个进程
加电后bios程序会自检硬件,硬件无故障后,会根据第一启动项去找内核,一般来说第一启动项是硬盘,找到硬盘后,会根据mbr 的指引 找到完整的 grub 程序,再根据grub的配置文件(grub.cfg)找到内核文件的具体位置,然后将内核文件加载到内存中运行,内存加载好后会启动第一个程序。
systemd 服务的特点:
1.对比5 6 可以解决依赖关系并行启动
2.按需启动
3.自动解决依赖关系
负责在系统启动或运行时,激活系统资源,服务器进程和其它进程
Systemd新特性
系统引导时实现服务并行启动
按需启动守护进程
自动化的服务依赖关系管理
同时采用socket式与D-Bus总线式激活服务
socket与服务程序分离
向后兼容sysv init脚本
使用systemctl 命令管理,systemctl命令固定不变,不可扩展,非由systemd启动的服务,
systemctl无法与之通信和控制
系统状态快照
systemd 核心概念:unit
unit 表示不同类型的systemd对象,通过配置文件进行标识和配置;文件中主要包含了系统服务、监听
socket、保存的系统快照以及其它与init相关的信息
systemd 保姆级
yum 以及 rpm 安装的 软件可以直接使用 systemctl 去启动 关闭,重启 开机自启 等功能
编译安装 不可以直接使用 systemctl 命令去管理程序,需要手写一个配置文件
systemd centos7
systemctl start 服务名 开启服务
systemctl stop 服务名 停止服务
systemctl status 服务名 查看系统服务状态
systemctl reload 服务名 重新加载服务
systemctl restart 服务名 重新启动服务
开机自启
systemctl enable 服务名
开机自启并立即启动
systemctl enable --now 服务名
开机不自启
systemctl disable 服务名
开机不自启并立即关闭
systemctl disable --now 服务名
在systemd中不同类型的systemd对象被统一称为单元,是让系统知道该如何进行操作和管理资源的主要对象,所以systemd有许多单元类型。
systemd单元文件最初默认存放在/lib/systemd/system目录中,每当安装新的软件都会自动在这个目录中添加一个配置文件。
systemctl 命令用于管理各种类型的systemd单元,可以使用“systemctl -t help”命令来查询systemd支持的单元类型。
单元类型 护展名 说明
Service .service 护展名
Socket .socket 描述一个进程间通信的套接字
Device .device 描述一个内核识别的设备文件
Mount .mount 描述一个文件系统的挂载点
Automoun .automount 描述一个文件系统的自动挂载点
Swap .swap 描述一个内存交换设备或目录
Timer .timer 描述一个定时器(用于实现类似cron的调度任务)
Path .path 描述一个文件系统中文件或目录(path 路径)
Snapshot .snapshot 用于保存一个systemd的状态(snapshot 快照)
Scope .scope 使用systemd的总线接口以编程的方式创建外部进程
Slice .slice 描述居于Cgroup的一组通过层次组织的管理系统进程
Target .target 描述一组systemd的单元(target 目标)
[root@localhost ~]#systemd-analyze blame
#启动过程 生成网页systemd-analyze plot > boot.html
ll /usr/lib/systemd/system
#查看system的文件位置
[root@localhost ~]# systemctl -t help
Available unit types:
service
socket
busname
target
snapshot
device
mount
automount
swap
timer
path
slice
scope
[root@localhost ~]# ls /usr/lib/systemd/system
abrt-ccpp.service plymouth-poweroff.service
abrtd.service plymouth-quit.service
abrt-oops.service plymouth-quit-wait.service
#########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:定义影响ExecStart及相关参数的功能的unit进程启动类型
EnvironmentFile:环境配置文件
ExecStart:指明启动unit要运行命令或脚本的绝对路径
ExecStartPre: ExecStart前运行
ExecStartPost: ExecStart后运行
ExecStop:指明停止unit要运行的命令或脚本
Restart:当设定Restart=1 时,则当次daemon服务意外终止后,会再次自动启动此服务
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
你已经 用程序的绝对路径启动过了
#自制systemctl 管理文件
[root@localhost ~]#vim /lib/systemd/system/hello.service
[Unit]
Description=Hello World
[Service]
TimeoutStartSec=0
ExecStart=/bin/sh -c "while true; do echo Hello World; sleep 1; done"
ExecStop=/bin/kill sh
[Install]
WantedBy=multi-user.target
[root@localhost ~]#systemctl daemon-reload
[root@localhost ~]#systemctl status hello.service
● hello.service - Hello World
Loaded: loaded (/usr/lib/systemd/system/hello.service; disabled; vendor preset: disabled)
Active: active (running) since 二 2022-03-01 00:40:54 CST; 6s ago
Main PID: 20993 (sh)
CGroup: /system.slice/hello.service
├─20993 /bin/sh -c while true; do echo Hello World; sleep 1; done
└─21005 sleep 1
3月 01 00:40:54 localhost.localdomain systemd[1]: Started Hello World.
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:定义影响ExecStart及相关参数的功能的unit进程启动类型
simple:默认值,这个daemon主要由ExecStart接的指令串来启动,启动后常驻于内存中
forking:由ExecStart启动的程序透过spawns延伸出其他子程序来作为此daemon的主要服务。原生父程序在启动结束后就会终止
oneshot:与simple类似,不过这个程序在工作完毕后就结束了,不会常驻在内存中
dbus:与simple类似,但这个daemon必须要在取得一个D-Bus的名称后,才会继续运作.因此通常也要同时设定BusNname= 才行
notify:在启动完成后会发送一个通知消息。还需要配合 NotifyAccess 来让 Systemd 接收消息
idle:与simple类似,要执行这个daemon必须要所有的工作都顺利执行完毕后才会执行。这类的daemon通常是开机到最后才执行即可的服务
EnvironmentFile:环境配置文件
ExecStart:指明启动unit要运行命令或脚本的绝对路径
ExecStartPre: ExecStart前运行
ExecStartPost: ExecStart后运行
ExecStop:指明停止unit要运行的命令或脚本
Restart:当设定Restart=1 时,则当次daemon服务意外终止后,会再次自动启动此服务
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:安装本服务的时候还要安装别的相关服务
chkconfig工具:
格式: chkconfig --list [服务名称]
chkconfig --add 服务名称
chkconfig --level 级别列表服务名on/off
chkconfig --add httpd
chkconfig --level 35 httpd on
chkconfig centos6
service 服务程序 start
service 服务程序 stop
service 服务程序 restart
service 服务程序 reload
service 服务程序 status
在/etc/init.d/写一个同名文件的脚本(必须要有 执行权限)
chkconfig --add 服务名称
chkconfig --level 35 服务程序 on 开机自启
chkconfig --level 35 服务程序 off 关闭开机自启
什么需要加入服务中 便于管理 习惯 写脚本
编译安装,不会 生成脚本,单元文件,需要手动编写
写脚本,复制yum 单元
加到服务中?
yum -y install pcre-devel zlib-devel gcc gcc-c++ make
#依赖包,编译软件
cd /opt
tar zxvf nginx-1.120.tar.gz -C /opt
cd nginx-1.120
./configure \
--prefix=/usr/local/nginx \
#安装路径
--user=nginx \
#指定用户名 指定谁来管理他
--group=nginx \
#指定用户组
--with-http_stub_status_module
#启用此模块支持状态统计
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module
useradd -M -s /sbin/nologin nginx
#创建管理用户
make && make install
#编译安装
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
#这步可以不做,做软链接,让系统可以直接使用
cat /usr/local/nginx/logs/nginx.pid
#查看nginx进程号,便于停止
停止
kill -3 进程号
vim /etc/init.d/nginx #写一个脚本
#!/bin/bash
#chkconfig: - 99 20
#description:Nginx Service Control Script
PROG="/usr/local/nginx/sbin/nginx"
PIDF="/usr/local/nginx/logs/nginx.pid"
case "$1" in
start) $PROG
;;
stop)
kill -s QUIT $(cat $PIDF)
;;
restart)
$0 stop $0 start
;;
reload)
kill -s HUP $(cat $PIDF)
;;
*) echo "Usage: $0 {start|stop|restart|reload}"
exit 1
esac
exit 0
chmod +x /etc/init.d/nginx
#给脚本加上权限
ss -ntap |grep nginx
#查看服务有没有启动
chkconfig --add nginx
#将服务加入
chkconfig --list nginx
#查看服务
chkconfig --level 35 nginx on
#开启3和5自动开启
vim /lib/systemd/system/nginx.service
[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
[Service]
Type=forking
PIDFile=/apps/nginx/run/nginx.pid
ExecStart=/apps/nginx/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
#重新加载配置
localectl set-locale LANG=zh_CN.utf8
#设置系统语言为中文
localectl set-locale LANG=en_US.utf8
#设置系统语言为英文
localectl [status ]
#查看当前系统使用的语言
第一步:新加一块盘,将 备份文件备份到 新盘
第二步:备份分区表以及 mbr
第三步:模拟破坏
可以看到无法正常开机启动了
第四步:进入到急救模式还原 sda
然后就可以正常开机了。
1.新加一块盘,将 备份文件备份到 新盘
2.dd if=/dev/sda of=/mnt/mbr count=1 bs=512 备份分区表以及 mbr
3.模拟破坏 dd if=/dev/zero of=/dev/sda count=1 bs=512
然后进入急救模式: 3 2 1
mkdir bak
mount /dev/sdb cak
dd if=cak/mbr of=/dev/sda count=1 bs=512
ifconfig 网卡名称 ip地址/子网掩码 临时设置ip地址
scp 远程复制
scp 本地文件地址 对面的地址:对面的文件夹
第一步:模拟破坏 grub.cfg 配置文件
第二步:重启进入急救模式 321
第三步:先切换根,从光盘的根切换到 自己系统的根
第四步:重新安装 grub2 程序在 sda 磁盘 并 重新生成配置文件
第五步:更改第一启动项
1. 在有光驱的情况下
进入到急救模式
chroot /mnt/sysimage 切换根目录
passwd 修改密码
exit
reboot
2.在无光驱的情况下
第一步:进入系统 在选择 内核界面 选择带一个选项 按e
第二步:将光标移动到 linux 开头行的 最后, 添加rd.break ctrl +x 运行
第三步:进入单用户 进行挂载 、切根 、修改密码 、重新打上标记操作
命令格式:
systemctl [command] [unit.target]
command参数:
get-default :取得当前的target
set-default :设置指定的target为默认的运行级别 3 5
isolate :切换到指定的运行级别
unit.target :上面列出的运行级别
示例:
init 0 systemctl isolate poweroff.target systemctl poweroff poweroff
init 1 systemctl isolate rescue.target
init 3 systemctl isolate multi-user.target
init 5 systemctl isolate graphical.target 图形
init 6 systemctl isolate reboot.target systemctl reboot reboot
0:关机
1:单用户模式(root自动登录), single, 维护模式
2:多用户模式,启动网络功能,但不会启动NFS;维护模式
3:多用户模式,正常模式;文本界面
4:预留级别;可同3级别
5:多用户模式,正常模式;图形界面
6:重启
systemctl get-default
#获得当前的运行级别
systemctl set-default multi-user.target
ln -sf /lib/systemd/system/multi-user.target /etc/systemd/system/default.target
#设置默认的运行级别为mulit-user
systemctl isolate multi-user.target
#在不重启的情况下,切换到运行级别mulit-user下
systemctl isolate graphical.target
#在不重启的情况下,切换到图形界面下
systemctl 7 管理工具
chkconfig 6 工具
/etc/init.d
chkconfig工具:
格式: chkconfig --list [服务名称]
chkconfig --add 服务名称
chkconfig --level 级别列表服务名on/off 0-6 7个级别 on off
chkconfig --add httpd
chkconfig --level 35 httpd on
#!/bin/bash
#chkconfig: - 99 20
#description:Nginx Service Control Script
PROG="/usr/local/nginx/sbin/nginx"
PIDF="/usr/local/nginx/logs/nginx.pid"
case "$1" in
start) $PROG
;;
stop)
kill -s QUIT $(cat $PIDF)
;;
restart)
$0 stop $0 start
;;
reload)
kill -s HUP $(cat $PIDF)
;;
*) echo "Usage: $0 {start|stop|restart|reload}"
exit 1
esac
exit 0
[root@localhost init.d]#ls /etc/rc*.d/
#S开头启用
[root@localhost init.d]#chkconfig --level 3 nginx on
编译安装过程
cd /opt
wget http://nginx.org/download/nginx-1.18.0.tar.gz
tar xf nginx-1.18.0.tar.gz
cd nginx-1.18.0
yum -y install gcc pcre-devel openssl-devel zlib-devel openssl openssl-devel
#请使用网络源
mkdir /apps/nginx -p
./configure --prefix=/apps/nginx
make
make install
#ln -s /apps/nginx/sbin/nginx /usr/sbin/nginx
#做软链接 可以补全 这里不怎么需要
自制 systemctl 管理文件
vim /usr/lib/systemd/system/nginx.service
[Unit]
Description=The nginx HTTP and reverse proxy server
[Service]
Type=forking
PIDFile=/apps/nginx/logs/nginx.pid
ExecStart=/apps/nginx/sbin/nginx
ExecStop=/usr/bin/kill -s TERM $MAINPID
ExecReload=/apps/nginx/sbin/nginx -s reload
[Install]
WantedBy=multi-user.target
#完成后保存并退出
systemctl daemon-reload
#nginx 要 告诉 systemd 我加入你了
systemctl start nginx
#开启nginx
各段解释:
[Unit]
Description=The nginx HTTP and reverse proxy server
#描述软件的功能
[Service]
Type=forking
PIDFile=/apps/nginx/logs/nginx.pid
# 方便使用 pid 号 进行操作 , 指明进程的 pid 号
ExecStart=/apps/nginx/sbin/nginx
#使用绝对路径启动
ExecStop=/usr/bin/kill -s TERM $MAINPID
#杀死进程
ExecReload=/apps/nginx/sbin/nginx -s reload
#重新加载
[Install]
WantedBy=multi-user.target
安装子字符界面