linux下fdisk创建主分区、逻辑分区和扩展分区

'# linux下fdisk创建主分区、逻辑分区和扩展分区

一、背景与问题

在Linux系统中,磁盘分区是系统管理的基础操作之一。fdisk作为传统磁盘管理工具,其核心功能是通过MBR(Master Boot Record)分区表对磁盘进行分区。在实际开发中,我们常常需要根据业务需求对磁盘进行分区管理,例如:

  • 为数据库服务器划分专用分区
  • 为日志系统创建独立分区
  • 管理多磁盘系统的分区策略

然而,许多开发人员在使用fdisk时容易陷入以下误区:

  1. 误将逻辑分区当作普通分区处理
  2. 忽略分区对系统启动的影响
  3. 未考虑磁盘空间分配的合理性
  4. 在生产环境中直接使用fdisk进行分区

本文将深入解析fdisk的分区机制,通过实际案例展示如何安全、高效地进行分区管理。

二、基本原理

1. MBR分区表结构

MBR(主引导记录)是磁盘分区表的核心,包含以下关键部分:

  • 446字节的引导代码
  • 6个分区表项(每个16字节)
  • 2字节的分区结束标志(0x55AA)

每个分区表项包含以下字段:

  • 起始扇区(32位)
  • 结束扇区(32位)
  • 系统ID(8位)
  • 起始磁头/扇区/柱面(16位)

MBR分区表的最大限制:

  • 仅支持2TB的磁盘空间(32位地址)
  • 最多4个主分区
  • 通过扩展分区可创建多个逻辑分区

2. 分区类型分类

分区类型特点限制使用场景
主分区(Primary)直接存储数据最多4个独立分区需求
逻辑分区(Logical)嵌套在扩展分区中无直接限制多分区需求
扩展分区(Extended)作为逻辑分区容器最多1个需要多个逻辑分区时

三、环境准备

确保系统环境满足以下条件:

# 检查磁盘设备
lsblk

# 安装必要的工具(通常预装)
fdisk --version

示例环境:

  • 系统:Ubuntu 22.04 LTS
  • 磁盘:/dev/sdb(10GB容量)
  • 操作用户:root(需sudo权限)

四、核心实现

1. 创建主分区(Primary Partition)

# 进入fdisk交互模式
sudo fdisk /dev/sdb

# 操作步骤(交互式模式)
Command (m for help): m
Command (m for help): n
Partition type: primary (1) - 创建主分区
Partition number (1-4, default 1): 1
First sector (1-3908415, default 2048): 2048
Last sector (2048-3908415, default 3908415): 3908415
Command (m for help): p
Command (m for help): w
Command (m for help): q

关键点解释:

  • 分区编号范围:1-4(主分区)
  • 起始扇区通常设置为2048(跳过MBR)
  • 分区大小计算:Last sector - First sector + 1(单位:扇区)

2. 创建扩展分区(Extended Partition)

# 进入fdisk交互模式
sudo fdisk /dev/sdb

# 操作步骤
Command (m for help): m
Command (m for help): n
Partition type: extended (5) - 创建扩展分区
Partition number (1-4, default 5): 5
First sector (1-3908415, default 2048): 2048
Last sector (2048-3908415, default 3908415): 3908415
Command (m for help): p
Command (m for help): w
Command (m for help): q

关键点解释:

  • 扩展分区编号为5(特殊类型)
  • 只能创建一个扩展分区
  • 扩展分区本身不能存储数据,必须包含逻辑分区

3. 创建逻辑分区(Logical Partition)

# 进入fdisk交互模式
sudo fdisk /dev/sdb

# 操作步骤
Command (m for help): m
Command (m for help): n
Partition type: logical (5) - 创建逻辑分区
Partition number (5-16, default 5): 5
First sector (1-3908415, default 2048): 2048
Last sector (2048-3908415, default 3908415): 3908415
Command (m for help): p
Command (m for help): w
Command (m for help): q

