Linux系统启动过程


Linux系统启动过程

  • Centos6系统启动过程及相关配置文件
  • Centos7系统启动过程及相关配置文件
  • 实战-加密grub防止黑客通过单用户系统破解root密码

Centos6系统启动过程及相关配置文件

Centos6系统启动过程

  1. 加载 BIOS 的硬件信息,跟据设定取得第一个可开机引导设置,如:光驱,硬盘,网络,USB。
  2. 读取硬盘中 MBR 的 boot Loader 就是 grub引导

    GRUB(GRand Unified Bootloader简称“GRUB”)是一个来自GNU项目的多操作系统启动程序。
    MBR的硬盘的0柱面、0磁头、1扇区称为主引导扇区(也叫主引导记录MBR)。它由三个部分组成,主引导程序、硬盘分区表DPT(Disk Partition table)和硬盘有效标志(55AA)。
  3. 依据 boot loader 的设定,到引导分区加载 Kernel ,Kernel 会开始侦测硬件并加载驱劢程序;
  4. 在硬件驱动成功后,Kernel 会主动执行 init 程序,而 init 会取得 run-level 信息;
  5. init 执行 /etc/rc.d/rc.sysinit 文件来准备软件执行的作业环境 (如网络、时区等);
  6. init 执行 run-level 下各个服务并启动 (script 方式);
  7. init 执行开机后自动运行脚本 /etc/rc.d/rc.local 文件;
  8. init 执行虚拟终端机控制程序 mingetty 来启动 login 程序,最后就等待用户登入啦;

为什么MBR分区表,只能分4个主分区?

磁盘默认一个扇区大小为:512字节。MBR由以下3部分组成:

  • 一部分是:主引导程序(boot loader)占446个字节。主引导程序,它负责从活动分区中装载,并运行系统引导程序。
  • 第二部分是Partition table区(分区表),即DPT,占64个字节,硬盘中分区有多少以及每一分区的大小都记在其中。每个分区表项长16个字节,16*4=64字节。为分区项1、分区项2、分区项3、分区项4。64字节只存4个分区表。
  • 第三部分是MBR有效标识位,占2个字节,固定为55AA。如果这个标志位0xAA55,就认为这个是MBR。所以:16*4+446+2=512

Centos6启动相关的配置文件

[root@xuegod64 Desktop]# vim /boot/grub/grub.conf
default=0 设定默认启动菜单项,当系统中有多个内核时,0表示默认加载第1个,1表示第2个内核
timeout=5 菜单项等待选项时间为5s
splashimage=(hd0,0)/grub/splash.xpm.gz 指明菜单背景图片路径为
hiddenmenu 隐藏菜单
title CentOS (2.6.32-358.6.1.el6.x86_64)  定义菜单项
root (hd0,0)  grub查找stage2及kernel文件所在设备分区,grub的根
kernel /vmlinuz-2.6.32-358.6.1.el6.x86_64 ro root=/dev/vg_have/lv_root rd_NO_LUKS LANG=en_US.UTF-8 SYSFONT=latarcyrheb-sun16 crashkernel=auto rhgb quiet 启动的内核
initrd /initramfs-2.6.32-358.6.1.el6.x86_64.img 内核匹配的ramfs文件

修改系统启动级别:

[root@xuegod64 Desktop]# vim /etc/inittab
# Default runlevel. The runlevels used are:
# 0 - halt (Do NOT set initdefault to this)
# 1 - Single user mode
# 2 - Multiuser, without NFS (The same as 3, if you do not have networking)
# 3 - Full multiuser mode
# 4 - unused
# 5 - X11
# 6 - reboot (Do NOT set initdefault to this)
# 
id:3:initdefault:    # 这里决定系统启动的级别

Centos7系统启动过程及相关配置文件

Centos7系统启动过程

CentOS7引导顺序

  1. UEFi或BIOS初始化,运行POST开机自检
  2. 选择启动设备
  3. 引导装载程序, centos7是grub2
  4. 加载装载程序的配置文件:/etc/grub.d/ /etc/default/grub /boot/grub2/grub.cfg
  5. 加载内核选项
  6. 加载initramfs初始化伪文件系统
  7. 内核初始化,centos7使用systemd代替init
  8. 执行initrd.target所有单元,包括挂载/etc/fstab
  9. 从initramfs根文件系统切换到磁盘根目录
  10. systemd执行默认target配置,配置文件/etc/systemd/system/default.target
  11. systemd执行sysinit.target初始化系统及basic.target准备操作系统
  12. systemd启动multi-user.target下的本机与服务器服务
  13. systemd执行multi-user.target下的/etc/rc.d/rc.local
  14. Systemd执行multi-user.target下的getty.target及登录服务
  15. systemd执行graphical需要的服务

