Linux系统启动过程【Linux系统学习】

                                                      Linux系统启动过程


Linux从加电自检后就要从硬盘上开始引导操作系统。


1.引导加载程序GRUB/LILO。

当机器引导操作系统时,首先读取硬盘主引导记录(MBR)中的信息,找到主引导加载程序,加载操作系统即可。在单一的MBR中只能存储一个操作系统的引导记录,因此同时安装多个操作系统时就必须要使用引导加载程序。Linux中的引导加载程序有两个,分别是GRUB和LILO,通过他们的引导,操作系统可以顺利地启动。

GRUB相对LILO而言有更多的优势,如支持网络引导、交互命令界面等。且GRUB不需要像LILO一样将引导操作系统位置的信息存储在MBR中,因而可以避免由于错误配置MBR导致系统无法引导的故障。现在的Linux系统一般都倾向于GRUB引导。


2.加载内核。

内核映射不是一个可执行的内核,而是一个经过压缩的内核映像。通常它是一个zImage或bzImage文件,将其加载到内存之后,内核就开始执行了。


3.执行init进程。

init进程作为系统的第一个进程,是所有进程的发起者和控制者。Init的进程ID(PID)为1。它完成系统的初始化工作并维护系统的各种运行级别,包括系统的初始化、系统结束、单用户运行模式和多用户运行模式。由于Init进程是系统所有进程的起点,内核在完成核内引导后就开始加载Init程序。

init进程有两个作用:第一个作用是终结父进程。因为init进程绝对不会被终止,所以系统总是使用Init并以它未参照。如果某个进程在它衍生出来的全部子进程就都会以init作为父进程;第二个作用是子啊进入某个特定的运行级别(Run level)时运行相应的程序,以此对各种运行级别进行管理。它的这个作用是由/etc/inittab定义的。


4.通过/etc/inittab文件进行初始化。

init的工作是根据/etc/inittab来执行相应的脚本,进行系统初始化。下面以redhat为例进行说明。

(1)执行/etc/rc.d/rc.sysinit

这是由init执行的第一个脚本,其主要功能是完成各个不同运行级别中相同部分的初始化工作,包括设置的$PATH变量、配置网络等。

(2)执行/etc/rc.d/rcX.d下的脚本

在系统目录/etc/rc.d/init.d下有许多服务器脚本程序,一般称为服务(service),在系统初始化启动会选择性地执行这些脚本程序的一部分。在/etc/rc.d下有7个名为rcx.d的目录,对应系统的7个运行级别,这里的x是不同运行级别数,实际中使用相应运行级别的数字代替,如运行级别3,则执行的是/etc/rc.d/rc3.d/下的脚本。

这些脚本实际上都是一些连接文件,而不是真正的rc启动脚本,存放在/etc/rc.d/init.d子目录中的、被符号连接上的命令脚本程序才是真正的程序,是它们完成了启动或者停止各种服务的操作过程。

这个脚本程序的连接文件命名规则为“K+xx+服务名”或“S+xx服务名”的形式,其中xx是一个两位数字,K(Kill)表示结束,S(Start)表示启动。

通常这些命令脚本程序的执行顺序很重要,基本规则是先终止K开头的服务,然后启动S开头的服务,再根据字母S或K后面这个两位数字的大小来决定执行顺序,数值小比数值大的先执行。以字母K开头的命令脚本程序会传递Stop参数,以字母S开头的命令脚本程序会传递Start参数,同时也能接受如Restart、Staus等参数。

root用户可以用init x命令改变当前运行级别,如可以将init0作为关机指令、inti 6用作重启系统的指令。

(3)执行/etc/rc.d/rc.local

redhat中的运行模式2、3、4、5都会将/etc/rc.d/rc.local作为最后一个运行的初始化脚本,所以用户可以在这个文件中添加脚本指令,以实现在系统开机后,自动运行某个程序或者执行某项常规操作的功能。如要在系统开机启动后自动执行pptpd服务,则可以在/etc/rc.d/rc.local中增加一行启动pptptd的指令。

(4)执行/bin/login

login程序检验用户的输入账号和密码,若获得通过,则为使用者进行初始化环境,并将控制权交给shell,即等待用户登录,启动过程完成。


5.GRUB和LILO配置

(1)配置LILO可以通过编辑/etc/lilo.conf文件实现,其具体内容如下:

[root@localhost etc]#vi /etc/lilo.conf
prompt
timeout=50
default=linux
boot/dev/hda
map=boot/map
install=/boot/boot.b
message=/boot/message
linear

image=/boot/vmlinuz-2.620-8
label=linux
initrd=/boot/initrd-2.6.20-8.img
read-only
append="root=LABEL=/"


other=/dev/hda1
optional
label=DOS

启动加载文件配置的说明如下:

prompt

timeout=50

default=linux

这三行表示系统启动时将会显示一个LILO提示信息并等待5秒钟。注意,timeout的单位是0.1秒。如果5秒钟之内没有输入系统的名字,那么将使用默认引导default=linux,引导标号为linux的系统。

