linux引导和服务

216 阅读9分钟

引导过程

linux开过过程

1. bios  开机自检查硬件是否有问题

2.mbr 主引导分区 ,加载 grub程序,分区表

3.grub 运行grub程序,找到内核等文件

4. 加载启动内核,挂载文件系统

5. 启动第一个进程 centos7  当中systemd(init在centos6中)

QQ截图20220804140903.png

systemd服务(systemd 核心概念:unit)

QQ截图20220805203206.png 1.开机自检

服务器主机开机以后,将根据主板 BIOS 中的设置对 CPU(Central Processing Unit, 中央处理器)、内存、显卡、键盘等设备进行初步检测,检测成功后根据预设的启动顺序移 交系统控制权,大多时候会移交给本机硬盘。

总结:检测出第一个能够引导系统的设备 比如硬盘或光驱

2.MBR引导

当从本机硬盘中启动系统时,首先根据硬盘第一个扇区中 MBR(Master Boot Record, 主引导记录)的设置,将系统控制权传递给包含操作系统引导文件的分区;或者直接根据 MBR 记录中的引导信息调用启动菜单(如 GRUB)。

总结:运行放在MBR扇区里的启动GRUB引导程序

3.GRUB菜单

对于 Linux 操作系统来说,GRUB(GRand Unified Bootloader,统一启动加载器)是 使用最为广泛的多系统引导器程序。系统控制权传递给 GRUB 以后,将会显示启动菜单给 用户选择,并根据所选项(或采用默认值)加载 Linux 内核文件,然后将系统控制权转交给 内核。需要注意的是,CentOS 7 采用的是 GRUB2 启动引导器。

总结:GRUB引导程序通过读取GRUB配置文件/boot/grub2/grub.cfg,来获取内核和镜像文件系统的设置和路径位置

4.加载Linux内核

Linux 内核是一个预先编译好的特殊二进制文件,介于各种硬件资源与系统程序之间, 负责资源分配与调度。内核接过系统控制权以后,将完全掌控整个 Linux 操作系统的运行过 程。在 CentOS 系统中,默认的内核文件位于“/boot/vmlinuz-3.10.0-514.el7.x86_64”。

总结:把内核和镜像文件系统加载到内存中

5.init进程初始化

为了完成进一步的系统引导过程,Linux内核首先将系统中的“/sbin/init”程序加载到内 存中运行(运行中的程序称为进程),init 进程负责完成一系列的系统初始化过程,最后等待用户进行登录

总结:加载硬件驱动程序,内核把init进程加载到内存中运行

传统SysVinit依赖于串行执行Shell 脚本启动服务,导致效率低下,系统启动速度较慢 systemd能够将更多的服务进程并行启动,并且具有提供按需启动服务的能力,使得启动更少进程,从而提高系统启动速度。

Systemd新特性

1.系统引导时实现服务并行启动
2.按需启动守护进程
3.自动化的服务依赖关系管理
4.同时采用socket式与D-Bus总线式激活服务
5.socket与服务程序分离
6.向后兼容sysv init脚本
7.使用systemctl 命令管理,systemctl命令固定不变,
8.不可扩展,非由systemd启动的服务,
9.systemctl无法与之通信和控制
10.系统状态快照

init

运行级别(init)
0关机
6重启
1单用户 系统维护  (比如改密码,破破解密码)
234=3 字符界面
5 图形界面
运行级别systemd的target含义
0target关机状态,使用该级别时将会关闭主机
1rescue.target单用户模式,不需要密码验证即可登录系统,多用于系统维护
2rescue.target用户定义/域特定运行级别。默认等同于3
3multi-user.target字符界面的完整多用户模式,大多数服务器主机运行在此级别
4multi-user.target用户定义/域特定运行级别。默认等同于3
5graphical.target图形界面的多用户模式,提供了图形桌面操作环境
6reboot.target重新启动,使用该级别时将会重启主机
systemd单元文件最初默认存放在/lib/systemd/system目录中
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
相关布尔值:
1、yes、ontrue 都是开启
0、no、offfalse 都是关闭
Restart:当设定Restart=1 时,则当次daemon服务意外终止后,会再次自动启动此服务
RestartSec: 设置在重启服务( Restart= )前暂停多长时间。 默认值是100毫秒(100ms)。 如果未指定时间单位,那么将视为以秒为单位。 
例如设为"20"等价于设为"20s"。
PrivateTmp:设定为yes时,会在生成/tmp/systemd-private-UUID-NAME.service-XXXXX/tmp/目录

ystemctl

命令格式:

 systemctl 控制类型 服务名称

command参数:

  get-default :取得当前的target

  set-default :设置指定的target为默认的运行级别

  isolate :切换到指定的运行级别

  unit.target :上面列出的运行级别

控制类型:

  • status:查看服务状态

  • start:启动

  • stop:停止

  • restart:重新启动

  • reload:重新加载

  • daemon-reload:加载新服务,让系统识别

  • enable:开机启动

  • enable --now:将服务设置为开机启动,并立即启动

  • disable:开机不启动

  • disable --now:将服务设置为开机不启动,并立即关闭该服务

示例:

systemctl get-default    获得当前的运行级别
systemctl set-default multi-user.target    设置默认的运行级别为mulit-user
systemctl isolate multi-user.target    在不重启的情况下,切换到运行级别mulit-user下
systemctl isolate graphical.target    在不重启的情况下,切换到图形界面下
chkconfig工具:

格式:

chkconfig --list [服务名称]

chkconfig --add 服务名称

