当前位置: 首页 > news >正文

UNIX下C语言编程与实践14-UNIX 文件系统格式化:磁盘分区与文件系统创建原理

一、磁盘使用前置认知:为什么需要分区与格式化?

在 UNIX 系统中,新磁盘(或虚拟磁盘)无法直接使用,必须经过分区格式化两个核心步骤。这两个操作分别解决了“磁盘空间如何划分”和“数据如何存储”的根本问题,是 UNIX 文件系统正常工作的基础。

核心逻辑:磁盘到文件系统的三层映射

UNIX 系统通过“物理磁盘 → 分区 → 文件系统”的三层结构管理存储,具体作用如下:

  1. 物理磁盘:硬件层面的存储设备(如 /dev/sda、/dev/vdb),是原始的字节存储区域,无结构可言;
  2. 磁盘分区:将物理磁盘划分为多个独立的“逻辑区域”(如 /dev/sda1、/dev/sda2),实现空间隔离(如系统分区与数据分区分离);
  3. 文件系统:在分区基础上创建“数据组织结构”,定义文件的存储方式、索引方法、空间分配规则,使 UNIX 能识别和管理文件。

类比:磁盘如同“未分割的土地”,分区是“划分地块”,格式化则是为每个地块“铺设道路和建筑规则”,最终才能在地块上“建造房屋(存储文件)”。

二、磁盘分区:用 fdisk 划分逻辑区域

磁盘分区的核心工具是 fdisk(适用于 MBR 分区表)和 gdisk(适用于 GPT 分区表),其本质是在磁盘的“分区表”中记录分区的起始位置、大小、类型等信息,让系统能识别不同的逻辑区域。

1. 分区表类型:MBR 与 GPT 的选择

分区表是磁盘的“目录”,记录所有分区的元数据。UNIX 系统支持两种主流分区表类型,选择需结合磁盘大小和使用场景:

MBR(Master Boot Record)

适用场景:2TB 以下磁盘、传统 BIOS 启动系统

核心特点

  • 支持最多 4 个主分区,或 3 个主分区 + 1 个扩展分区(扩展分区内可分多个逻辑分区);
  • 分区大小上限为 2TB(因使用 32 位地址记录分区起始和大小);
  • 包含引导程序(Boot Loader),BIOS 启动时从 MBR 加载系统。

局限性:无法支持 2TB 以上磁盘,分区数量受限,引导程序大小仅 446 字节(易被病毒破坏)。

GPT(GUID Partition Table)

适用场景:2TB 以上磁盘、UEFI 启动系统、需要多分区场景

核心特点

  • 支持最多 128 个主分区(无扩展/逻辑分区概念);
  • 分区大小上限为 8EB(1EB = 1024PB),兼容大磁盘;
  • 包含备份分区表(磁盘末尾),分区信息损坏可恢复;
  • 支持 UEFI 启动,安全性更高(需配合 ESP 分区)。

局限性:传统 BIOS 系统不支持,部分老旧工具(如早期 fdisk)无法识别。

2. 实操案例:用 fdisk 为磁盘创建 MBR 分区

假设场景:新磁盘 /dev/sdb(20GB),需创建 1 个 10GB 的主分区(用于数据存储),剩余空间暂不分区。

步骤 1:查看磁盘信息,确认目标磁盘

执行 lsblk 或 fdisk -l 查看系统中的磁盘列表,确认目标磁盘为 /dev/sdb(避免误操作系统磁盘 /dev/sda):

# 查看所有磁盘和分区信息
fdisk -l# 输出示例(目标磁盘 /dev/sdb)
Disk /dev/sdb: 20 GiB, 21474836480 bytes, 41943040 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

步骤 2:进入 fdisk 交互模式,操作目标磁盘

执行 fdisk /dev/sdb 进入交互模式,输入 m 可查看所有命令说明:

# 进入 fdisk 交互模式 fdisk /dev/sdb # 输入 m 查看命令帮助 Command (m for help): m # 核心命令说明(常用) # n: 创建新分区 d: 删除分区 p: 查看分区表 w: 保存退出 q: 放弃退出

步骤 3:创建主分区(10GB)

按以下流程输入命令,完成分区创建:

调整缩进后的命令流程

# 输入 n 创建新分区
Command (m for help): n# 选择分区类型:p(主分区),按 Enter 确认
Partition typep   primary (0 primary, 0 extended, 4 free)e   extended (container for logical partitions)
Select (default p): p# 输入分区编号(1-4),默认 1,按 Enter 确认
Partition number (1-4, default 1): 1# 输入分区起始扇区(默认从第一个可用扇区开始),按 Enter 确认
First sector (2048-41943039, default 2048):# 输入分区大小:+10G(表示 10GB),按 Enter 确认
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-41943039, default 41943039): +10G# 分区创建成功,输入 p 查看分区表
Command (m for help): p# 输出示例(新分区 /dev/sdb1)
Disk /dev/sdb: 20 GiB, 21474836480 bytes, 41943040 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x12345678Device     Boot   Start      End  Sectors Size Id Type
/dev/sdb1          2048 20973567 20971520  10G 83 Linux

