CentOS6/7系统引导过程_centos引导-程序员宅基地

技术标签: Liunx  系统引导过程  linux  grub  

Centos6的引导过程

在这里插入图片描述

一、硬件启动阶段

在这里插入图片描述

BIOS(Basic input/output System)基本输入输出系统
大致流程分为:打开电源 ——> POST自检 ——> bios逐一排查设备启动顺序 ——> 如果是硬盘启动,读取硬盘的MBR的BootLoader。

按下电源以后,CPU第一条指令指向bios芯片(ROM只读存储器;一般情况为只读)中的bios程序载入到内存运行。程序运行识别检测各个硬件
如果检测到硬件有问题时:

  1. 硬件相关指示灯亮起(红、橙)
  2. 屏蔽有问题的硬件继续进行下一步(将有问题的硬件所在槽位设置为disabled);如果达到临界点无法进行下一步会卡住

BIOS程序自检完成后会加载CMOS芯片中(RAM随机存储器)的BIOS设置信息(时间、密码、启动项等)
Boot Sequence(BIOS)为用户设定启动顺序由哪个设备启动计算机,如果硬盘、光驱、USB、U盘等,按照设定的顺序,遍历设备的第0柱面的第0磁道第1个扇区(MBR)。如果发现这个扇区以0XAA55结束,则认为它是一个可引导扇区,进行下一阶段,否则继续遍历,如果都没有BIOS提示没有找到系统。

MBR介绍

在这里插入图片描述

  • MBR(Main Boot Record),是磁盘的0柱面。0磁道,1扇区(第一个扇区),称为主引导扇区,也称为主引导记录。
  • 它由三部分组成:主引导程序(BootLoader)、磁盘分区表DPT(Disk Partition table)、磁盘有效标识(55AA)。
  • 注:磁盘默认一个扇区512字节。

在这里插入图片描述

  • 主引导程序446字节。
    • 其中包含了硬盘的一系列参数和一端引导程序,其中硬盘引导程序的主要作用是检查分区表是否正确并且在系统系统硬件完成自检后引导具有激活标志的分区上的操作系统,并将控制权交给启动程序。它不依赖任何操作系统,而且硬盘引导程序也是可以改变的,从而实现多系统共存
    • 加载磁盘的0柱面。0磁道,1扇区中前512字节到内存地址00000:7c00中
    • 如主引导记录: 80 01 01 00 0B FE BF FC 3F 00 00 00 7E 86 BB 00。 在这里我们可以看到,最前面的“80”是一个分区的激活标志,表示系统可引导;“01 01 00”表示分区开始的磁头号为01,开始的扇区号为01,开始的柱面号为00;“0B”表示分区的系统类型是FAT32,其他比较常用的有04(FAT16)、07(NTFS);“FE BF FC”表示分区结束的磁头号为254,分区结束的扇区号为63、分区结束的柱面号为764;“3F 00 00 00”表示首扇区的相对扇区号为63;“7E 86 BB 00”表示总扇区数为12289622。
  • 磁盘分区表DPT64字节
    • 每个bai分区项占用16个字节du,这16个字节中存有活动状态标志、文件系统标识、起止柱面号、磁头号、扇区号、隐含扇区数目(4个字节)、分区总扇区数目(4个字节)等内容。
  • 磁盘有效标识2字节
    • 固定为0xAA55或0x55AA,这取决于处理器类型 ,如果是小端模式处理器 (如Intel系列),则该值为0xAA55;如果是大端模式处理器 (如Motorola6800),则该值为0x55AA

二、GRUB引导阶段

GRUB是一个启动管理器,和Linux没有强制的关系,当然也可以用GRUB启动Windows。可以通过rpm -qi grub命令查看grub的版本。
在这里插入图片描述

1、Stage1阶段

这一阶段其实执行的就是系统安装时预先写入到MBR的Bootloader程序。它的任务仅是读取(加载)硬盘的0柱面,0磁道,2扇区的内容(/boot/grub/stage1)并执行。
其实Linux的loader为stage1那个文件刚好512字节,我们在安装Linux的时候,系统会把stage1文件安装到所在分区的boot sector中,同时默认Linux启动的话,也需要把stage1中的引导代码安装到MBR中的boot loader中。该文件太小,能完成的功能有限

[root@wzp ~]$ ll /boot/grub/stage1
-rw-r--r--. 1 root root 512 723 08:21 /boot/grub/stage1
这一阶段,使硬件初始化,为Stage2准备RAM空间(内存空间),
读取Stage2到RAM空间(应该涉及到了Stage1.5阶段)。
就是Stage1.5阶段或Stage2阶段的入口,引导进入Stage1.5阶段或Stage2阶段。
另外,这一阶段并没有识别文件系统的能力。
2、Stage1.5阶段

