硬盘分区的陷阱及应对
之所以想到写这篇,是因为本人在折腾 Linux 系统的过程中,有多次掉入硬盘分区的陷阱的经历。最近几天,再一次掉入坑中,折腾了两天才从坑中爬出来。经过多方查询资料,终于弄明白了硬盘分区的一些概念。下面将其记录下来,以警示来者。
说起我自己掉坑的经历,无不与 WinXP 和 Linux 的激烈碰撞有关。多年前,我就开始在一台电脑上同时安装WinXP 和 Linux,只要遵守先安装 WinXP 再安装 Linux 的顺序,就不会出问题,Linux 的安装程序会自动识别多系统,安装完成后可顺利启动多系统。有一天,我觉得单用 Linux 就够了,于是就格了整个硬盘安装了 Linux。又有一天,我觉得还是要用 WinXP,于是就重新安装 WinXP(不要对我说虚拟机,多年前我的电脑还只有 256M 内存,虚拟机根本跑不动),结果发现,WinXP 的安装程序没办法对硬盘进行分区了。这个坑是由 Linux 中的 LVM 引起的,WinXP 识别不了 LVM 分区,那个时代的 WinPE、DOS 工具箱中的所有工具都没办法识别 LVM,而那时我对Linux 的了解又只停留在只会在安装系统的时候分区,根本不知道 Linux 系统中还有 fdisk、parted 这样的工具,所以折腾了许久才从坑里面爬出来。多年后的现在,我又一次掉入了坑中。我工作时用的电脑是 WinXP 系统(天朝国情,你懂的),为了干点私活,我又装了个 Ubuntu 上去了,这两个系统一直相安无事。直到有一天,我把 Ubuntu 系统又折腾挂了,于是重装,因为在分区的时候不小心选择了默认的“清除整个盘并安装Ubuntu”,然后硬盘就被整个格掉了,WinXP 就没有了。我当时想,这多大点儿事,我再装个 WinXP 不就完了吗。但是问题来了,无论我怎么安装,WinXP 系统就是启动不了。后来才整明白,这个坑是硬盘采用了 GPT 分区引起的。那为什么我让 Ubuntu 自动分区它就分成了 GPT 分区呢?这也怪这台惠普的工作用机比较奇葩,它即支持 legacy BIOS,也支持 EFI,当原来 WinXP 存在时,它用的当然是 MBR 分区(msdos分区),所以安装 Ubuntu 时就是使用的 MBR 分区,而后来 Ubuntu 自动分区时,它看到主板支持 EFI,就自动把硬盘整成 GPT 分区了。我也是折腾了几天才明白这个道理,最后终于在 Ubuntu LiveCD 的 parted 程序的帮助下,使用一个 mklabel msdos 命令把硬盘从 GPT 分区更改为 MBR 分区,然后再按顺序安装 WinXP 和 Ubuntu,才算是从坑里面爬出来。
对于那些长期管理大型机房和大存储容量的服务器的朋友,对于硬盘分区,他们肯定是早就做好了功课。不会像我这样,直到碰到问题才会去学习相关的知识。对于硬盘分区的这些知识,我总结如下(只是简单总结,具体内容请大家自行搜素):
1、传统的 BIOS 只支持从 MBR 分区的硬盘启动。MBR 分区的分区表保存在硬盘的第一个扇区,而且只有 64 字节,所以最多只能有四个表项。也就是说,我们只能把硬盘分为 4 主分区,或者分成小于等于 3 个主分区再加一个扩展分区。扩展分区又可以分为多个逻辑分区。MBR 分区的优点就是简单,大家都用,所以大家都懂的嘛,很多操作系统都可以从 MBR 分区的硬盘启动。缺点就是 MBR 分区不能识别大于 2T 的硬盘空间,也不能有大于 2T 的分区;
2、GPT 分区的硬盘可以解决以上 MBR 分区的所有缺点,它没有 4 个主分区的限制,想分几个主分区就可以分几个主分区,它可以识别大于 2T 的硬盘空间,每个分区的大小也可以超过 2T。但是它的缺点是需要操作系统支持。比如只有 WinXP 64 位、Win Vista、Win 7 和 Win 8 和比较新的 Linux 发行版支持 GPT 分区的硬盘。而且,如果没有 EFI 的支持的话,以上系统也只能将 GPT 分区的硬盘当成数据盘,不能从 GPT 分区的硬盘启动;
3、要从 GPT 分区的硬盘启动,则主板使用 EFI、硬盘使用 GPT 分区、操作系统支持 GPT 和 EFI 这三个条件缺一不可。目前比较新的 64 位 Linux 系统和 Win8 系统都是支持 EFI 的,所以都是需要从 GPT 分区的硬盘启动的。现在的电脑主板已经逐渐抛弃 legacy BIOS,而只支持 EFI了。(像我的工作机这样的过渡产品将越来越少。)目前很多预装 Win8 的笔记本的主板几乎都只支持 EFI 了。所以,学习 GPT 和 EFI 的相关知识势在必行;
4、以上分区策略都是固定分区。硬盘分区一旦完成,则分区的大小不可改变,如果要改变分区的大小的话,只有重新分区。而且由于没有办法把多个硬盘分到一个区,所以再怎么分,每个分区的大小都有限。所以我们需要一种动态分区的东西。LVM 就是这样一个东东,它叫逻辑卷管理。使用 LVM 的机制是这样的:首先把硬盘分区或者整块硬盘标记为一个物理卷(PV),然后再创建一个卷组(VG),把一个或多个物理卷加入卷组,最后对卷组进行分区,每一个分区称为一个逻辑卷(LV)。LVM的优点就是可以随时向卷组中添加物理卷扩展卷组的大小,以可以动态调整逻辑卷的大小。这在服务器中尤其有用,比如说有一个原本有100个用户的服务器,其 /home 目录下就会有100个用户的主目录,如果给他们每人分配 20G 的空间的话,就会占满一个 2T 的硬盘,如果这时再来 100 个用户怎么办?如果使用 LVM 就可以顺利解决这个问题,我们可以再加一个 3T 的硬盘,然后把这个硬盘加入卷组就可以扩大卷组的大小,然后再调整 /home 所在的逻辑卷的大小即可。LVM 既可以搭配 MBR 使用,也可以搭配 GPT 使用。
下面通过 Ubuntu 14.04 安装过程中自动分区的策略来验证以上知识点。首先,对于只支持 legacy BIOS 的电脑,安装 Ubuntu 时分区选项如下:
这时,不选择启动 LVM 的选项。安装完操作系统后,使用 parted 程序查看硬盘分区,通过查看 /etc/fstab 文件来了解哪个分区对应哪个文件系统,如下图:
通过上面图片中 parted 程序中的 print 命令的输出可以看出,硬盘的分区表类型为 msdos,也就是 MBR 分区。硬盘分为一个主分区 sda1 和一个扩展分区 sda2,主分区 sda1 占 20.4G,扩展分区 sda2 只有 1072M,扩展分区中只有一个逻辑分区 sda5。通过 /etc/fstab 可以看出主分区 sda1 挂载到根目录,逻辑分区 sda5 为交换空间。
上面的分区方案是最简单最常用的一种。下面来看看启用 LVM 是什么效果。在选择分区方案的界面选择开启 LVM 的选项,如下图:
安装完操作系统后,还是通过 parted 程序和 /etc/fstab 来查看硬盘的分区及使用情况,如下图:
从图中可以看出,分区表的类型还是 msdos。硬盘还是只分了一个主分区 sda1 和一个扩展分区 sda2,但是主分区 sda1 只有 255M,扩展分区 sda2 倒是有 21.2G,同样扩展分区只分为一个逻辑分区 sda5,逻辑分区 sda5 占用扩展分区中全部的 21.2G 空间,而且 sda5 的标志是 lvm,说明该分区被标记为一个物理卷(PV),它肯定是被加入到了一个卷组(VG)中。通过 /etc/fstab 文件可以看出,主分区 sda1 挂载到 /boot,而根目录和交换空间挂载的是两个逻辑卷(LV)。
通过 lvm 命令可以查看系统中卷组、物理卷和逻辑卷的信息,如下图:
通过 pvs 和 pvdisplay 命令,可以看到系统中只有一个物理卷,那就是 /dev/sda5,该物理卷加入到了卷组 ubuntu-vg 之中。通过 vgs 和 vgdisplay 命令可以看到系统中只有一个卷组,那就是 ubuntu-vg,该卷组被分为两个逻辑卷。
再看下图:
通过 lvs 和 lvdisplay 命令可以看到卷组分为两个逻辑卷,它们分别挂载到根目录和交换空间。
通过 lvm 命令还可以进行更多的操作,比如创建新的卷组,将新的物理卷加入到卷组,增大或减小逻辑卷的大小等等。具体用什么命令,一个 help 即可搞定。
最后,来看看在主板只支持 EFI 的情况下,Ubuntu 如何分区。安装的启动界面如下:
这个安装界面和 legacy BIOS 系统下的安装界面是不同的,传统的安装界面如下:
在 EFI 模式下,还是选择自动分区。安装完操作系统后,使用 parted 和 /etc/fstab 来查看硬盘的分区和使用情况,如下图:
通过以上图片可以看出,硬盘的分区表类型为 gpt,硬盘分为三个区,都是主分区。其中第 1 个分区 sda1 的大小是 537M,文件系统是 fat32,其挂载的路径是 /boot/efi,而另外两个分区一个挂载到根目录,一个为交换空间。从上面的信息我们不难推断:只支持 EFI 的主板只能从 GPT 分区的硬盘启动,而且该硬盘第 1 个分区必须为 fat32 文件系统,该文件系统中存放的是 EFI 需要的各种文件。
如果在安装 Ubuntu 系统的时候不是选择自动分区,而是选择最后那个“其它选项”来自定义分区,会发现其实Ubuntu 提供的自定义分区功能很有限。它没办法让人选择是使用 MBR 分区还是使用 GPT 分区,也没有办法选择是否启用 LVM。如果需要更灵活的管理的话,还是只有点击“试用Ubuntu”按钮,进入 LiveCD 的 Ubuntu 系统后,使用 parted 命令和 lvm 命令手动管理硬盘分区。
延伸阅读:
除了硬盘分区,平常还有可能用到的硬盘管理功能有以下一些:
1、创建 RAID,可以使用 mdadm 程序;
2、查看个分区或各文件夹的空间占用 ,使用 df 和 du 程序;
3、指定磁盘配额,使用 quota 软件包;
4、查看各分区的文件系统、UUID、卷标,使用 blkid 程序。
(京山游侠于2014-07-13发布于博客园,转载请注明出处。)
最新进展
前文提到,我使用的惠普工作站比较奇特,既支持 Legacy BIOS,又支持 EFI。后来我自己又更新过几台电脑,包括自己组装的台式机和更换过几台笔记本,发现其实不是我碰到的惠普工作站奇特,而是在支持 EFI 的主板上,都普遍支持 Legacy BIOS,可以在 BIOS 里面设置启动方式来选择是从 Legacy BIOS 启动还是从 EFI 启动。
使用 EFI 模式安装的 Linux 系统无法从 Legacy BIOS 模式启动,反之亦然。知道了这个原理以后,这个坑就再也坑不到我了。在不同的机器、不同的介质上安装 Linux 系统,甚至安装多系统,就再也难不倒我了。
(京山游侠于2016-08-20更新于博客园,转载请注明出处。)