1. 认识fdisk:你的Linux磁盘分区瑞士军刀

刚接触Linux系统管理时,我第一次给服务器添加新硬盘就遇到了分区难题。当时前辈只说了一句"用fdisk就行",留下我在命令行前手足无措。现在回想起来,fdisk确实是每个Linux管理员必须掌握的利器,就像瑞士军刀一样能解决各种磁盘分区问题。

fdisk是Linux系统自带的经典分区工具,从早期的Unix系统延续至今。它采用命令行交互方式,支持MBR(主引导记录)分区方案,能创建主分区、扩展分区和逻辑分区。与图形化工具相比,fdisk的优势在于:

  • 无需图形界面,通过SSH就能远程操作服务器磁盘
  • 支持脚本化操作,适合批量部署环境
  • 功能全面且稳定,历经数十年考验

实际工作中,这些场景特别适合使用fdisk:

  • 为新硬盘创建分区表
  • 调整现有分区大小(需先删除后重建)
  • 转换分区类型(如将普通分区改为交换分区)
  • 修复损坏的分区表

提示:操作分区前务必确认目标磁盘,误操作可能导致数据丢失。建议先执行 lsblk 命令确认磁盘标识符。

2. 实战前的准备工作

上周给公司NAS扩容时,我特意记录下了完整的操作流程。首先需要确认几个关键信息:

查看磁盘列表

sudo fdisk -l

这个命令会列出所有磁盘及其分区信息。比如我们新加的2TB硬盘可能显示为 /dev/sdb ,而原有系统盘是 /dev/sda 。输出示例:

Disk /dev/sdb: 1.8 TiB, 2000398934016 bytes, 3907029168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: dos
Disk identifier: 0x00000000

重点关注:

  • 磁盘容量(确保是我们操作的设备)
  • 分区表类型(dos表示MBR,gpt表示GPT)
  • 现有分区情况(避免误操作已有分区)

理解MBR分区限制 : MBR方案中,一个磁盘最多只能有:

  • 4个主分区,或
  • 3个主分区 + 1个扩展分区(扩展分区内可建多个逻辑分区)

这是我曾经踩过的坑:给系统盘分区时,已经创建了3个主分区(boot、root、swap),想再建一个数据分区时才发现这个限制,最后不得不重建分区表。

3. 主分区创建实战:系统盘的黄金分割

以常见的500GB系统盘分区为例,我通常这样规划:

  1. /boot 分区:1GB(存放内核)
  2. swap 分区:内存的1.5倍(16GB内存配24GB swap)
  3. / 分区:100GB(系统文件)
  4. /home 分区:剩余空间(用户数据)

具体操作步骤

sudo fdisk /dev/sdb

进入交互界面后:

  1. 输入 n 创建新分区
  2. 选择 p 创建主分区
  3. 分区号按顺序输入1-4
  4. 起始扇区直接回车用默认值
  5. 设置分区大小:
    • +1G 表示1GB
    • +24G 表示24GB
    • 不指定大小则用完剩余空间

完整操作记录:

Command (m for help): n
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-976773167, default 2048): 
Last sector, +sectors or +size{K,M,G,T,P} (2048-976773167, default 976773167): +1G

Created a new partition 1 of type 'Linux' and of size 1 GiB.

创建swap分区时需要额外步骤:

  1. 先用上述方法创建分区
  2. 输入 t 修改分区类型
  3. 输入 82 设置为Linux swap类型

注意:修改分区类型不会影响已有数据,但修改后需要执行 mkswap 命令初始化swap分区。

4. 扩展分区与逻辑分区的艺术

当需要超过4个分区时,就必须使用扩展分区。去年我们部署MySQL服务器时,就遇到了这个典型场景:需要为不同数据库创建独立分区。

创建扩展分区

  1. 前三个分区按常规主分区创建
  2. 第四个分区选择 e 创建扩展分区
  3. 扩展分区会占用所有剩余空间

在扩展分区内创建逻辑分区

