Linux磁盘与启动程序

Linux磁盘分区与启动程序

一、Linux中的硬件

在学习Linux之前最好需要弄清楚需求是什么?根据需要来选择相应的硬件设备。在现在的主流市场上,Linux主要用于企业级的服务器搭建。

(一)选择与Linux搭配的主机设备

值得庆祝的是Linux的硬件要求并不是很高,但是由于不同的任务主机所需要的硬件设备的要求也不尽相同。

举例来说,如果任务主机需要承担的是企业内部的服务器或者需要使用用户界面模式的计算等功能的时候,应当使用更高配置的计算机。

下面针对可能遇到的的不同需求给出不同的设备推荐。(仅供参考)

1. 一般小型主机且不含X-Window系统

    用途:家用NAT主机(路由器功能)或小型企业的非图形用户界面模式小型主机。 CPU:要求较低 内存:至少512M,推荐1GB以上 网卡:一般的以太网卡即可 显卡:只要能够被Linux识别的显卡即可,例如NVIDIA或ATI的主流显卡均可 硬盘:推荐200GB以上即可

2. 桌面型Linux或含X-Window

    用途:Linux练习机或办公室常用的工作机(一般会使用到的环境) CPU:要求相比小型机高,推荐Intel i5或者i7及以上等级 内存:最起码需要大于1GB(如果装有图形用户界面),较少的内存会造成图形用户界面卡顿 网卡:普通的以太网卡即好 显卡:推荐使用256MB以上的显卡即可 硬盘:推荐60GB以上,越大越好

3.中型以上Linux服务器

    用途:中小型企业或学校的FTP、邮件、网页等网络服务主机。 CPU:等级要求较高。推荐Intel i5或者i7及以上等级的多核CPU 内存:至少需要4GB,越大越好 网卡:推荐知名品牌,比较稳定,性能优越 显卡:如果使用到图形功能,则64MB显存的显卡是必须的 磁盘:越大越好,有条件的可以使用磁盘阵列或网络硬盘等的系统架构,能够拥有更加稳定安全的环境 建议企业用计算机购买商用服务器,不建议自行组装。

说了这么多,也许你很想知道自己的机器是否适合自己青睐的那一个系统,很简单,可以通过两种方式查看自己的硬件是否符合安装要求。

    在linux的HowTo文件中查询硬件的支持情况。 也可以到各个相关的linux发行版网站进行相应的查询。

个人建议在安装部署之前,最好先去查询是否符合要求,否则后续会出现很多的问题。(一般来说,一般的硬件基本都能满足。)

(二)各硬件设备文件名

早在之前我们就提到过,在LInux中,**一切的硬件设备都当作文件来对待。**因此学习Linux很多时候都是和文件打交道。

因此了解各个硬件设备在Linux当中扮演的角色是至关重要的。

在Linux的系统中,几乎所有的硬件设备都在/dev这个目录内,因此经常可以看到/dev/sda、/dev/sdb等。

下面列出了几个常见的硬件设备在LInux当中的文件名

设备 设备在linux中的文件名 SCSI(串行接口)、SATA(串行接口)、USB磁盘驱动器 /dev/sd[a-p] U盘 /dev/sd[a-p](与SATA相同) Virtio接口(IO设备虚拟化程序) /dev/vd[a-p](用于虚拟机内) 软盘驱动器 /dev/fd[0-7] 打印机 /dev/lp[0-2](25针打印机)、/dev/usb/lp[0-15](USB接口) 鼠标 /dev/input/mouse[0-15](通用)、/dev/psaux(PS/2接口)、/dev/mouse(当前鼠标) CD-ROM(光盘只读存储器)、DVD-ROM(只读型DVD) /dev/scd[0-1](通用)、/dev/sr[0-1](通用,Centos比较常见)、/dev/cdrom(当前CD-ROM) 磁带机 /dev/ht0(IDE接口)、/dev/st0(SATA/SCSI接口)、/dev/tape(当前磁带) IDE磁盘驱动器 /dev/hd[a-d](主要用于旧式系统)

需要注意的是由于IDE接口的磁盘驱动器已经几乎被淘汰了,因此现在的IDE接口的磁盘文件名也被模拟成为/dev/sd[a-p]

