首页 > 编程笔记

Linux硬盘分区详解

和其他操作系统类似,Linux 的文件系统大部分存放在硬盘上,只有少量的存放在可移除式存储设备中。本节中,我们主要讲解硬盘的分区。

硬盘设备和硬盘分区的识别

Linux 系统在进行初始化时,会根据 MBR 来识别硬盘设备。MBR 全称 Master Boot Record,硬盘主引导记录,占据硬盘 0 磁道的第一个扇区。

在 MBR 中,包括用来载入操作系统的可执行代码,这个可执行代码就是 MBR 中前 447 字节的 boot loader 即引导加载程序,而在 boot loader 程序之后的 74(17×4)字节的空间主要是用于存储的分区表(Partition table)的相关信息,如图 1 所示。

MBR结构图
图 1 MBR结构图

在分区表中,主要存储的值息包括分区号、分区的起始磁柱和分区的磁柱数量。因此,Linux 操作系统在初始化时就可以通过分区表中的这 3 种数据信息来识别硬盘设备。

常见的分区号如下:
在 MBR 中,分区表的磁盘空间只有 74 字节,而每个分区表的大小为 17 字节,所以在一个硬盘上最多可以划分出 4 个主分区。如果要划分出 4 个以上的分区时,可以通过在硬盘上先划分出一个可扩展分区的方法来增加额外的分区。

注意,在 Linux 的 Kernel 中所支持的分区数量都是有限制的,IDE 的硬盘最多可以使用 73 个分区;SCSI 的硬盘最多可以使用 15 个分区。

讲了那么多,读者可能会疑惑,为什么要将一个硬盘划分成多个分区,为什么不可以使用整个硬盘呢?原因如下:
  1. 方便管理和控制。将系统中的数据或程序按照不同的种类进行划分,然后将不同类型的数据或程序分别存放在不同的磁盘分区中。而每个分区上存放的都是类似的数据或程序,这样对数据或程序的管理和维护就变得非常简单了。
  2. 提高系统的效率。系统在读写磁盘时,磁头移动的距离缩短了,也就是说,缩小了磁头搜寻的范围;如果不使用分区,在硬盘上搜寻信息时就要搜寻整个硬盘,所以速度会降低很多。另外,硬盘分区也可以减轻由于文件不连续存放而所造成的系统效率下降的问题。
  3. 使用磁盘配额的功能限制用户使用的磁盘量。磁盘配额的功能,只能在分区一级上使用。为了限制用户使用磁盘的总量,防止用户浪费磁盘空间,最好的办法就是先将磁盘分区,然后在分配给用户。
  4. 便于备份和恢复。硬盘分区后,就可以只对所需的分区进行备份和恢复操作,因此备份和恢复的数据量会下降,而且也变得更加简单、方便。

创建分区

一块新的硬盘,要想能够正常使用,必须在存储设备上创建分区来容纳文件系统,分区可以是整个硬盘,也可以是部分硬盘,用以容纳虚拟目录的一部分。

分区是把硬盘划分成一个或无数个分区,然后再把每一个分区格式化为文件系统,这样 Linux 系统才能在格式化后的硬盘分区上存储数据和进行相应的文件管理及维护。

把一个分区格式化为文件系统就是将磁盘的这个分区划分成许多大小相等的小单元,并将这些小单元顺序地编号。小单元就被称为块(block)。Linux 默认的 block 大小为 4KB。

注意,在 Linux 系统上 block 是存储数据的最小单位,而每个 block 最多只能存储一个文件。如果一个文件的大小超过 4KB,那么就会占用多个 blocks。例如,一个文件的大小为 10KB,那么就需要 3 个 blocks 来存储这个文件。

在 Linux 操作系统中创建硬盘分区的命令是 fdisk。fdisk 命令用来帮助管理安装在系统上的任何存储设备上的分区。它是个交互式的程序,允许用户输入命令逐步完成硬盘的分区操作。

读者如果不知道自己系统中都有哪些分区,可以使用带有 -l 选项的 ls 命令列出系统中所有的 SCSI 硬盘和分区。

例如,查看系统中的 SCSI 硬盘和分区。打开终端页面,输入如下命令:

[root@bogon ~]# ls -l /dev/sd*
brw-rw----. 1 root disk 8, 0 Aug 25 01:55 /dev/sda
brw-rw----. 1 root disk 8, 1 Aug 25 01:55 /dev/sda1
brw-rw----. 1 root disk 8, 2 Aug 25 01:55 /dev/sda2
brw-rw----. 1 root disk 8, 3 Aug 25 01:55 /dev/sda3
[root@bogon ~]#

打印信息中,不带数字的文件名(/dev/sda)是系统的整个硬盘,文件名中带有数字(/dev/sda1、/dev/sda2 和 /dev/sda3)的则为分区。

可以使用 fdisk 命令来查看系统上的硬盘的分区信息,fdisk命令的语法格式如下:

[root@bogon ~]# fdisk -l          //列出系统分区
[root@bogon ~]# fdisk 设备文件名  //给硬盘分区

