当前位置: 首页 > 工具软件 > fdisk > 使用案例 >

【Linux】分区和格式化硬盘(fdisk | parted)

沈乐邦
2023-12-01

摘要

本文探讨如何在 Linux 中对硬盘进行分区,并对分区进行格式化。

样例

我们现在来完成一个对硬盘分区和格式化的任务。硬盘大小为 223.6G,设备名为 sdd,需要划分为 5 个分区:

  • 分区 1:为主分区,采用 ext4 文件系统,大小 100G
  • 分区 2:也采用 ext4 文件系统,大小 32G
  • 分区 3 :采用与 Windows 兼容的文件格式(vfat),大小为 32G
  • 分区 4:也采用 ext4 文件系统,大小 20G
  • 分区 5:也采用 ext4 文件系统,大小为所有余下的空间

Linux 中对硬盘进行分区有很多工具,我们选择使用最经典的工具 fdisk。对这个样例任务进行简单分析:在 MSDOS 分区类型中,主分区加上拓展分区做多只能由四个。而拓展分区最多只能有一个。如果要使用超过四个以上的分区,就必须用到拓展分区,并且在其中划分逻辑分区。因此,对于上述任务,我们可以考虑将分区 1 划分为主分区,将分区 2-5 都用逻辑分区来表示,并将这些逻辑分区都存入一个拓展分区中。

分区教程

  1. fdisk -l /dev/sdd:查看硬盘分区情况(未显示分区信息,说明未分区)。
root@centos:~# fdisk -l /dev/sdd
Disk /dev/sdd:223.58 GiB,240057409536 字节,468862128 个扇区
Disk model: INTEL SSDSC2KG24
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 4096 字节
I/O 大小(最小/最佳):4096 字节 / 4096 字节
磁盘标签类型:dos
磁盘标识符:0x55af9331
  1. fdisk /dev/sdd:进入硬盘分区界面。
root@centos:~# fdisk /dev/sdd

欢迎使用 fdisk (util-linux 2.34)。
更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。


命令(输入 m 获取帮助):
  1. 输入 n 新建分区;输入 p 选择分区类型为主分区;输入分区号 1;输入分区的开始柱面号,默认为 1,我们不改了,直接回车;输入分区的结束柱面号,这里支持直接输入分区大小,那我们输入 +100G。
root@centos:~# fdisk /dev/sdd

欢迎使用 fdisk (util-linux 2.34)。
更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。


命令(输入 m 获取帮助): n
分区类型
   p   主分区 (0个主分区,0个扩展分区,4空闲)
   e   扩展分区 (逻辑分区容器)
选择 (默认 p): p
分区号 (1-4, 默认  1): 1
第一个扇区 (2048-468862127, 默认 2048):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-468862127, 默认 468862127): +100G

创建了一个新分区 1,类型为“Linux”,大小为 100 GiB。
  1. 接下来,我们逐一划分其它分区。输入 n 新建分区,输入 e 建立第一个拓展分区,输入分区号 2,起始柱面号和结束柱面号都默认即可。默认表示使用所有余下的空间。后面要建立的所有分区都是属于该拓展分区的逻辑分区。
命令(输入 m 获取帮助): n
分区类型
   p   主分区 (1个主分区,0个扩展分区,3空闲)
   e   扩展分区 (逻辑分区容器)
选择 (默认 p): e
分区号 (2-4, 默认  2): 2
第一个扇区 (209717248-468862127, 默认 209717248):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (209717248-468862127, 默认 468862127):

创建了一个新分区 2,类型为“Extended”,大小为 123.6 GiB。
  1. 继续创建分区。输入 n 新建分区;建好拓展分区之后,选择分区类型就不再出现了,默认创建逻辑分区;根据要求,大小为 32G,所以起始柱面号默认,结束柱面号输入 +32G。
命令(输入 m 获取帮助): n
所有主分区的空间都在使用中。
添加逻辑分区 5
第一个扇区 (209719296-468862127, 默认 209719296):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (209719296-468862127, 默认 468862127): +32G

创建了一个新分区 5,类型为“Linux”,大小为 32 GiB。
  1. 用同样的方法创建第二个逻辑分区。
命令(输入 m 获取帮助): n
所有主分区的空间都在使用中。
添加逻辑分区 6
第一个扇区 (276830208-468862127, 默认 276830208):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (276830208-468862127, 默认 468862127): +32G

创建了一个新分区 6,类型为“Linux”,大小为 32 GiB。
  1. 然后,我们创建大小为 20G 的第三个逻辑分区。
命令(输入 m 获取帮助): n
所有主分区的空间都在使用中。
添加逻辑分区 7
第一个扇区 (343941120-468862127, 默认 343941120):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (343941120-468862127, 默认 468862127): +20G

创建了一个新分区 7,类型为“Linux”,大小为 20 GiB。
  1. 最后,将 sdd 硬盘剩下的所有空间划分给第四个逻辑分区。
