Linux引导流程(一)

来源:互联网 发布:postman post传递json 编辑:程序博客网 时间:2024/06/13 11:49

Linux从启动到弹出用户界面经历了下面几个步骤。


每次启动电脑的时候都是在加电自检的过程。比如电脑启动的时候会检查硬件信息,显卡,CPU,硬盘。内存一直到网卡等等固件会进行加电自检。也就是说固件是在硬件的层面上检查所有硬件是否是正常的。固件最重要的作用就是加电自检。这个和Linux Windows是无关的。即使买了一个裸机没有安装操作系统按下电源键这个步骤也是一样要进行的。

 

 

 

固件里面同步软硬件时钟

Linux关于固件的设置要注意一个点。就是系统的硬件时钟(和操作系统无关,固化在硬件上面的),安装了Linux里面有软件时钟这个可以通过date命令查看。这里就设计到一个软硬件时间同步。如果软件的软件时钟和硬件时钟不同步的在时间的调取的时候是没有办法运行的。时间的同步非常重要。

Windows也有这种时间同步的,定期和时间服务器同步,这个服务器可以是互联网上的,也可以是局域网某台服务器作为参照物。保障时间是同步的。如何将固化在固件里面的时钟和软件时钟以Linux操作系统的时钟进行同步。

date可以查看Linux软件时钟,hwcolck可以查看固件的时钟。一般来讲这两个时钟是同步的。但是有些方面出了问题两个时钟不一样。这个时候就要同步两个时钟。在Linux时间的同步可以在命令行下进行。

如果忘记了hwcolck有哪些选项就是使用hwcolck --help可以查看有哪些常用的选项。

想查看一个命令常用的选项不需要使用man    --help就可以了。

[root@localhost test]# date

20171116日 星期四09:00:11 CST

[root@localhost test]# hwclock

20171116日 星期四090026秒  -0.371185

一般来说这两个时间值是一样的,如果出现某些原因这两个时间值不一样,那么就需要同步。

 

[root@localhost test]# hwclock --help

 

用法:

 hwclock [功能] [选项...]

 

功能:

 -h, --help           显示此帮助并退出

 -r, --show           读取硬件时钟并打印结果

     --set            RTC设置为--date指定的时间

 -s, --hctosys        从硬件时钟设置系统时间

 -w, --systohc        从当前系统时间设置硬件时钟

第一个选项将软件时钟设置为硬件时钟,硬件时钟是对那么就要以硬件为参照修改软件时钟。

[root@localhost test]# hwclock --hctosys

如果系统时间是错的,但是硬件时钟是正确的,那么将当前的系统时间设置为硬件时间。

 

如果软件时钟和硬件时钟都是错误的,那么就无法以其中某一个为参照物修改时间,那么可以使用date修改Linux软件时钟,也可以使用hwclock修改硬件时钟。

hwclock --set --date="2017-08-14 16:45:05"

 

在按下电源以后,就开始固件的加电自检,检查所有的硬件是否都可以检测通过,如果有硬件检测没有通过,那么就要看看哪里出现了问题。

在构建一个Linux的时候如果要增加硬件,如增加一块硬盘。要让固件对该硬件进行识别这样才有可能在系统上使用。正常情况下添加一个硬盘或者网卡也好应该先到固件里面查看,查看是否被固件识别出来。如果在固件里面检测不到该硬盘或者网卡就没有必要到系统里面设置。

 

 

固件在自检没有问题之后最重要的事情就是读取MBRMBR叫做主引导记录,它位于磁盘的0柱面0磁头,1扇区。


在固件自检之后马上就会跳到MBR里面进行读取数据,做的动作就是载入MBR里面很重要的东西把这个东西称为bootloder自举程序。或者称为自启动程序。也就是说固件在自检完以后肯定要读取硬盘上的数据。读取硬盘上第一个数据称为MBRMBR里面保存了三个东西。Bootloder(自举程序)partition table(磁盘分区表) magic number(结束标识字)

 

bootloder在所有的操作系统里面都有。Windows Linux里面都有。也就是说固件在自检没有问题之后,读取MBR载入bootloder以后。后续系统所有的启动都是由bootloder来完成的。所有的操作系统里面都有一个bootloder。现在Linux里面使用最广泛的自启动程序就是grub

查看grub的配置文件


Grub配置文件  里面最重要的一行。自举程序不管在任何操作系统里面最重要的作用就是载入内核。载入系统的核心。每个操作系统都有核心。把它称作为内核kernel

内核的作用非常重要,在Linux里面内核的作用包括存储的管理,CPU的管理,进程的管理,文件系统的管理。设备驱动管理以及系统的初始化等等。内核就像人的心脏和大脑一样。

自启动程序最重要的作用就是载入内核kerler/vmlinuz-.....指定了内核存放的位置。

 

Vmlinuz-2.6.18-194.el5这个是Linux内核的一个文件。是可执行文件是一个单独的文件。因为这个文件是压缩的在载入内核的时候有一个解压缩的过程。

还有一个就是内核的版本号2.6.18是内核的版本号。第一位的2代表主版本号。第2位的6代表次版本号。第三位代表末版本号。第2位的6比较重要。如果第2位位基数表示内核是一个测试版。偶数表示正式版。

