IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    MBR、分区表及开机引导流程

    onlyice发表于 2015-07-28 10:31:06
    love 0

    很久之前就对开机引导流程有一个大致的了解,但是始终不够清晰和深入。今天看了下《鸟哥的私房菜》,对这个概念又了解了一些,便趁热写下了这篇文章巩固一下。

    讲到开机引导流程,便得先谈起 BIOS。BIOS 即 Basic Input/Output System,是现今世界上大部分主板上搭载的固件。电脑接通电源后,便开始运行 BIOS 内的最基本的引导加载程序。此时 BIOS 会进行开机自检,如检查内存及外围硬件设备情况等,然后根据 BIOS 的设置读取引导设备(一般是硬盘,当然也可以是 U 盘,光盘等)的引导区。硬盘的引导区即 MBR (Main Boot Record),存在于硬盘的第一个扇区内,而硬盘的扇区一般为 512 字节,因此 MBR 的容量也是 512 字节。

    MBR 的结构如图所示(出处)。前面 446 个字节存放的是引导程序代码,一般在安装操作系统时写入;之后的 447-510 字节区域存放的是分区表的内容,一共 64 字节。MBR 的分区表只能有四项,每项的信息占 16 字节。这四个分区被称为主分区(Primary)或者扩展分区(Extended)。

    这里有几点信息值得一提:

    • 新买的电脑常常要进行分区的操作,其实就是针对那个 64 字节的分区表进行操作而已
    • MBR 的分区表只能写入四组信息,这四个分区被称为主分区或扩展分区
    • 系统要写入磁盘时,一定会参考磁盘分区表,才能针对某个分区进行数据的处理

    有过 Windows 使用经验的同学都知道,一个硬盘上的分区经常不止 4 个,可能有 C, D, E, F, G, H 等等数量的分区。可是 MBR 里面只能保存 4 个分区信息,那为何还可以有 5 个以上的分区存在呢?

    这就是扩展分区帮的忙啦。扩展分区使用额外的扇区来纪录扩展分区内的分区结构,于是一个扩展分区可以分为数个逻辑分区。

    上图是我的硬盘的分区表。第一个分区是主分区,用来放 Win7;第二个分区是扩展分区,分个 5 个逻辑分区,其中 3 个供 Windows 使用,为 NTFS 文件格式。另外两个,一个挂载 openSUSE 的 /home 目录,一个作为交换空间。而最后一个分区为主分区,挂载 openSUSE / 目录。值得一提的是,每个分区都有自己的引导扇区,供 MBR 读取及调用,但是引导扇区似乎只能存在于主分区,而不能存在于扩展分区或逻辑分区。

    由于 MBR 的分区机制,便出现了诸如合并主分区和逻辑分区的问题,或者把逻辑分区变成主分区的问题。这些操作都会修改扩展分区的信息,使用软件做出更改时要多加小心,避免扩展分区信息被破坏或者搞乱。

    接下来说说 Linux 系统中对于硬盘分区的设备文件名。现在主流的电脑大多数提供的是 SATA 接口,而 IDE 接口只在老旧的电脑上出现,因此这里只讨论 SATA 接口,IDE 接口也是类似的。

    SATA/USB/SCSI 等磁盘接口都是使用 SCSI (我不知道是啥) 模块来驱动的,因此这些接口的磁盘设备文件名都是 /dev/sd[a-p] 格式。而且设备文件名是由 Linux 系统检测到的顺序来命名的。

    比如你的 PC 上有两片 SATA 硬盘及插有一个 U 盘,则两个 SATA 硬盘的文件名为 /dev/sda 及 /dev/sdb,而 U 盘在开机完成后才被识别(鸟哥说言,不知道现在是否仍是这个情况),因此被命名为 /dev/sdc。

    而 /dev/sda 这种文件只表示硬盘,但是操作硬盘上的文件需要用到具体的分区。分区的设备文件名是在 /dev/sda 后加上数字,形成诸如 /dev/sda1 之类的文件名。

    Linux 系统将前 4 个号分给了 MBR 分区表的 4 个纪录。因此,逻辑分区的设备文件名至少是 5 及 5 以上的号。根据上图我的机器的分区表,可以推测出哪个分区挂载在哪个设备文件名上:

    • /dev/sda1: Windows 下 C 盘
    • /dev/sda2: 扩展分区
    • /dev/sda5: Windows 下 D 盘
    • /dev/sda6: Windows 下 E 盘
    • /dev/sda7: Linux EXT3 分区,挂载 /home
    • /dev/sda8: Linux Swap 分区
    • /dev/sda9: Windows 下 F 盘
    • /dev/sda3: Linux EXT3 分区,挂载 /

    说完分区的事情,再来谈谈开机引导流程。从上文中也大概可以知道,需要经过 BIOS,MBR 等过程。大致的过程为:

    1. ROM 中的 POST (Power On Self-Test),即开机自检
    2. BIOS/EFI (Extended Firmware Interface) 代码
    3. MBR (Main Boot Record)
    4. 引导扇区 (Boot Sector),即上文提到的主分区里的引导扇区,可以放置加载操作系统文件的程序代码
    5. 调用操作系统引导程序

    虽然大部分的机器使用的固件为 BIOS,且硬盘引导使用的是与 BIOS 相对应 MBR,但是 MBR 是 1983 年提出的,带有那个时代的局限性,因此就有人提出了 EFI 规范以制定新的固件来代替 BIOS。MBR 存在的一个主要问题是,它用了 4 个字节来表示分区的扇区数,而一个扇区为 512 字节,这意思着一个分区至多为 pow(2, 32) * 512 ,即 2TB 大小。而 EFI 规范定义了一种新的分区方式,称为 GPT (GUID Partition Table),在兼容 MBR 的情况下比较好地解决了 MBR 存在的一些问题。具体内容我也了解不多,有兴趣的同学可以参考下面的文献:

    1. http://en.wikipedia.org/wiki/Master_boot_record
    2. https://wiki.archlinux.org/index.php/GUID_Partition_Table
    3. http://en.wikipedia.org/wiki/UEFI


沪ICP备19023445号-2号
友情链接