1. 认识Linux文件系统
1.1 磁盘组成与分区
- 磁盘物理组成:盘片、机械手臂、磁头、主轴马达
- 物理单位:扇区(最小存储单位,512B或4K)、磁柱(扇区组成的圆)
- 设备命名:
/dev/sd[a-p](SATA/SCSI/USB)、/dev/vd[a-d](虚拟化) - 分区编号:主分区1-4,逻辑分区从5开始
1.2 文件系统特性
- 索引式文件系统:通过inode找到数据block,无需碎片整理
- superblock:记录文件系统整体信息(总量、使用量、剩余量)
- inode:记录文件属性和数据所在的block号码
- block:实际存放数据,一个block只能放一个文件
1.3 Ext2文件系统结构
- 区块群组:格式化时分多个群组,便于管理
- inode/block bitmap:记录使用情况
- dumpe2fs:查看Ext家族superblock信息
1.4 与目录树的关系
- 目录:inode记录权限,block记录文件名和inode对应关系
- 文件读取流程:通过目录block找到inode,再通过inode找到数据block
- 挂载点:文件系统与目录树结合的人口
1.5 日志式文件系统
- 数据不一致:系统中断导致metadata与实际数据不符
- 日志功能:记录预备、实际写入、结束三个阶段,快速恢复
1.6 Linux文件系统的运行
- 异步处理:数据先载入内存,标记为dirty,定期写回磁盘
- sync:手动强制写入磁盘
1.7 挂载点的意义
- 挂载点一定是目录,是进入文件系统的入口
1.8 其他Linux支持的文件系统与VFS
- 支持类型:ext2/ext3/ext4、xfs、vfat、ntfs、iso9660等
- VFS:管理所有文件系统的接口
1.9 XFS文件系统简介
- 特点:高性能,适合大文件,RHEL/CentOS 7+默认
- 三大区块:数据区、日志区、实时运行区
- 动态配置:inode和block动态分配,格式化更快
2. 文件系统的简单操作
2.1 磁盘与目录的容量:df, du
df命令详解:
1 | df # 以KB为单位显示 |
输出字段说明:
- Filesystem:文件系统(设备名)
- Type:文件系统类型(ext4、xfs等)
- Size:总容量
- Used:已使用
- Avail:可用
- Use%:使用百分比
- Mounted on:挂载点
- Inodes:inode总量(用-i时)
- IUsed:已用inode
du命令详解:
1 | du # 列出当前目录所有子目录大小 |
实用场景:
1 | # 找出根目录下最大的10个目录 |
2.2 实体链接与符号链接:ln
实体链接(hard link):
1 | ln 源文件 目标文件 # 创建硬链接 |
特点:
- 多个文件名对应同一个inode
- 删除任一文件名,不影响另一个文件
- 修改任意文件,内容同步改变
- 限制:不能跨文件系统,不能链接目录
- 查看:
ls -li可看到inode相同
符号链接(symbolic link):
1 | ln -s 源文件 目标文件 # 创建符号链接 |
特点:
- 相当于Windows的快捷方式
- 创建一个独立的文件,文件内容指向源文件
- 如果源文件被删除,链接文件会失效(变成死链接)
- 可跨文件系统,可链接目录
- 查看:
ls -l显示->指向
区别对比:
| 特性 | 实体链接 | 符号链接 |
|---|---|---|
| inode | 相同 | 不同 |
| 跨文件系统 | 不能 | 能 |
| 链接目录 | 不能 | 能 |
| 源文件删除 | 仍可访问 | 失效 |
| 文件大小 | 同源文件 | 路径名字符数 |
3. 磁盘的分区、格式化、检验与挂载
3.1 观察磁盘分区状态
lsblk(list block devices):
1 | lsblk # 树状显示所有磁盘和分区 |
输出示例:
1 | NAME FSTYPE LABEL UUID MOUNTPOINT |
blkid:
1 | blkid # 查看所有设备的UUID和文件系统类型 |
parted:
1 | parted /dev/sda print # 查看分区表类型(MBR或GPT) |
3.2 磁盘分区:gdisk/fdisk
MBR分区(fdisk):
1 | fdisk /dev/sdb # 进入交互模式 |
fdisk常用命令:
| 命令 | 作用 |
|---|---|
n |
新建分区 |
d |
删除分区 |
p |
显示分区表 |
w |
保存并退出 |
q |
不保存退出 |
t |
修改分区类型(83=Linux, 82=swap) |
GPT分区(gdisk):
1 | gdisk /dev/sdb # 进入交互模式 |
命令与fdisk类似,支持GPT特性。
分区后通知内核:
1 | partprobe # 重新读取分区表 |
分区类型代码:
- 83:Linux native(普通文件系统)
- 82:Linux swap(交换分区)
- 8e:Linux LVM
- fd:Linux RAID
3.3 磁盘格式化
mkfs命令:
1 | mkfs.xfs /dev/sdb1 # 格式化为XFS |
格式化参数:
1 | mkfs.ext4 -b 4096 /dev/sdb1 # 指定block大小(1K/2K/4K) |
查看文件系统信息:
1 | blkid /dev/sdb1 # 查看UUID和类型 |
3.4 文件系统检验
fsck(file system check):
1 | fsck /dev/sdb1 # 检查并修复(需卸载) |
xfs_repair:
1 | xfs_repair /dev/sdb1 # 修复XFS(需卸载) |
⚠️ 重要原则: 执行fsck或xfs_repair前必须卸载文件系统,否则可能造成数据损坏。
3.5 文件系统挂载与卸载
mount(挂载):
1 | mount /dev/sdb1 /mnt/data # 挂载设备到目录 |
常用挂载选项:
| 选项 | 作用 |
|---|---|
ro |
只读挂载 |
rw |
读写挂载 |
noexec |
禁止执行二进制文件 |
nosuid |
禁止SUID功能 |
auto/noauto |
是否自动挂载 |
user/nouser |
是否允许普通用户挂载 |
查看挂载:
1 | mount # 查看所有挂载 |
umount(卸载):
1 | umount /mnt/data # 按挂载点卸载 |
无法卸载的解决:
1 | lsof /mnt/data # 查看哪些进程在使用 |
3.6 磁盘/文件系统参数修改
mknod:创建设备文件
1 | mknod /dev/sdc b 8 32 # 创建块设备文件(主设备号8,次设备号32) |
e2label:修改ext卷标
1 | e2label /dev/sdb1 mydata # 设置卷标 |
xfs_admin:修改XFS参数
1 | xfs_admin -L mydata /dev/sdb1 # 设置XFS卷标 |
tune2fs:调整ext文件系统参数
1 | tune2fs -L mydata /dev/sdb1 # 修改卷标 |
hdparm:硬盘参数设置
1 | hdparm -I /dev/sda # 查看硬盘详细信息 |
4. 设置开机挂载
4.1 /etc/fstab详解
六字段格式:
1 | [设备/UUID] [挂载点] [文件系统] [选项] [dump] [pass] |
字段详解:
| 字段 | 含义 | 说明 |
|---|---|---|
| 第1字段 | 设备/UUID | 推荐使用UUID避免设备名变动 |
| 第2字段 | 挂载点 | 挂载的目录(swap用swap) |
| 第3字段 | 文件系统 | ext4、xfs、swap等 |
| 第4字段 | 选项 | 挂载参数(defaults等) |
| 第5字段 | dump | 是否备份(0不备份,1备份) |
| 第6字段 | pass | fsck检查顺序(0不检查,1根目录,2其他) |
常用选项(第4字段):
defaults:默认值(rw, suid, dev, exec, auto, nouser, async)noexec:不允许执行二进制文件ro:只读挂载auto/noauto:是否自动挂载user/nouser:是否允许普通用户挂载usrquota:启用用户磁盘配额grpquota:启用组磁盘配额
示例:
1 | UUID=1234-5678-9012-3456 /data ext4 defaults 0 2 |
UUID获取:
1 | blkid |
测试fstab:
1 | mount -a # 重新加载fstab(测试配置是否正确) |
fstab错误导致无法启动的修复:
- 进入紧急模式
mount -o remount,rw /# 重新挂载根为可读写vim /etc/fstab# 修复错误mount -a# 测试reboot
4.2 特殊设备loop挂载
挂载ISO镜像:
1 | mount -o loop /path/to/image.iso /mnt/iso |
创建并使用镜像文件:
1 | dd if=/dev/zero of=/tmp/disk.img bs=1M count=100 # 创建100M空文件 |
查看loop设备:
1 | losetup -a # 查看所有loop设备 |
5. 内存置换空间(swap)
5.1 swap的作用
- 内存扩展:物理内存不足时,将不活跃数据移到swap
- 休眠支持:系统休眠时将内存数据保存到swap
- 内存溢出保护:防止系统崩溃
5.2 查看swap
1 | free -h # 查看内存和swap使用情况 |
5.3 使用实体分区构建swap
1 | # 1. 分区(用fdisk或gdisk,类型设为82) |
5.4 使用文件构建swap
1 | # 1. 创建文件(1GB) |
5.5 永久启用swap
在 /etc/fstab 中添加:
1 | /dev/sdb2 swap swap defaults 0 0 |
5.6 swap大小建议
| 物理内存 | swap大小建议 |
|---|---|
| <2GB | 内存 × 2 |
| 2-8GB | 等于内存大小 |
| >8GB | 4-8GB |
| 启用休眠 | ≥ 内存大小 |
6. 文件系统的特殊查看与操作
6.1 磁盘空间浪费问题
- block越大,空间浪费越多(一个block只能放一个文件)
- 小文件多时建议用较小block(如1K)
- 大文件多时可用较大block(如4K)提高性能
6.2 利用GPT分区表与UEFI BIOS开机
- GPT支持大于2TB磁盘
- UEFI取代传统BIOS,启动更快
- 需要创建EFI系统分区(通常为100MB,类型EF00)
6.3 虚拟文件系统:/proc与/sys
/proc:进程信息、系统状态(内存中的信息)
1 | cat /proc/cpuinfo # CPU信息 |
/sys:内核对象、设备信息
1 | ls /sys/block/ # 块设备信息 |
6.4 特殊文件系统(udev)
- 动态管理设备文件
- 设备插入时自动在
/dev下创建对应文件 - 配置文件:
/etc/udev/rules.d/
7. 重点命令速查
| 分类 | 命令 | 用途 | 常用示例 |
|---|---|---|---|
| 查看 | lsblk |
查看磁盘结构 | lsblk -f |
df |
查看分区使用 | df -hT |
|
du |
查看目录大小 | du -sh /home |
|
blkid |
查看UUID | blkid /dev/sda1 |
|
free |
查看内存/swap | free -h |
|
| 分区 | fdisk |
MBR分区 | fdisk /dev/sdb |
gdisk |
GPT分区 | gdisk /dev/sdb |
|
parted |
查看分区表 | parted /dev/sda print |
|
| 格式化 | mkfs.ext4 |
格式化为ext4 | mkfs.ext4 /dev/sdb1 |
mkfs.xfs |
格式化为XFS | mkfs.xfs /dev/sdb1 |
|
mkswap |
创建交换分区 | mkswap /dev/sdb2 |
|
| 挂载 | mount |
挂载 | mount /dev/sdb1 /mnt |
umount |
卸载 | umount /mnt |
|
mount -a |
加载fstab | mount -a |
|
| 检查 | fsck |
检查ext | fsck /dev/sdb1 |
xfs_repair |
检查XFS | xfs_repair /dev/sdb1 |
|
| swap | swapon |
启用swap | swapon /dev/sdb2 |
swapoff |
关闭swap | swapoff /dev/sdb2 |
|
| 链接 | ln |
创建链接 | ln -s source target |
| 其他 | partprobe |
更新分区表 | partprobe |
dd |
备份/创建文件 | dd if=/dev/zero of=/swapfile bs=1M count=1024 |
|
e2label |
修改ext卷标 | e2label /dev/sdb1 mydata |
|
xfs_admin |
修改XFS参数 | xfs_admin -L mydata /dev/sdb1 |
8. 核心要点总结
磁盘管理三步曲:
- 分区:fdisk(MBR)或gdisk(GPT)
- 格式化:mkfs.ext4或mkfs.xfs
- 挂载:mount + /etc/fstab永久生效
重要原则:
- 用UUID代替设备名写入fstab,避免设备名变动
- 修改fstab后执行
mount -a测试配置是否正确 - fsck或xfs_repair前必须卸载文件系统
- 重要数据定期备份
日常维护命令:
1 | df -hT # 查看磁盘使用情况 |
常见问题解决:
- 磁盘空间不足:
du找出大文件清理,或扩展LVM - 无法卸载:
lsof或fuser找出占用进程 - fstab错误:进入紧急模式修复
- swap不足:增加swap分区或文件