目录
kernel 实现进程管理、内存管理、网络管理、驱动程序、文件系统、安全功能等功能
内核设计流派
宏内核(monolithic kernel):又称单内核和强内核,Unix,Linux把所有系统服务都放到内核里,所有功能集成于同一个程序,分层实现不同功能,系统庞大复杂,Linux其实在单内核内核实现了模块化,也就相当于吸收了微内核的优点。
微内核(micro kernel):Windows,Solaris,HarmonyOS简化内核功能,在内核之外的用户态尽可能多地实现系统服务,同时加入相互之间的安全保护,每种功能使用一个单独子系统实现,将内核功能移到用户空间,性能差。
一.引导过程
1.开机自检BIOS
服务器主机开机后,根据主板BIOS的设置对cpu、内存、显卡等设备进行基础检测,检测成功后根据预设的启动程序移交系统控制权,大多时候会移交系统控制权,大多时候会移交给本机硬盘。
总结:如果是网络启动的话会开启pxe。
检测硬件是否正常然后根据BIOS中的启动项,去找操作系统
2.MBR引导
当从本机硬盘中启动系统时,首先根据硬盘第一个扇区中 MBR(Master Boot Record, 主引导记录)的设置,将系统控制权传递给包含操作系统引导文件的分区;或者直接根据 MBR 记录中的引导信息调用启动菜单(如 GRUB)
总结:运行放在MBR扇区里的启动 GRUB引导程序
统一启动加载器:MBR、GRUB
因为GRUB太大,在第一个扇区放不下,所以GRUB分为两部分
MBR是指引硬件找到内核文件
3.GRUB菜单
对于 Linux 操作系统来说,GRUB(GRand Unified Bootloader,统一启动加载器)是 使用最为广泛的多系统引导器程序。系统控制权传递给 GRUB 以后,将会显示启动菜单给 用户选择,并根据所选项(或采用默认值)准备加载 Linux 内核文件,然后将系统控制权转交给 内核。需要注意的是,CentOS 7 采用的是 GRUB2 启动引导器。
总结:GRUB引导程序通过读取GRUB配置文件/boot/grub2/grub.cfg,来获取内核和镜像文件系统的设置和路径位置
根据GRUB配置文件(grub.cfg)中记录的位置去找到内核文件(高级语言)
4.加载Linux内核
linux内核是一个预先编译好的内设二进制文件,介于各种硬件资源与系统程序之间,负责资源分配与调度,内核接过系统控制权后转交给内核后,将完全掌握整个linux操作系统的运行过程,在cenos中默认的内核文件放置位置在/boot/vmlinuz-3.10.0-514.el7.x86_64”。
总结:把内核和镜像文件系统加载到内存中 可以使用;把内核运行在内存中
5.init进程初始化
为了完成进一步的系统引导过程,linux内核首先将系统中的“/sbin/init”程序加载到内存运行(运行中的程序称为进程),init进程完成一系列的初始化过程,最后才会让用户登录
总结:加载硬件驱动程序,内核把init进程加载到内存中运行
第一个主进程
6.Centos启动过程总结
Centos7和Centos6的区别
1.普通用户的uid号范围不同
2.系统初始化进程Centos6是init,Centos7是systemd
开机启动的完整总结:
第一步加电后会BIOS程序会自检硬件,硬件无故障后,会根据第一启动项去找内核,一般来说第一启动项是硬盘,找到硬盘后,会根据MBR的指引找到完整的GRUB程序,再根据GRUB的配置文件找到内核文件的具体位置,然后将内核文件加载到内存中运行,内存加载好后会启动第一个程序。
7.系统初始化进程
7.1init进程
由Linux内核加载运行/sbin/init程序
init进程是系统中第一个进程
init进程的PID(进程标记)号永远为1
7.2Systemd
Systemd是Linux操作系统的一种init软件,是系统级程序,代为管理系统上的服务程序
Centos7中采用全新的Systemd启动方式,取代传统的SysVinit
Centos7中运行的第一个init进程是/lib/systemd/systemd
nit是串型启动后续的程序,程序之间有依赖关系,程序按顺序依次启动
systemd是并行启动程序,所有程序一起启动
引入:rpcbind程序如果启动,会监听111端口;如果rpcbind没有启动,systemd会代为监听systemd是保姆级程序,如果是yum或者编译安装的软件,都可以直接使用systemctl命令去启动、关闭、重启、开机自启等功能;但是如果是编译安装的话,需要手写一个配置文件才可以使用systemctl命令去管理程序。
7.2.1Systemd单元类型
单元类型 | 扩展名 | 说明 |
Service | .service | 描述一个系统服务软件 |
Socket | .socket | 描述一个进程间通信的套接字 |
Device | .device | 描述一个内核识别的设备文件 |
Mount | .mount | 描述一个文件系统的挂载点 |
Automount | .automount | 描述一个文件系统的自动挂载点 |
Swap | .swap | 描述一个内存交换设备或交换文件 |
Path | .path | 描述一个文件系统中文件或目录 |
Timer | .timer | 描述一个定时器(用于实现类似cron的调度任务) |
Snapshot | .snapshot | 用于保存一个systemd的状态 |
Scope | .scope | 使用systemd的总线接口以编程的方式创建外部进程 |
Slice | .slice | 描述居于Cgroup的一组通过层次组织的管理系统进程 |
Target | .target | 描述一组systemd的单元 |
Systemd unit(单元)是为了Systemd方便便利程序,将程序按照特定的功能分成了很多单元;其中服务单元最主要的是写配置文件
7.2.2运行级别所对应的Systemd目标
运行级别 | Systemd的target | 说明 |
0 | target | 关机状态,使用该级别时将会关闭主机 |
1 | rescue.target | 单用户模式,不需要密码验证即可登录系统,多用于系统维护 |
2 | muliti-user.target | 用户定义/域特定运行级别。默认等同于3 |
3 | muliti-user.target | 字符界面的完整多用户模式,大多数服务器主机运行在此级别 |
4 | muliti-user.target | 用户定义/域特定运行级别。默认等同于3 |
5 | graphical.target | 图形界面的多用户模式,提供了图形桌面操作环境 |
6 | reboot.target | 重新启动,使用该级别时将会重启主机 |
runlevel 查看当前运行级别
3代表从哪个级别过来的;5代表当前级别
- 查看默认运行级别
systemctl get-default
- 设置默认级别
systemctl set-default
- 设置混合模式
systemctl set-default multi-user.target
其中,multi-user.target 代表字符界面;graphical.target 代表图形界面
二.服务控制
1.修复MBR扇区故障
故障原因
- 病毒、木马等造成的破坏
- 不正确的分区操作、磁盘读写误操作
故障现象
- 找不到引导程序,启动中断
- 无法加载操作系统,开机后黑屏
解决思路
- 应提前做好备份文件
- 以安装光盘引导进入急救模式
- 从备份文件中回复
新建磁盘
[root@localhost ~]#fdisk /dev/sdb
欢迎使用 fdisk (util-linux 2.23.2)。
更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。
Device does not contain a recognized partition table
使用磁盘标识符 0x38fd3e00 创建新的 DOS 磁盘标签。
命令(输入 m 获取帮助):n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): p
分区号 (1-4,默认 1):
起始 扇区 (2048-41943039,默认为 2048):
将使用默认值 2048
Last 扇区, +扇区 or +size{K,M,G} (2048-41943039,默认为 41943039):
将使用默认值 41943039
分区 1 已设置为 Linux 类型,大小设为 20 GiB
命令(输入 m 获取帮助):w
The partition table has been altered!
Calling ioctl() to re-read partition table.
正在同步磁盘。
[root@localhost ~]#scan
[root@localhost ~]#lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 60G 0 disk
├─sda1 8:1 0 5G 0 part /boot
└─sda2 8:2 0 54G 0 part
├─centos-root 253:0 0 50G 0 lvm /
└─centos-swap 253:1 0 4G 0 lvm [SWAP]
sdb 8:16 0 20G 0 disk
└─sdb1 8:17 0 20G 0 part
sr0 11:0 1 4.2G 0 rom /run/media/root/CentOS 7 x86_64
将备份文件备份到新盘
模拟破坏
模拟破坏sda磁盘;if=/dev/zero代表不断往sda盘内写0
hexdump -C -n /dev/sda 可以查看输入后的效果
重启Linux系统,进入急救模式
![](https://i-blog.csdnimg.cn/blog_migrate/c6fc98078eb4f328279d1236a50e7f9f.png)
![](https://i-blog.csdnimg.cn/blog_migrate/80e55b26c43b0aeeac54bd3ae8d9ebfc.png)
进行操作
查看效果并重启
总结
第一步,新建磁盘,将备份文件备份到新盘
第二步,备份分区表及MBR
dd if=/dev/sda of=/mnt/mbr count=1 bs=512
第三步,模拟破坏
dd if=/dev/zero of=/dev/sda count=1 bs=512
第四步,进入急救模式
重启ESC进入急救模式选择Troubleshooting→Rescue a Centos system→Continue
第五步,新建文件夹、挂载、恢复
mkdir bak
mount /dev/sdb1 bak
dd if=/bak/mbr.bak of=/dev/sda count=1 bs=512
第六步,退出重启
exit→reboot
2.修复GRUB引导故障
故障原因
- MBR中的GRUB引导程序遭到破坏
- grub.conf文件丢失,引导配置有误
故障现象
- 系统引导停滞,显示“grub>”提示符
解决思路
- 尝试手动输入引导命令
- 进入急救模式,重写或者从备份中恢复grub.conf
- 向MBR扇区中重建grub程序
grub只需备份446字节
实验操作过程
进入急救模式与MBR修复一致
先模拟破坏grub.cfg配置文件
重启进入急救模式
与MBR分区抢修一致
先切换根目录
从光盘的根目录切换到当前系统的根
重新安装grub程序
重新生成配置文件
退出并重启
总结
第一步,先模拟破坏grub.cfg配置文件
mv /boot/grub2/grub.cfg /opt
第二步,重启进入急救模式选择Troubleshooting→Rescue a Centos system→Continue
第三步,先切换根目录,从光盘的根切换到当前系统的根
chroot /mnt/sysimage
第四步,重新安装grub程序在sda磁盘
grub2-install /dev/sda
第五步,重新生成配置文件
grub2-mkconfig -o /boot/grub2/grub.cfg
第六步,退出重启
exit→reboot
3.破解密码
3.1有光驱
最后exit退出
reboot重启
Xshell连接成功即为成功
3.2无光驱
进入内核界面
进入单用户模式
修改密码
重新输入密码登录即可成功
总结
第一步,进入系统在选择内核界面,选择第一个选项按E键进入内核操作界面
第二步,光标移动到Linux开头行最后,添加rd.break,Ctrl + x 进入单用户界面
第三步,重新挂载
mount -o remount,rw /sysroot #重新挂载 添加读写权限
第四步,切换到真正的根目录
chroot /sysroot
第五步,修改密码
passwd
第六步,退出并重启
exit→reboot
延伸:如果开启了selinux的话需要重新打上标记
4.系统服务控制
systemctl 控制类型 服务名称
控制类型
控制名 | 含义 |
start | 启动 |
stop | 停止 |
reload | 重新加载 |
staus | 查看服务状态 |
- Centos6 chkconfig
- Centos7 systemd
0123456代表级别
0代表关机;1代表单用户;234代表字符界面(2没有nfs;4没有用过);5图形化界面;6重启
服务程序的特点
- 一旦运行,一直运行
- 一般是后台运行,不会影响前台操作
服务控制命令
Centos6
Service | 服务程序 | start | 开启 |
stop | 关闭 | ||
restart | 重启 | ||
reload | 重新加载配置文件 | ||
status | 查看服务状态 |
在/etc/init.d写一个同名文件的脚本(必须要有执行权限)
chkconfig --add 服务名称
chkconfig --level 35 服务程序 on 开机自启
chkconfig --level 35 服务程序 off 关闭开机自启
Centos7
systemctl | start | 服务名 | 开启服务(可以同时启动12345多个程序服务) |
stop | 关闭服务 | ||
restart | 查看服务状态 | ||
reload | 重新加载配置文件 | ||
status | 重启服务 |
systemctl enable 服务名 开机自启
systemctl enable --now 服务名 开机自启并立即启动
systemctl disable 服务名 开机不自启
systemctl disable --now 服务名 开机不自启并立即关闭
如果用yum安装以及rpm安装 会自动生成一个配置文件 不需要我们手动加入systemd会自己添加
5.使用Systemd编译安装nginx程序
编译安装
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 /cxk/nginx -p
./configure --prefix=/cxk/nginx
make
make install
ln -s /apps/nginx/sbin/nginx /usr/sbin/nginx
#做软链接 可以补全
####以上操作可以直接新建vim.test.sh进行操作
###然后使用bash test.sh进行上述操作
开启Nginx服务并测试
编辑nginx服务项
开启Nginx服务并测试
[root@localhost nginx-1.18.0]#systemctl start nginx.service
##开启nginx服务
[root@localhost nginx-1.18.0]#systemctl status nginx.service
##查看nginx服务状态信息
● nginx.service - The nginx HTTP and reverse proxy server
Loaded: loaded (/usr/lib/systemd/system/nginx.service; disabled; vendor preset: disabled)
Active: active (running) since 二 2024-01-02 22:04:16 CST; 6s ago
Main PID: 5970 (nginx)
CGroup: /system.slice/nginx.service
├─5970 nginx: master process /ghd/nginx/sbin/nginx
└─5971 nginx: worker process
1月 02 22:04:16 localhost.localdomain systemd[1]: Started The nginx HTTP and r....
1月 02 22:04:16 localhost.localdomain systemd[1]: Starting The nginx HTTP and ....
Hint: Some lines were ellipsized, use -l to show in full.
[root@localhost nginx-1.18.0]#systemctl stop nginx.service
##终止nginx服务
[root@localhost nginx-1.18.0]#systemctl status nginx.service
##查看nginx服务状态信息
● nginx.service - The nginx HTTP and reverse proxy server
Loaded: loaded (/usr/lib/systemd/system/nginx.service; disabled; vendor preset: disabled)
Active: inactive (dead)
1月 02 22:04:16 localhost.localdomain systemd[1]: Started The nginx HTTP and r....
1月 02 22:04:16 localhost.localdomain systemd[1]: Starting The nginx HTTP and ....
1月 02 22:04:29 localhost.localdomain systemd[1]: Stopping The nginx HTTP and ....
1月 02 22:04:29 localhost.localdomain systemd[1]: Stopped The nginx HTTP and r....
Hint: Some lines were ellipsized, use -l to show in full.