很多人都有安装Linux的经历,无非就是插张光盘或者USB到主机上,然后按照提示一步一步进行配置,完了重启一遍,OK。但是这个过程中,系统到底做了些什么事情呢?下面就简单地来说一说。

1. 可启动盘的历史

普通的光盘是基于ISO-9660的标准发展起来的,在光盘上数据被组织为帧和扇区,一个扇区包含98帧,共2352字节,一个700M的CD大概包含了360000个扇区。在大约1994~1995年的时候,凤凰科技(Phoenix Technologies)和IBM的两个牛人(Curtis Stevens和Stan Merkin)在一个墨西哥餐厅边吃午饭边商量可启动盘(Bootable Disk)的规范,商量完后,两人根据餐馆的名字将可启动盘的规范命名为”El Torito“。这个规范实际上对ISO-9660进行了扩展,规范中定义了可启动光盘的数据结构与映像数据的配置及光盘制作的一些详细说明,同时也隐含地制定了能够读取可启动光盘的BIOS规范。1996年COMPAQ、Phoenix与Intel联合发布的BIOS启动规范(BIOS Boot Specification)1.01,该规范为BIOS厂家提供了制造支持可启动光盘的BIOS的标准。

2. 可启动盘的原理

可启动盘跟普通的数据盘到底有什么区别呢?为什么将它插到电脑上就能够引导系统呢?

根据标准,BIOS会在开机时将检查光盘的第17个扇区(sector 17),查找其中的代码,若找到启动记录卷描述表(Boot Record Volume Descripter),它就根据表中的地址继续查找启动目录(Booting Catalog),找到启动目录后 ,再根据其中描述的启动入口(Boot Entry)找到相应的启动盘映像(Bootable Disk Image)或启动引导文件,找到启动盘映像后,读取其中的数据,并执行相应的开机动作。

3. 启动盘映像

启动盘映像多很多种,如SYSLINUX、ISOLINUX、PXELINUX、EXTLINUX等,其中PXELINUX用于网络安装,EXTLINUX用于从ext2/ext3/ext4/btrfs文件系统启动。而启动光盘会使用到剩下的两种映像:SYSLINUX和ISOLINUX。

在上面我们提到了自启动光盘的规范”El Torito“,它支持两种启动模式:模拟模式和非模拟模式。

模拟模式将启动信息保存在一个1.44M的FAT格式的映像文件中,就如同将一张1.44M的软盘”镶嵌“到一张光盘中,系统从光盘中加载这个映像文件,然后跟使用软盘一样启动系统。因为受空间限制,这种模式不能用于启动完整的Linux操作系统,通常只用来做Rescue盘、Live USB或者其他轻量级的启动系统。模拟模式使用的映像就是SYSLINUX,但这种方式一般只用于1999年以前的电脑。

非模拟模式直接将启动信息保存在光盘上,而不是一个模拟的映像文件上,这时用的就是ISOLINUX。从3.72版本开始,ISOLINUX支持”hybrid mode“模式,能够在ISO映像中放一个启动程序,支持使用同一个映像文件从光盘或者USB启动。现在大部分情况我们用的都是这种方式。

4. ISOLINUX

ISOLINUX目录中一般包含下列文件

名称

说明

isolinux.bin

非模拟模式的启动引导程序。当使用mkisofs命令时,-b参数要指向这个文件

vmlinuz

压缩的内核,引导系统安装。”VM“表示”Virtual Memory“

initrd.img

内存映像文件(initial ramdisk)。解压后可以看出一个简洁的Linux根文件系统

isolinux.cfg

ISOLINUX的配置文件

boot.cat

启动目录(booting catalog)文件,保存了所有可用的启动映像

*.msg

一些命令用到的文本文件,比如启动界面的提示信息

*.lss

ISOLINUX的图像化启动界面

首先说一下配置文件。isolinux.cfg是一个纯文本文件,里面大概像下面这个样子:

default local

prompt 1

timeout 600

display boot.msg

label linux

kernel vmlinuz

append initrd=initrd.img

label rescue

kernel vmlinuz

append initrd=initrd.img rescue

label local

localboot 0xFF

label reinstall

kernel vmlinuz

append ks=hd:sdb1:/ks.cfg method=hd:sdb1:/ initrd=initrd.img ramdisk_size=8192 console=ttyS0,9600 headless cmdline

文件头部可以认为是一些全局设置,default表示超时后系统的默认启动项,prompt为1时表示始终显示启动提示信息,否则需要按某些键才会显示,timeout以0.1秒为单位,等待用户输入的超时时间。