注意,在使用 fdisk 命令时,必须切换到 root 用户。只有 root 用户才有此命令的操作权限,否则系统会提示“fdisk:打不开/dev/sda:权限不够”。


【例 1】使用 fdisk 命令查看硬盘分区信息。在终端页面,输入如下命令:
[root@bogon ~]# fdisk -l /dev/sda

Disk /dev/sda: 32.2 GB, 32212254720 bytes
255 heads, 63 sectors/track, 3916 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: 0x000806aa

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          39      307200   83  Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2              39        2358    18631680   83  Linux
/dev/sda3            2358        2611     2031616   82  Linux swap / Solaris
[root@bogon ~]#
从打印信息中可以看出,/dev/sda 为整个磁盘,共 32.2 GB(32212254720 字节);以 Units 开始的那一行为每个磁柱的大小,约为 512 字节;最下面框起来的部分就是该硬盘的分区表,从左到右依次为:
在使用 fdisk 命令创建分区时,常常使用单字母的命令符来完成一些功能。创建分区常用的命令及功能如表 2 所示。

表 2 创建分区常用命令及功能
命 令 功 能
a 设置活动分区标记
b 编辑 bsd 磁盘标签
c 设置 DOS 操作系统兼容标记
d 删除一个已经存在的分区
l 显示已知的分区类型
m 显示出 fdisk 中使用的所有命令
n 添加一个新的分区
0 建立空白 DOS 分区表
P 显示分区表的内容
q 退出 fdisk,但不保存
s 新建空白 SUN 磁盘标签
t 修改系统分区的 ID
u 修改使用的存储单位
v 验证分区表
w 退出 fdisk 并保存
x 高级功能

【例 2】创建分区。切换到 root 用户,在终端页面中输入以下命令:

[root@bogon ~]# fdisk /dev/sda

WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
         switch off the mode (command 'c') and change display units to
         sectors (command 'u').

Command (m for help):

在 Command(m for help)中输入 fdisk 命令中的 p 选项列出分区表中的内容,输出结果为:
Command (m for help): p

Disk /dev/sda: 32.2 GB, 32212254720 bytes
255 heads, 63 sectors/track, 3916 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: 0x000806aa

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          39      307200   83  Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2              39        2358    18631680   83  Linux
/dev/sda3            2358        2611     2031616   82  Linux swap / Solaris

Command (m for help):
在 Command(m for help)中输入命令 n 来创建新的分区,在 First cylinder(9431-9985,default 9431)处默认为起始磁柱为 9431,在 Last cylinder or +sizeM or +sizeK(9431-9985,default 9985)处输入“+1G”,将该分区的大小定义成 1GB,操作命令如下:
Command(m for help):n
First cylinder(2611-3916,default 2611):
Using default value 2611
Last cylinder or +sizeM or +sizeK(2611-2916,default 3916):+1G
在出现的 Command(m for help)提示处输入 p 指令,以验证在该硬盘上所添加的新分区的操作是否成功。显示结果如下:
Command (m for help): p
......
   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          39      307200   83  Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2              39        2358    18631680   83  Linux
/dev/sda3            2358        2611     2031616   82  Linux swap / Solaris
/dev/sda4            2611        2742     1053595    5  Linux

Command (m for help):
分区创建完成之后,可以使用 w 命令将所创建的新分区的信息保存在磁盘 /dev/sda 的分区表中。

删除分区

当在硬盘上创建完成一个分区后,如果不想要这个分区可以使用前述提到的表 2 中 fdisk 的 d 指令删除这个分区。

【例 3】删除分区。使用 su 命令切换到 root 用户,只有 root 用户才有此操作权限。在终端页面中输入以下命令:
[root@bogon ~]# fdisk /dev/sda

WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
         switch off the mode (command 'c') and change display units to
         sectors (command 'u').

Command (m for help): d
Partition number (1-5): 4

Command (m for help): p
......
   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          39      307200   83  Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2              39        2358    18631680   83  Linux
/dev/sda3            2358        2611     2031616   82  Linux swap / Solaris

Command (m for help):

注意,在删除完分区之后,如果没有想真的删除该分区,可以输入 q 命令,退出 fdisk 命令不保存该操作;如果认为真的需要删除该分区,就输入 w 命令保存并退出。

在一些 Linux 系统中,当执行完 fdisk 的 w 命令后,虽然新的分区已经创建成功,但并不能够立即使用,因为系统还不能够识别该分区,需要重启系统或者使用 partprobe 命令之后,系统才能够识别这个分区。

在 Linux 系统中可以使用 partprobe 命令重新初始化内存中内核的分区表信息,让新的分区表生效,从而可以使系统识别所创建的新分区。

例如,以 root 用户的身份在终端页面中输入 partprobe 命令。

[root@bogon ~]# partprobe

该命令的打印信息可能会提示:无法以读写方式打开 /dev/sr0(只读文件系统)。/dev/sr0 已按照只读方式打开。当 partprobe 命令执行成功之后,系统就可以识别该分区了。

优秀文章