步骤 4:保存分区表并退出

输入 w 保存分区表,系统会更新磁盘分区信息(若提示“Syncing disks.”表示成功):

调整后的命令与输出示例

保存分区表并退出:
w

成功执行后显示:

The partition table has been altered.  
Calling ioctl() to re-read partition table.  
Syncing disks.  

关键说明

  • 输入 w 后按回车,将修改写入磁盘并退出 fdisk 工具。
  • 系统自动重新读取分区表并同步磁盘操作,无需额外命令。

验证:执行 lsblk /dev/sdb,若显示 /dev/sdb1 则分区成功。

分区操作注意事项

  • 操作前必须确认目标磁盘(如 /dev/sdb),避免误删系统磁盘(/dev/sda)分区,导致系统崩溃;
  • 分区大小需合理规划:系统分区(如 /boot、/)建议至少 20GB,数据分区根据实际存储需求设置;
  • MBR 分区表若需超过 4 个分区,需创建“3 主分区 + 1 扩展分区”,再在扩展分区内创建逻辑分区;
  • 分区后需重启系统或执行 partprobe /dev/sdb,让系统识别新分区。

三、文件系统格式化:创建数据存储规则

分区仅划分了磁盘的“逻辑区域”,但该区域仍是“空白”的——没有定义文件如何存储、如何索引、如何分配空间。格式化的核心就是在分区上创建“文件系统结构”,让 UNIX 系统能按规则管理文件。

1. 文件系统核心原理:UNIX 如何组织数据?

,UNIX 文件系统采用 “目录 - i 节点 - 数据块”三级结构,格式化过程本质是初始化这三级结构的元数据:

三级结构解析
  1. 数据块(Data Block):存储文件的实际内容(如文本、二进制数据),是磁盘的最小存储单元(常见大小 4KB、8KB);
  2. i 节点(Inode):每个文件对应一个唯一 i 节点,记录文件的属性(权限、所有者、大小、修改时间)和数据块的存储位置(通过“磁盘地址表”指向数据块);
  3. 目录(Directory):本质是“文件名 - i 节点号”的映射表,记录目录下所有文件的名称及其对应的 i 节点编号,实现“按文件名查找文件”。

格式化的核心动作

  • 划分磁盘分区为“引导块、超级块、i 节点区、数据区”四个部分(超级块记录文件系统整体信息,如 i 节点总数、数据块总数);
  • 初始化 i 节点区,创建空闲 i 节点池;
  • 初始化数据区,创建空闲数据块池;
  • 创建根目录(/),其目录项包含“.”(当前目录,指向自身 i 节点)和“..”(父目录,指向自身 i 节点,因根目录无父目录)。

2. 主流文件系统对比:ext2/ext3/ext4/XFS

UNIX 系统支持多种文件系统,不同文件系统在日志功能、性能、兼容性上有差异,选择需结合业务场景:

文件系统核心特点适用场景局限性
ext2无日志功能,结构简单,性能较高;文件系统大小上限 32TB,单个文件大小上限 2TB嵌入式系统(资源有限)、临时存储分区(如 /tmp)无日志,断电或崩溃后数据恢复困难,易出现数据不一致
ext3在 ext2 基础上增加日志功能(支持 journal、ordered、writeback 三种日志模式);兼容 ext2传统服务器数据分区、对数据一致性要求较高的场景日志占用额外性能,文件系统大小和单个文件大小上限低于 ext4
ext4ext3 的升级版本,支持日志、extents(连续数据块分配,提升大文件性能)、延迟分配;文件系统大小上限 1EB,单个文件大小上限 16TBLinux 系统默认文件系统、通用服务器存储、大文件存储(如视频、日志)对超大规模存储(如 PB 级)的性能不如 XFS
XFS日志型文件系统,采用 B+ 树索引,支持动态扩展;文件系统大小上限 8EB,单个文件大小上限 8EB;并行 I/O 性能优异大磁盘(TB/PB 级)、高并发读写场景(如数据库、大数据存储)、CentOS/RHEL 7+ 默认文件系统不兼容 ext 系列文件系统,小文件性能略低于 ext4

3. 实操案例:格式化分区为 ext4 文件系统

假设场景:将上一步创建的 /dev/sdb1 分区格式化为 ext4 文件系统,用于存储应用数据。

步骤 1:确认分区状态,避免误格式化

执行 blkid /dev/sdb1 查看分区当前文件系统类型(新分区应显示“TYPE=”为空):

