基础文件系统管理学习笔记

一、认识 Linux 文件系统

1.1 磁盘文件名与磁盘分区

  • 物理特性:磁区(Sector)是最小物理存储单元,现代磁盘常见 512 字节与 4K 两种格式。多个磁区在物理上连续排列形成磁柱(Cylinder),磁盘读写以磁柱为单位进行寻址。例如,传统机械硬盘通过磁头沿磁柱移动实现数据读写,固态硬盘则通过闪存芯片的区块管理模拟类似机制。
  • 分区表格式
    • MSDOS(MBR):磁盘首个磁区包含 446 字节的主要开机区(MBR Boot Code)和 64 字节的分区表。由于仅能记录 4 笔主分区信息,若需更多分区需通过扩展分区实现逻辑分区。其容量上限受限于 32 位地址空间,无法管理超过 2TB 的磁盘。
    • GPT:使用 34 个 LBA 区块记录分区信息,磁盘末尾 33 个 LBA 作为备份。支持创建 128 个以上分区,突破 2TB 容量限制,且每个分区记录可独立格式化。GPT 还引入 CRC 校验机制,提高分区表的可靠性。
  • 磁盘文件名:实体磁盘文件名遵循 /dev/sd[a-p] 规则(如 /dev/sda 表示第一块 SCSI/SATA 磁盘),虚拟磁盘(如 KVM 或 VMware 环境)使用 /dev/vd[a-p] 命名。软件磁盘阵列(如 mdadm)或 Intel 主板内置阵列磁盘,文件名会增加阵列编号,如 /dev/md126 代表第 126 号软件阵列设备。

1.2 Linux 的 EXT2 文件系统

  • 文件系统组成
    • superblock:存储文件系统全局元数据,包括 inode 总数、已用 / 可用数量、block 总量、文件系统类型、挂载选项等。系统启动时会加载 superblock 信息,若其损坏将导致文件系统无法挂载。
    • inode:每一个inode大小固定、每个文件对应唯一 inode,记录文件存取模式(rwx)、所有者与群组、文件容量、修改时间、数据块位置、文件真正内容指向(指针)等属性。inode 不存储文件名,文件名通过目录项与 inode 关联。
    • block:实际存储文件内容,block大小和数量在格式化后不能更改,常见大小为 1KB、2KB 或 4KB。一个block最多放置一个文件的内容。大文件会占用多个连续或离散的 block,通过 inode 中的指针记录其分布。
  • 文件操作流程
    • 读取文件:系统先通过目录项找到对应 inode 编号,检查权限后读取 inode 中记录的 block 位置,将数据加载到内存缓冲区。
    • 新建文件:从空闲 inode 列表中分配一个 inode,写入文件属性;在空闲 block 中写入数据,更新 inode 指向的 block 列表,并同步 superblockinode/block 使用计数。
    • 删除文件:将 inodeblock 标记为空闲状态,更新 superblock 统计信息。若存在硬链接,仅删除文件名与 inode 的关联,实际数据保留直到所有链接被删除。

1.3 目录与文件名

目录本质是一种特殊文件,创建时分配一个 inode 和至少一个 block

inode 记录目录权限、所有者等属性,block 存储目录项(文件名与 inode 编号的映射关系)。用户通过文件名访问文件时,系统先解析目录项找到对应 inode,再通过 inode 读取数据。例如,/etc/passwd 文件路径解析过程中,系统依次查找根目录 /etc 目录、最终定位到 passwd 文件的 inode

目录的重要性就是记载文件名和对应的inode

1.4 ln 链接文件的应用

  • 目录链接数:每个目录默认有两个硬链接(...),创建子目录时,父目录的链接数自动加 1。例如,在 /home/user 目录下创建 test 子目录后,/home/user 的链接数从 2 变为 3。
  • ln 指令(也许看做快捷方式)
    • 硬链接:使用 ln 源文件 目标文件 创建,两个文件共享同一 inode,修改任一文件内容会同步更新。硬链接无法跨文件系统创建,常用于备份重要文件或节省磁盘空间。
    • 符号链接:使用 ln -s 源文件 目标文件 创建,类似 Windows 快捷方式。符号链接包含源文件路径字符串,删除源文件后链接失效,可跨文件系统创建。

