前言
Linux 系统中所有的硬件设备都是通过文件的方式来表现和使用的,我们将这些文件称为设备文件,硬盘对应的设备文件一般被称为块设备文件。
本文介绍磁盘设备在 Linux 系统中的表示方法以及如何创建磁盘分区。
为什么要有多个分区?
防止数据丢失:如果系统只有一个分区,那么这个分区损坏,用户将会丢失所的有数据。
增加磁盘空间使用效率:可以用不同的区块大小来格式化分区,如果有很多1K的文件,而硬盘分区区块大小为4K,那么每存储一个文件将会浪费3K空间。这时我们需要取这些文件大小的平均值进行区块大小的划分。
数据激增到极限不会引起系统挂起:将用户数据和系统数据分开,可以避免用户数据填满整个硬盘,引起的系挂起。
磁盘分类
比较常见的磁盘类型有服务器中使用的 SCSI 硬盘和消费类市场中的 SATA 硬盘,当然还有当下大热的各种固态硬盘。
SCSI 硬盘
SCSI 硬盘即采用 SCSI 接口的硬盘。它由于性能好、稳定性高,因此在服务器上得到广泛应用。同时其价格也不菲,正因它的价格昂贵,所以在普通PC上很少见到它的踪迹。SCSI 硬盘使用 50 针接口,外观和普通硬盘接口有些相似(下图来自互联网):
SATA 硬盘
SATA(Serial ATA)口的硬盘又叫串口硬盘,Serial ATA 采用串行连接方式,串行 ATA 总线使用嵌入式时钟信号,具备了更强的纠错能力,与以往相比其最大的区别在于能对传输指令(不仅仅是数据)进行检查,如果发现错误会自动矫正,这在很大程度上提高了数据传输的可靠性。串行接口还具有结构简单、支持热插拔的优点(下图来自互联网):
固态硬盘
固态硬盘(Solid State Disk),一般称之为 SSD 硬盘,固态硬盘是用固态电子存储芯片阵列而制成的硬盘,由控制单元和存储单元(FLASH芯片、DRAM芯片)组成。其主要特点是没有传统硬盘的机械结构,读写速度非常快(下图来自互联网):
磁盘设备在 Linux 下的表示方法
在 Linux 系统中磁盘设备文件的命名规则为:
主设备号 次设备号 磁盘分区号
对于目前常见的磁盘,一般表示为:
sd[a-z]x
主设备号代表设备的类型,相同的主设备号表示同类型的设备。当前常见磁盘的主设备号为 sd。
次设备号代表同类设备中的序号,用 “a-z” 表示。比如 /dev/sda 表示第一块磁盘,/dev/sdb 表示第二块磁盘。
x 表示磁盘分区编号。在每块磁盘上可能会划分多个分区,针对每个分区,Linux 用 /dev/sdbx 表示,这里的 x 表示第二块磁盘的第 x 个分区。
如下图所示:
该系统中一共有四块磁盘 /dev/sda,/dev/sdb,/dev/sdc 和 /dev/sdd。其中的 /dev/sda 上创建了三个分区,分别是 /dev/sda1,/dev/sda2,/dev/sda5;/dev/sdb 上只有一个分区 /dev/sdb1。而 /dev/sdc 和 /dev/sdd 则尚未分区(也肯能是只有一个分区,分区的名称和磁盘的名称相同)。
磁盘分区
创建磁盘分区大概有下面几个目的:
- 提升数据的安全性(一个分区的数据损坏不会影响其他分区的数据)
- 支持安装多个操作系统
- 多个小分区对比一个大分区会有性能提升
- 更好的组织数据
磁盘的分区由主分区、扩展分区和逻辑分区组成。在一块磁盘上,主分区的最大个数是 4,其中扩展分区也是一个主分区,并且最多只能有一个扩展分区,但可以在扩展分区上创建多个逻辑分区。因此主分区(包括扩展分区)的范围是 1-4,逻辑分区从 5 开始。对于逻辑分区,Linux 规定它们必须建立在扩展分区上,而不是建立在主分区上。
主分区的作用是用来启动操作系统的,主要存放操作系统的启动或引导程序,因此建议操作系统的引导程序都放在主分区,比如 Linux 的 /boot 分区,最好放在主分区上:
扩展分区只不过是逻辑分区的 “容器”。实际上只有主分区和逻辑分区是用来进行数据存储的,因而可以将数据集中存放在磁盘的逻辑分区中。
我们可以通过 fdisk 命令来查看磁盘分区的信息:
代码语言:javascript复制$ sudo fdisk -l /dev/sda
输出中的前几行是磁盘的基本信息,比如总大小为 80G,一共有多少个扇区(sector),每个扇区的大小等等。红框中的则是我们比较关注的分区信息:
- 第一列 Device 显示了磁盘分区对应的设备文件名。
- 第二列 Boot 显示是否为引导分区,上图中的 /dev/sda1 就是引导分区。
- 第三列 Start 表示磁盘分区的起始位置。
- 第四列 End 表示磁盘分区的结束位置。
- 第五列 Sectors 表示分区占用的扇区数目。
- 第六列 Size 显示分区的大小。
- 第七列和第八列显示的内容相同,分别是数值 ID 及其文字描述。 Id 列显示了磁盘分区对应的 ID,根据分区的不同,分区对应的 ID 号也不相同。Linux 下用 83 表示主分区和逻辑分区,5 表示扩展分区,8e 表示 LVM 分区,82 表示交换分区,7 表示 NTFS 分区。
上图中的信息表明:/dev/sda1 是一个主分区并且被用作引导分区;/dev/sda2 是扩展分区,其中只有一个逻辑分区,即 /dev/sda5,这点可以通过两个分区相同的大小证明。
利用 fdisk 划分磁盘分区
fdisk 是 Linux 系统中一款功能强大的磁盘分区管理工具,可以观察硬盘的使用情况,也可以用来管理磁盘分区。本文仅介绍如何使用 fdisk 创建新的磁盘分区。
假设我们的 Linux 系统中增加了一块新的磁盘,系统对应的设备名为 /dev/sdd,下面我们通过 fdisk 命令对这个磁盘进行分区。
代码语言:javascript复制$ sudo fdisk /dev/sdd
输入命令 n 来创建新分区:
根据上面的提示,我们选择 p 来创建主分区,然后提示我们输入分区的编号:
主分区的编号为 1- 4,这里我们输入了 1。接下来是设置分区的大小:
分区的大小是通过设置分区开始处的扇区和结束处的扇区设置的。这里如果回车两次会把整个磁盘划分为一个分区,也就是整个磁盘的容器都分给了一个分区。这样一个简单的分区就差不多完成了,注意此时的分区信息还没有写入到磁盘中,在这里还可以反悔,如果确认执行上面的分区,执行 w 命令就行了:
这时分区操作已经完成了,我们可以通过下面的命令查看分区的结果:
代码语言:javascript复制$ sudo fdisk -l /dev/sdd
如果嫌上面的执行过程麻烦,可以用下面的一行命令起到相同的效果:
代码语言:javascript复制$ (echo n; echo p; echo 1; echo ; echo ; echo w) | sudo fdisk /dev/sdd
更改分区的类型
上面创建的分区类型默认为 83(Linux),如果想要一个 8e(Linux LVM)类型的分区该怎么办?我们可以继续使用 fdisk 命令修改分区的类型,这次输入 t 命令来修改分区的类型:
接下来可以选择要修改的分区号,我们只有一个分区,所以默认就是 1。
下面我们可以通过 L 命令来查看 fdisk 命令支持的分区类型:
我们需要创建 LVM,因此我们使用 LVM 的类型代码 8e:
最后输入 w 命令确认变更。再次查看 /dev/sdd 的分区信息,此时分区类型已经变成了 Linux LVM:
总结
分区是使用磁盘的基础,在分区完成后还需要对分区进行格式化,并把格式化后的文件系统挂载到 Linux 系统之后才能存储文件。