前面讲过,硬盘是由大量的扇区组成的,每个扇区的容量为 512 字节。其中第一个扇区最重要,因为它保存着主引导记录和分区表信息。
在第一个扇区中,主引导记录需要占用 446 字节,分区表占用 64 字节,还有 2 个字节供结束符使用。而分区表是本节所关心的,在分区表中,每记录一个分区信息就需要占用 16 字节,这样一来,整个分区表最多只能记录 4 个分区信息,这 4 个分区就称为 4 个主分区。
因此,第一个扇区中的总体情况,如图 1 所示。
图 1 第一个扇区中的数据信息
那么,第一个扇区最多只能创建出 4 个分区吗?不是的,为了解决分区个数不够的问题,还可以进一步将第一个扇区的分区表中 16 个字节(原本要写入主分区信息)的空间,用来存储另外一个分区的信息,通常将这 16 个字节的空间称为扩展分区。
注意,扩展分区并不是一个真正的分区,而可以看做是一个占用 16 字节分区表空间的指针,它用来指向另一个分区。
通常情况下,用户会选择使用 3 个主分区外加 1 个扩展分区的方法,然后在扩展分区中再创建出多个逻辑分区,从而来满足多分区(大于 4 个)的需求(如图 2 所示)。
图 2 硬盘分区的实际规划
因此总的来说,硬盘分区有 3 种,分别是主分区、扩展分区和逻辑分区。对于一个硬盘来说,主分区至少有 1 个,最多有 4 个;扩展分区可以没有,最多只能有 1 个,且主分区+扩展分区总共不能超过 4 个;逻辑分区可以有若干个。
前面我们已经学习了 fdisk 命令的基本用法,本节就来用它给硬盘分区。
fdisk命令创建主分区
首先,我们要建立一个主分区,看看过程是什么样子的,命令如下:
[root@localhost ~]# fdisk /dev/sdb …省略部分输出… Command (m for help): p #显示当前硬盘的分区列表 Disk /dev/sdb: 21.5 GB, 21474836480 bytes 255 heads, 63 sectors/track, 2610 cylinders Units = cylinders of 16065 *512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0xb4b0720c Device Boot Start End Blocks id System #目前一个分区都没有 Command (m for help): n #那么我们新建一个分区 Command action #指定分区类型 e extended #扩展分区 p primary partition (1-4) #主分区 p #这里选择p,建立一个主分区 Partition number (1-4): 1 #选择分区号,范围为1~4,这里选择1 First cylinder (1 -2610, default 1): #分区的起始柱面,默认从1开始。因为要从硬盘头开始分区,所以直接回车 Using default value 1 #提示使用的是默认值1 Last cylinder, +cylinders or +size{K, M, G}(1-2610, default 2610): +5G #指定硬盘大小。可以按照柱面指定(1-2610)。我们对柱面不熟悉,那么可以使用size{K, M, G}的方式指定硬盘大小。这里指定+5G,建立一个5GB大小的分区 Command (m for help): #主分区就建立了,又回到了fdisk交互界面的提示符 Command (m for help): p #查询一下新建立的分区 Disk /dev/sdb: 21.5GB, 21474836480 bytes 255 heads,63 sectors/track, 2610 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes 1512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0xb4b0720c Device Boot Start End Blocks id System /dev/sdb1 1 654 5253223+ 83 Linux #dev/sdb1已经建立了吧
可以看到,建立主分区的过程是:"fdisk 硬盘名 -> n(新建)->p(建立主分区) -> 1(指定分区号) -> 回车(默认从 1 柱面开始建立分区)-> +5G(指定分区大小)"。当然,我们的分区还没有格式化和挂载,所以还不能使用。
fdisk命令创建扩展分区
接下来给大家展示如何建立一个扩展分区。还记得吗?主分区和扩展分区加起来最多只能建立 4 个,而扩展分区最多只能建立 1 个。
扩展分区的建立命令如下:
[root@localhost ~]# fdisk /dev/sdb …省略部分输出… Command (m for help): n #新建立分区 Command action e extended p primary partition (1-4) e #这次建立扩展分区 Partition number (1-4): 2 #给扩展分区指定分区号2 First cylinder (655-2610, default 655): #扩展分区的起始柱面。上节建立的主分区1已经占用了1~654个柱面,所以我们从655开始建立,注意:如果没有特殊要求,则不要跳开柱面建立分区,应该紧挨着建立分区 Using default value 655 提示使用的是默认值655 Last cylinder, +cylinders or +size{K, M, G} (655-2610, default 2610): #这里把整块硬盘的剩余空间都建立为扩展分区 Using default value 2610 #提示使用的是默认值2610
这里把 /dev/sdb 硬盘的所有剩余空间都建立为扩展分区,也就是建立一个主分区,剩余空间都建立成扩展分区。要知道,扩展分区是不能被格式化和直接使用的,所以还要在扩展分区内部再建立逻辑分区。
fdisk命令创建逻辑分区
最后,我们来看看逻辑分区的建立过程,命令如下:
[root@localhost ~]# fdisk /dev/sdb …省略部分输出… Command (m for help): n #建立新分区 Command action l logical (5 or over) #由于在前面章节中,扩展分区已经建立,所以这里变成了l(logic) p primary partition (1-4) l #建立逻辑分区 First cylinder (655-2610, default 655): #不用指定分区号,默认会从5开始分配,所以直接选择起始柱面 #注意:逻辑分区是在扩展分区内部再划分的,所以柱面是和扩展分区重叠的 Using default value 655 Last cylinder, +cylinders or +size{K, M, G} (655-2610, default 2610):+2G #分配2GB大小 Command (m for help): n #再建立一个逻辑分区 Command action l logical (5 or over) p primary partition (1-4) l First cylinder (917-2610, default 917): Using default value 917 Last cylinder, +cylinders or +size{K, M, G} (917-2610, default 2610):+2G Command (m for help): p #查看一下已经建立的分区 Disk /dev/sdb: 21.5GB, 21474836480 bytes 255 heads, 63 sectors/track, 2610 cylinders Units = cylinders of 16065 *512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0xb4b0720c Device Boot Start End Blocks id System /dev/sdb1 1 654 5253223+ 83 Linux #主分区 /dev/sdb2 655 2610 15711570 5 Extended #扩展分区 /dev/sdb5 655 916 2104483+ 83 Linux #逻辑分区 1 /dev/sdb6 917 1178 2104483+ 83 Linux #逻辑分区2 Command (m for help): w #保存并退出 The partition table has been altered! Calling ioctl。to re-read partition table. Syncing disks. [root@localhost -]# #退回到提示符界面
注意,所有的分区立过程中如果不保存并退出是不会生效的,所以建立错了也没有关系,使用 q 命令不保存退出即可。如果使用了 w 命令,就会保存退出。有时因为系统的分区表正忙,所以需要重新启动系统才能使新的分区表生效。命令如下:
Command (m for help): w #保存并退出 The partition table has been altered! Calling ioctl() to re-read partition table. WARNING: Re-reading the partition table failed with error 16: Device or resource busy. The kernel still uses the old table. The new table will be used at the next reboot. #要求重新启动,才能格式化 Syncing disks.
看到了吗?必须重新启动!可是重新启动很浪费时间。如果不想重新启动,则可以使用 partprobe 命令。这个命令的作用是让系统内核重新读取分区表信息,这样就可以不用重新启动了,命令如下:
[root@localhost ~]# partprobe
如果这个命令不存在,则请安装 parted-2.1-18.el6.i686 这个软件包。partprobe 命令不是必需的,如果没有提示重启系统,则直接格式化即可。