Command (m for help): n
All primary partitions are in use.
Adding logical partition 5
First sector (205826048-976773167, default 205826048): 
Last sector, +sectors or +size{K,M,G,T,P} (205826048-976773167, default 976773167): +100G

逻辑分区会从5开始编号(sdb5、sdb6等),这是MBR分区的特性。

实际案例 : 为数据库服务器规划分区:

  • sdb1:系统分区(主分区)
  • sdb2:日志分区(主分区)
  • sdb3:备份分区(主分区)
  • sdb4:扩展分区
    • sdb5:用户数据库(逻辑分区)
    • sdb6:订单数据库(逻辑分区)
    • sdb7:日志数据库(逻辑分区)

5. 分区方案设计与优化技巧

经过多次实战,我总结出这些分区原则:

分区策略

  • 系统盘:单独分区存放/boot、/、/var、/home
  • 数据盘:按业务功能划分(如数据库、日志、备份)
  • 临时盘:整个作为单个分区

性能优化

  • 将频繁读写的分区(如数据库)放在磁盘外圈(分区时先创建)
  • SSD不需要考虑此问题
  • 使用 cfdisk 可以直观查看分区物理位置

容量规划经验

  • /boot:1GB足够
  • swap:物理内存<8GB时设为2倍,>8GB时与内存相同
  • /:50-100GB
  • /var:日志服务需要20GB+
  • /home:根据用户数量决定

一个生产环境案例 : 某Web服务器配置:

/dev/sda1  /boot  1GB
/dev/sda2  /      50GB
/dev/sda3  /var   20GB
/dev/sda4  [扩展分区]
  /dev/sda5 /home  100GB
  /dev/sda6 /data  剩余空间

6. 保存与后续操作

完成分区后,需要执行 w 命令写入分区表。但此时系统可能还未识别新分区,可以通过这些方法解决:

刷新分区表

partprobe /dev/sdb

或重启系统

格式化新分区

mkfs.ext4 /dev/sdb1  # 创建ext4文件系统
mkfs.xfs /dev/sdb5   # 创建xfs文件系统
mkswap /dev/sdb2     # 初始化swap分区

挂载使用

mkdir /data
mount /dev/sdb5 /data

要永久挂载需要编辑 /etc/fstab 文件,添加类似配置:

/dev/sdb5  /data  ext4  defaults  0 2

记得第一次操作时,我创建完分区就直接尝试挂载,结果报错"找不到文件系统",后来才明白需要先格式化。这种细节在实际操作中很容易被忽略。

7. 常见问题排查

分区未生效

  • 确认执行了 w 命令保存
  • 检查 dmesg | grep sdb 看内核是否识别到新分区
  • 尝试重新插拔磁盘(USB设备常见)

空间不足

  • 使用 df -h 查看各分区使用情况
  • du -sh * 定位大文件目录
  • 逻辑分区不能超过扩展分区大小

误删分区

  • 立即卸载该分区
  • 使用 testdisk 等工具尝试恢复
  • 重要数据建议提前备份

有次我误删了包含数据库的分区,幸亏有定期备份,只损失了少量数据。这次教训让我养成了操作前备份分区表的习惯:

sfdisk -d /dev/sdb > sdb_backup.sfdisk

需要恢复时执行:

sfdisk /dev/sdb < sdb_backup.sfdisk

8. 进阶技巧与替代方案

非交互式分区 : 对于自动化部署,可以用管道传递命令:

echo -e "n\np\n1\n\n+20G\nw" | fdisk /dev/sdb

GPT分区 : 对于大于2TB的磁盘,需要使用 gdisk parted 工具:

gdisk /dev/sdb

GPT分区没有4个主分区的限制,但引导可能需要UEFI支持。

parted命令 : 更适合脚本化操作,支持调整分区大小:

parted /dev/sdb resizepart 2 100%

记得初次接触这些工具时,我被各种分区方案搞得晕头转向。后来在虚拟机里反复练习,才逐渐掌握它们的区别和适用场景。建议新手也先在测试环境练习,毕竟分区操作直接影响数据安全。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