计算机的启动和Linux的启动


一 计算机的启动
 
计算机的启动过程分为四个阶段,分别是:BIOS、MBR、启动管理程序、加载操作系统内核、操作系统启动。
 
1.1 BIOS
计算机加电后,第一件事就去加载BIOS进入内存,之后系统的控制权交给BIOS。BIOS首先会加载存储在CMOS中的各各硬件的配置参数,之后进行开机硬件自检(Power-On Self-Test POST)。
 
1.2 MBR
硬件自检完成之后,BIOS会根据CMOS中记录的存储设备的启动顺序,来读取第一个可启动设备的第一个扇区,这个扇区也叫主引导扇区MBR(Master Boot Record)。
 
(MBR一般是512字节,分为三部分,前边的446个字节里存放启动管理程序grub,后边的64个字节存放存储设备的分区表,最后的两个字节的值是0x55和0xAA,表明这个设备可以用于启动。)
 
1.3 Grub
BIOS把MBR中的grub读取到内存之后,就把计算机的控制权交给grub。grub给用户显示一个可启动操作系统的选单,由用户来选择要启动哪一个操作系统。
 
1.4 加载操作系统内核
选定要启动的操作系统之后,grub负责读取磁盘中的操作系统入内存。接下来系统的控制权会交给操作系统的核心kernel。
 
二 操作系统的启动
操作系统的启动过程是在grub把kernel加载进入内存之后,控制权交给kernel之后开始的。比较复杂,包括以下步骤:kernel重新检测硬件并驱动外围设备、启动初始化程序/sbin/init、确定运行级别/etc/inittab、处理系统初始化、加载开机启动服务程序、加载用户自定义开机启动程序、用户登录(/sbin/mingetty,/bin/login)、进入login shell(bash)、打开non login shell。
 
2.1 kernel重新检测硬件并驱动外围设备
kernel在内存中开始运行之后,它首先会重新检测一遍硬件,然后kernel会加载各个外围设备的驱动程序,驱动各个外围设备。
此时,主机的硬件就已经全部准备就绪了。
 
2.2 kernel运行/sbin/init程序
主机硬件准备就绪后,kernel会运行/sbin/init程序,它是kernel之外的第一个进程,所以它的PID是1,其他进程都是它的子进程。
 
/sbin/init的主要功能是准备软件执行的环境,包括系统的主机名、网络设定、语言处理、文件系统格式和其他系统服务的启动。
 
这些功能都是由它的配置文件/etc/inittab来确定的。
 
2.3 确定运行级别
init进程会根据它的配置文件/etc/inittab文件来确定系统的运行级别。系统有7个运行级别,但是一般只有一个默认运行级别,init接下来会根据这个默认的运行级别,运行一些列的脚本来完成它的各项功能。
 
运行级别是记录在/etc/inittab文件中的,它一般包括7个级别,分别是0-6号:
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: #这就是默认的运行级别
 
每个运行级别在/etc/rc.d目录下面,都有一个对应的子目录,指定要加载的程序。
rc0.d
rc1.d
rc2.d
rc3.d
rc4.d
rc5.d
rc6.d
 
2.4 init处理系统初始化(/etc/rc.d/rc.sysinit)
在init运行各个系统服务的启动脚本之前,得先用rc.sysinit脚本来准备好系统环境,
 
2.5 加载开机启动的系统服务程序
一般各个运行级别在/etc/rc.d/都有一个目录rcN.d,这个目录中存放了这个级别需要启动的服务的启动脚本。
比如/etc/rc.d/rc3.d/下
...
K92pppoe-server
K95firstboot
K95rdma
K99rngd
S01sysstat
S02lvm2-monitor
...
 
这些脚本的名字是这样的:字母S或K+两位数字+程序名。根据S开头或K开头,脚本分为两类:一类以S开头,表示在这个运行级别下要启动的服务,另一类以K开头,表示在这个运行级别下坚决要关闭的服务,尤其是如果从其他运行级别切换过来,需要关闭的程序。
后面的两位数字表示处理顺序,数字越小越早处理,数字相同时,则按照程序名的字母顺序启动。
 
运行这些启动脚本之后,各项随着开机而启动的服务程序就都启动起来了。
 
2.6 自定义开机启动程序
开机的时候不仅可以启动一些必须的系统服务程序,用户还可以自己指定一些想要在开机时启动的程序,这些程序一般放在/etc/rc.d/rc.local文件中。
在完成了系统的各项服务之后,就可以运行rc.local来启动用户自定义的开机启动程序了。
 
2.7 用户登录
系统开机启动程序和用户开机启动程序都启动完成后,就可以让用户登录了。
 
一般会有三种用户登录方式:
(1)命令行登录
(2)ssh登录
(3)图形界面登录
这三种方式的用户名和密码的验证方式不一样。
(1)命令行登录:init进程调用mingetty程序(意为get teletype),让用户输入用户名和密码。输入完成后,再调用login程序,核对密码。如果密码正确,就从文件 /etc/passwd 读取该用户指定的shell,然后启动这个shell。
(2)ssh登录:这时系统调用sshd程序,取代mingetty和login,然后启动shell。
(3)图形界面登录:init进程调用显示管理器,Gnome图形界面对应的显示管理器为gdm(GNOME Display Manager),然后用户输入用户名和密码。如果密码正确,就读取/etc/gdm/Xsession,启动用户的会话。
 