文件后面以label开头的段落就是具体的启动项及参数配置。比如用户输入linux,那表示将用vmlinz为内核,带着参数initrd=initrd.img来启动系统;localboot 0x80表示如果用户输入local,则系统将从第一块硬盘的第一个分区启动,可选参数包括:

0x80 - 第一块硬盘的第一个分区 (C: in DOS)

0x81 - 第一块硬盘的第二个分区(D: in DOS)

0x00 - 一个软盘驱动器 (A: in DOS)

....

0xFF - 从BIOS中列举的下一个设备启动

再说一下initrd.img。initrd.img是一个使用gzip压缩的ext2格式的文件系统映像,它包含了Linux的根目录,解压后能够看到下面的目录结构:

bin  dev  etc  firmware  init  lib  lib64  modules  proc  sbin  selinux  sys  tmp  usr  var

它一般被用来临时地引导硬件到实际内核能够接管并继续引导的状态,主要是用于加载ext3等文件系统及 SCSI 设备的驱动。比如,使用SCSI硬盘,而内核中并没有相关驱动,那么在装入SCSI模块之前,内核不能加载根文件系统,这时就可以从initrd的/lib/modules下加载驱动程序来读取硬盘数据。

5. 安装阶段1

将上面1~4节的内容汇总一下,可以大概得到Linux从光盘或USB安装过程第一阶段的内幕:

Step1. 电源上电后,BIOS根据设置的启动顺序从第一个设备开始启动,假设第一个设备已经被设置为光盘或者USB,启动程序执行/isolinux路径下的isolinux.bin,这个程序读取isolinux.cfg,在启动屏幕上显示所有的启动项。

Step2. 用户选择某个启动项(假设为reinstall)后,引导程序根据参数继续引导过程,加载内核映像vmlinuz和初始RAM磁盘initrd.img,在内存中构建了一个Linux启动所需的虚拟的根文件系统(rootfs)。

Step3. 内核执行initrd.img中的/init程序(这实际上是一个指向/sbin/init的软链接)。init会调用/sbin/loader程序,执行anaconda主程序。

至此,安装引导的第一个阶段结束,这个阶段的主要任务就是找到第二个阶段的引导程序并执行它。

6. 安装阶段2

安装的第二个阶段实际上就是anaconda的执行过程,非交互式安装建议直接参考ks.cfg的手册来理解,本文不再赘述,只简单介绍一下安装盘上相关文件和目录。

安装盘顶层目录除了前面提到的isolinux,还有几个主要的目录,如images、Packages、repodata,另外还有几个文件,如ks.cfg、.discinfo和.treeinfo。

文件或目录名

说明

.discinfo

安装盘识别信息,执行/usr/lib/anaconda-runtime/buildinstall时生成

.treeinfo

记录不同安装方式安装程序所在的目录结构

ks.cfg

kickstart文件,非交互式安装的配置文件,包括系统账户、分区以及安装哪些rpm包等都在里面定义

images

包含启动和驱动盘映像文件,最重要的是第二阶段的引导映像install.img(rhel6)或stage2.img(rhel5)

Packages

包含所有的二进制RPM包

repodata

包含RPM包的描述文件,如依赖关系,包含文件,校验码信息。有四个必要文件:filelists.xml.[gz],other.xml.[gz],primary.xml.[gz]和repomd.xml

以上都是自己的一些理解,如果理解有错,希望不吝指出,谢谢。

参考资料:

Linux安装程序Anaconda分析 ---   http://blog.csdn.net/zhoudaxia/article/details/7172020

使用isolinux制作liveUSB   ---   http://blog.csdn.net/trochiluses/article/details/17585525

Anaconda/Stage1DevelopmentGuide   --- https://fedoraproject.org/wiki/Archive:Anaconda/Stage1DevelopmentGuide?rd=Anaconda/Stage1DevelopmentGuide

Anaconda/Kickstart    ---  https://fedoraproject.org/wiki/Anaconda/Kickstart

感谢wikipedia,syslinux.org以及google.com