关键点解释:

  • 逻辑分区编号范围:5-16(与扩展分区相关)
  • 必须在扩展分区中创建
  • 逻辑分区的起始位置由扩展分区的起始位置决定

五、完整案例

案例场景:为数据库服务器创建分区

需求:

  • 系统盘:/dev/sda(保留默认分区)
  • 数据盘:/dev/sdb(10GB容量)
  • 分区策略:

    • 1个主分区(1GB)用于系统日志
    • 1个扩展分区(9GB)

      • 2个逻辑分区(各4.5GB)用于数据库存储

操作步骤:

# 查看磁盘信息
lsblk

# 创建分区
sudo fdisk /dev/sdb <<EOF
n
p
1
2048
3908415
p
n
e
5
2048
3908415
p
n
l
5
2048
19530623
p
n
l
6
19530624
3908415
p
w
EOF
# 格式化分区
sudo mkfs.ext4 /dev/sdb1
sudo mkfs.ext4 /dev/sdb5
sudo mkfs.ext4 /dev/sdb6

# 创建挂载点
sudo mkdir /mnt/logs
sudo mkdir /mnt/db1
sudo mkdir /mnt/db2

# 挂载分区
sudo mount /dev/sdb1 /mnt/logs
sudo mount /dev/sdb5 /mnt/db1
sudo mount /dev/sdb6 /mnt/db2

# 配置开机自动挂载
echo '
/dev/sdb1 /mnt/logs ext4 defaults 0 0
/dev/sdb5 /mnt/db1 ext4 defaults 0 0
/dev/sdb6 /mnt/db2 ext4 defaults 0 0' | sudo tee /etc/fstab

六、源码解析

1. 分区表结构解析

struct partition {
    uint8_t boot_flag;       // 启动标志(0x80表示活动分区)
    uint8_t start_head;      // 起始磁头号
    uint8_t start_sector;    // 起始扇区号
    uint8_t start_cylinder;  // 起始柱面号
    uint8_t sys_id;          // 文件系统类型ID
    uint8_t end_head;        // 结束磁头号
    uint8_t end_sector;      // 结束扇区号
    uint8_t end_cylinder;    // 结束柱面号
    uint32_t start_sector;   // 起始扇区(32位)
    uint32_t size;           // 分区大小(32位)
};

2. 分区类型代码映射

// MBR分区类型代码
#define PART_TYPE_LINUX 0x83    // Linux文件系统
#define PART_TYPE_WIN95 0x06    // Windows 95 FAT32
#define PART_TYPE_EXTENDED 0x05 // 扩展分区
#define PART_TYPE_FREEBSD 0x07  // FreeBSD

七、进阶使用

1. 分区大小计算

# 计算分区大小(以扇区为单位)
sector_size=512
partition_size=$(( (last_sector - first_sector + 1) * sector_size ))

# 示例:计算1GB分区大小
partition_size=$(( 1024 * 1024 * 1024 * 512 ))

2. 防止磁盘空间浪费

# 计算分区利用率
usage=$(df -h /mnt/logs | awk '/ / { print $5 }')
echo "日志分区使用率: $usage%"

3. 分区对齐优化

# 使用parted实现4K对齐
sudo parted /dev/sdb mkpart primary 2048s 1024m

八、性能与工程实践

1. 性能优化建议

优化点建议原因
分区对齐4K对齐提高读写效率
磁盘分区分区大小适中避免磁盘碎片
分区类型使用ext4支持大文件系统
分区顺序系统分区优先确保启动可靠性

2. 安全风险分析

  • 数据丢失风险:误操作可能导致数据丢失
  • 引导问题:错误的分区配置可能导致系统无法启动
  • 分区碎片:未合理规划可能导致磁盘碎片

3. 事务性操作

# 使用dd命令进行分区复制(带校验)
sudo dd if=/dev/sdb of=/dev/sdc bs=512 count=1024 conv=notrunc iflag=fullblock