centos7启动过程:

[root@love logs]# find /boot/ -name *img*
/boot/grub2/i386-pc/core.img
/boot/grub2/i386-pc/boot.img

Systemd运行原理-了解一下

Systemd概述:systemd即为system daemon [ˈdi:mən]

守护进程,是linux下的一种init软件,开发目标是提供更优秀的框架以表示系统服务间的依赖关系,并依此实现系统初始化时服务的并行启动,同时达到降低Shell的系统开销的效果,最终代替现在常用的System V与BSD风格init程序。

与多数发行版使用的System V风格init相比,systemd采用了以下新技术:

  • 采用Socket激活式与总线激活式服务,以提高相互依赖的各服务的并行运行性能;
  • 用Cgroups代替PID来追踪进程,以此即使是两次fork之后生成的守护进程也不会脱离systemd的控制。

unit对象:unit表示不同类型的systemd对象,通过配置文件进行标识和配置;文件中主要包含了系统服务、监听socket、保存的系统快照以及其它与init相关的信息

Systemd配置文件:

  • /usr/lib/systemd/system/ #这个目录存储每个服务的启动脚本,类似于之前的/etc/init.d/
  • /run/systemd/system/ #系统执行过程中所产生的服务脚本,比上面目录优先运行
  • /etc/systemd/system/ #管理员建立的执行脚本,类似于/etc/rc.d/rcN.d/Sxx类的功能,比上面目录优先运行

注意: 对于新创建的unit文件,或者修改了的unit文件,要通知systemd重载此配置文件,而后可以选择重启

[root@love ~]# systemctl daemon-reload

总结:centos5-6-7 3个系统版本启动过程:

  • CentOS 5: SysV init
  • CentOS 6: Upstart
  • CentOS 7: Systemd

管理系统服务

命令: systemctl COMMAND name.service
-CentOS6CentOS7
启动service name startsystemctl start name.service
停止service name stopsystemctl stop name.service
重启service name restartsystemctl restart name.service
状态service name statussystemctl status name.service
重载或重启服务(先加载,再启动) - systemctl reload-or-restart name.service

chkconfig命令的对应关系