LILO配置文件解析:

    boot=/dev/hda表示启动盘使用第一个IDE硬盘,也就是hda。

    install=/boot/boot.b表示要将/boot/boot.b文件内容写到引导记录中,该文件在安装linux时已经创建。

    image=/boot/vmlinuz-2.6.20-8表示启动时使用的内核映像是boot/vmlinuz-2.6.20-8。

    label=Linux表示这个启动选择项的名称是Linux,然后是其他引导系统,这种配置适合同时安装了linux和windows两个系统的计算机。

更改后,为了使配置生效,还需要执行/sbin/lilo命令。

(2)配置GRUB可以通过编辑/boot/grub/grub.conf文件实现,具体内容如下:

[root@localhost grub]#vi  /boot/grub/grub.conf
default=0
  timeout=10
  splashimage=(had1,2)/boot/grub/splash.xpm.gz
  title Windows2K3
  rootnoverify(had0,0)
  chainloader+1


title Ubuntu
  root(had1,2)
  kernel /boot/vmlinuz-2.620-9 ro root=LABEL=/
  initrd /boot/initrd-2.6.20-8.img


title Mandrake10
  kernel(had1,4)/boot/vmliuz root=/dev/hda5 quiet devfs=mountacpi=off vga=788
initrd(had,4)/boot/initrd.img

GRUB配置文件解析:
       default=表示默认启动的系统,0为排在第一个的系统,依次类推。

      timeout=X为GRUB菜单停留的时间,单位为秒。

     title XXX:XXX为标题,就是要引导的操作系统的名字。

     root(hdX,Y)X和Y都代表一个数值,X是Linux的根分区所在的硬盘。如只有一个硬盘,则就是hda0。Y是代表Linux安装所在的分区,这个数字有点特殊。如配置文件中将Mandrake安装到第二块硬盘的第二个分区,也就是hdb5。则root(hdX,Y)就应该写为root(hda1,4),也就是说Y=hdaZ或者hdbZ中的Z减去1.

     kernel(hdX,Y)/boot/vmlinuz root=/dev/hdaZ和initrd (hdX,Y)/boot/initrd.img就是要引导硬盘分区的映像和initrd文件,一定要写正确X和Y的值,不然无法引导系统。 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
完整版:https://download.csdn.net/download/qq_27595745/89522468 【课程大纲】 1-1 什么是java 1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机中的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3-1 java语言基础入门 3-2 数据的分类 3-3 标识符、关键字和常量 3-4 运算符 3-5 表达式 3-6 顺序结构和选择结构 3-7 循环语句 3-8 跳转语句 3-9 MyEclipse工具介绍 3-10 java基础知识章节练习 4-1 一维数组 4-2 数组应用 4-3 多维数组 4-4 排序算法 4-5 增强for循环 4-6 数组和排序算法章节练习 5-0 抽象和封装 5-1 面向过程的设计思想 5-2 面向对象的设计思想 5-3 抽象 5-4 封装 5-5 属性 5-6 方法的定义 5-7 this关键字 5-8 javaBean 5-9 包 package 5-10 抽象和封装章节练习 6-0 继承和多态 6-1 继承 6-2 object类 6-3 多态 6-4 访问修饰符 6-5 static修饰符 6-6 final修饰符 6-7 abstract修饰符 6-8 接口 6-9 继承和多态 章节练习 7-1 面向对象的分析与设计简介 7-2 对象模型建立 7-3 类之间的关系 7-4 软件的可维护与复用设计原则 7-5 面向对象的设计与分析 章节练习 8-1 内部类与包装器 8-2 对象包装器 8-3 装箱和拆箱 8-4 练习题 9-1 常用类介绍 9-2 StringBuffer和String Builder类 9-3 Rintime类的使用 9-4 日期类简介 9-5 java程序国际化的实现 9-6 Random类和Math类 9-7 枚举 9-8 练习题 10-1 java异常处理 10-2 认识异常 10-3 使用try和catch捕获异常 10-4 使用throw和throws引发异常 10-5 finally关键字 10-6 getMessage和printStackTrace方法 10-7 异常分类 10-8 自定义异常类 10-9 练习题 11-1 Java集合框架和泛型机制 11-2 Collection接口 11-3 Set接口实现类 11-4 List接口实现类 11-5 Map接口 11-6 Collections类 11-7 泛型概述 11-8 练习题 12-1 多线程 12-2 线程的生命周期 12-3 线程的调度和优先级 12-4 线程的同步 12-5 集合类的同步问题 12-6 用Timer类调度任务 12-7 练习题 13-1 Java IO 13-2 Java IO原理 13-3 流类的结构 13-4 文件流 13-5 缓冲流 13-6 转换流 13-7 数据流 13-8 打印流 13-9 对象流 13-10 随机存取文件流 13-11 zip文件流 13-12 练习题 14-1 图形用户界面设计 14-2 事件处理机制 14-3 AWT常用组件 14-4 swing简介 14-5 可视化开发swing组件 14-6 声音的播放和处理 14-7 2D图形的绘制 14-8 练习题 15-1 反射 15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋游戏 17-2 总体设计 17-3 代码实现 17-4 程序的运行与发布 17-5 手动生成可执行JAR文件 17-6 练习题 18-1 Java数据库编程 18-2 JDBC类和接口 18-3 JDBC操作SQL 18-4 JDBC基本示例 18-5 JDBC应用示例 18-6 练习题 19-1 。。。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值