Linux系统的启动过程并不是大家想象中的那么复杂,其过程可以分为5个阶段:
服务器主机开机以后,将根据主板BIOS中的设置对CPU 、内存、显卡、键盘等设备进行初步检测,检测成功后根据预设的启动顺序移交系统控制剖权,大多时候会移交给本机硬盘。
当从本机硬盘中启动系统时,首先根据硬盘第一个扇区中 MBR的设置,将系统控制权传递给包含操作系统引导文件的分区;或者直接根据MBR记录中的引导信息调用启动菜单(如GRUB)。
对于Linux操作系统来说,GRUB是使用最为广泛的多系统引导器程序。系统控制权传递给GRUB 以后,将会显示启动菜单给用户选择,并根据所选项(或采用默认值)加载 Linux内核文件,然后将系统控制权转交给内核。需要注意的是,Centos 7 采用的是 GRUB2启动引导器。
将内核与镜像加载到内存中
开启pid=1的进程,进程就是init加载的程序是systemd
? MBR 也就是主引导记录,位于硬盘的 0 磁道、0 柱面、1 扇区中,主要记录了启动引导程序和磁盘的分区表,最主要的功能就是存储启动引导程序;主要有以下作用:
? 这是启动引导程序最主要的功能。 拥有一个可以让用户选择的菜单,来选择到底启动哪个系统。大家如果在服务器上安装过双 Windows 系统,就应该见过类似的选择菜单,不过这个选择菜单是由 Windows 的启动引导程序提供的,而不是 GRUB。
? 这是多系统启动的关键。不过需要注意的是,Windows 的启动引导程序不能调用 Linux 的启动引导程序,所以我们一般建议先安装 Windows,后安装 Linux,是为了将 Linux 的启动引导程序安装到 MBR 中,覆盖 Windows 的启动引导程序。
GNU GRUB(简称“GRUB”)是GRand Unified Bootloader的缩写,是一个来自GNU项目的多操作系统启动程序。GRUB是多启动规范的实现,它允许用户可以在计算机内同时拥有多个操作系统,并在计算机启动时选择希望运行的操作系统。GRUB可用于选择操作系统分区上的不同内核,也可用于向这些内核传递启动参数。它是一个多重操作系统启动管理器,用来引导不同系统,如windows,linux。
MBR是磁盘的第一个扇区,大小不能超过512KB,所以引导程序只能分成两步来执行:
1.引导加载程序的最小主程序(必须安装在MBR中),并没有安装加载程序的相关设置文件。 2.引导加载程序的所有设置文件和相关参数,一般在/boot下。 即加载引导程序可以安装在MBR中或超级块中,但是Windows系统则默认强制会同时安装在MBR和超级块中,所以在安装多重系统时,先装Windows再装Linux。
文件系统中第一个块被称为超级块。这个块存放文件系统本身的结构信息。比如,超级块记录了每个区域的大小,超级块也存放未被使用的磁盘块的信息。
/sbin/grub-install 命令可用来修复MBR的损坏。
GRUB 加载了内核之后,内核首先会再进行二次系统的自检,而不一定使用 BIOS 检测的硬件信息。 Linux 的内核存在 /boot 目录中,分别是:
config ?#内核的配置文件,内核编译时选择的功能与模块
efi ? ? ? ?#可扩展固件接口,为英特尔为全新PC固件的体系结构、接口和服务提出的建议标准
grub ? ?#启动引导程GTUB的数据目录
initramfe.img#虚拟文件系统(CentOS 6.x 中用initramfs替代了initrd,但功能是一样的)
symvers.gz ?#模块符号信息
System.map #内核功能和内存地址的对应列表
vmlinuz ?#用于启动的Linux内核。这个文件是一个压缩的内核镜像
如下图所示,一台启动系统/boot目录下所有文件内容
在内核加载完毕,并完成硬件检测与驱动程序加载后,此时主机硬件已经准备完毕,内核会主动呼叫第一个进程,也就是 /sbin/init,此配置文件最主要的功能就是准备软件执行的环境,包括系统的主机名、网络设定、语言、文件系统格式及其他服务的启动等。
Linux系统有7个运行级别(runlevel):
运行级别0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动
运行级别1:单用户工作状态,root权限,用于系统维护,禁止远程登录
运行级别2:多用户状态(没有NFS)
运行级别3:完全的多用户状态(有NFS),登录后进入控制台命令行模式
运行级别4:系统未使用,保留
运行级别5:X11控制台,登录后进入图形GUI模式
运行级别6:系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动
LINUX设置服务开机自启动有三种方式:
方式一:把服务启动命令添加到/etc/rc.local中
例如添加一个redis服务启动脚本:
注意:添加完需要对rc.local赋权执行权限
chmod +x /etc/rc.local
方式二:在/etc/init.d目录中直接添加启动脚本
/etc/rc.d/init.d(链接到/etc/init.d)下有很多的文件,每个文件都是可以看到内容的,都是一些shell脚本或者系统服务文件。Linux开机的时候,会加载运行/etc/init.d目录下的程序,因此我们可以把想要自动运行的脚本放到这个目录下即可。
注意:同样添加完后务必设置文件的可执行权限 chmod +x filename
方式三:将服务制作到LINUX系统服务中,并设置成开机启动
redhat7以上可以用systemd来管理服务,具体操作如下:
以nginx服务为例,添加nginx.service文件到/etc/sysntemd/system目录下,写入服务启动配置内容
然后设置服务的开机自启动
systemctl enable nginx
systemctl?start? nginx
实验操作步骤:
重启操作系统,进入到内核引导界面时,按以下步骤操作
(1)按e编辑grub菜单?
(2)选择linux16那行,追加rd.break?
(3)ctrl+x引导?
(4)#mount ?-o ?remount,rw ?/sysroot?
(5)#chroot ?/sysroot?
(6)#passwd ?root?
(7)#touch ?/.autorelabel?
(8)#exit
(9)#exit
实验操作步骤:
先模拟/boot/grub2/grub.cfg破坏(删除里面文件内容)
然后按以下步骤恢复:
(1)虚拟机挂载光盘镜像
(2)BIOS从光盘启动
(3)进入急救模式,加载光盘镜像,切换到系统根环境
? ? ? ? ? sh-4.2# chroot /mnt/ sys image
(4)重新将GRUB引导程序安装到第一块硬盘(/dev/sda)的MRB扇区,如果有多个分区可省略
? ? ? ? ? bash-4.2# grub2-install /dev/ sda
(5)重新构建GRUB菜单的配置文件
? ? ? ? ? bash-4.2# grub2-mkconfig -0 /boot/grub2/grub.cfg
? ? ? ? ? 退出chroot环境,并重启
? ? ? ? ? bash-4.2# exit
? ? ? ? ? sh-4.2# reboot