Linux学习日志(4) Linux磁盘与文件系统管理

参考资料:鳥哥私房菜 - 第七章、Linux 磁碟與檔案系統管理

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
2
3
4
5
6
7
df                     # 以KB为单位显示
df -h # 人类可读格式(GB、MB)
df -T # 显示文件系统类型
df -hT # 最常用:人类可读+显示类型
df -i # 显示inode使用情况
df -a # 显示所有文件系统(包括/proc)
df /home # 指定目录所在分区

输出字段说明:

  • Filesystem:文件系统(设备名)
  • Type:文件系统类型(ext4、xfs等)
  • Size:总容量
  • Used:已使用
  • Avail:可用
  • Use%:使用百分比
  • Mounted on:挂载点
  • Inodes:inode总量(用-i时)
  • IUsed:已用inode

du命令详解:

1
2
3
4
5
6
7
8
du                     # 列出当前目录所有子目录大小
du -h # 人类可读格式
du -sh /目录 # 只显示目录总大小
du -sh * # 显示当前目录下所有文件和目录大小
du -sm /* # 显示根目录下每个目录大小(MB)
du -h --max-depth=1 # 显示一层子目录大小
du -h --time # 同时显示修改时间
du -sh .[!.]* # 显示隐藏文件大小

实用场景:

1
2
3
4
5
# 找出根目录下最大的10个目录
du -sm /* 2>/dev/null | sort -nr | head -10

# 找出当前目录下大于100M的文件
find . -type f -size +100M -exec du -sh {} \;

2.2 实体链接与符号链接:ln

实体链接(hard link):

1
ln 源文件 目标文件      # 创建硬链接

特点:

  • 多个文件名对应同一个inode
  • 删除任一文件名,不影响另一个文件
  • 修改任意文件,内容同步改变
  • 限制:不能跨文件系统,不能链接目录
  • 查看:ls -li 可看到inode相同

符号链接(symbolic link):

1
2
ln -s 源文件 目标文件   # 创建符号链接
ln -sf 源文件 目标文件 # 若目标存在则强制覆盖

特点:

  • 相当于Windows的快捷方式
  • 创建一个独立的文件,文件内容指向源文件
  • 如果源文件被删除,链接文件会失效(变成死链接)
  • 可跨文件系统,可链接目录
  • 查看:ls -l 显示 -> 指向

区别对比:

特性 实体链接 符号链接
inode 相同 不同
跨文件系统 不能
链接目录 不能
源文件删除 仍可访问 失效
文件大小 同源文件 路径名字符数

3. 磁盘的分区、格式化、检验与挂载

3.1 观察磁盘分区状态

lsblk(list block devices):

1
2
3
4
lsblk                    # 树状显示所有磁盘和分区
lsblk -f # 显示文件系统类型和UUID(最常用)
lsblk -m # 显示设备权限
lsblk -d # 仅显示磁盘本身,不显示分区

输出示例:

1
2
3
4
5
6
NAME   FSTYPE LABEL UUID                                 MOUNTPOINT
sda
├─sda1 ext4 12345678-1234-1234-1234-123456789abc /boot
├─sda2 ext4 abcdef12-3456-7890-abcd-ef1234567890 /
├─sda3 ext4 98765432-1000-2000-3000-123456789000 /home
└─sda4 swap 56781234-4321-8765-2109-abcdef123456 [SWAP]

blkid:

1
2
blkid                    # 查看所有设备的UUID和文件系统类型
blkid /dev/sda1 # 查看指定设备

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
2
3
4
mkfs.xfs /dev/sdb1               # 格式化为XFS
mkfs.ext4 /dev/sdb1 # 格式化为ext4
mkfs -t ext4 /dev/sdb1 # 指定类型
mkfs -t xfs -f /dev/sdb1 # 强制格式化(覆盖原有数据)

格式化参数:

1
2
3
mkfs.ext4 -b 4096 /dev/sdb1      # 指定block大小(1K/2K/4K)
mkfs.ext4 -L mydata /dev/sdb1 # 设置卷标
mkfs.xfs -f -L mydata /dev/sdb1 # XFS设置卷标

查看文件系统信息:

1
2
3
blkid /dev/sdb1                  # 查看UUID和类型
xfs_info /dev/sdb1 # 查看XFS信息
dumpe2fs /dev/sdb1 # 查看ext信息

3.4 文件系统检验

fsck(file system check):

1
2
3
4
fsck /dev/sdb1                   # 检查并修复(需卸载)
fsck -f /dev/sdb1 # 强制检查
fsck.ext4 /dev/sdb1 # 指定类型
fsck -y /dev/sdb1 # 自动回答yes

xfs_repair:

1
2
xfs_repair /dev/sdb1             # 修复XFS(需卸载)
xfs_repair -n /dev/sdb1 # 只检查不修复

⚠️ 重要原则: 执行fsck或xfs_repair前必须卸载文件系统,否则可能造成数据损坏。

3.5 文件系统挂载与卸载

mount(挂载):

1
2
3
4
mount /dev/sdb1 /mnt/data        # 挂载设备到目录
mount /dev/sdb1 /mnt/data -o ro # 只读挂载
mount -o loop /path/image.iso /mnt/iso # 挂载ISO镜像
mount -o remount,rw /mnt/data # 重新挂载(修改选项)

常用挂载选项:

选项 作用
ro 只读挂载
rw 读写挂载
noexec 禁止执行二进制文件
nosuid 禁止SUID功能
auto/noauto 是否自动挂载
user/nouser 是否允许普通用户挂载

查看挂载:

1
2
3
mount                    # 查看所有挂载
df -hT # 查看已挂载分区使用情况
findmnt # 树状显示挂载

umount(卸载):

1
2
umount /mnt/data         # 按挂载点卸载
umount /dev/sdb1 # 按设备卸载

无法卸载的解决:

1
2
lsof /mnt/data           # 查看哪些进程在使用
fuser -km /mnt/data # 强制终止使用进程

3.6 磁盘/文件系统参数修改

mknod:创建设备文件

1
mknod /dev/sdc b 8 32    # 创建块设备文件(主设备号8,次设备号32)

e2label:修改ext卷标

1
2
e2label /dev/sdb1 mydata   # 设置卷标
e2label /dev/sdb1 # 查看卷标

xfs_admin:修改XFS参数

1
2
xfs_admin -L mydata /dev/sdb1   # 设置XFS卷标
xfs_admin -u /dev/sdb1 # 查看UUID

tune2fs:调整ext文件系统参数

1
2
tune2fs -L mydata /dev/sdb1     # 修改卷标
tune2fs -l /dev/sdb1 # 查看文件系统信息

hdparm:硬盘参数设置

1
2
hdparm -I /dev/sda       # 查看硬盘详细信息
hdparm -t /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
2
3
4
UUID=1234-5678-9012-3456 /data ext4 defaults 0 2
/dev/sdb1 /backup xfs defaults 0 0
/dev/sdb2 swap swap defaults 0 0
tmpfs /tmp tmpfs defaults 0 0

UUID获取:

1
2
blkid
lsblk -f

测试fstab:

1
mount -a                 # 重新加载fstab(测试配置是否正确)

fstab错误导致无法启动的修复:

  1. 进入紧急模式
  2. mount -o remount,rw / # 重新挂载根为可读写
  3. vim /etc/fstab # 修复错误
  4. mount -a # 测试
  5. reboot

4.2 特殊设备loop挂载

挂载ISO镜像:

1
mount -o loop /path/to/image.iso /mnt/iso

创建并使用镜像文件:

1
2
3
dd if=/dev/zero of=/tmp/disk.img bs=1M count=100   # 创建100M空文件
mkfs.ext4 /tmp/disk.img # 格式化为ext4
mount -o loop /tmp/disk.img /mnt/disk # 挂载使用

查看loop设备:

1
losetup -a                    # 查看所有loop设备

5. 内存置换空间(swap)

5.1 swap的作用

  • 内存扩展:物理内存不足时,将不活跃数据移到swap
  • 休眠支持:系统休眠时将内存数据保存到swap
  • 内存溢出保护:防止系统崩溃

5.2 查看swap

1
2
3
free -h                    # 查看内存和swap使用情况
swapon -s # 查看swap分区信息
cat /proc/swaps # 查看swap设备列表

5.3 使用实体分区构建swap

1
2
3
4
5
6
7
8
9
10
11
12
# 1. 分区(用fdisk或gdisk,类型设为82)
# 2. 格式化
mkswap /dev/sdb2

# 3. 启用
swapon /dev/sdb2

# 4. 查看
swapon -s

# 5. 关闭
swapoff /dev/sdb2

5.4 使用文件构建swap

1
2
3
4
5
6
7
8
9
10
11
# 1. 创建文件(1GB)
dd if=/dev/zero of=/swapfile bs=1M count=1024

# 2. 设置权限(安全考虑)
chmod 600 /swapfile

# 3. 格式化为swap
mkswap /swapfile

# 4. 启用
swapon /swapfile

5.5 永久启用swap

/etc/fstab 中添加:

1
2
/dev/sdb2 swap swap defaults 0 0
/swapfile 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
2
3
4
5
cat /proc/cpuinfo        # CPU信息
cat /proc/meminfo # 内存信息
cat /proc/version # 内核版本
cat /proc/filesystems # 支持的文件系统
ls /proc/PID # 指定进程的信息

/sys:内核对象、设备信息

1
2
3
ls /sys/block/           # 块设备信息
ls /sys/bus/ # 总线信息
ls /sys/class/ # 设备类别

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. 核心要点总结

磁盘管理三步曲:

  1. 分区:fdisk(MBR)或gdisk(GPT)
  2. 格式化:mkfs.ext4或mkfs.xfs
  3. 挂载:mount + /etc/fstab永久生效

重要原则:

  • 用UUID代替设备名写入fstab,避免设备名变动
  • 修改fstab后执行 mount -a 测试配置是否正确
  • fsck或xfs_repair前必须卸载文件系统
  • 重要数据定期备份

日常维护命令:

1
2
3
4
df -hT        # 查看磁盘使用情况
lsblk -f # 查看磁盘结构
du -sh /home # 查看目录大小
free -h # 查看内存和swap使用

常见问题解决:

  • 磁盘空间不足:du找出大文件清理,或扩展LVM
  • 无法卸载:lsoffuser找出占用进程
  • fstab错误:进入紧急模式修复
  • swap不足:增加swap分区或文件