# 查看分区 /dev/sdb1 的文件系统信息 blkid /dev/sdb1 # 新分区输出示例(无文件系统) /dev/sdb1: PARTUUID="12345678-01"

步骤 2:执行 mkfs.ext4 格式化分区

使用 mkfs.ext4 命令格式化分区,添加 -L 参数可设置分区标签(便于识别):

格式化磁盘为 ext4 并设置标签

使用以下命令将 /dev/sdb1 格式化为 ext4 文件系统,并设置标签为 data_part

mkfs.ext4 -L data_part /dev/sdb1

命令输出示例

执行后,会显示类似以下信息:

mke2fs 1.42.9 (28-Dec-2013)  
Filesystem label=data_part  
OS type: Linux  
Block size=4096 (log=2)  
Fragment size=4096 (log=2)  
Stride=0 blocks, Stripe width=0 blocks  
655360 inodes, 2621440 blocks  
131072 blocks (5.00%) reserved for the super user  
First data block=0  
Maximum filesystem blocks=2684354560  
80 block groups  
32768 blocks per group, 32768 fragments per group  
8192 inodes per group  
Superblock backups stored on blocks:  32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632  
Allocating group tables: done  
Writing inode tables: done  
Creating journal (32768 blocks): done  
Writing superblocks and filesystem accounting information: done  

关键信息说明

  • Filesystem label=data_part:确认标签已正确设置为 data_part
  • Block size=4096:默认块大小为 4KB,适用于大多数场景。
  • Superblock backups:列出备份超级块的位置,便于文件系统恢复。
  • done:每一步骤完成后会显示,确保格式化完整无误。

验证格式化结果

格式化完成后,可使用以下命令检查文件系统信息:

blkid /dev/sdb1

预期输出应包含 LABEL="data_part"TYPE="ext4"

关键参数说明

  • -L data_part:设置文件系统标签为 data_part,后续可通过 findfs LABEL=data_part 快速定位分区;
  • 默认块大小为 4KB(适合大多数场景),若需调整可添加 -b 8192(设置为 8KB)。

步骤 3:验证格式化结果

执行 blkid /dev/sdb1 或 df -T 验证文件系统类型:

验证文件系统类型

执行 blkid /dev/sdb1 命令可查看块设备信息,输出示例显示 /dev/sdb1 的文件系统类型为 ext4,同时包含分区标签、UUID 等元数据:

/dev/sdb1: LABEL="data_part" UUID="a1b2c3d4-1234-5678-90ab-cdef01234567" TYPE="ext4" PARTUUID="12345678-01"

挂载并检查文件系统

将分区挂载到目标目录(如 /mnt/data),随后通过 df -T 确认挂载状态和文件系统类型:

mount /dev/sdb1 /mnt/data
df -T /mnt/data

输出示例显示挂载成功且文件系统类型与 blkid 结果一致:

Filesystem     Type  Size  Used Avail Use% Mounted on
/dev/sdb1      ext4  9.8G   37M  9.2G   1% /mnt/data

4. 格式化操作注意事项与常见错误

注意事项(核心避坑点)

  • 格式化会彻底删除分区内所有数据,操作前必须备份重要数据(如通过 rsync 或 dd 备份);
  • 不要格式化已挂载的分区(会导致数据损坏),需先执行 umount /dev/sdb1 卸载;
  • 选择合适的文件系统:小文件多选 ext4,大文件/高并发选 XFS,嵌入式系统选 ext2;
  • ext4 文件系统可通过 tune2fs 调整参数(如日志模式、保留块比例),例如 tune2fs -m 2 /dev/sdb1 将根用户保留块比例从 5% 改为 2%(节省空间)。

常见错误与解决方案

错误现象可能原因解决方案
mkfs.ext4: Device or resource busy分区已挂载,无法格式化执行 umount /dev/sdb1 卸载分区,若卸载失败用 fuser -m /dev/sdb1 查看占用进程并杀死
mkfs.ext4: Bad magic number in super-block磁盘分区表损坏,或命令指定错误(如误写为 /dev/sdb 而非 /dev/sdb1)1. 确认命令中的分区路径正确(如 /dev/sdb1);2. 若分区表损坏,用 fdisk 重新创建分区
格式化后分区大小与预期不符(如 10GB 分区显示 9.8GB)文件系统预留空间(默认 5% 给根用户)和元数据(i 节点、日志)占用部分空间通过 tune2fs -m 2 /dev/sdb1 减少预留空间比例,或接受正常损耗(元数据不可避免)
磁盘无法识别(fdisk -l 不显示)磁盘硬件故障、未连接好,或虚拟机磁盘未添加1. 检查硬件连接(物理机)或虚拟机磁盘配置;2. 执行 echo "- - -" > /sys/class/scsi_host/host0/scan 重新扫描 SCSI 总线(识别新磁盘)