如果想要了解更多的Linux内核支持的硬件设备与文件名,可以参考以下网页:

Linux内核官网:https://www.kernel.org/

二、Linux中的磁盘分区

前面说完了Linux中的硬件的有关内容,由于无论是什么系统,最终都需要安装在磁盘中,也就是硬盘中,所以我们需要对硬盘有一个最基本的认识。

以Windows的观点来看,系统磁盘可能会被划分为C、D、E甚至更多的磁盘分区,但是由于Llinux中的设备都是以文件的形式存在,自然与Windows常见的C、D、E盘有很大的区别。

(一)分区的优势

1. 数据的安全性

因为经过分区之后,每个分区的信息数据都是分开的,当需要将某个分区的数据进行整理的时候,可以将该分区的数据移交到其他分区,是不会影响数据的完整性的。所以分好区可以提升数据的安全性。

2. 系统性能

由于分区的出现,可以将某一类型的数据集中存放在某一个分区,由于数据的高度集中,这样就能够提高提高数据的读取的速度与性能。

下面我们来简单了解一下磁盘连接与设备文件名的关系。

(二)磁盘连接与设备文件名

这里需要知道的是个人计算机的常见磁盘接口主要有两种:SATA以及SAS。目前主流的是SATA接口。

更老的计算机使用的是IDE接口。以前的IDE接口与SATA接口在Linux上的磁盘代号有所不同,但是近年来随着各大Linux发行版已经将IDE接口的磁盘文件名模拟成与SATA一样了。

正常的物理机器使用的是/dev/sd[a-p]的磁盘文件名。 但随着网络虚拟技术的发展,在虚拟环境中,可能会使用/dev/vd[a-p]这种设备文件名

再以SATA接口来说,由于SATA、USB、SAS等接口都是以SCSI模块来驱动,因此这些接口的磁盘文件名都是/dev/sd[a-p]的格式。所以SATA与USB接口的磁盘本身并没有一定的顺序。

如何决定它的设备文件名呢?

这个时候主要根据Linux检测到磁盘的顺序来命名的。

(三)MBR(MS-DOS)与GPT磁盘分区表

在了解这两个磁盘分区格式之前,需要了解到磁盘的有关内容。

磁盘主要是由碟片、机械手臂、磁头与主轴马达组成,数据的写入主要在碟片上面。 碟片上又可以细分出扇区和磁道两种单位。其中扇区的物理大小设计有2种,分别是512字节和4K字节。

磁盘示意图如下所示:

从图中可以看出,一块磁盘上往往有很多的扇区,其实只有第一个扇区十分重要,因为它记录了整个磁盘的重要信息。

并且所有碟片的同一个磁道,被称为柱面,这是文件系统的最小单位,也是分区的最小单位。

早期磁盘的第一个扇区里面含有的重要信息称为MBR,但是由于磁盘容量的不断扩大,造成了一些读写的困扰。后来渐渐地出现了一个新的磁盘分区格式GPT。这两种分区格式与限制有所不同。

什么是分区表?简单来说,新到手的磁盘就类似于一块木头,你需要进行相应的切割,分成不同的部分,每个部分都有着自己的独特用途,也就是说对于磁盘需要划分分区才能够使用。

1. MBR(MS-DOS)分区表格与限制

早期的Linux系统为了兼容Windows的磁盘,使用的是支持Windows的MBR方式来处理启动引导程序以及分区表。而启动引导程序记录区与分区表则通通放在磁盘的第一个扇区,通常大小是512字节。

(1)四个主分区模式

通常第一个磁盘分区会有以下内容:

    主引导记录:可以安装启动引导程序的地方,有446字节。 分区表:记录整块磁盘分区的状态。占有64字节。

由于分区表所在区块仅有64字节容量,因此最多仅能有4组记录区,每组记录区记录了该区段的启始与结束的柱面号码。

假设某个磁盘设备文件名在Linux系统中的名称为/dev/sda,这四个分区在系统中的设备文件名如下所示:

    P1:/dev/sda1 P2:/dev/sda2 P3:/dev/sda3 P4:/dev/sda4

假设上图的硬盘有400个柱面,并且分成四个分区。

第一个分区在第1-100号柱面的范围,第二个分区在第101-200号柱面的范围,第三个分区在第201-300号柱面的范围。第四个分区在第301-400号柱面的范围。

