鸟哥的私房菜:基础文件系统管理学习笔记

一、认识 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
列表,并同步superblock
中inode
/block
使用计数。 - 删除文件:将
inode
和block
标记为空闲状态,更新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.1 建立分割
- 判断磁盘信息:
- 在建立分割之前,需要先判断:(1)目前系统内的磁盘文件名与(2)磁盘目前的分割格式。
- 使用
lsblk
命令列出系统所有块设备及其分区结构,parted /dev/sda print
可查看/dev/sda
的分区表类型(GPT
或MBR
)及详细分区信息。
- 使用
fdisk
分割:在Linux
中,fdisk
支持GPT
和MSDOS
分区表。常用操作: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 | # <文件系统> <挂载点> <文件系统类型> <挂载选项> <dump> <fsck> |
- 建议使用 UUID 标识设备,避免设备名变动导致挂载失败
defaults
表示使用默认挂载选项,可替换为ro
(只读)、noauto
(不自动挂载)等- 在 RockyLinux 9.x 的 XFS 文件系统中,
dump
和fsck
通常设为 0
三、开机过程文件系统问题处理
3.1 文件系统的卸载与移除
卸载并回收文件系统步骤:
- 使用
lsof
确认文件系统无进程占用 - 从
/etc/fstab
移除自动挂载配置 - 清空 superblock:
dd if=/dev/zero of=/dev/sda4 bs=1M count=10
- 使用
gdisk /dev/sda
删除分区
3.2 启动过程文件系统错误的救援
修改 /etc/fstab
后未测试可能导致开机失败。若根目录配置错误,系统无法正常启动;普通目录错误可进入单用户维护模式。救援步骤:
- 重启系统,在 GRUB 菜单中编辑内核启动参数,添加
rd.break
进入救援模式 - 挂载根文件系统:
mount -o remount,rw /sysroot
- 使用
journalctl -xb
查看启动日志,定位错误原因 - 修复
/etc/fstab
文件后,重新挂载根文件系统并退出救援模式:
1 | mount -o remount,ro /sysroot |
All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.