inux在启动的过程中,最要的grub在启动的过程当中就是载入内核。有一行语句指定内核kernel所在的位置。所以在编译内核生成了新的内核的时候需要重新更新grub的配置文件。

[root@localhost ~]# ls /boot

config-3.10.0-514.el7.x86_64                             initramfs-3.10.0-514.el7.x86_64.img       System.map-3.10.0-514.el7.x86_64

grub                                                     initramfs-3.10.0-514.el7.x86_64kdump.img  vmlinuz-0-rescue-c2167cb9c89744a0864229098898bcc8

grub2                                                    initrd-plymouth.img                       vmlinuz-3.10.0-514.el7.x86_64内核文件,解压缩该文件之后启动Linux

initramfs-0-rescue-c2167cb9c89744a0864229098898bcc8.img  symvers-3.10.0-514.el7.x86_64.gz

 

[root@localhost ~]# file /boot/vmlinuz-3.10.0-514.el7.x86_64

/boot/vmlinuz-3.10.0-514.el7.x86_64: Linux kernel x86 boot executable bzImage, version 3.10.0-514.el7.x86_64 (builder@kbuilder.dev.centos.org) #1 SMP , RO-rootFS, swap_dev 0x5, Normal VGA

[root@localhost ~]# ls -l /boot/vmlinuz-3.10.0-514.el7.x86_64  可以看到内核文件是一个可执行文件

-rwxr-xr-x. 1 root root 5392080 1123 2016 /boot/vmlinuz-3.10.0-514.el7.x86_64

内核叫vmlinuz,后面是版本号。是可执行文件,单独的一个文件。并不是一堆文件。

 

从网上下载了一个源代码的linux内核文件,解压缩出来会看到里面有许多文件,可以直接编译升级。


Linux启动的时候有这样的步骤,解压缩内核文件之后启动内核。


在固件检测完所有硬件没有问题 读取硬盘MBR载入自举程序grub以后grub会载入内核。之后的启动工作就交给内核来完成。内核怎么样引导后续工作。

其实内核在引导期间只做两件事情。

一个是驱动硬件。内核在下载下来以后会发现很大有几十兆,其实内核里面最多的东西就是硬件驱动。在使用操作系统的时候不需要了解每一个硬件的细节,系统会调用它,这个过程称之为驱动。如果一个硬件内核无法驱动那么就要安装驱动程序。

和固件的检测不一样,固件的检测是在物理的层面上。在硬件的基础上进行检测。这个硬件是否可用(线有没有连接好,有没有插错)。而内核的驱动硬件是在操作系统软件的层次上识别这个硬件是否可以被调用。Linux启动的过程当中内核会有一个识别硬件的过程。

 

第二就是内核在启动一个进程就完成了在引导过程当中的使命。这个就是启动一个进程。启动进程的名字叫init

init是一个进程,是系统启动的第一个进程。



在操作系统里面每次启动一个服务都对应一个进程,这个进程都要有一个数字的标识。就是pid的值。内核在调用进程的时候都是通过该PID进行管理的。但是每次这个PID都是动态分配的,正常来讲一个进程的启动每次PID都是不一样的。PID不是固定的是动态分配的,但是init这个进程比较特殊。它的PID恒为1在任何一个Linux NUIX系统里面init进程的PID永远都是1的。

[root@localhost ~]# ps -le

F S   UID    PID   PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD

4 S     0      1      0  0  80   0 - 32023 ep_pol ?        00:00:05 systemd

 

cmd是进程的名称 PPID是父进程。

Linux的特点是分时的,多用户多任务的操作系统。分时:就是CPU分为小的时间片,然后任务排队处理。在一个CPU循环周期里面会给每个任务分配一个时间片。如果执行完了就结束如果没有执行完就在下一个循环周期里面分配时间。谁来做CPU时间的分配谁来做进程的切换。这个就是由PID0的内核调度器来完成。它是用来分配CPU时间和进程切换的。所以内核调度器是一个非常重要的进程。是PID1的父进程。

在进程管理当中有一个基本的概念,父进程终止子进程必须终止。如果关闭了一个父进程不管下面有多少个子进程都必须关闭。

Linux里面如果父进程终止,子进程因为某种特殊的原因没有正常终止变成孤儿进程,孤儿进程在系统发现后会将父进程指向init

 

内核在载入以后会完成两件事情。一个是驱动硬件,一个是启动init进程。那么init进程后面要做的事情就是读取配置文件(/etc/inittab。来完成后面所有的引导。

 

查看配置文件里面信息:

运行级别:运行级别分为了7种。

0表示shut down关机

1表示单用户模式,只有root可以登入。没有图形界面。(Linux如果无法正常启动,可以进入到单用户模式来进行修复)

2,3都是字符界面的多用户模式。所有的服务都可以正常启动但是就是没有图形界面。2,3是应用最多的服务器模式。23区别是2没有nsf这个服务。这时一个网路文件系统。这个可以实现LinuxUnix文件共享。只要操作系统是unix系列的他们都可以使用nfs进行文件共享。

4代表自己可以定义的运行级别

5代表图形化的多用户环境

6是重启,那么系统会不停的重启

 

Linux里面不需要启动电脑切换运行级别。使用命令就可以切换。



原创粉丝点击