1.5 文件系统的挂载

文件系统需挂载到目录树的空目录(挂载点)才能访问。使用 df -hT 命令可查看当前系统挂载情况,输出包含文件系统类型、大小、使用量、挂载点等信息。例如:

1
2
文件系统        类型      容量  已用  可用  已用%  挂载点
/dev/sda2 xfs 50G 20G 30G 40% /

挂载时需注意:挂载点必须为空目录;同一文件系统不可重复挂载;单个目录不能同时挂载多个文件系统。

二、文件系统管理

2.1 建立分割

  • 判断磁盘信息
    • 在建立分割之前,需要先判断:(1)目前系统内的磁盘文件名与(2)磁盘目前的分割格式。
    • 使用 lsblk 命令列出系统所有块设备及其分区结构,parted /dev/sda print 可查看 /dev/sda 的分区表类型(GPTMBR)及详细分区信息。
  • 使用 fdisk 分割:在Linux中,fdisk 支持 GPTMSDOS 分区表。常用操作:
    • n:新建分区
    • p:打印分区表
    • w:保存并退出
    • q:放弃修改并退出

2.2 创建文件系统(磁盘格式化)

使用 mkfs 命令创建文件系统:

  • mkfs.xfs /dev/sda1:格式化为 XFS 文件系统
  • mkfs.vfat /dev/sdb1:格式化为 FAT32 文件系统
  • mkswap /dev/sdc1:创建 swap 空间
  • 使用block查询每个设备文件系统与UUID信息

挂载时建议使用 UUID,避免因磁盘设备名变动(如添加新磁盘导致设备名重排)影响挂载。例如,在 /etc/fstab 中配置 UUID 挂载:

1
UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx /data xfs defaults 0 0

2.3 文件系统的挂载 / 卸载

  • 挂载方式mount 命令支持多种挂载方式:
    • 按设备名挂载:mount /dev/sda1 /mnt/data
    • 按 UUID 挂载:mount UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx /mnt/data
    • 按 LABEL 挂载:mount LABEL=DATA /mnt/data
  • 卸载操作:使用 umount /mnt/data 卸载文件系统,swapoff /dev/sda2 关闭 swap 分区。若无法卸载,可通过 lsof | grep /mnt/data 查找占用该目录的进程,终止进程后重试。

2.4 开机自动挂载

系统启动时自动挂载配置存储在 /etc/fstab 文件,格式如下:

1
2
# <文件系统>        <挂载点>      <文件系统类型>  <挂载选项>  <dump>  <fsck>
UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx /data xfs defaults 0 0
  • 建议使用 UUID 标识设备,避免设备名变动导致挂载失败
  • defaults 表示使用默认挂载选项,可替换为 ro(只读)、noauto(不自动挂载)等
  • 在 RockyLinux 9.x 的 XFS 文件系统中,dumpfsck 通常设为 0

三、开机过程文件系统问题处理

3.1 文件系统的卸载与移除

卸载并回收文件系统步骤

  1. 使用 lsof 确认文件系统无进程占用
  2. /etc/fstab 移除自动挂载配置
  3. 清空 superblock:dd if=/dev/zero of=/dev/sda4 bs=1M count=10
  4. 使用 gdisk /dev/sda 删除分区

3.2 启动过程文件系统错误的救援

修改 /etc/fstab 后未测试可能导致开机失败。若根目录配置错误,系统无法正常启动;普通目录错误可进入单用户维护模式。救援步骤:

  1. 重启系统,在 GRUB 菜单中编辑内核启动参数,添加 rd.break 进入救援模式
  2. 挂载根文件系统:mount -o remount,rw /sysroot
  3. 使用 journalctl -xb 查看启动日志,定位错误原因
  4. 修复 /etc/fstab 文件后,重新挂载根文件系统并退出救援模式:
1
2
mount -o remount,ro /sysroot
exit