命令(输入 m 获取帮助): n
所有主分区的空间都在使用中。
添加逻辑分区 8
第一个扇区 (385886208-468862127, 默认 385886208):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (385886208-468862127, 默认 468862127):

创建了一个新分区 8,类型为“Linux”,大小为 39.6 GiB。
  1. 至此,所有的划分操作都已经完成!输入 w 将划分好的新分区写入分区表。当然,如果你发现前面的划分有问题,比如分区号和分区大小出错了,你可以按 q 取消一切操作并退出 fdisk 命令面板,所有之前的操作都不会写入磁盘的分区表。
命令(输入 m 获取帮助): w
分区表已调整。
将调用 ioctl() 来重新读分区表。
正在同步磁盘。
  1. 使用 fdisk -l /dev/sdd 查看建立好的分区。注意到,从 sdd5 建立的分区均是在 sdd2 这个拓展分区中建立的逻辑分区,逻辑分区的分区号从 5 开始,因为 1-4 是保留给主分区和拓展分区使用的。此外,除拓展分区外,其它分区的 Id 均显示为 83,这个字段并非是分区真正文件系统类型,当然我们也会改动这个标识,使它与真正的分区文件系统类型一致。
root@centos:~# fdisk -l /dev/sdd
Disk /dev/sdd:223.58 GiB,240057409536 字节,468862128 个扇区
Disk model: INTEL SSDSC2KG24
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 4096 字节
I/O 大小(最小/最佳):4096 字节 / 4096 字节
磁盘标签类型:dos
磁盘标识符:0x55af9331

设备       启动      起点      末尾      扇区   大小 Id 类型
/dev/sdd1            2048 209717247 209715200   100G 83 Linux
/dev/sdd2       209717248 468862127 259144880 123.6G  5 扩展
/dev/sdd5       209719296 276828159  67108864    32G 83 Linux
/dev/sdd6       276830208 343939071  67108864    32G 83 Linux
/dev/sdd7       343941120 385884159  41943040    20G 83 Linux
/dev/sdd8       385886208 468862127  82975920  39.6G 83 Linux
  1. 我们仍然使用 fdisk 命令来改变分区的 Id。输入 fdisk /dev/sdd 命令进入操作面板;输入 l 命令列出 Linux 默认支持的文件系统类型,总共有 255 种,找到支持大硬盘的 Windows 分区类型 FAT32,记住其序号 c;输入 t 命令修改分区 Id;输入要修改的分区号 6;输入要修改的分区类型号 c;输入 w 将修改写入分区表。
root@centos:~# fdisk /dev/sdd
命令(输入 m 获取帮助): t
分区号 (1,2,5-8, 默认  8): 6
Hex 代码(输入 L 列出所有代码): c

已将分区“Linux”的类型更改为“W95 FAT32 (LBA)”。

命令(输入 m 获取帮助): w
分区表已调整。
将调用 ioctl() 来重新读分区表。
正在同步磁盘。
  1. 重新查看硬盘 fdisk -l /dev/sdd,我们发现分区 6 的 Id 已经修改过来了。
root@centos:~# fdisk -l /dev/sdd
Disk /dev/sdd:223.58 GiB,240057409536 字节,468862128 个扇区
Disk model: INTEL SSDSC2KG24
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 4096 字节
I/O 大小(最小/最佳):4096 字节 / 4096 字节
磁盘标签类型:dos
磁盘标识符:0x55af9331

设备       启动      起点      末尾      扇区   大小 Id 类型
/dev/sdd1            2048 209717247 209715200   100G 83 Linux
/dev/sdd2       209717248 468862127 259144880 123.6G  5 扩展
/dev/sdd5       209719296 276828159  67108864    32G 83 Linux
/dev/sdd6       276830208 343939071  67108864    32G  c W95 FAT32 (LBA)
/dev/sdd7       343941120 385884159  41943040    20G 83 Linux
/dev/sdd8       385886208 468862127  82975920  39.6G 83 Linux
  1. 如果检查发现分区错了,进入 fdisk 面板后,使用 -d 命令可以删除指定分区。例如,删除分区 8(别忘了使用 w 写入分区表)。当然,我们这里并没有出错,所以就不执行了。
命令(输入 m 获取帮助): d
分区号 (1,2,5-8, 默认  8): 8

分区 8 已删除。

命令(输入 m 获取帮助): w

文件系统

分好区之后,接下来就是为这些分区创建文件系统了,也就是格式化分区。在 Linux 中格式化非常简单,我们只需要记住两个命令即可:mkfs 和 mkswap。

  1. /dev/sdd1 分区格式化,-t 指定其文件系统类型为 ext4
root@centos:~# mkfs -t ext4 /dev/sdd1
mke2fs 1.45.5 (07-Jan-2020)
丢弃设备块: 完成
创建含有 26214400 个块(每块 4k)和 6553600 个inode的文件系统
文件系统UUID:77e1c795-4f0b-462e-96df-7a7ecc9fdf8f
超级块的备份存储于下列块:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
        4096000, 7962624, 11239424, 20480000, 23887872