简述linux的重要安装过程,对Linux安装过程的理解相关推荐

  1. 解决Linux安装过程中不能安装Grub的问题

    参考,部分转载和万分感谢:解决Linux安装过程中不能安装Grub的问题 关卡1: 从前段时间折腾了很久,刚开始是因为/boot区已经占满了,那么为什么会占满呢?因为当时尝试初次手动分区,然后参考了网 ...

  2. p750tm安装linux系统,Android 开发环境(虚拟机,LINUX, secureCRT)安装过程.pdf

    Android 开发环境(虚拟机,LINUX, secureCRT)安装过程 Android linux 开发环境(虚拟机,LINUX, secureCRT )安装过程 注意 由于selinux 打开 ...

  3. 深度linux引导安装,全程演示Linux Deepin 12.06安装过程

    1为Deepin分配内存和磁盘资源 最近经常听到有网友讨论,当他们最喜爱的Windows XP在2014年官方停止补丁和安全更新之后,下一步该如何选择操作系统呢?选择市场占有率直线攀升的Windows ...

  4. linux yum nothing,Centos6.9 yum安装htop报错解决过程

    今天在学习linux过程中需要安装htop,但是我在直接yum -y install htop之后,系统提示: No package htop available. Error: Nothing to ...

  5. 改变openssl的环境变量linux,ECS Linux 安装配置openssl的具体过程

    这篇文章讲解在Linux系统下安装和配置openssl的过程 实验环境:Openssl 0.9.8, CentOS 6.5 Release (Final) 安装openssl需要预装gcc,若没有安装 ...

  6. gpt efi win7 linux,科学网—UEFI+GPTSSD+HDD 成功安装win10+Centos linux7 过程 - 陈长云的博文...

    主机为:Dell Precision T7910台式工作站  SSD + HDD 双硬盘 1.必备工具 ① Disk Genious ② Win10系统(光盘和U盘,我用的是U盘),网上可以下载 cn ...

  7. linux下安装nginx启动,Linux下安装启动nginx的过程

    1.首先将nginx的安装包传到虚拟机里的/home目录下 2.为了方便nginx运行而不影响linux安全需创建组合用户 groupadd -r nginx useradd -r -g nginx  ...

  8. linux 环境下安装oracle11g方法及安装过程中遇上的问题解决方法

     Oralce安装教程 1.先安装需要的依赖包 找到哪个没有安装,直接yum install XX,直到所有的都安装完成.注意,可能一个包安装了,再次执行检查,还是提示没有安装,那么就不需要管他们了, ...

  9. linux 深度定制,基于ubuntu发行版的安装界面的深度定制过程

    基于ubuntu发行版的安装界面的深度定制过程 先阅读官方帮助文档详细介绍ubuntu社区如果定制ubuntu发行版的具体步骤.最好是按照步骤执行一遍,否则会停留在表面问题. 漫长的阅读-. 1.版本 ...

  10. kali系统的u盘安装过程_kali linux怎么安装u盘启动

    2017-08-25 回答 以前在虚拟机中安装过backtrack 3 r5特别喜欢bt的风格,也很喜欢bt强大的功能,所以看到bt后面的版本变为kali后就直接动手安装了,不过马上要换电脑了,而且电 ...

最新文章

  1. PHP远程DoS漏洞深入分析及防护方案
  2. linux显示父目录,linux – 仅列出文件的公共父目录
  3. ckeditor5加字数_CKEditor5基本使用
  4. CC2530, 各种智能家居通信技术比较
  5. java 同类调用方法_JAVA中同类中方法的调用问题?
  6. 如何制作pem公钥证书和私钥证书
  7. suse linux安装rpm包,linux – 如何为Suse创建RPM
  8. Java未来路在何方?挑战大厂重燃激情!
  9. linux6安装图形化界面,centos 6.8 图形界面安装
  10. Python 为了提升性能,竟运用了共享经济!赶紧看看!!
  11. 创科视觉软件说明书_【纳博特斯克 | GGII】20192023年中国机器视觉行业调研
  12. android 控制流混淆 反向,AST混淆实战:仿obfuscator混淆控制流平坦化
  13. 大学学计算机用游戏本好吗,大学学建筑学用什么配置的笔记本电脑好?
  14. 麟龙指标通达信指标公式源码_通达信麟龙指标套三主图+副图指标 贴图
  15. 【python】google的经纬度定位查询API
  16. Eslint的严格模式
  17. 在梦想的道路上,一路前行
  18. 如何收集SparkSteaming运行日志实时进入kafka中
  19. linux otg 鼠标 节点,otg 的host功能,使用otg转host的线,连接鼠标。无效。
  20. 千篇一律:“外挂”泛滥的网游公关写作

热门文章

  1. solr后台登录验证
  2. 在SQL Server里为什么我们需要更新锁
  3. Redmine for windows 一键安装
  4. nginx子目录301重定向到其他域名URL
  5. 第四章、PL/SQL基础
  6. 编写程序,使用一维数组,模拟栈数据结构。 要求: 1、这个栈可以存储java中的任何引用类型的数据。 2、在栈中提供push方法模拟压栈。(栈满了,要有
  7. 数列分段II(信息学奥赛一本通-T1436)
  8. Linux 命令执行顺序控制
  9. 最大子矩阵(信息学奥赛一本通-T1224)
  10. 9 SD配置-企业结构-分配-给公司代码分配销售组织