这件事我已经预谋很久了,然后我终于付出了行动。虽然我现在把操作系统换成Ubuntu并不是件明智的事,但是我那颗Geek的心已经等不了了。
这次操作系统分区我先是依照的《鸟哥的私房菜》分区的:
ubuntu_partion.jpeg
分区就和这张图类似。之后就出现这个问题:
ubuntu_writegrup_fail.jpeg
这我就很蒙了,我明明按照教程来的怎么能错呢?
还是百度大法好总,我在这里找到了点启示:http://forum.ubuntu.org.cn/viewtopic.php?t=465188
没错:我就是uefi开机,莫非和uefi开机有关系,尤其是那个繁体字的那几句话还要gpt分区,这又是个什么鬼。
好吧情急之下只能再次开启百度大法,我在这里找到了启示:http://blog.163.com/yangz_ranma/blog/static/121054460201601912253287/
然后按照他的操作总算是把Ubuntu给装上了
好吧,虽然把操作系统给装上了但还是有诸多疑惑,于是我就又去《鸟哥的私房菜》来寻求答案了。
我们先来认识下硬盘的结构如图:
hard_disk01.jpg
整个磁碟盘上头好像有多个同心圆绘制出的圆形图,而由圆心以放射状的方式分割出磁碟的最小储存单位,那就是磁区(Sector), 在物理组成分面,每个磁区大小为512Bytes,这个值是不会改变的。而磁区组成一个圆就成为磁轨(track), 如果是在多碟的硬盘上面,在所有磁碟盘上面的同一个磁轨可以组成一个磁柱(Cylinder), 磁柱也是一般我们分割硬盘时的最小单位了!
硬盘这部分鸟哥是这么说的:
整个磁碟盘上头好像有多个同心圆绘制出的圆形图,而由圆心以放射状的方式分割出磁碟的最小储存单位,那就是扇区(Sector), 在物理组成分面,每个磁区大小为512Bytes,这个值是不会改变的。而磁区组成一个圆就成为磁道(track), 如果是在多碟的硬盘上面,在所有磁碟盘上面的同一个磁道可以组成一个柱面(Cylinder), 磁柱也是一般我们分割硬盘时的最小单位了!
在计算整个硬盘的储存量时,简单的计算公式就是:『header数量 * 每个header负责的磁柱数量 * 每个磁柱所含有的磁区数量 * 磁区的容量』,单位换算为『header * cylinder/header * secter/cylinder * 512bytes/secter』,简单的写法如下: Head x Cylinder x Sector x 512 Bytes。 不过要注意的是,一般硬盘制造商在显示硬盘的容量时,大多是以十进位来编号,因此市售的500GB硬盘, 理论上仅会有460GBytes左右的容量喔
注释:Heads就是磁头数
接下来我们谈MBR分区:
早期的 Linux 系统为了相容于 Windows 的磁盘,因此使用的是支持 Windows 的
MBR(Master Boot Record, 主要开机纪录区) 的方式来处理开机管理程序与分区表!而开
机管理程序纪录区与分区表则通通放在磁盘的第一个扇区, 这个扇区通常是 512Bytes 的大
小 (旧的磁盘扇区都是 512Bytes 喔!),所以说,第一个扇区 512Bytes 会有这两个数据:
主要开机记录区(Master Boot Record, MBR):可以安装开机管理程序的地方,有446
Bytes
分区表(partition table):记录整颗硬盘分区的状态,有64 Bytes
由于分区表所在区块仅有64 Bytes容量,因此最多仅能有四组记录区,每组记录区记录了该区
段的启始与结束的柱面号码。 若将硬盘以长条形来看,然后将柱面以直条图来看,那么那64
Bytes的记录区段有点像下面的图示:Diskdivide.jpg
由于分区表就只有64 Bytes而已,最多只能容纳四笔分区的记录, 这四个分区的记录被称为
主要(Primary)或延伸(Extended)分区。 根据上面的图示与说明,我们可以得到几个重
点信息:其实所谓的“分区”只是针对那个64 Bytes的分区表进行设置而已!
硬盘默认的分区表仅能写入四组分区信息
这四组分区信息我们称为主要(Primary)或延伸(Extended)分区
分区的最小单位“通常”为柱面(cylinder)
当系统要写入磁盘时,一定会参考磁盘分区表,才能针对某个分区进行数据的处理
MBR逻辑分区:
既然分区表只有记录四组数据的空间,那么是否代表我一颗硬盘最多只能分区出四个分区?
当然不是啦!有经验的朋友都知道, 你可以将一颗硬盘分区成十个以上的分区的!那又是如
何达到的呢?在Windows/Linux系统中, 我们是通过刚刚谈到的延伸分区(Extended)的方
式来处理的啦!延伸分区的想法是: 既然第一个扇区所在的分区表只能记录四笔数据, 那我
可否利用额外的扇区来记录更多的分区信息?实际上图示有点像下面这样:
logicDivision.jpg
Tips 实际上延伸分区并不是只占一个区块,而是会分佈在每个分区的最前面几个扇区来记载
分区信息的!只是为了方便读者记忆, 鸟哥在上图就将他简化了!有兴趣的读者可以到下面
的链接瞧一瞧实际延伸分区的纪录方式: http://en.wikipedia.org/wiki/Extended_boot_record
在上图当中,我们知道硬盘的四个分区记录区仅使用到两个,P1为主要分区,而P2则为延伸
分区。请注意, 延伸分区的目的是使用额外的扇区来记录分区信息,延伸分区本身并不能被
拿来格式化。 然后我们可以通过延伸分区所指向的那个区块继续作分区的记录。
如上图右下方那个区块有继续分区出五个分区, 这五个由延伸分区继续切出来的分区,就被
称为逻辑分区(logical partition)。 同时注意一下,由于逻辑分区是由延伸分区继续分区出
来的,所以他可以使用的柱面范围就是延伸分区所设置的范围喔! 也就是图中的101~400
啦!
MBR 主要分区、延伸分区与逻辑分区的特性我们作个简单的定义啰:
主要分区与延伸分区最多可以有四笔(硬盘的限制)
延伸分区最多只能有一个(操作系统的限制)
逻辑分区是由延伸分区持续切割出来的分区;
能够被格式化后,作为数据存取的分区为主要分区与逻辑分区。延伸分区无法格式化;
逻辑分区的数量依操作系统而不同,在Linux系统中SATA硬盘已经可以突破63个以上的
分区限制;
GPT分区:
因为过去一个扇区大小就是 512Bytes 而已,不过目前已经有 4K 的扇区设计出现!为了相容
于所有的磁盘,因此在扇区的定义上面, 大多会使用所谓的逻辑区块位址(Logical Block
Address, LBA)来处理。GPT 将磁盘所有区块以此 LBA(默认为 512Bytes 喔!) 来规划,
而第一个 LBA 称为 LBA0 (从 0 开始编号)。
与 MBR 仅使用第一个 512Bytes 区块来纪录不同, GPT 使用了 34 个 LBA 区块来纪录分区
信息!同时与过去 MBR 仅有一的区块,被干掉就死光光的情况不同, GPT 除了前面 34 个
LBA 之外,整个磁盘的最后 33 个 LBA 也拿来作为另一个备份!这样或许会比较安全些吧!
详细的结构有点像下面的模样:
GPTdivision.png
LBA0 (MBR 相容区块)
与 MBR 模式相似的,这个相容区块也分为两个部份,一个就是跟之前 446 Bytes 相似的
区块,储存了第一阶段的开机管理程序! 而在原本的分区表的纪录区内,这个相容模式
仅放入一个特殊标志的分区,用来表示此磁盘为 GPT 格式之意。而不懂 GPT 分区表的
磁盘管理程序, 就不会认识这颗磁盘,除非用户有特别要求要处理这颗磁盘,否则该管
理软件不能修改此分区信息,进一步保护了此磁盘喔!LBA1 (GPT 表头纪录)
这个部份纪录了分区表本身的位置与大小,同时纪录了备份用的 GPT 分区 (就是前面谈
到的在最后 34 个 LBA 区块) 放置的位置, 同时放置了分区表的检验机制码
(CRC32),操作系统可以根据这个检验码来判断 GPT 是否正确。若有错误,还可以通
过这个纪录区来取得备份的 GPT(磁盘最后的那个备份区块) 来恢复 GPT 的正常运
行!LBA2-33 (实际纪录分区信息处)
从 LBA2 区块开始,每个 LBA 都可以纪录 4 笔分区纪录,所以在默认的情况下,总共可
以有 432 = 128 笔分区纪录喔!因为每个 LBA 有 512Bytes,因此每笔纪录用到 128
Bytes 的空间,除了每笔纪录所需要的识别码与相关的纪录之外,GPT 在每笔纪录中分
别提供了 64bits 来记载开始/结束的扇区号码,因此,GPT 分区表对於单一分区来说,
他的最大容量限制就会在“ 264 512Bytes = 263 1KBytes = 233TB = 8 ZB ”,要注意 1ZB=230TB
啦! 你说有没有够大了?
现在 GPT 分区默认可以提供多达 128 笔纪录,而在 Linux 本身的核心设备纪录中,针对单一
磁盘来说,虽然过去最多只能到达 15 个分区,不过由于 Linux kernel 通过 udev 等方式的处
理,现在 Linux 也已经没有这个限制在了! 此外,GPT 分区已经没有所谓的主、延伸、逻辑
分区的概念,既然每笔纪录都可以独立存在, 当然每个都可以视为是主分区!每一个分区都
可以拿来格式化使用喔!
BIOS+MBR/GPT搭配启动情况
在计算机概论里面我们有谈到那个可爱的BIOS与CMOS两个东西, CMOS是记录各项硬件参
数且嵌入在主板上面的储存器,BIOS则是一个写入到主板上的一个固件(再次说明, 固件就
是写入到硬件上的一个软件程序)。这个BIOS就是在开机的时候,计算机系统会主动执行的
第一个程序了!
接下来BIOS会去分析计算机里面有哪些储存设备,我们以硬盘为例,BIOS会依据使用者的设
置去取得能够开机的硬盘, 并且到该硬盘里面去读取第一个扇区的MBR位置。 MBR这个仅
有446 Bytes的硬盘容量里面会放置最基本的开机管理程序, 此时BIOS就功成圆满,而接下
来就是MBR内的开机管理程序的工作了。
这个开机管理程序的目的是在载入(load)核心文件, 由于开机管理程序是操作系统在安装
的时候所提供的,所以他会认识硬盘内的文件系统格式,因此就能够读取核心文件, 然后接
下来就是核心文件的工作,开机管理程序与 BIOS 也功成圆满,将之后的工作就交给大家所
知道的操作系统啦!
简单的说,整个开机流程到操作系统之前的动作应该是这样的:
BIOS:开机主动执行的固件,会认识第一个可开机的设备;
MBR:第一个可开机设备的第一个扇区内的主要开机记录区块,内含开机管理程序;
开机管理程序(boot loader):一支可读取核心文件来执行的软件;
核心文件:开始操作系统的功能...
第二点要注意,如果你的分区表为 GPT 格式的话,那么 BIOS 也能够从 LBA0 的 MBR 相容
区块读取第一阶段的开机管理程序码, 如果你的开机管理程序能够认识 GPT 的话,那么使用
BIOS 同样可以读取到正确的操作系统核心喔!换句话说, 如果开机管理程序不懂 GPT ,例
如 Windows XP 的环境,那自然就无法读取核心文件,开机就失败了!
第二点要注意,如果你的分区表为 GPT 格式的话,那么 BIOS 也能够从 LBA0 的 MBR 相容
区块读取第一阶段的开机管理程序码, 如果你的开机管理程序能够认识 GPT 的话,那么使用
BIOS 同样可以读取到正确的操作系统核心喔!换句话说, 如果开机管理程序不懂 GPT ,例
如 Windows XP 的环境,那自然就无法读取核心文件,开机就失败了!
UEFI+GPT搭配启动情况:
我们现在知道 GPT 可以提供到 64bit 的寻址,然后也能够使用较大的区块来处理开机管理程
序。但是 BIOS 其实不懂 GPT 耶!还得要通过 GPT 提供相容模式才能够读写这个磁盘设备
~而且 BIOS 仅为 16 位的程序,在与现阶段新的操作系统接轨方面有点弱掉了! 为了解决这
个问题,因此就有了 UEFI (Unified Extensible Firmware Interface) 这个统一可延伸固件界
面的产生。
UEFI 主要是想要取代 BIOS 这个固件界面,因此我们也称 UEFI 为 UEFI BIOS 就是了。
UEFI 使用 C 程序语言,比起使用组合语言的传统 BIOS 要更容易开发!也因为使用 C 语言
来撰写,因此如果开发者够厉害,甚至可以在 UEFI 开机阶段就让该系统了解 TCP/IP 而直接
上网! 根本不需要进入操作系统耶!这让小型系统的开发充满各式各样的可能性!
另外,与 BIOS 模式相比,虽然 UEFI 可以直接取得 GPT 的分区表,不过最好依旧拥有
BIOS boot 的分区支持, 同时,为了与 windows 相容,并且提供其他第三方厂商所使用的
UEFI 应用程序储存的空间,你必须要格式化一个 vfat 的文件系统, 大约提供 512MB 到 1G左右的容量,以让其他 UEFI 执行较为方便。
作者:Upstreamzy
链接:https://www.jianshu.com/p/c506c15d6ce0