2.8 login shell 与 non login shell
上面的用户登录之后启动的shell,就是login shell。
login shell会读取/etc/profile、~/.bash_profile或~/.bash_login或~/.profile等配置文件,而在~/.bash_profile中又会执行~/.bashrc文件,这些配置文件会做设置环境变量等其他的工作。
 
在login shell下启动的其他的shell都是non login shell。non login shell在启动之前只会读取~/.bashrc文件。
 
 
以上就是计算机的启动过程和操作系统的启动过程,之后系统就进入了shell控制过程中了。
 
 
 

计算机的启动和Linux的启动的更多相关文章

  1. linux 开机启动过程详解

    Linux开机执行内核后会启动init进程,该进程根据runlevel(如x)执行/etc/rcx.d/下的程序,其下的程序是符号链接,真正的程序放在/etc/init.d/下.开机启动的程序(服务等 ...

  2. linux内核启动以及文件系统的加载过程

    Linux 内核启动及文件系统加载过程 当u-boot 开始执行 bootcmd 命令,就进入 Linux 内核启动阶段.普通 Linux 内核的启动过程也可以分为两个阶段.本文以项目中使用的 lin ...

  3. Linux内核启动及根文件系统载入过程

    上接博文<u-boot之u-boot-2009.11启动过程分析> Linux内核启动及文件系统载入过程 当u-boot開始运行bootcmd命令,就进入Linux内核启动阶段.与u-bo ...

  4. linux开机启动脚本

    linux开机启动脚本 linux 开机启动脚本 用户自定义开机程序(/etc/rc.d/rc.local) 操作最简单,方便.每次都自己启动PHP啊,Nginx啊 烦死了,其他方式还要弄shell啊 ...

  5. 计算机从加电到系统(Linux)启动完成

    0x0 背景 在我参加的面试和我面试别人.或者参加别人对别人的面试的事后经常遇到的一个问题就是:请从计算机加电开始描述一下计算机启动到操作系统正式启动起来的全过程.这是一个考验对计算机体系结构和基本知 ...

  6. Linux 开机启动

    Linux开机启动(bootstrap)   作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 计算机开机是一个神秘的过程.我们只是 ...

  7. (转)Linux的启动过程

    原文链接:http://www.ruanyifeng.com/blog/2013/08/linux_boot_process.html 半年前,我写了<计算机是如何启动的?>,探讨BIOS ...

  8. linux开机启动

    开机过程指的是从打开计算机电源直到LINUX显示用户登录画面的全过程.分析LINUX开机过程也是深入了解LINUX核心工作原理的一个很好的途径. 启动第一步--加载BIOS 当你打开计算机电源,计算机 ...

  9. Linux 的启动流程(转)

    原文链接:http://blog.jobbole.com/46078/ 半年前,我写了<计算机是如何启动的?>,探讨BIOS和主引导记录的作用. 那篇文章不涉及操作系统,只与主板的板载程序 ...

随机推荐

  1. SQLSERVER 切换数据库为单用户和多用户模式

    有时候数据库在占用时,想做一些操作,无法操作.可以尝试将数据库切换为单用户模式来操作.操作完之后再切换回多用户模式. 命令如下: alter database 数据库名 set Single_user ...

  2. extern “ C”的含义

    见博客:http://www.cnblogs.com/xulei/archive/2006/11/12/558139.html

  3. 解决mysql启动时报The server quit without updating PID file 的错误(转)

    1.一般是权限问题,把用户和组改为mysql就可以了. chown -R mysql:mysql  /var/lib/mysql 2.在启动mysql时报下列错误 [root@mysqld2 ~]#  ...

  4. 安装psacct或acct程序包

    监视Linux用户活动 我认为,对每个想密切监视其服务器/系统上用户活动的Linux/Unix系统管理员来说,psacct或acct是优秀的.必需的应用程序之一. psacct或acct程序包提供了用 ...

  5. Linux之sort命令

    sort - sort lines of text files 提示:如果第一个字段都相同的话,就根据第二个字段进行排序 参数: -f  忽略大小写 -b  忽略最前面的空格部分 -M  以月份的名字 ...

  6. 自动化利器-RPM自定义打包

    1.Rpm打包程序 1.1为什么要使用rpm打包 1.编译安装软件,优点是可以定制化安装目录.按需开启功能等,缺点是需要查找并实验出适合的编译参数,诸如MySQL之类的软件编译耗时过长. 2.yum安 ...

  7. 【Electron】Electron开发入门(七):打开本地文件或者网页链接 and webview里操纵electron api

    1.打开本地文件或者网页链接 // 打开系统本地文件 const {shell} = require('electron'); // Open a local file in the default ...

  8. 【Egret】2D 使用中的一些疑难解决技巧!

    1.问题:声音在ios上无法播放    解决方法:①首先需要预加载一个声音                        ②然后目前只有点击之后才能播放声音,不能默认播放 2.问题:滚动条问题   解 ...

  9. JDBC基础学习(四)—数据库事务

    一.事务基本认识 1.事务的概述      为了保证数据库中数据的一致性,数据的操作应当是离散的成组的逻辑单元.当它全部完成时,数据的一致性可以保持,而当这个单元中的一部分操作失败,整个事务应当全部视 ...

  10. Ackerman 函数 (双递归函数)

    public static int ackerman(int n,int m){  if(n==1&&m==0){return 2;}  else if(n==0&&m ...