-CentOS6CentOS7
设定某服务开机自启chkconfig name onsystemctl enable name.service
设定某服务开机禁止启动chkconfig name offsystemctl disable name.service
查看所有服务的开机自启状态chkconfig --listsystemctl list-unit-files --type service
用来列出该服务在哪些运行级别下启用和禁用chkconfig sshd –listls /etc/systemd/system/*.wants/sshd.service
查看服务是否开机自启 - systemctl is-enabled name.service

服务状态

[root@love ~]# systemctl list-unit-files #显示状态
loadedUnit配置文件已处理
active(running)一次或多次持续处理的运行
active(exited)成功完成一次性的配置
active(waiting)运行中,等待一个事件
inactive不运行
enabled开机启动
disabled开机不启动
static开机不启动,但可被另一个启用的服务激活

运行级别

Centos6下Linux运行级别0-6的各自含义

  • 0:关机模式
  • 1:单用户模式 ,用于破解root密码
  • 2:无网络,支持的多用户模式
  • 3:有网络支持的多用户模式(一般叫字符界面,工作中最长使用的模式)
  • 4:保留,未使用
  • 5:有网络支持,支持图形界面,支持的多用户模式(图形界面)
  • 6:重新引导系统,及重启

可以在不同级别下,设置服务是否随系统启动运行。在CentOS7上运行级别的含义已经和之前不同了,已由.target来代替运行级别,我们可以称target为目标态,我们可以通过target定制更符合我们工作运行环境。

[root@love ~]# ls /usr/lib/systemd/system/*.target # 查看我们的机器上有多少个target
[root@love ~]# ll /usr/lib/systemd/system/*.target | grep runlevel
lrwxrwxrwx. 1 root root 15 9月 19 2017 /usr/lib/systemd/system/runlevel0.target -> poweroff.target
lrwxrwxrwx. 1 root root 13 9月 19 2017 /usr/lib/systemd/system/runlevel1.target -> rescue.target
lrwxrwxrwx. 1 root root 17 9月 19 2017 /usr/lib/systemd/system/runlevel2.target -> multi-user.target
lrwxrwxrwx. 1 root root 17 9月 19 2017 /usr/lib/systemd/system/runlevel3.target -> multi-user.target
lrwxrwxrwx. 1 root root 17 9月 19 2017 /usr/lib/systemd/system/runlevel4.target -> multi-user.target
lrwxrwxrwx. 1 root root 16 9月 19 2017 /usr/lib/systemd/system/runlevel5.target -> graphical.target
lrwxrwxrwx. 1 root root 13 9月 19 2017 /usr/lib/systemd/system/runlevel6.target -> reboot.target

注:发现在runlevel2-4 都是调用multi-user.target这个unit。所以在Centos7上runlevel2-4是一个意思

[root@love ~]# systemctl list-unit-files --type target # 查看所有target的状态
[root@love ~]# systemctl list-dependencies runlevel3.target # 查看3级别Unit 的所有依赖。

Unit 之间存在依赖关系:A 依赖于 B,就意味着 Systemd 在启动 A 的时候,同时会去启动 B。也可以理解也3运行级别下都开启哪些服务
在CentOS7上所谓的目标态,其实就是由各种指定的服务和基础target组合而成的。

运行级别的切换

systemctl set-default name.target来修改我们的目标态。

实战-加密grub防止黑客通过单用户系统破解root密码

实战场景:如何防止别人恶意通过单用户系统破解root密码,进入系统窃取数据?

给grub加密,不让别人通过grub进入单用户。

基于Centos6进行grub加密

[root@love ~]# grub-md5-crypt
Password: 123456
Retype password: 123456
$1$oaqo5$3d/cmTosm68jTw6o1wCu31
[root@love init]# vim /boot/grub/grub.conf
#boot=/dev/sda
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
password --md5 $1$oaqo5$3d/cmTosm68jTw6o1wCu31
title Red Hat Enterprise Linux (2.6.32-220.el6.x86_64)
root (hd0,0)

# 重启测试:
# 编辑grub时,需要按下p键,然后输入密码:123456

基于Centos7进行grub加密

# 生成密码
[root@love ~]# grub2-mkpasswd-pbkdf2
# 输入口令: 123456
Reenter password:  123456
PBKDF2 hash of your password is
grub.pbkdf2.sha512.10000.8F355BAB512AFB7B8C990A1FEB887B8F2F3F1C54467E9B9F0535F2268E1FFC5F4E8D33F7633D7FBEC25B2039C6D8B3226A90528D4883AB9B99E391A4965D069F.DDE992693BE2C09FFEEC1149120B6B84DBAB933DE6CF7BFF718E1DDC858AB73EE32CFF45EB7F06AC45AA6792E91C4CD09E2B445FC288C47E79F537DBBABAD756

[root@love ~]# vim /etc/grub.d/00_header # 在最后后面添加如下内容,注mk这个用户名可以换成自己的用户名
cat <<EOF
set superusers='mk'
password_pbkdf2 mk
grub.pbkdf2.sha512.10000.8F355BAB512AFB7B8C990A1FEB887B8F2F3F1C54467E9B9F0535F2268E1FFC5F4E8D33F7633D7FBEC25B2039C6D8B3226A90528D4883AB9B99E391A4965D069F.DDE992693BE2C09FFEEC1149120B6B84DBAB933DE6CF7BFF718E1DDC858AB73EE32CFF45EB7F06AC45AA6792E91C4CD09E2B445FC288C47E79F537DBBABAD756
EOF

[root@love ~]# grub2-mkconfig -o /boot/grub2/grub.cfg # 更新grub信息

# 重启验证:
# 输入用户名和密码
# 看到可以进入GRUB菜单,就证明你加密成功了

# 按ctrl-x 开始启动

声明:Rock 版权所有,内容均为原创,欢迎转载。

转载:转载请注明原文链接 - Linux系统启动过程


我是一个程序员,致力于网页开发,我还很年轻,什么也不懂。