Linux - 启动管理相关知识点

启动流程 - 运行级别

1、系统运行级别

0 - 关机
1 - 单用户模式,可以想象为windows的安全模式,主要用于系统修复
2 - 不完全的命令行模式,不含NFS服务
3 - 完全的命令行模式,就是标准的字符界面
4 - 系统保留
5 - 图形界面模式
6 - 重启动

2、运行级别命令

#查看运行级别命令 : runlevel
#改变运行界别命令 : init 运行级别

实例:查看当前系统的运行级别
[root@192 /]# runlevel
N 3
表示:系统是从哪个级别更改到哪个级别,比如“5,3”就是表示系统是从图形界面,切换到命令行模式。如果是N,表示空,一开机就进入了3级别。

实例:如果想从字符界面,进入到图形界面,怎么操作?
[root@192 /]# init 5

注意:切换的图形界面的时候,可能会提示你输入密码!

3、系统默认运行级别配置文件  /etc/inittab

[/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:
---------------------------------------------------------------------------------------------------------------------------------

注意:0和6两个级别是不能设置为开机运行界别的!

启动流程 - 启动过程

通常,Linux的启动过程是这样的:开机,这个时候,BIOS芯片会开机自检,自检完成后,会加载MBR,也就是我们说的主引导记录,主引导记录中保存的是我们的启动引导程序,在Linux中,启动程序叫做GRUB,GRUB保存在MBR中,是系统启动的主引导,进行下一步引导。

这个时候,有个分支,需选择。如果服务器只有一个Linux,启动程序,也就是GRUB会直接加载内核,然后,进行下一步的启动;如果我的计算机里不光有Linux系统,还有Windows系统,或者,有两个不同版本的Linux,这时,就会进入一个多系统的启动状态,在里面去选,给你一个列表,让你选择。选哪个系统,就会加载哪个系统的内核,启动,然后,到下一步。

注意,Linux中,加载内核的时候,考虑到性能、速率,会进行压缩,所以,选完系统后,会先在内存当中,进行解压缩。解压缩完成之后,内核还会再进行一次自检(两次自检,BIOS一次,内核一次)。Linux信任的是内核自检,它会把自检的过程,记录在dmsg命令。

自检完成之后,内核会加载驱动。我们的Linux是这样,我们装虚拟机的时候,安完Linux,所有的内核就直接驱动,然后,我们就可以直接使用。在Windows中,如果你需要某个驱动,得手动安装;但是,Linux不是,Linux的虚拟机和真实机的安装是一致的,只要内核安装完,因为所有的驱动都安装在内核,内核会通过服务器的硬件,查看到底需要哪个驱动,然后,自动加载,所以,驱动在内核安装完以后,就可以直接使用了。

但是,这里有个问题,那就是如果系统的驱动都安装在内核,那内核的压力,岂不是很大?那怎么办? Linux的解决方案是,将常见的驱动安装在内核里,把不常见的驱动作为函数模块,也就是把驱动写成一个程序,保存在硬盘里,放在根下的lib目录,也就是函数库的保存位置。当我需要的时候,内核就去这个目录调取,即可。这样,就保证了内核的压力不会太大。

因此上说,Linux不需要单独安装驱动,内核加载完毕,即可使用,无需额外安装。只有一种情况(比如说,硬件太新了,当硬件发行的时候,内核早就存在了),需要你手动安装,那就是Linux内核没有这个驱动。

按常理,内核自检完成后,就会去根下的lib下去读取这个驱动,读出来,就可以加载,但是这里出现了一个比较大的悖论!

我们的硬盘如果是IDE接口,IDE接口的驱动是直接在内存中的,它认识你的硬盘,直接就可以从lib中拿去相关的服务。但是,我们现在绝对大多数的计算机,我们的硬盘都是SATA接口,或者SCASI接口,SATA接口的硬盘,Linux会认为,它不是我必须的,所以,它是作为模块,放入到lib这个目录。

那有问题吗? 有,啥意思? 我的内核,必须要去lib目录,读取SATA的驱动,我才能识别硬盘,但是,我既然没有识别硬盘,我怎么加载它的驱动? SATA接口的驱动,是放在硬盘的lib目录下的,可我没有这个驱动,我是无法读取硬盘的。就相当于,我有一个柜子,要想取柜子里的东西,但是,钥匙在柜子里,我得先拿到钥匙,才能取这个东西,现在,我没有钥匙,开不了门,更别说取里面的东西了。

怎么办?

如果我是真要开这个门,就得去找开锁公司。可对于Linux,也是采取类似的方法,它在我们的启动分区当中,有一个initranfs文件系统,这个文件系统模拟了一个跟硬盘基本相似的结构,然后,内核先加载这个相似结构,通过它,把基本的常见驱动,加载到内核里。这也就是所SATA得驱动,没有再从lib中去调,而是从这个模拟系统中去调取。加载了内核,加载了它,才能建立仿真目录,才能加载真正的硬盘分区,才能读取剩余的其他驱动,也就是说,Linux系统做了一个假的根目录,这个假的根目录,保存了硬盘上必须的驱动,把这个家伙加载到内核里,内核就可以调用真正的驱动,就相当于,你拿到了一把仿真钥匙,打开了柜子,取到了东西。

initranfs这个文件,存放在/boot目录下,那就有个问题,initranfs在/boot上,那/boot也在硬盘上,内核既然没法加载根下的lib,那当然,也就应该没法加载/boot了?

这里需要注意,/boot不是由内核加载的,而是由启动引导程序加载,事先就已经读取出来了。因为boot目录,就是启动分区,所以,启动引导程序,是默认可以识别boot分区。

有了虚拟的驱动目录,就相当于有了打开/lib目录的钥匙,这样,就取到了相关的驱动,读取到了硬盘上真正的驱动目录,有了真正的系统硬盘驱动,就可以读取真正的硬盘了。就可以读取里面真正的根目录,这个仿真“钥匙文件”的使命,就结束了。

现在读取的就是真正的系统硬盘根。读出来之后,我们调取/sbin/init目录,init是系统启动的第一个进程,它诞生之后,才衍生出其他的进程,才可以进行后面的后续启动,然后,会先调用调用/etc/init/rcS.conf配置文件,主要有两个功能,先调用/etc/rc.d/rc.sysinit,然后,由/etc/rc.d/rc.sysinit配置文件进行Linux系统的初始化;然后,再调用/etc/inittab,由/etc/inittab配置文件确定系统的默认运行级别。

/etc/init/rcS.conf初始化系统都初始化哪些内容呢,如下所示:
1、获得网络环境
2、挂载设备
3、开机启动画面Plymouth(取代了过往的RHGB)
4、判断是否启动SELinux
5、显示开机过程中的欢迎画面
6、初始化硬件
7、用户自定义模块的加载
8、配置内核的参数
9、设置主机名
10、同步存储器
11、设备映射器以及相关的初始化
12、初始化软件磁盘的阵列(RAID)
13、初始化LVM文件系统功能
14、检查磁盘文件系统(fsck)
15、设置磁盘配额(quota)
16、重新以可读写模式挂载系统磁盘
17、更新quota(非必要)
18、启动系统虚拟随机数生成器
19、配置机器(非必要)
20、清除开机过程当中的临时文件
21、创建ICE目录
22、启动交换分区(swap)
23、将开机信息写入/var/log/dmsg文件

初始化完成后,就会调用/etc/inittab文件来确定系统启动的界面,是字符界面还是图形界面,紧接着,传入运行级别到/etc/init/rc.conf文件,再调用/etc/rc.d/rc文件,然后,按照运行级别,调用/etc/rc[0-6].d文件(如果是字符界面,调用/etc/rc3.d文件;如果是图形界面,调用/etc/rc5.d文件)。最后呢,按照优先级别启动和关闭相应脚本,再启动和关闭/etc/rc.d/rc.local中的程序。

执行完以上,就到“登录界面”了,这个时候,我们输入用户名和密码,登录系统,进入,程序启动完毕!
调用/etc/rc.d/rc文件

运行级别参数传入/etc/rc.d/rc这个脚本之后,由这个脚本按照不同的运行级别,启动/etc/rc[0-6].d目录中相应的程序。

1、/etc/rc3.d/k??开头的文件(??是数字),会按照数字顺序依次关闭(k即kill)
2、/etc/rc3.d/S??开头的文件(??是数字),会按照数字顺序依次启动(S即start)

启动引导程序 - Grub配置文件

1、grub中的分区表示

2、grub配置文件

vi /boot/grub/grub.conf

# default=0    默认启动第一个系统(如果有多个系统,就会有0和1的选项)
# timeout=5   等待时间,默认是5秒
# splashimge=(hd0,0)/grub/splash.xpm.gz   这里是指定grub启动时的背景图像的保存位置
# hiddenmenu  隐藏菜单(上下按钮动一下,就能看到菜单)


/boot/grub/grub.conf 文件内容

注意:有几个系统配置,就有几个以下的部分

关于以上这段内容的注解:
title CentOS (2.6.32-279.el6.x86_64)
#标题是  CentOS (2.6.32-279.el6.x86_64)

        root (hd0,4)
# 是指启动程序的保存分区

        kernel /boot/vmlinuz-2.6.32-279.el6.x86_64 ro root=UUID=7e2f23ae-71f2-4838-86fb-8f134b98e069 rd_NO_LUKS  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_MD crashkernel=auto LANG=zh_CN.UTF-8 rd_NO_LVM rd_NO_DM rhgb quiet(内核加载的功能选项)
# 指定内核加载时的选项
        initrd /boot/initramfs-2.6.32-279.el6.x86_64.img
# 指定了initramfs内存文件系统镜像文件所在的位置

initramfs-2.6.32-279.el6.x86_64.img文件位置

如果你在你的服务器里,既想装一个Linux系统,又想装一个Windows系统,那你最好是先装windows,再装Linux。因为Windows的启动引导程序是不会识别Linux。如果你先安装了Linux,那么,Windows的启动引导程序会覆盖Linux的Grub,从而,导致Linux不能启动。 如果先装Windows,后装Linux,Linux的grub会识别Windows的,Linux的grub会覆盖Windows的,同时会把Windows启动加到grub里, /boot/grub/grub.conf这个文件,就会再多四行即两套配置。这个时候,你就可以选择启动哪一个。

现实工作中,服务器通常只安装一个系统,确保系统的稳定,正常运行,因此,勿安多系统!
发布了59 篇原创文章 · 获赞 2 · 访问量 5562

猜你喜欢

转载自blog.csdn.net/LDR1109/article/details/103882049