如果在Windows系统上第一到第四分区的代号应该为C、D、E、F,当有数据要写入C分区的时候,数据将会被写入1-100号柱面之间。

根据上图我们可以得到如下信息

    所谓的分区,其实就是对64字节的分区表进行设置 磁盘默认的分区表仅能写入四组分区信息 四组划分信息称为主要分区(Primary)或扩展分区(Extended) 分区的最小单位通常是柱面 当系统需要写入磁盘时,会参考磁盘分区表,才能针对某个分区进行数据的处理。
(2)带扩展分区的划分

但是很多时候,一块硬盘往往不止划分出四个分区。往往能够划分出十几个以上的分区。这个时候就需要利用扩展分区来实现了。顾名思义,扩展分区也就是提供扩展作用的分区。

简单来说就是:第一个扇区记录四个分区的数据,之后利用额外的扇区来记录更多的分区信息。

带扩展分区的示意图如下所示:

实际上扩展分区并不是只占一个区块,而是会分布在每个分区的最前面几个扇区来记录分区信息

扩展分区的目的是使用额外的扇区来记录分区信息。扩展分区本身不能够被拿来格式化。

由扩展分区分出来的分区,常常被称为逻辑分区,由于逻辑分区是由扩展分区进一步划分出来的,所以逻辑分区的使用的柱面范围就是扩展分区所设置的范围。

那么上图中的设备文件名分别如下:

    P1:/dev/sda1 P2:/dev/sda2 L1:/dev/sda5 L2:/dev/sda6 L3:/dev/sda7 L4:/dev/sda8 L5:/dev/sda9

这里需要注意的是虽然有四个分区,但是只有sda1和sda2,没有3和4,这是因为前面这4个数字保留给主分区或者扩展分区来使用的。相应的逻辑分区的名称就从5开始

总的来说:

    主要分区与扩展分区最多有4个(硬盘限制) 扩展分区最多只能有一个 逻辑分区是由扩展分区持续划分出来的分区 能够被格式化后作为数据存取的分区是主要分区和逻辑分区,扩展分区无法格式化。 逻辑分区的数量是依据操作系统差异而有所不同

需要注意的是:同位于扩展分区内的逻辑分区是可以实现整合的,但主要分区与逻辑分区是无法实现整合的。并且一旦扩展分区被破坏,那么所有的逻辑分区都会被删除,因为逻辑分区的信息都记录在扩展分区里面。

由于第一个扇区所记录的分区表和MBR很重要,几乎只要读取硬盘都会优先从这个扇区先读起,那么如果整个硬盘的第一个扇区出现了问题,那么这个硬盘大概率是没有用了。

(3)MBR分区存在的问题

由于MBR分区表除了主要分区、扩展分区、逻辑分区之外,每组分区表仅有16字节而已,可记录的信息内容十分有限。

    操作系统无法使用2.2TB以上的磁盘容量 MBR仅有一个区块,若被破坏后,经常无法或很难恢复 MBR内的存放启动引导程序的区块仅446字节,无法存储较多的程序代码

2. GPT(GUID partition table)磁盘分区表

由于磁盘分区中一个扇区的大小主要有两种,一种是512字节,一种是4K字节,此时为了兼容所有的磁盘,在扇区的定义上,大多会使用**逻辑区块地址(Logical Block Address,简称LBA)**来处理。

GPT的磁盘分区格式将磁盘所有的区块以LBA(默认512字节)来规划,第一个LBA称为LBA0(从0开始编号)

GPT分区表结构示意图

如上图所示,与MBR使用第一个512字节区块来记录信息不同,GPT使用了34个LBA区块来记录分区信息,与MBR最为显著的一点差别就是,GPT除了前面34个LBA之外,整个磁盘的最后的34个LBA也拿来作为另一个备份。提高磁盘的安全性。

下面简单解释一下几个重要的分区

(1)LBA0(MBR兼容区块)

这个区块与MBR模式相似,这个兼容区块也一分为二。

一个就是存储启动引导程序的区块,大约占446字节。

在原本的分区表的记录区内(MBR分区中存储记录分区的信息),仅放入一个特殊标志符,用来表示为GPT格式。

(2)LBA1(GPT表头记录)