一阶段是Stage1阶段和Stage2阶段的桥梁,具有识别分区文件系统的能力,此后grub程序便有能力去访问/boot/grub/stage2,并将其读取到内存执行。
GRUB在不依赖Linux内核的情况下具有读取配置文件与内核映像的能力”。GRUB的内置文件系统其实是依靠stage1_5那些文件定义的,而且有不同文件系统的stage1_5。我们在安装Linux的时候会把stage1_5相关文件放到0磁道1-62扇区中(一个磁道63个扇区,划分分区是从1磁道开始的,除了MBR外,所以会有62个扇区作为保留扇区),用于定义grub的文件系统。

ll /boot/grub/*stage1_5
-rw-r--r--. 1 root root 13380 7/boot/grub/e2fs_stage1_5
-rw-r--r--. 1 root root 12620 7/boot/grub/fat_stage1_5
-rw-r--r--. 1 root root 11748 7/boot/grub/ffs_stage1_5
-rw-r--r--. 1 root root 11756 7/boot/grub/iso9660_stage1_5
-rw-r--r--. 1 root root 13268 7/boot/grub/jfs_stage1_5
-rw-r--r--. 1 root root 11956 7/boot/grub/minix_stage1_5
-rw-r--r--. 1 root root 14412 7/boot/grub/reiserfs_stage1_5
-rw-r--r--. 1 root root 12024 7/boot/grub/ufs2_stage1_5
-rw-r--r--. 1 root root 11364 7/boot/grub/vstafs_stage1_5
-rw-r--r--. 1 root root 13964 7/boot/grub/xfs_stage1_5
3、Stage2阶段

这一阶段会(初始化本阶段需要用到的硬件,检测系统的内存映像,)解析grub的配置文件/boot/grub/grub.cnf、menu.list等,根据配置文件加载内核镜像到内存中,通过initrd程序建立虚拟根文件系统,最后调用(转交)内核

[root@wzp ~] cat /boot/grub/grub.conf
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE:  You have a /boot partition.  This means that
#          all kernel and initrd paths are relative to /boot/, eg.
#          root (hd0,0)
#          kernel /vmlinuz-version ro root=/dev/mapper/vg_wzp-lv_root
#          initrd /initrd-[generic-]version.img
#boot=/dev/sda
default=0                                   //设置默认启动项为第一个内核,1表示第二个
timeout=5                                   //菜单项等待选项时间为5秒
splashimage=(hd0,0)/grub/splash.xpm.gz      //菜单背景图片,这里的hd0,0是第一个硬盘的第一个分区,没有/dev/sd*的概念
hiddenmenu                                  //是否显示选单画面
#这里有时候会有passwrod参数,意思是进入急救模式(单用户模式)的密码是多少,可以是明文密码,可以是加密密码
#例如password --md5 $1$1S9Xy$1MuGZSoPc2vAtkW.jvz0X/,这代表进入急救模式的password经过MD5加密,加密密码为$1$1S9Xy$1MuGZSoPc2vAtkW.jvz0X/

title CentOS (2.6.32-431.el6.x86_64)        //菜单项名称,可以自定义
    root (hd0,0)                            //grub查找stage2文件及kernel文件所在设备分区,grub的根。第一块硬盘的第一个分区
    //启动的内核
    kernel /vmlinuz-2.6.32-431.el6.x86_64 ro root=/dev/mapper/vg_wzp-lv_root rd_NO_LUKS rd_LVM_LV=vg_wzp/lv_swap rd_NO_MD crashkernel=auto LANG=zh_CN.UTF-8 rd_LVM_LV=vg_wzp/lv_root  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
# 内核文件;读取内核文件之后要挂载/目录,只读,root后跟真正的/目录挂载的分区
# rhgb 表示默认图形显示,把启动过程覆盖掉
# quit表示系统启动时将模块启动的详细信息屏蔽,只显示模块启动时候成功(ok or failed)

    initrd /initramfs-2.6.32-431.el6.x86_64.img     //内核匹配的ramfs文件,img是镜像文件

在这里插入图片描述

  • BootLoader
    • 不同的系统有不同的主引导程序(BootLoader)。Windows使用的是NTLDR(NT Loader,Windows NT系列操作系统)、Bootmgr(Boot Manager,Windows Vista,7,8,10),Linux一般使用的是grub(也叫grub legacy)和grub2。
    • CentOS6一般使用的是grub。GRUB(GRand Unified Bootloader)是一个来自GNU项目的多操作系统启动程序。

boot loader怎么能够做到引导的就是我们想要的操作系统呢?这么多不同的功能单靠一个446字节的boot loader是远远不够的。因此必须弄一个相对应的程序来处理各自对应的操作系统核心文件,这个程序就是操作系统的loader(注意不是MBR中的boot loader),这样一来boot loader只需要将控制权交给对应操作系统的loader,让它负责去启动操作系统就行了。

在这里插入图片描述
我们知道一个硬盘的每个分区的第一个扇区叫做boot sector,这个扇区存放的就是操作系统的loader,所以我们常说一个分区只能安装一个操作系统,如上图,第一个分区的boot sector存放着windows的loader,第二个分区放着Linux的loader,第三个第四个由于没有安装操作系统所以空着。

Boot loader的功能:
提供选单就是给用户提供一张选项单,让用户选择进入哪个操作系统;

  1. 提供选择菜单
  2. 读取内核文件
  3. 转交给其他loader

读取内核文件,我们知道系统会有一个默认启动的操作系统,这个操作系统的loader在所在分区的boot sector有一份,除此之外,也会将这个默认启动的操作系统的loader复制一份到MBR的boot loader中,这样一来MBR就会直接读取boot loader中的loader了,然后就是启动默认的操作系统;

安装windows操作系统的时候,windows会主动复制一份自己的loader到MBR中的boot loader中,这种操作在linux下不会。所以我们安装多重操作系统的时候要求先安装windows,然后再安装Linux;我们假设先安装Linux,再安装windows的时候就会自动把windows的loader复制到MBR中的boot loader,这样一来就会默认优先启动windows。然而先安装windows,自动复制windows的loader到boot loader,再安装Linux的时候,我们可以设置把Linux的loader复制到boot loader中,把原先windows的覆盖掉,这样才能设置Linux默认启动。**

三、内核引导阶段

在这里插入图片描述

  1. MBR将内核文件(代码)载入物理内存中执行,内核就是/boot/vmlinuz-2.6.32-431.el6.x86_64
  2. 控制权转交给内核后,内核重新检测各种硬件信息,(第一次为POST自检),然后加载各种驱动和模块。
  3. 这些模块在/lib/modules/2.6.32-431.el6.x86_64/下。(/和/lib/modules/不能挂载不同的分区),此时内核还没有文件系统的概念,也无法挂载根目录。
  4. 此时使用一个过渡的临时根系统使得内核可以得到根文件系所需要的根设备位置、设备驱动等。

该文件系统在内存中,本质是一个ramfs文件系统。/boot/initramfs-2.6.32-431.el6.x86_64.img

[root@wzp ~] file /boot/initramfs-2.6.32-431.el6.x86_64.img
/boot/initramfs-2.6.32-431.el6.x86_64.img: gzip compressed data, from Unix, last modified: Thu Jul 23 08:20:56 2020, max compression
#发现该文件是一个gzip的压缩文件,gzip解压文件必须以.gz为后缀
[root@wzp ~] cp /boot/initramfs-2.6.32-431.el6.x86_64.img /root/ramfs.gz
[root@wzp ~] gzip -d ramfs.gz
[root@wzp ~] file ramfs
ramfs: ASCII cpio archive (SVR4 with no CRC)
#使用cpio解压
[root@wzp ~] mkdir init
[root@wzp ~] cd init
[root@wzp init] cpio -id < /root/ramfs
91590 块
[root@wzp init] ls
bin      dracut-004-335.el6  init                initqueue-settled  lib64      pre-trigger  sbin     tmp
cmdline  emergency           initqueue           initqueue-timeout  mount      pre-udev     sys      usr
dev      etc                 initqueue-finished  lib                pre-pivot  proc         sysroot  var
#内容类似于真正/目录下内容,这是因为这是一个最小化的Linux根文件系统。
#内核就是先把这个文件展开,形成一个虚拟文件系统,内核借虚拟文件系统装载必要的模块,完成后释放该虚拟文件系统并挂载真正的根目录。

#!initd的制作
mkinitrd /boot/initramfs-$(uname -r).img $(uname -r)
dracut /boot/initramfs-$(uname -r).img $(uname -r)

四、init初始化阶段(系统初始化)

在这里插入图片描述

  1. 这里第一步:执行/sbin/init程序,读取/etc/inittab确认系统运行级别,然后执行/etc/rc.d/rc?.d,?为对应的运行级别(0~6)。
  2. 于此同时执行系统初始化脚本/etc/rc.syslink(软连接指向/etc/rc.d/rc.syslink),定义主机名,不存在则定义为localhost、读取/etc/sysconfig/network文件,设置网络、挂载内存装置/proc和USB装置/sys,如果存在USB设备,会加载usb模块和usb文件系统、SELINUX的一些相关配置、设定text banner,显示欢迎界面等等
  3. 加载 /etc/rc.local(软连接,指向/etc/rc.d/rc.local)用户自定义脚本
#/etc/inittab文件
[root@wzp ~] cat /etc/inittab
# inittab is only used by upstart for the default runlevel.
# ADDING OTHER CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
# System initialization is started by /etc/init/rcS.conf
# Individual runlevels are started by /etc/init/rc.conf
# Ctrl-Alt-Delete is handled by /etc/init/control-alt-delete.conf
# Terminal gettys are handled by /etc/init/tty.conf and /etc/init/serial.conf,
# with configuration in /etc/sysconfig/init.
#
# For information on how to write upstart event handlers, or how
# upstart works, see init(5), init(8), and initctl(8).
# 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:
#上述对应为id:runlevel:action:process,即id:运行级别:init的动作行为,initdefault表示默认启动的运行级别:执行动作的指令,一般为脚本

#/etc/rc.d/rc?.d/
[root@wzp ~] ll /etc/rc.d/
总用量 60
drwxr-xr-x. 2 root root  4096 723 08:20 init.d
-rwxr-xr-x. 1 root root  2617 1123 2013 rc
drwxr-xr-x. 2 root root  4096 723 08:20 rc0.d
drwxr-xr-x. 2 root root  4096 723 08:20 rc1.d
drwxr-xr-x. 2 root root  4096 723 08:20 rc2.d
drwxr-xr-x. 2 root root  4096 723 08:20 rc3.d
drwxr-xr-x. 2 root root  4096 723 08:20 rc4.d
drwxr-xr-x. 2 root root  4096 723 08:20 rc5.d
drwxr-xr-x. 2 root root  4096 723 08:20 rc6.d
-rwxr-xr-x. 1 root root   220 1123 2013 rc.local
-rwxr-xr-x. 1 root root 19688 1123 2013 rc.sysinit

[root@wzp ~] ll /etc/rc.d/rc3.d/
总用量 0
lrwxrwxrwx. 1 root root 19 723 08:19 K10saslauthd -> ../init.d/saslauthd
lrwxrwxrwx. 1 root root 20 723 08:19 K50netconsole -> ../init.d/netconsole
lrwxrwxrwx. 1 root root 21 723 08:19 K87restorecond -> ../init.d/restorecond
lrwxrwxrwx. 1 root root 15 723 08:19 K89rdisc -> ../init.d/rdisc
lrwxrwxrwx. 1 root root 22 723 08:20 S02lvm2-monitor -> ../init.d/lvm2-monitor
lrwxrwxrwx. 1 root root 19 723 08:19 S08ip6tables -> ../init.d/ip6tables
lrwxrwxrwx. 1 root root 18 723 08:19 S08iptables -> ../init.d/iptables
lrwxrwxrwx. 1 root root 17 723 08:19 S10network -> ../init.d/network
lrwxrwxrwx. 1 root root 16 723 08:20 S11auditd -> ../init.d/auditd
lrwxrwxrwx. 1 root root 17 723 08:19 S12rsyslog -> ../init.d/rsyslog
lrwxrwxrwx. 1 root root 20 723 08:19 S22messagebus -> ../init.d/messagebus
lrwxrwxrwx. 1 root root 26 723 08:20 S25blk-availability -> ../init.d/blk-availability
lrwxrwxrwx. 1 root root 15 723 08:19 S25netfs -> ../init.d/netfs
lrwxrwxrwx. 1 root root 19 723 08:19 S26udev-post -> ../init.d/udev-post
lrwxrwxrwx. 1 root root 14 723 08:20 S55sshd -> ../init.d/sshd
lrwxrwxrwx. 1 root root 17 723 08:19 S80postfix -> ../init.d/postfix
lrwxrwxrwx. 1 root root 15 723 08:19 S90crond -> ../init.d/crond
lrwxrwxrwx. 1 root root 11 723 08:19 S99local -> ../rc.local

K开头的文件:要停止的服务(脚本),从01开始关闭,数字越小越优先关闭
S开头的文件:要启动的服务(脚本),从01开始启动,数字越小越优先启动
这些文件其实都是软链接,指向的都是/etc/rc.d/init.d/目录下的文件

五、启动终端

在这里插入图片描述
通过/sbin.mingetty指令启动终端,tty1~tty6

[root@wzp ~] ps aux |grep [t]ty
root 1149  576 tty1     Ss+  /sbin/mingetty /dev/tty1
root 1151  580 tty2     Ss+  /sbin/mingetty /dev/tty2
root 1153  576 tty3     Ss+  /sbin/mingetty /dev/tty3
root 1157  576 tty4     Ss+  /sbin/mingetty /dev/tty4
root 1159  576 tty5     Ss+  /sbin/mingetty /dev/tty5
root 1161  576 tty6     Ss+  /sbin/mingetty /dev/tty6

Centos7引导过程

在这里插入图片描述

一、硬件启动过程

与centos6差不多

二、GRUB2引导阶段

GRUB2没有grub的stage1stage1.5stage2的概念,被bootstrap image文件所代替。

  • stage1相当于boot.img,他们完成同样的功能
  • stage1.5相当于core.img,不过core.img更加强大,它提供了恢复shell,使能够在不能加载其他模块时人工恢复。
  • stage2没有对应的image文件,相当于grub2从/boot/grub下加载的各种模块动作

大致流程:

  • 显示加载两个镜像(boot.img、core.img),再加载mod模块文件
  • grub2程序执行,解析/boot/grub2/grub.cfg,根据配置文件加载内核镜像到内存,之后构建虚根文件系统,转到内核
    • grub.cfg由/etc/grub.d/目录下的文件和/etc/default/grub文件组成。
    • grub.cfg配置文件相对复杂,一般修改好配置后使用命令 grub2-mkconfig -o /boot/grub2/grub.cfg重新生成

/boot/grub2/i386-pc/目录下是GURB2 bootstrap image文件,大部门以.mod结尾,这些事grub2的模块文件

[root@wzp ~] ll /boot/grub2/i386-pc/*.img
-rw-r--r--. 1 root root   512 Jul 26 03:38 /boot/grub2/i386-pc/boot.img
-rw-r--r--. 1 root root 26703 Jul 26 03:38 /boot/grub2/i386-pc/core.img
[root@wzp ~] file /boot/grub2/i386-pc/boot.img
/boot/grub2/i386-pc/boot.img: x86 boot sector; partition 4: ID=0xd4, starthead 205, startsector 4277266767, 0 sectors, code offset 0x63
[root@wzp ~] file /boot/grub2/i386-pc/core.img
/boot/grub2/i386-pc/core.img: data

只有两个.img文件,这两个文件会被grub2-install命令安装到对应的位置上

1、boot.img

在PC BIOS系统中,这个image是GRUB2第一个被运行的。它被写在MBR(Master BootRecord)或者在分区(partition)的boot sector中。

因为MBR或PC boot secto是固定512字节,这个文件的大小也固定为512byte,boot.img功能很简单,主要是读磁盘中core.img中的第一个扇区(sector)到内存中并跳到该部分运行(如果是硬盘启动,那么该扇区就是下面要介绍的diskboot.img). 因为只有512字节,boot.img不能够加载文件系统(比如CentOS7中XFS或其它Linux的EXT4等等),并且只能是从硬盘固定的位置加载。

2、diskboot.img

当从硬盘启动的时候这是coreimg第一个扇区sector)的内容, 主要功能是读剩下的core. img到内存中并开始运行kermel img.同样dsbot img没有文件系统的功能XFS、ext4等,当他读取剩余的core. img时候,依然从硬盘固定位置读取,

根据启动的介质不同,类似dkot imng文件有很多,在安装GRUB时候选用其中一个:

  • cdboot.img: 从CD-ROM启动
  • pxeboot.img: 从PXE网络启动
  • Lnxboot.img: 如果从其他bootloader 比如LILO ( 用image=section)启动,这个image使GRUB看上去像一个Linux内核.
3、kernel.img

这个文件包含了GRUB2基本的运行时支撑:对设备及文件的框架,环境变量,恢复模式下的命令行等等,一般我们不会直接使用它,但是它是core.img中必不可少的一部分。

4、core.img

这个是GRUB的核心。他是被grub2-mkimage命令生成,包含了kernel.imng以及一些必须必要的modules。通常core.img包含了足够的模块(modules)为了访问xfs、ext4文件系统/boot/grub2目录,并且在运行时加载从文件系统xfs所有剩余的模块,这些剩余模块包含启动目录处理,加载操作系统等等功能。

模块化的设计最主要的目的是使core.img保持足够小,目前disk限制core.img安装必须小于32kb,core.img一般被安在硬盘的特殊区域:embedding area(夹层区)这个区一般有32K限制。

5、*.mod

所有GRUB其他部分被称为模块,他们大部分被core.img在运行时自动动态加载,其中一小部分被整合到core.img中,这小部分是必须,比如文件系统支持(xfs.mod)

三、内核引导阶段

与centos6差不多,加载驱动、切换到真正的根文件系统,区别是初始化程序从init变成了/usr/lib/systemd/systemd

四、systemd初始化阶段(系统初始化)

systemd即为system daemon,是Linux下的一种init软件,开发目标是提供更优秀的框架以表示系统服务间的以来关系,并依此实现系统初始化时服务的并行启动,同时达到降低Shell系统开销的效果,最终代替现在常用的System V与BSD风格的init程序。
与多数发行版使用的System V风格的init相比,systemd采用了以下的新技术:

  • A.采用Socket激活式与总线激活式服务,以提高相互依赖的各服务的并行运行性能;
  • B.用Cgroup代替PID来追踪进程,即使是两次fork之后生成的守护进程也不会脱离systemd的控制。
  • unit对象:unit表示不同类型的systemd对象,通过配置文件进行标识和配置;文件中主要包含了系统服务、监听socket、保存的系统快照以及其他与init相关的信息。(也就是CentOS6中的服务器启动脚本)

CentOS7中我们的初始化进程变为了systemd。
1、执行默认target配置文件/etc/systemd/system/default.target(这是一个软链接,与默认运行级别有关)。
2、然后执行sysinit.target来初始化系统和basic.target来准备操作系统。
3、接着启动multi-user.target下的本机与服务器服务,并检查/etc/rc.d/rc.local文件是否有用户自定义脚本需要启动。
4、最后执行multi-user下的getty.target及登录服务,检查default.target是否有其他的服务需要启动。

systemd执行sysinit.target
systemd启动multi-user.target下的本机与服务器服务
systemd执行multi-user.target下面的/etc/rc.d/rc.local
Systemd执行multi-user.target下的getty.target及登录服务
如果有图形化界面再执行graphical图形化需要的服务

注意:

/etc/systemd/system/default.target指向了/lib/systemd/system/目录下的graphical.target或multiuser.target。而graphical.target依赖multiuser.target,multiuser.target依赖basic.target,basic.target依赖sysinit.target,所以倒过来执行。

位置 描述
/usr/lib/systemd/system/ 存储每个服务的脚本,类似centos6的/etc/init.d/
/run/systemd/system 系统执行过程中产生的脚本
/etc/systemd/system 类似于centos6的/etc/rc.d/rc?.d/Sxx类文件的功能,管理员建立执行脚本,大部分是软连接
systemd单元类型
单元类型 扩展名 说明
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的 单元

修改启动界面的背景和选择菜单

修改启动背景

准备一张图片,支持格式有png、jpg、jpeg、tga,最好选择1024x768的png格式图片,兼容性最好。

[root@wzp ~]# mkdir /boot/grub2/images
#rz上传一张图片
[root@wzp ~]# cd /boot/grub2/images
[root@wzp images]# rz
#a修改配置文件,标红处为修改
[root@wzp images]# vim /etc/default/grub
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="wzp linux"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="gfxterm"
GRUB_BACKGROUND=/boot/grub2/images/2.png
GRUB_GFXMODE=1440x900,1024x768,640x480
GRUB_CMDLINE_LINUX="crashkernel=rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet"
GRUB_DISABLE_RECOVERY="true"
#b重新生成grub2.cfg文件,重启即可
[root@wzp images]# grub2-mkconfig -o /boot/grub2/grub.cfg
[root@wzp images]# reboot

修改启动菜单和启动进度条名称

#a.查看当前的选择菜单有什么
[root@wzp grub2]# awk -F\' '$1=="menuentry " {
    print i++ " : " $2}' /boot/grub2/grub.cfg
0 : CentOS Linux (3.10.0-957.el7.x86_64) 7 (Core)
1 : CentOS Linux (0-rescue-959fab0bc8d74ad795143b4cdee525c5) 7 (Core)

#b.修改/boot/grub2/grub.cfg
[root@wzp ~]# vim /boot/grub2/grub.cfg
menuentry 'wzp Linux (3.10.0-957.el7.x86_64) 7 (Core)' --class wzp --class gnu-linux --class gnu --class os
menuentry 'wzp Linux (0-rescue-959fab0bc8d74ad795143b4cdee525c5) 7 (Core)' --class wzp --class gnu-linux

#c.其他影响查看系统版本的几个位置
/boot/grub2/grubenv
/etc/os-release               #关联启动时进度条位置的名称
/etc/redhat-release   
/etc/issue
/etc/motd
/proc/version

#d.修改启动进度条名称
[root@wzp ~]# vim /etc/os-release
PRETTY_NAME="wzp Linux 7 (Core)"

Grub加密

#centos6
#grub加密
[root@wzp ~]# grub-md5-crypt
Password:
Retype password:
$1$SY3F21$FoKaOREdTTS1HzhatnIrg0
[root@wzp ~]# vim /boot/grub/grub.conf
default=0
timeout=5
password --md5 $1$SY3F21$FoKaOREdTTS1HzhatnIrg0

#centos7.1
#grub2加密,is 后面时加密后的密码
[root@wzp ~]# grub2-mkpasswd-pbkdf2
输入口令:
Reenter password: PBKDF2 hash of your password is grub.pbkdf2.sha512.10000.497F246861691979B9B7A6E3758A865929ED27D121E913DB7CE825BA8051A6F12C8AFA6A1A497BA87AC2AEEF2FDDC293523114CAC53603B78B6BD790EEE802A7.3E1A2876C499CD9F12A8A634C7D4A18B84F8F0AF69BDB4D9C1E859A1861BB01EA5E34BBF65388CED8F4435C50051C61FBB460E489F1D1E4DA41A5B5984E43F1C
#a.编辑文件,加入加密的密码
[root@wzp ~]# vim /etc/grub.d/40_custom
#!/bin/sh
exec tail -n +3 $0
# This file provides an easy way to add custom menu entries.  Simply type the
# menu entries you want to add after this comment.  Be careful not to change
# the 'exec tail' line above.
set superusers = "root"
password_pbkdf2  root  grub.pbkdf2.sha512.10000.497F246861691979B9B7A6E3758A865929ED27D121E913DB7CE825BA8051A6F12C8AFA6A1A497BA87AC2AEEF2FDDC293523114CAC53603B78B6BD790EEE802A7.3E1A2876C499CD9F12A8A634C7D4A18B84F8F0AF69BDB4D9C1E859A1861BB01EA5E34BBF65388CED8F4435C50051C61FBB460E489F1D1E4DA41A5B5984E43F1C

#centos7.2之后可以使用下述方式
[root@wzp ~]# grub2-setpassword
Enter password:
Confirm password:
#a.如果现在重新启动系统并尝试修改引导条目,系统将要求提供凭据,但是可以在没有凭据的情况下修改引导条目。
#b.为了阻止未经授权的修改和未经授权的启动,我们需要对 /boot/grub2/grub.cfg 文件进行更改
#c.打开文件并使用密码搜索需要保护的启动条目,它以menuentry开头。找到条目后,从中删除 --unrestricted 参数
#d.重启验证
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/harry_wang0/article/details/108170288

智能推荐

论文笔记--DeepFly3D,一种基于深度学习的方法,用于拴住的成年果蝇的3D肢体和附属物追踪_动物行为3d模拟算法-程序员宅基地

文章浏览阅读3k次。没有外部校准模式的校准  从多个图像中估计3D姿势需要校准相机,以达到与目标尺寸相称的精度水平–在测量像果蝇这样小的动物的腿部运动时,这是一个困难的挑战。因此,DeepFly3D没有使用典型的外部校准网格,而是使用苍蝇本身作为校准目标。它检测苍蝇身体上的任意点,并依靠捆绑调整(Chavdarova等人,2018)来同时为这些点分配三维位置,并估计每个摄像头的位置和方向。为了提高鲁棒性,它执行了适用于系留苍蝇的肢体长度和运动范围的几何约束。_动物行为3d模拟算法

未能加载文件或程序集“ExcelHelper”或它的某一个依赖项。试图加载格式不正确的程序。_未能加载文件或程序集“excelreport”或它的某一个依赖项。试图加载格式不正确的-程序员宅基地

文章浏览阅读823次。未能加载文件或程序集“ExcelHelper”或它的某一个依赖项。试图加载格式不正确的程序。说明: 执行当前 Web 请求期间,出现未经处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.BadImageFormatException: 未能加载文件或程序集“ExcelHelper”或它的某一个依赖项。试图加载格式不正确的_未能加载文件或程序集“excelreport”或它的某一个依赖项。试图加载格式不正确的

python中try...except...else...finally_try: 语句1 语句x #该语句会产生异常 语句2 except: 语句3 else: 语句4 f-程序员宅基地

文章浏览阅读267次。python中的try、except、else、finally用法_try: 语句1 语句x #该语句会产生异常 语句2 except: 语句3 else: 语句4 finally:

rosbag文件如何解析出来_ros解析bag-程序员宅基地

文章浏览阅读2.5k次。1、cd xxx/xxxx //进入bag所在路径2、rosbag info xxx.bag //查看rosbag的信息如下图所示:解析数据获得带时间戳的点云数据1、rosrun pcl_ros bag_to_pcd <*.bag> <output_directory>获得带时间戳的图像数据法1如下代码能一次性没有遗漏的解析出全部带有时间戳的图片#coding:utf-8import roslib; import rosbagimport _ros解析bag

linux 查看gz打包文件里的日志_根据时间查询.gz中的日志-程序员宅基地

文章浏览阅读2.8w次,点赞10次,收藏7次。有很多时候我们想要查看日志文件,发现服务器已经被重启了,然后原来的日志就被打包存起来了,这个时候生成的gz日志文件我们就没有办法直接去查看了。 所以这个时候我们就需要zcat+日志名.gz来查看,还可以用 | grep 来进行筛选自己想要的日志信息。..._根据时间查询.gz中的日志

Snort规则入门学习_snort和mtx规则区别-程序员宅基地

文章浏览阅读6.9k次,点赞5次,收藏32次。Snort规则学习入门引言从一条简单的snort规则开始alert tcp any any -> 192.168.1.0/24 111(content:"|00 01 86 a5|";msg:"mountd access";)snort 每条规则都可以分成逻辑上的两个部分:规则头(header)和规则选项(General Option)从开头到括号前属于规则头部分,括号内的部分属于规则选项。规则选项中冒号前面的词叫做选项关键词(option keywords)。如果许多选项组合在一起_snort和mtx规则区别

随便推点

【PCIe总线】-- PCI、PCIE基础知识_pci1x2x-程序员宅基地

文章浏览阅读2.7k次。整理的一部分PCI、PCIe基础知识PCI基础知识: 1.PCI总线的组成:HOST桥、PCI桥、PCI设备、 2.PCI桥的作用可以隔离PCI设备,不影响各条总线的带宽 3.总线x1上的通讯和总线x2上的通讯无关,同一条总线上的设备可以自由通讯; 4.如果PCI桥出现问题,那么PCI桥下的设备之间可以自由通讯但是无法将数据发送到外面 5.PCI的..._pci1x2x

LVM逻辑卷与快照_卷和快照-程序员宅基地

文章浏览阅读2.4k次。简介LVM是 Logical Volume Manager(逻辑卷管理)的简写,它是Linux环境下对磁盘分区进行管理的一种机制,它由Heinz Mauelshagen在Linux 2.4内核上实现,Linux用户安装Linux操作系统时遇到的一个常见的难以决定的问题就是如何正确地评估各分区大小,以分配合适的硬盘空间。普通的磁盘分区管理方式在逻辑分区划分好之后就无法改变其大小,当一个逻辑分区存..._卷和快照

HTTP状态码(HTTP Status Code)-程序员宅基地

文章浏览阅读1.9k次。HTTP状态码(HTTP Status Code)是用以表示网页服务器HTTP响应状态的3位数字代码。它由 RFC 2616 规范定义的,并得到RFC 2518、RFC 2817、RFC 2295、RFC 2774、RFC 4918等规范扩展。HTTP: Status 1xx (临时响应)->表示临时响应并需要请求者继续执行操作的状态代码。详细代码及说明:HTTP: Status 1

(建议收藏)计算机网络:TCP-首部格式,序号确认和连接管理习题解析与拓展_当 tcp 接收端要确认一个有效载荷大小 是100b和序列号为800 的数据段时,应该-程序员宅基地

文章浏览阅读3k次,点赞3次,收藏46次。TCP(1)-首部格式,序号确认和连接管理一.单选题(共12题,69.6分)1 关于TCP,以下哪一项描述是错误的A、提供面向字节流传输服务B、因为面向字节流,所示实现过程简单C、提供面向连接传输服务D、实现进程间通信正确答案: B首先要明确一点,TCP确实是面向字节流的,物理层是比特流。意思就是说,在网络里,不管是UDP还是TCP,都是面向字节流的,因为他们都以字节传输。但是TCP要比UDP更加复杂,这里不能说它所示实现过程简单,和UDP比复杂多了。TCP是面向连接的,服务给应用层_当 tcp 接收端要确认一个有效载荷大小 是100b和序列号为800 的数据段时,应该

python是高级语言还是低级语言_作为一名程序员必需知道的术语:高级/低级语言?解释/编译语言?...-程序员宅基地

文章浏览阅读1.3w次。作为一名合格的程序员,你必须知道一些计算机软件编程方面的术语。这次给大家解释一下下面两对常见的术语:高级语言/低级语言、解释语言/编译语言。什么是高级语言/低级语言?1、高级语言我们现在大多数人使用的语言,如C、C++、Python、Java、Matlab、LabVIEW等等,都属于高级语言,相对于低级语言,它更接近于我们平时正常的人思维,其最大的特点是编写容易,代码可读性好。实现同样的功能,使用..._python属于高级语言吗

Button和ImageButton_下列说法错误的是a button和imagebutton都可以实现按钮功能b button没有src-程序员宅基地

文章浏览阅读1.5k次。Button----按钮ImageButton----图片按钮 共有特征:都可以作为一个按钮产生点击事件不同点1、 Button有text的属性,ImageButton没有2、 ImageButton有src属性,Button没有onClick事件Button和ImageButton都有一个onClick事件通过他们自身的.setOnClickListener(_下列说法错误的是a button和imagebutton都可以实现按钮功能b button没有src属

推荐文章

热门文章

相关标签