5.9. 分区

一个硬盘可以被划分为若干个分区。每个分区的功能就像它是一个独立的硬盘一样。 这样做的目的是,如果你只有一个硬盘,并且想要在上面安装两个操作系统,你可以将硬盘划分为两个分区。 每个操作系统可以使用其分区,而不会影响其他分区。 这样,两个操作系统可以在同一硬盘上和平共处。 如果没有分区,则每个操作系统都必须购买一个硬盘。

软盘通常不进行分区。 从技术上来说,这样做并没有什么不可行的,但由于软盘容量很小,因此分区很少有用。 CD-ROM 通常也不进行分区,因为将它们用作一个大的磁盘更容易,而且很少需要在同一个光盘上安装多个操作系统。

5.9.1. MBR、引导扇区和分区表

关于硬盘如何分区的的信息存储在其第一个扇区(即,第一个磁盘表面上第一个磁道的第一个扇区)中。 第一个扇区是磁盘的主引导记录 (MBR);这是 BIOS 读取并在机器首次启动时启动的扇区。 主引导记录包含一个小程序,该程序读取分区表,检查哪个分区是活动的(即,标记为可引导的),并读取该分区的第一个扇区,即分区的引导扇区(MBR 也是一个引导扇区,但它具有特殊状态,因此具有特殊名称)。 该引导扇区包含另一个小程序,该程序读取存储在该分区上的操作系统的第一部分(假设它是可引导的),然后启动它。

分区方案并非内置于硬件,甚至也不是内置于 BIOS 中。 这仅仅是许多操作系统遵循的约定。 并非所有操作系统都遵循它,但它们是例外。 有些操作系统支持分区,但它们占用硬盘上的一个分区,并在该分区内使用其内部分区方法。 后一种类型可以与其他操作系统(包括 Linux)和平共处,并且不需要任何特殊措施,但是不支持分区的操作系统无法与任何其他操作系统在同一磁盘上共存。

作为一项安全预防措施,最好将分区表写在一张纸上,这样如果分区表损坏,您就不必丢失所有文件。 (可以使用 fdisk 修复坏的分区表)。 相关信息由 fdisk -l 命令给出

	$ fdisk -l /dev/hda
	
	Disk /dev/hda: 15 heads, 57 sectors, 790 cylinders
	Units = cylinders of 855 * 512 bytes
	
	   Device Boot  Begin   Start     End  Blocks   Id  System
	/dev/hda1           1       1      24   10231+  82  Linux swap
	/dev/hda2          25      25      48   10260   83  Linux native
	/dev/hda3          49      49     408  153900   83  Linux native
	/dev/hda4         409     409     790  163305    5  Extended
	/dev/hda5         409     409     744  143611+  83  Linux native
	/dev/hda6         745     745     790   19636+  83  Linux native
	$
	

5.9.2. 扩展分区和逻辑分区

PC 硬盘的原始分区方案只允许四个分区。 这很快被证明在现实生活中太少了,部分原因是有些人想要超过四个操作系统(Linux、MS-DOS、OS/2、Minix、FreeBSD、NetBSD 或 Windows/NT,仅举几例),但主要是因为有时为一个操作系统设置多个分区是一个好主意。 例如,出于速度原因(见下文),交换空间通常最好放在 Linux 的单独分区中,而不是放在主 Linux 分区中。

为了克服这个设计问题,发明了扩展分区。 这个技巧允许将主分区划分为子分区。 这样细分的主分区就是扩展分区;子分区是逻辑分区。 它们的行为类似于主分区,但创建方式不同。 它们之间没有速度差异。 通过使用扩展分区,您现在每个磁盘最多可以拥有 15 个分区。

硬盘的分区结构可能如图 5-2 所示。 磁盘被划分为三个主分区,其中第二个主分区被划分为两个逻辑分区。 磁盘的一部分根本没有分区。 整个磁盘和每个主分区都有一个引导扇区。

图 5-2. 硬盘分区示例。

5.9.3. 分区类型

分区表(MBR 中的分区表和扩展分区的分区表)每个分区包含一个字节,用于标识该分区的类型。 这试图标识使用该分区的操作系统,或它的用途。 其目的是使两个操作系统有可能避免意外地使用同一个分区。 然而,实际上,操作系统并不真正关心分区类型字节; 例如,Linux 根本不在乎它是什么。 更糟糕的是,它们中的一些操作系统不正确地使用它; 例如,至少某些版本的 DR-DOS 忽略了字节的最高有效位,而其他版本则没有。