这个部分记录分区表本身的位置与大小,同时也记录了备份用的GPT分区放置的位置。

除此之外,还放入了分区表的检验码,操作系统可依据校验码来判断GPT是否正确,若有错误,可以通过这个记录区来获取备份的GPT(磁盘最后的那个备份分区)来恢复GPT的正常运行。

(3)LBA2-33(实际记录分区信息处)

从LBA2区块开始,每个LBA都可以记录4组分区记录,并且由于每个LBA占512字节,所以每组记录用到128字节的空间,由于总共有32个区块,所以就一共有128组分区记录。

除了每组记录所需要的标识符与相关的记录之外,,GPT在每组记录中分别提供了64位来记载开始/结束的扇区号码。

现在GPT分区默认可以提供多达128组记录,并且GPT磁盘分区格式没有了所谓的主、扩展、逻辑分区的概念

每组记录都可以独立存在,每个都可以视为主要分区,每一个分区都可以拿来格式化使用。

并不是所有的操作系统都支持读取到GPT的磁盘分区格式,同时,也不是所有的硬件都可以支持GPT的磁盘分区。是否能够读写GPT的格式与启动的检测程序有关。

三、启动中的BIOS与UEFI启动检测程序

之前说到,是否能够读写GPT格式的磁盘与启动检测程序有关。

基本上,目前的主机系统在加载硬件驱动方面的程序,主要是早期的BIOS与新的UEFI两种机制。

何为BIOS?

BIOS是英文"Basic Input Output System"的缩略词,直译过来后中文名称就是"基本输入输出系统"。

其实,它是一组固化到计算机内主板上一个ROM芯片上的程序,它保存着计算机最重要的基本输入输出的程序、开机后自检程序和系统自启动程序,它可从CMOS中读写系统设置的具体信息。 其主要功能是为计算机提供最底层的、最直接的硬件设置和控制。

下面简单介绍一下早期BIOS与UEFI BIOS的有关内容:

(一)BIOS搭配MBR/GPT的启动流程

BIOS简单来说就是一个写到主板上的一个固件(即写到硬件上的一个软件程序)。

这个BIOS就是在启动的时候,计算机系统主动执行的第一个程序。

BIOS接下来就会分析我们的计算机系统中有哪些存储设备。

以硬盘为例,BIOS会根据用户的设置去取得能够启动的硬盘,并且到该硬盘中去读取第一个扇区的MBR位置。MBR这个仅有446字节的硬盘的硬盘容量里面会放置最基本的启动引导程序。

接下来说说启动引导程序的作用:

如下是启动引导程序示意图:

启动引导程序顾名思义主要的工作就是引导系统的启动,而系统的启动需要加载一系列的文件,例如:内核文件。因此这个启动引导程序的主要目的就是加载系统的内核文件。

这是因为启动引导程序是操作系统安装的时候提供的,所以他可以认识硬盘内的文件系统格式,也就是说它可以读取内核文件。

总结一下,整个启动流程到操作系统之前的流程如下:

  1. BIOS:启动主动执行的固件,会认识第一个可启动的设备。
  2. MBR:第一个可启动设备的第一个扇区的主引导记录块,内含启动引导代码。
  3. 启动引导程序(boot loader):一个可读取内核文件来执行的软件
  4. 内核文件:开始启动操作系统。
那么问题来了,什么是boot loader呢?

首先我们必须明确,BIOS与MBR都是硬件本身会支持的功能。

其次,严格来说boot loader启动引导程序是一个在MBR的第一扇区的主引导记录块中的软件程序。并且由于主引导记录区块只有446字节,那么也就决定了这个启动引导程序是非常小并且高效的。

最后,简单介绍一下启动引导程序的主要功能:

    提供选项,用户可以选择不同的启动选项,这也是多重引导的重要功能。 加载内核文件,直接指向可使用的程序区段来启动操作系统。 转交其他启动引导程序,将启动管理功能转交给其他启动引导程序负责(可以安装在每个分区的启动扇区)

**第三点转交其他启动引导程序(多重引导)**大致可以用下图来表示:

需要明确的一点是:启动引导程序除了可以安装在MBR分区之外,还可以安装在每个分区的启动扇区。