chkconfig --level 级别列表服务名on/off

chkconfig --add httpd

chkconfig --level 35 httpd on

systemctl get -default
设置永久运行级别
1n -sf /lib/systemd/system/multi-user.target /etc/systemd/system/default.target
或
systemctl set -default multi-user.target
永久修改主机名
hostnamectl set-hostname newname
查看主机名的状态
hostnamectl status
设置系统语言为中文
localectl set-locale LANG=zh_ CN.utf8
查看当前系统使用的语言
localectl [status ]
如,执行以下操作即可配置 apache 服务开机自动启动或关闭,并查看开机启动状态。 
当 apache 服务设置为开机自动启动时,在/etc/systemd/system/multi-user.target.wants/目录下面会出现一个文件名为 httpd.service 的软连接文件。
当apache服务设置为开机自动关 闭时,在/etc/systemd/system/multi-user.target.wants/目录下面的 httpd.service 软连接文件 就会被删除。
在当前系统下执行“systemctl list-units --type=service”命令可以查看当前系统中所有已 激活的系统服务,
 命令如下: 
 [root@localhost ~]# systemctl list-units --type=service //查看所有已经激活的系统服务 
 UNIT LOAD ACTIVE SUB DESCRIPTION abrt-ccpp.service loaded active exited Install ABRT coredump hook abrt-oops.service loaded active running ABRT kernel log watcher abrt-xorg.serviceloaded active running ABRT Xorg log watcherdisabled

查看所有开机自启动的服务器

systemctl list-unit-files |grep enabled

排除启动类故障

###修复MBR扇区故障
MBR位于第一 块硬盘( /dev/sda) 的第一一个物理扇区处,总共512字节
1.备份MBR扇区数据到其它磁盘( /dev/sdb1)
mkdir /backup
mount /dev/sdb1 /backup
dd if=/dev/sda of=/backup/mbr.bak bs=512 count=1
2.模拟破坏MBR引导扇区
dd if=/dev/zero of=/dev/sda bs=512 count=1
3.引导界面进入急救模式,从备份文件中恢复MBR扇区数据
先加载好光盘镜像,重启操作系统,
当出现安装向导界面时,选择"Troubleshooting"选项,
再选择"Rescue a CentOS Linux system"选项,进入急救模式
选择“1"选择Continue并按Enter 键继续
再次按Enter 键后将进入带“sh-4.2#"提示符的Bash Shell环境
sh-4.2# mkdir /backupdir
sh-4.2# mount /dev/sdb1/backupdir
#挂载带有备份文件的分区
sh-4.2# dd if=/backupdir/mbr.bak of=/dev/sda
#恢复备份数据.
sh-4.2# exit
#执行exit命令退出临时Shell环境,系统将会自动重启

修:复GRUB 引导故障

/boot/grub/目录下的包是用于启动菜单的背景图片及样式
/boot/grub2/grub.cfg

GRUB配置文件

方法一“: 手动输入引导命令(笨拙繁琐,不建议使用)
grub> insmod xfs            #加载指定的模块到内核
grub> linux16 /vmlinuz-3.10.0-693.el7.x86_64 root=UUID=8fd74986-ae66-4ffd-b7d8-a19f2eca7b6f ro rhgb quiet
LANG=zh_ CN.UTF-8           #内核的名字及位置等信息
grub> initrd16 /initramfs-3.10.0-693.e17.x86_64.img           #镜像系统文件
grub> boot       #引导boot

方法二:进入急救模式,恢复GRUB引导程序

MBR位于第一 块硬盘( /dev/sda) 的第一个物理扇区处,总共512字节,前446字节是主引导记录,分区表保存在MBR扇区中的第447 
-510字节中。
mkdir /bak
mount /dev/sdb1 /bak
dd if=/dev/sda of=/bak/grub.bak bs=446 count=1
#模拟对MRB中的GRUB引导程序的破坏,但并不破坏分区表
dd if=/dev/zero of=/dev/sda bs=446 count=1
#引导界面进入急救模式,从备份文件中恢复GRUB引导程序
N
sh-4.2# mkdir /backupdir
sh-4.2# mount /dev/sdb1 /backupdir
sh-4.2# dd if=/backupdir/grub.bak of=/dev/sda
sh-4.2# exit

方法三:引导界面进入急救模式,重建GRUB菜单配置文件

rm -rf /boot/grub2/grub.cfg
#进入急救模式,加载光盘镜像,切换到系统根环境
sh-4.2# chroot /mnt/sysimage     进入光驱系统里的根     当前系统的根
#重新将GRUB引导程序安装到第一块硬盘(/dev/sda)的MRB扇区,如果有多个分区可省略
bash-4.2# grub2-install /dev/sda
#重新构建GRUB菜单的配置文件
bash-4.2# grub2-mkconfig -o /boot/grub2/grub.cfg
#退出chroot环境,并重启
bash-4.2# exit
sh-4.2# reboot

CentOS7遗忘root用户的密码或是重置

1.重启开机按esc,第一行按e在启动GRUB菜单中选择编辑选项,按键 "e" 进入编辑;
2.编辑修改:大约在第16行找到 "ro""ro" 修改为 " rw init=/sysroot/bin/bash ";
3.按Ctrl+X重启,输入命令进入系统
sh-4.2#chroot /sysroot
4.字符集修改
###修改前可修改字符集:
sh-4.2#LANG=en_US.UFT-8
###重置root密码
sh-4.2# passwd root
#退出chroot环境,并重启
bash-4.2# exit
sh-4.2# init 6