四、拓展:文件系统的空间分配与回收算法

格式化时创建的“空闲数据块池”和“空闲 i 节点池”,需要通过算法管理空间分配与回收,这是文件系统性能的核心影响因素。

1. 空间分配算法:如何高效分配数据块?

UNIX 文件系统(如 ext4、XFS)主要采用以下两种分配策略:

  • 连续分配(Extents)

    ext4 和 XFS 引入“extent”(连续数据块组)概念,为大文件一次性分配多个连续数据块(如一个 extent 包含 128 个 4KB 块,共 512KB)。优点是减少磁盘寻道时间(连续读取),提升大文件读写性能;缺点是小文件仍需多个 extent 时会产生碎片。

  • 延迟分配(Delayed Allocation)

    ext4 和 XFS 支持延迟分配,即写入数据时先缓存到内存,不立即分配磁盘块;当数据积累到一定量或缓存满时,再一次性分配连续块。优点是减少碎片,提升 I/O 效率;缺点是断电可能导致未分配块的数据丢失(依赖日志恢复)。

2. 空间回收算法:如何管理空闲块?

当文件被删除时,文件系统需回收其占用的 i 节点和数据块,常见算法如下:

  • 空闲块链表:将空闲数据块用链表连接,分配时从链表头取块,回收时将块加入链表。优点是实现简单;缺点是连续分配时需遍历链表,效率低(ext2 采用)。
  • 空闲块位图:用位图(bit)表示数据块状态(1 表示占用,0 表示空闲),分配时查找连续的 0 位,回收时将对应位设为 0。优点是便于查找连续块,效率高(ext4、XFS 采用);缺点是位图需占用一定内存(可接受,因位图压缩存储)。

性能优化建议

  • 大文件场景(如视频存储):选择 XFS 文件系统,开启 extent 和延迟分配,块大小设为 8KB 或 16KB;
  • 小文件场景(如 Web 服务器):选择 ext4 文件系统,关闭延迟分配(减少内存占用),块大小设为 4KB;
  • 定期执行 e2fsck(ext 系列)或 xfs_repair(XFS)检查文件系统一致性,避免碎片和元数据损坏。

聚焦 UNIX 系统磁盘分区与格式化的原理和实操,适用于 Linux、BSD 等类 UNIX 环境。

磁盘操作直接影响数据安全,建议在测试环境(如虚拟机)反复练习后,再在生产环境操作;重要数据务必提前备份,避免不可逆损失。

http://www.dtcms.com/a/427399.html

相关文章:

  • UNIX下C语言编程与实践16-UNIX 磁盘空间划分:引导块、超级块、i 节点区、数据区的功能解析
  • 互联网兼职做网站维护做ui设计用什么素材网站
  • ETL参数化技巧:如何避免写一堆重复任务?
  • git下载分支
  • Linux应用开发·Makefile菜鸟教程
  • ai智能化算法
  • 【专业词典】冰山模型
  • 第三方应用测试:【移动应用后端API自动化测试:Postman与Newman的集成】
  • 企业网站备案 淘宝客前端工程师主要做什么
  • 桌面预测类开发,桌面%雷达,信号预测%系统开发,基于python,tk,scikit-learn机器学习算法实现,桌面预支持向量机分类算法,CSV无数据库
  • 网站备案黑名单重庆新闻头条24小时
  • 使用vscode的ssh功能连接远程服务器卡在Setting up SSH Host IP: Downloading VS Code Server的解决方案
  • vscode连接算力平台
  • VSCode中Java开发环境配置的三个层级(Windows版)1-3
  • 西安建设网站的公司网页装修设计
  • 太空算力革命:卫星如何成为地面交通的“天脑“
  • 大数据 Python小说数据分析平台 小说网数据爬取分析系统 Django框架 requests爬虫 Echarts图表 17k小说网 (源码)✅
  • 第 1 天:零基础入门 C 语言 —— 认识 C 语言的起源、特点与应用场景
  • 网站建设制作公司地址网站建设费用明细
  • image process unit 模块实现防抖的原理
  • 【LeetCode 每日一题】2221. 数组的三角和
  • 爬虫之淘宝接口获取:Python 返回淘宝商品详情数据 API 接口
  • 合肥专业网站优化seo在线培训机构排名
  • 便利的聊城网站建设整站网站优化
  • C# 对Bitmap 的一些处理方法,裁剪,压缩,旋转等
  • Labview多个子VI加密码和去密码
  • LabVIEW声音压力与响度实时监测
  • 网站毕业设计选题本溪网站建设兼职
  • Python利用ffmpeg实现rtmp视频拉流和推流
  • 佛山电商网站建设软件开发流程流程图