简单来说,MBR的启动引导程序提供了两种选项:M1和M2

    M1(直接指向Windows):可以直接加载Windows的内核文件来开机。 M2(指向Linux的启动扇区):将开机管理工作交给第二个分区的启动扇区。选择之后,该启动引导程序只有一个选项(右M1) M1(直接指向Linux):选择M2之后就会显示M1(指向Linux),选择之后就使用Linux的内核文件来启动。

简单总结一下上图:

  1. 每个分区都拥有自己的启动扇区(boot sector)
  2. 图中的系统分区为第一及第二分区
  3. 实际可启动的内核文件是放置到各个分区中的
  4. 启动引导程序只会认识自己的系统分区内的可启动内核文件以及其他启动引导程序而已。
  5. 启动引导程序可直接指向或者间接将管理权转交给另一个管理程序。
小科普:为什么人们常说:如果要安装多重引导,最好最先安装Windows再安装Linux?

原因:

  1. Linux在安装的时候,可以选择将启动引导程序安装在MBR或者其他个别分区的引导扇区。而且Linux的启动引导程序可以手动设置启动选项(也就是上图中的M1和M2),也就是说我们可以在Linux的启动引导程序中加入Windows启动的选项。
  2. 但在Windows安装的时候,它的安装程序会主动的覆盖掉MBR以及自己所在分区的启动扇区,不提供自己选择启动选项的功能。

因此,如果先装Linux再装Windows的话,那么MBR的启动引导程序就只会有Windows的选项,而不会有Linux的选项。但然凡事不是绝对的,如果遇到了启动引导程序被覆盖了,可以利用恢复模式来修复MBR。

说完了MBR分区格式,同样的如果启动引导程序能够支持GPT,那么使用BIOS同样可以读取到正确的操作系统内核。如果启动引导程序不支持GPT,那么就无法读取到内核,将无法启动操作系统。

(二)UEFI BIOS搭配GPT启动流程

这里值得注意的是UFI本质上也是一个类似于BIOS的启动程序,只不过属于较后期随着磁盘容量的不断发展才出来的。

由以上的GPT分区表中可以知道,GPT分区格式可以提供64位的寻址,也能使用较大的区块来处理启动引导程序。但早期的BIOS(仅仅是一个16位的程序)其实不懂GPT,需要通过GPT提供的兼容模式才能够读写这个磁盘设备。

为了解决与现阶段的新操作系统接轨方面的问题,于是出现了UEFI这个统一可扩展固件接口。

下面来简单比较一下传统的BIOS与UEFI的差异:

比较项目 传统BIOS UEFI 使用程序语言 汇编语言 C语言 硬件资源控制 使用中断(IRQ)管理,不可变的内存存取,不可变的输入/输出存取 使用驱动程序与协议 处理器运行环境 16位 CPU保护模式 扩充方式 通过IRQ连接 直接加载驱动程序 第三方厂商支持 较差 较佳且支持多平台 图形能力 较差 较佳 内置简化操作系统环境 不支持 支持

从上面的比较不难发现:

    UEFI简直就类似于一个低级的操作系统,只需要加载驱动程序即可控制操作。 使用UEFI的主机,在开机速度上一般都要比BIOS快很多。 UEFI的各项性能都明显优于传统的BIOS

与BIOS模式相比,虽然UEFI各项性能都优于传统的BIOS,并且可以直接获取GPT的分区表(对于GPT分区的磁盘分区而言),最好拥有BIOS boot 的分区支持。

这是因为GPT磁盘分区格式中,LBA0仅提供第一阶段的启动引导程序代码,如果要使用类似于grub的启动引导程序的话,需要额外划分一个分区(BIOS boot),该分区放置其他开机过程所需要的程序。否则可能会导致无法读取其他扇区的启动引导程序,也就无法加载内核文件了。

最后补充一点:

过去由于经常有黑客借由BIOS启动阶段来破坏系统,并取得系统的控制权,因此UEFI加入了一个安全启动的功能,该功能的意思是即将启动的操作系统都必须要经过UEFI的验证,否则无法顺利启动。 不过有利肯定也有弊,加入了这个功能之后,许多的操作系统,包括Linux,就很有可能无法顺利启动,某些时候,可能需要将UEFI的secure boot功能关闭,才能够顺利进入系统。
经验分享 程序员 微信小程序 职场和发展