正在分配组表: 完成
正在写入inode表: 完成
创建日志(131072 个块) 完成
写入超级块和文件系统账户统计信息: 已完成
  1. 同样的方式格式化 sdd5sdd7sdd8
root@centos:~# mkfs -t ext4 /dev/sdd5
...
root@centos:~# mkfs -t ext4 /dev/sdd7
...
root@centos:~# mkfs -t ext4 /dev/sdd8
...
  1. sdd6 比较特殊,要求采用与 Windows 兼容的文件格式 vfat(由于 vfat 文件系统格式结构相对简单,因此格式化分区的速度非常块)
root@centos:~# mkfs -t vfat /dev/sdd6
mkfs.fat 4.1 (2017-01-24)

至此,sdd 硬盘的分区和格式化都完成了!关于格式化分区我们还需要知道的一个命令是 mkswap。这个命令为 Linux 中必不可少的一个分区,即交换分区创建文件系统。一般来说,交互分区往往在创建系统的时候就创建好了,因此这个命令很少用到。事实上,这个命令在我们样例任务中也用不到,但我们还是要简单了解一下它的用法。例如将 sdd7 格式化为一个交换分区:mkswap /dev/sdd7,我们无法指定文件系统,因为 mkswap 创建的文件系统是指定好的,即 swap 文件系统。

注意

fdisk 分区虽然很方便,但却也有限制,fdisk 使用 MSDOS 分区表,最大只能处理 2.2 TB 的空间。如果非要用 fdisk 对大硬盘进行分区的话,会浪费很多硬盘空间,因此建议使用 parted 命令并采用 GPT 分区表来对大硬件进行分区。

在 CentOS 中常用的 GPT 分区工具主要有两种:parted 和 gfdisk。其中,parted 是默认工具,我们这里就介绍使用 parted 来对大硬盘进行分区。

目前手头没有这么大的硬盘,因此还是上述使用的那个硬盘 /dev/sdd,大小 223.6G,要求划分为 3 个分区:

  • 分区1:大小 112.8GB
  • 分区2:大小 56.4GB
  • 分区3:大小为所有余下的空间

在命令行中输入 parted /dev/sdd 即可进入 parted 对 sdd 设备进行分区的交互界面,输入 help 查看帮助,输入 quit 退出交互界面。除了通过交互的方式进行分区外,parted 还可以通过非交互的方式来划分分区。处于效率和实用角度考虑,我们实用非交互的方式来分区。特别要注意的是,和 fdisk 不同,parted 中所有的操作命令都是实时写入硬盘分区表的,因此 parted 每一步操作都是不可撤销的。与 fdisk 自动建立 MSDOS 分区表不同,parted 需要手动建立 GPT 分区表,可使用 parted 的 mklable 命令来实现这一点。还需要注意的是,mklabel 会设置分区表类型,这将导致硬盘上原来所有数据丢失。

root@centos:~# parted /dev/sdd mklabel gpt # 创建 gpt 分区表
信息: 你可能需要 /etc/fstab。

root@centos:~# parted /dev/sdd mkpart part1 0% 50% # 创建分区1
信息: 你可能需要 /etc/fstab。

root@centos:~# parted /dev/sdd mkpart part2 50% 75% # 创建分区2
信息: 你可能需要 /etc/fstab。

root@centos:~# parted /dev/sdd mkpart part3 75% 100% # 创建分区3
信息: 你可能需要 /etc/fstab。

root@centos:~# parted /dev/sdd print # 打印分区信息
型号:ATA INTEL SSDSC2KG24 (scsi)
磁盘 /dev/sdd: 240GB
扇区大小 (逻辑/物理):512B/4096B
分区表:gpt
磁盘标志:

编号  起始点  结束点  大小    文件系统  名称   标志
 1    1049kB  120GB   120GB   ext4      part1
 2    120GB   180GB   60.0GB            part2
 3    180GB   240GB   60.0GB            part3

parted 的子命令 mkpart 用于创建分区,其后接三个字段选项:

  • 第一字段:分区名(必选)
  • 第二字段:分区起始位置
  • 第三字段:分区结束位置

分区的起始位置和结束位置推荐使用百分比,以避免出现分区对齐问题。当然,也可以使用数字加上 KB、MB 和 GB 等单位来直接指定起始和结束位置。

parted 也提供了删除分区的子命令 rm,rm 后紧跟分区号即可删除分区,分区号创建的时候自动生成,默认从 1 开始。因此,上述创建的三个分区就可以通过以下命令依次删除:

root@centos:~# parted /dev/sdd rm 1 # 删除分区1
root@centos:~# parted /dev/sdd rm 2 # 删除分区2
root@centos:~# parted /dev/sdd rm 3 # 删除分区3

虽然删除了 sdd 硬盘的所有分区,但其分区表仍然还是 GPT,可通过命令将其改回 MSDOS:parted /dev/sdd mklabel msdos

参考

中国大学 MOOC | Linux 系统管理 | 主题 07 管好硬盘 | 小节 2 分区和格式化硬盘

 类似资料: