Linux的引导过程与服务控制
Posted NicolasNRH
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux的引导过程与服务控制相关的知识,希望对你有一定的参考价值。
@TOC
Linux引导过程与服务控制
Linux操作系统引导过程
引导过程总览(简)
-
开机自检(Bios)
服务器主机开机以后,将根据主板BIOS中的设置对CPU、内存、显卡、键盘等设备进行初步检测,检测成功后根据预设的启动顺序移交系统控制权,大多时候会移交给本机硬盘。
==总结:检查硬件设备,检测出第一个能够引导系统的设备,比如硬盘或者光驱==
-
MBR引导
当从本机硬盘中启动系统时,首先根据硬盘第一个扇区中MBR(主引导记录)的设置,将系统控制权传递给包含操作系统引导文件的分区;或者直接根据MBR记录中的引导信息调用启动菜单(如GRUB) 。
==总结:运行放在MBR扇区里的启动GRUB引导程序==
-
GRUB菜单
对于Linux操作系统来说,GRUB(统一启动加载器)是使用最为广泛的多系统引导器程序。系统控制权传递给GRUB以后,将会显示启动菜单给用户选择,并根据所选项(或采用默认值〉加载Linux内核文件,然后将系统控制权转交给内核。
CentOS 7采用的是GRUB2启动引导器。
==总结: GRUB引导程序通过读取GRUB配置文件/boot/grub2/grub.cfg,来获取内核和镜像文件系统的设置和路径位置==
-
加载Linux内核
Linux内核是一个预先编译好的特殊二进制文件,介于各种硬件资源与系统程序之间,负责资源分配与调度。内核接过系统控制权以后,将完全掌控整个Linux操作系统的运行过程。
Centos 7系统中,默认的内核文件位于"/boot/vmlinuz-3.10.0-514.el7.x86_64"。
==总结:把内核和镜像文件系统加载到内存中==
-
init进程初始化
为了完成进一步的系统引导过程,Linux内核首先将系统中的"/sbin/init"程序加载到内存中运行(运行中的程序称为进程),init进程负责完成整个系统的初始化,最后等待用户进行登录。
==总结:加载硬件驱动程序,内核把init进程加载到内存中运行==
系统初始化进程
-
init进程
- 由Linux内核加载运行/sbin/init程序
- init进程是系统中第一个进程,是所有进程的父进程
- init进程的PID(进程标记)号永远为1
-
Systemd
-
Systemd是Linux操作系统的一种init软件
- CentOS7中采用全新的Systemd启动方式,取代传统的SysVinit(CentOS 5,6)
取代传统的串行的脚本启动方式(/etc/init.d/一个接一个)
Systemd能够将更多的服务进程并行启动,并且具有提供按需启动服务的能力,使得启动更少进程,从而提高系统启动速度
- CentOS7中运行的第一个init进程是/lib/systemd/systemd
-
-
Systemd单元类型
单元类型 扩展名 说明 ==Service== .service 描述一个系统服务 Socket .socket 描述一个进程间通信的套接字(ip:端口) Device .device 描述一个内核识别的设备文件 Mount .mount 描述一个文件系统的挂载点 Automount .automount 描述一个文件系统的自动挂载点 Swap .swap 描述一个内存交换设备或交换文件 Path .path 描述一个文件系统中文件或目录 Timer .timer 描述一个定时器(用于实现类似cron的调度任务) Snapshot .snapshot 用于保存一个systemd的状态 Scope .scope 使用systemd的总线接口以编程的方式创建外部进程 Slice .slice 描述居于Cgroup(限制io,内存)的一组通过层次组织的管理系统进程 ==Target== .target 描述一组systemd的单元
运行级别所对应的Systemd目标
运行级别 | Systemd的target | 说明 |
---|---|---|
0 | target | 关机状态 |
1 | rescue.target | 单用户模式,不需要密码验证即可登录系统,多用于系统维护 |
2 | multi-user.target | 用户定义/域特定运行级别。默认等同于3 |
3 | multi-user.target | 字符界面的完整多用户模式,大多数服务器主机运行在此级别 |
4 | multi-user.target | 用户定义/域特定运行级别。默认等同于3 |
5 | graphical.target | 图形界面的多用户模式,提供了图形桌面操作环境 |
6 | reboot.target | 重新启动,使用该级别时将会重启主机 |
命令 | 命令 | 命令 | 结果 |
---|---|---|---|
init 0 | systemctl isolate poweroff.target | (systemctl) poweroff | 关机(shutdown) |
init 1 | systemctl isolate resue.target | 切换单用户模式 | |
init 3 | systemctl isolate multi-user.target | 切换字符界面多用户模式 | |
init 5 | systemctl isolate graphical.target | 切换图形界面多用户模式 | |
init 6 | systemctl isolate reboot.target | (systemctl) reboot | 重启 |
排除启动类故障
修复MBR扇区故障
- 故障原因
- 病毒,木马等造成的破坏
- 不正确的分区操作,磁盘读写误操作
- 故障现象
- 找不到引导程序,启动中断
- 无法加载操作系统,开机后黑屏
- 解决思路
- 应提前作好备份文件
- 以安装光盘引导进入急救模式
- 从备份文件中恢复
故障模拟恢复
-
修复MBR扇区故障
MBR位于第一块硬盘(/dev/sda)的第一个物理扇区处,总共512字节
-
备份MBR扇区数据到其它磁盘(/dev/sdb1)
mkdir /backup
mount /dev/sdb1 /backup
dd if=/dev/sda of=/backup/mbr.bak bs=512 count=1
-
模拟破坏MBR引导扇区
dd if=/dev/zero of=/dev/sda bs=512 count=l
-
引导界面进入急救模式,从备份文件中恢复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引导故障
- 故障原因
- MBR中的GRUB引导程序(1--446字节)遭到破坏
- grub.confg文件丢失、引导配置有误
-
故障现象
- 系统引导停滞,显示"grub>"提示符
-
解决思路
- 尝试手动输入引导模式(步骤繁琐,需要手动输入/boot/grub2/grub.cfg中的配置信息,很容易出错,不建议使用)
grub> insmod xfs //加载指定的模块到内核
grub> linux16 /vmlinuz-0-rescue-3e3bbcbbcd23437fabc66e7016070505 root=/dev/mapper/centos-root ro rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet //内核的名字及位置等信息,UUID等信息每台设备都不同
grub> initrd16 /initramfs-0-rescue-3e3bbcbbcd23437fabc66e7016070505.img //镜像系统文件
grub> boot //引导boot
-
进入急救模式,重写或者从备份中恢复grub.confg(数据被破坏,上述第一个原因)(和恢复MBR类似,不作赘述)
-
MBR位于第一块硬盘(/dev/sda)的第一个物理扇区处,总共512字节,前446字节时主引导记录,分区表保存在MBR扇区中的第447-519字节中。
-
mkdir /bak
mount /dev/sdb1 /bak
dd if=/dev/sda of=/bak/grub.bak bs=446 count=1
-
模拟对MBR中的GRUB引导程序的破坏,但并不破坏分区表
dd if=/dev/zero of=/dev/sda bs=446 count=1
-
引导界面进入急救模式,从备份文件中恢复GRUB引导程序
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
- 向MBR扇区中重建grub程序(引导界面进入急救模式,重建GRUB菜单配置文件)
rm -rf /boot/grub2/grub.cfg //模拟丢失GRUB菜单配置文件
进入急救模式,加载光盘镜像,切换到系统根环境(急救模式进入方法同上)
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
==此方法对于多个硬盘的Linux系统可能会出现第一次重启无法正常启动的情况,多数情况下可以正常启动,要做好MBR程序备份==
遗忘root用户密码
-
故障原因
遗忘用户密码
-
故障现象
无法进行需要root权限的管理操作
若没有其他账号可用,将无法登录系统
-
解决思路
进入急救模式,重设密码
- 按上例进入引导界面更改密码
passwd root
- 重新登陆即可
服务控制及切换运行级别
系统服务控制
systemctl 控制类型 服务名称
-
控制类型 6
- start:启动
- stop:停止
- restart:重新启动(对于关闭的服务等于start)
- status:查看服务状态
- reload:重新加载配置文件(修改了配置文件后,重启耗时较长或者不适宜重启使用)
Linux系统的运行级别
-
查看运行级别
-
runlevel命令:只能查看切换前一次的运行级别于当前运行级别
- systemctl工具(systemctl get-default):只能查看默认的运行级别
-
-
临时切换运行级别
-
init命令:命令参数是运行级别对应的数字
- systemctl工具:命令参数是具体的targrt(上面已经给出)
-
-
设置永久运行级别
systemctl set-default 命令级别(.target)
ln -sf /usr/lib/systemd/system/graphical.target(命令级别.target) /etc/systemd/system/default.target //强制覆盖软链接文件
优化启动过程
ntsysv工具
-
命令行输入ntsysv会出现图形交互界面
上下键移动光标,空格选择打上星号和取消星号(有星号的服务开机自启)
Tab键切换操作按键
回车选择确定/取消
systemctl / chkconfig工具
systemctl
-
查询服务是否开机自启
systemctl is-enabled 服务名
开机自启-> enabled ; 开机不自启-> disabled
-
开启关闭服务的开机自启
systemctl enable 服务名
systemctl disable 服务名
-
查询服务是否启动
systemctl is-active 服务名
未开启(但是开机会自启)->inactive ; 开启->active ; 未开启且开机不自启->unknown
-
打开并设置开机自启(disable同理)
systemctl enable --now 服务名
chkconfig
- 只能对/etc/init.d/中的服务实现管理
- 需要在/etc/init.d/中写入脚本文件
- 脚本文件中的"# chkconfig: 2345 10 90"字段三段数字分别表示开机自启的运行级别(-:都不自启),开机第几个启动,关机第几个关闭。
chkconfig --add 创建的服务名 //添加有可执行权限的命令至系统中
chkconfig --list [服务名] //查看服务相关信息
chkconfig --level [0123456] 服务名 on/off //更改设定的运行级别下,该服务是否开机自动启动
- 添加脚本之后可以使用
service 服务名 控制类型
进行管理
一点相关知识
主机相关
-
永久修改主机名
hostnamectl set-hostname newname
-
查看主机名状态
hostnamectl status
设置系统语言
-
设置系统语言为中文
localectl set-locale LANG=zh_CN.utf8 //万国字符集UTF8(ASCII码演化)
-
查看当前系统使用的语言
localectl [status]
查看启动用时
-
sytemd-analyze
以上是关于Linux的引导过程与服务控制的主要内容,如果未能解决你的问题,请参考以下文章