没有标准化机构来指定每个字节值的含义,但就 Linux 而言,以下是 fdisk 程序的分区类型列表。

 0  Empty           1c  Hidden Win95 FA 70  DiskSecure Mult bb  Boot Wizard hid
 1  FAT12           1e  Hidden Win95 FA 75  PC/IX           be  Solaris boot
 2  XENIX root      24  NEC DOS         80  Old Minix       c1  DRDOS/sec (FAT-
 3  XENIX usr       39  Plan 9          81  Minix / old Lin c4  DRDOS/sec (FAT-
 4  FAT16 <32M      3c  PartitionMagic  82  Linux swap      c6  DRDOS/sec (FAT-
 5  Extended        40  Venix 80286     83  Linux           c7  Syrinx
 6  FAT16           41  PPC PReP Boot   84  OS/2 hidden C:  da  Non-FS data
 7  HPFS/NTFS       42  SFS             85  Linux extended  db  CP/M / CTOS / .
 8  AIX             4d  QNX4.x          86  NTFS volume set de  Dell Utility
 9  AIX bootable    4e  QNX4.x 2nd part 87  NTFS volume set df  BootIt
 a  OS/2 Boot Manag 4f  QNX4.x 3rd part 8e  Linux LVM       e1  DOS access
 b  Win95 FAT32     50  OnTrack DM      93  Amoeba          e3  DOS R/O
 c  Win95 FAT32 (LB 51  OnTrack DM6 Aux 94  Amoeba BBT      e4  SpeedStor
 e  Win95 FAT16 (LB 52  CP/M            9f  BSD/OS          eb  BeOS fs
 f  Win95 Ext'd (LB 53  OnTrack DM6 Aux a0  IBM Thinkpad hi ee  EFI GPT
10  OPUS            54  OnTrackDM6      a5  FreeBSD         ef  EFI (FAT-12/16/
11  Hidden FAT12    55  EZ-Drive        a6  OpenBSD         f0  Linux/PA-RISC b
12  Compaq diagnost 56  Golden Bow      a7  NeXTSTEP        f1  SpeedStor
14  Hidden FAT16 <3 5c  Priam Edisk     a8  Darwin UFS      f4  SpeedStor
16  Hidden FAT16    61  SpeedStor       a9  NetBSD          f2  DOS secondary
17  Hidden HPFS/NTF 63  GNU HURD or Sys ab  Darwin boot     fd  Linux raid auto
18  AST SmartSleep  64  Novell Netware  b7  BSDI fs         fe  LANstep
1b  Hidden Win95 FA 65  Novell Netware  b8  BSDI swap       ff  BBT

5.9.4. 硬盘分区

有很多程序可以创建和删除分区。 大多数操作系统都有自己的程序,最好使用每个操作系统自己的程序,以防它执行其他程序无法执行的异常操作。 许多程序都称为 fdisk,包括 Linux 的程序,或其变体。 关于使用 Linux fdisk 的详细信息,请参阅其手册页。 cfdisk 命令类似于 fdisk,但具有更友好的(全屏)用户界面。

当使用 IDE 磁盘时,引导分区(包含可引导内核映像文件的分区)必须完全位于前 1024 个柱面内。 这是因为在启动期间(在系统进入保护模式之前),磁盘是通过 BIOS 使用的,而 BIOS 无法处理超过 1024 个柱面。 有时可以使用仅部分位于前 1024 个柱面内的引导分区。 只要使用 BIOS 读取的所有文件都位于前 1024 个柱面内,这就可以工作。 由于这很难安排,因此非常不建议这样做; 您永远不知道内核更新或磁盘碎片整理何时会导致系统无法启动。 因此,请确保您的引导分区完全位于前 1024 个柱面内。

但是,对于支持 LBA(逻辑块寻址)的新版本 LILO 来说,这可能不再适用。 请查阅您的发行版的文档,以查看它是否具有支持 LBA 的 LILO 版本。

实际上,一些较新版本的 BIOS 和 IDE 磁盘可以处理超过 1024 个柱面的磁盘。 如果您有这样的系统,您可以忘记这个问题; 如果您不太确定,请将其放在前 1024 个柱面内。

每个分区都应该有偶数个扇区,因为 Linux 文件系统使用 1 千字节的块大小,即两个扇区。 奇数个扇区将导致最后一个扇区未使用。 这不会导致任何问题,但这很难看,并且某些版本的 fdisk 会对此发出警告。

更改分区大小通常需要首先备份您要从该分区保存的所有内容(最好是整个磁盘,以防万一),删除分区,创建新分区,然后将所有内容恢复到新分区。 如果分区正在增长,您可能还需要调整相邻分区的大小(以及备份和恢复)。

由于更改分区大小很麻烦,因此最好第一次就正确设置分区,或者拥有有效且易于使用的备份系统。 如果您从不需要太多人工干预的介质(例如,从 CD-ROM,而不是软盘)进行安装,则一开始尝试不同的配置通常很容易。 由于您还没有要备份的数据,因此多次修改分区大小并不那么痛苦。

有一个用于 MS-DOS 的程序,称为 fips,它可以调整 MS-DOS 分区的大小,而无需备份和恢复,但对于其他文件系统,仍然需要这样做。

fips 程序包含在大多数 Linux 发行版中。 商业分区管理器“Partition Magic”也具有类似的功能,但界面更友好。 请记住,分区是危险的。 在您尝试“动态”更改分区大小之前,请确保您拥有任何重要数据的最新备份。 程序 parted 也可以调整其他类型分区以及 MS-DOS 分区的大小,但有时方式有限。 在使用 parted 之前,请查阅 parted 文档,安全总比后悔好。

5.9.5. 设备文件和分区

每个分区和扩展分区都有自己的设备文件。 这些文件的命名约定是在整个磁盘的名称后附加分区的编号,约定 1-4 是主分区(无论有多少个主分区),编号大于 5 是逻辑分区(无论它们位于哪个主分区内)。 例如,/dev/hda1是第一个 IDE 硬盘上的第一个主分区,并且/dev/sdb7是第二个 SCSI 硬盘上的第三个扩展分区。