九、常见问题与踩坑

1. 常见错误及解决方法

错误现象原因解决方法
分区编号超过4主分区数量限制删除冗余分区
分区覆盖现有数据未正确识别磁盘使用lsblk确认设备
分区未保存未执行w命令在fdisk交互模式中执行w
系统无法启动分区表损坏使用fdisk重新创建分区

2. 磁盘空间分配陷阱

# 错误示例:分配过多分区导致空间浪费
sudo fdisk /dev/sdb <<EOF
n
p
1
1
2048
p
n
p
2
2049
3908415
w
EOF

问题:主分区1占据1GB,主分区2占据9GB,实际可用空间仅剩1GB

改进:合理规划分区大小,使用扩展分区管理多分区需求

十、最佳实践

  1. 分区规划原则

    • 系统分区优先(/boot)
    • 日志分区独立(/var/log)
    • 数据分区分离(/data)
    • 使用扩展分区管理多逻辑分区
  2. 操作规范

    • 在生产环境操作前进行数据备份
    • 使用fdisk -l确认分区信息
    • 使用parted进行磁盘对齐优化
    • 使用pvcreate创建LVM卷组
  3. 安全措施

    • 使用dd进行分区备份
    • 使用fsck检查文件系统
    • 使用smartctl监控磁盘健康状态

十一、总结

本文深入解析了fdisk在Linux系统中的分区机制,从MBR分区表结构到不同分区类型的创建方法,再到完整的生产环境案例。通过实际案例展示了如何安全、高效地进行磁盘分区管理,同时分析了常见错误和性能优化方法。

在实际开发中,fdisk适用于以下场景:

  • 小型服务器配置
  • 老旧系统维护
  • 快速分区测试

但需要注意:

  • 不适合支持大于2TB的磁盘
  • 不适合需要动态调整分区大小的场景
  • 不适合需要高级分区管理的复杂环境

建议在需要高级功能时使用parted或LVM工具,对于简单分区需求可继续使用fdisk。同时,始终遵循"先备份,再操作"的原则,确保系统稳定运行。

最后修改于:2026年09月25日 05:37

评论已关闭

推荐阅读

AIGC实战——Transformer模型
2024年12月01日
Socket TCP 和 UDP 编程基础(Python)
2024年11月30日
python , tcp , udp
如何使用 ChatGPT 进行学术润色?你需要这些指令
2024年12月01日
AI
最新 Python 调用 OpenAi 详细教程实现问答、图像合成、图像理解、语音合成、语音识别(详细教程)
2024年11月24日
ChatGPT 和 DALL·E 2 配合生成故事绘本
2024年12月01日
omegaconf,一个超强的 Python 库!
2024年11月24日
【视觉AIGC识别】误差特征、人脸伪造检测、其他类型假图检测
2024年12月01日
[超级详细]如何在深度学习训练模型过程中使用 GPU 加速
2024年11月29日
Python 物理引擎pymunk最完整教程
2024年11月27日
MediaPipe 人体姿态与手指关键点检测教程
2024年11月27日
深入了解 Taipy:Python 打造 Web 应用的全面教程
2024年11月26日
基于Transformer的时间序列预测模型
2024年11月25日
Python在金融大数据分析中的AI应用(股价分析、量化交易)实战
2024年11月25日
AIGC Gradio系列学习教程之Components
2024年12月01日
Python3 `asyncio` — 异步 I/O,事件循环和并发工具
2024年11月30日
llama-factory SFT系列教程:大模型在自定义数据集 LoRA 训练与部署
2024年12月01日
Python 多线程和多进程用法
2024年11月24日
Python socket详解,全网最全教程
2024年11月27日
python之plot()和subplot()画图
2024年11月26日
理解 DALL·E 2、Stable Diffusion 和 Midjourney 工作原理
2024年12月01日