Linux 文件系统管理完整指南

目录

一、文件系统基础概念

1.1 文件系统层次结构

物理磁盘 → 分区 → 文件系统 → 挂载点 → 目录结构

1.2 核心概念说明

  • 块设备:硬盘、分区等块存储设备
  • 文件系统:数据在磁盘上的组织方式(ext4、xfs、btrfs等)
  • 挂载点:文件系统接入目录树的接入点
  • LVM:逻辑卷管理,提供灵活的磁盘管理

二、磁盘和设备管理命令

2.1 lsblk 命令 - 列出块设备信息

功能说明

以树状结构显示所有块设备(磁盘、分区、LVM等)

基本语法

lsblk [选项] [设备]

常用选项

选项 说明 示例
-a 显示所有设备(包括空设备) lsblk -a
-f 显示文件系统信息 lsblk -f
-m 显示权限信息 lsblk -m
-o 指定输出列 lsblk -o NAME,SIZE,TYPE,MOUNTPOINT
-p 显示完整设备路径 lsblk -p

实战示例

# 基本使用(树状显示)
lsblk

# 显示文件系统信息
lsblk -f

# 详细输出(常用组合)
lsblk -f -m -p

# 自定义输出列
lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINT,LABEL,UUID

# 查看特定设备
lsblk /dev/sda
lsblk -f /dev/sdb1

输出解读示例

$ lsblk -f
NAME        FSTYPE FSVER LABEL UUID                                 MOUNTPOINT
sda                                                                 
├─sda1      ext4   1.0         a1b2c3d4-e5f6-7890-abcd-ef1234567890 /boot
├─sda2      swap   1           12345678-90ab-cdef-1234-567890abcdef [SWAP]
└─sda3      LVM2_m LVM2        xyz789abc-def0-1234-5678-90abcdef1234
  ├─vg0-root ext4   1.0        567890ab-cdef-1234-5678-90abcdef1234 /
  └─vg0-home ext4   1.0        abcdef12-3456-7890-abcd-ef1234567890 /home

2.2 df 命令 - 磁盘空间使用情况

功能说明

显示文件系统的磁盘空间使用情况

基本语法

df [选项] [文件或目录]

常用选项

选项 说明 示例
-h 人类可读格式(KB、MB、GB) df -h
-T 显示文件系统类型 df -T
-i 显示inode使用情况 df -i
-t 只显示指定类型的文件系统 df -t ext4
-x 排除指定类型的文件系统 df -x tmpfs
--total 显示总计信息 df -h --total

实战示例

# 基本使用(字节显示)
df

# 人类可读格式(最常用)
df -h

# 显示文件系统类型
df -T
df -hT

# 显示inode使用情况
df -hi

# 只显示ext4文件系统
df -ht ext4

# 排除临时文件系统
df -h -x tmpfs -x devtmpfs

# 查看特定目录所在文件系统
df -h /home
df -h /var/log

# 显示总计信息
df -h --total

输出解读示例

$ df -hT
文件系统       类型      容量  已用  可用 已用% 挂载点
/dev/sda3      ext4       50G   20G   28G   42% /
/dev/sda1      ext4      976M  120M  789M   13% /boot
tmpfs          tmpfs     3.9G     0  3.9G    0% /dev/shm
/dev/mapper/vg0-home ext4  200G   50G  141G   26% /home

2.3 du 命令 - 文件和目录空间使用

功能说明

估算文件和目录的磁盘使用空间

基本语法

du [选项] [文件或目录]

常用选项

选项 说明 示例
-h 人类可读格式 du -h file
-s 只显示总计(不显示子目录) du -sh directory
-c 显示总计并显示所有项目 du -ch *.log
--max-depth=N 限制显示深度 du -h --max-depth=1 /var
-a 显示所有文件(包括普通文件) du -ah directory
--exclude 排除特定模式 du -sh --exclude="*.tmp" /tmp

实战示例

# 查看当前目录使用情况
du -sh

# 查看家目录总大小
du -sh ~/

# 查看/var下各目录大小(只显示一级)
du -h --max-depth=1 /var

# 查看日志目录详细大小
du -ah /var/log/ | sort -hr | head -20

# 排除特定文件类型
du -sh --exclude="*.iso" /data/

# 显示多个目录并计算总计
du -ch /home /var /tmp

# 查找大文件
find /var -type f -size +100M -exec du -h {} + | sort -hr

# 监控目录大小变化
watch -n 5 'du -sh /tmp/'

实用组合技巧

# 找出占用空间最大的10个目录
du -h --max-depth=1 / 2>/dev/null | sort -hr | head -10

# 分析磁盘使用情况
du -h --max-depth=1 /home/* 2>/dev/null | sort -hr

# 查找大日志文件并显示详细信息
find /var/log -name "*.log" -size +100M -exec ls -lh {} \; -exec du -h {} \;

三、文件系统挂载管理

3.1 mount 命令 - 挂载文件系统

功能说明

挂载文件系统到目录树

基本语法

mount [选项] [设备] [挂载点]
mount -t 类型 设备 挂载点

常用选项

选项 说明 示例
-t 指定文件系统类型 mount -t ext4 /dev/sdb1 /mnt
-o 指定挂载选项 mount -o rw,noatime /dev/sdb1 /data
-a 挂载/etc/fstab中的所有文件系统 mount -a
-l 显示已挂载的文件系统 mount -l

挂载选项说明

选项 说明
rw/ro 读写/只读模式
noatime 不更新访问时间(提升性能)
defaults 默认选项(rw,suid,dev,exec,auto,nouser,async)
user 允许普通用户挂载
loop 挂载镜像文件

实战示例

# 查看当前已挂载的文件系统
mount
cat /proc/mounts

# 挂载U盘或移动硬盘
mkdir /mnt/usb
mount /dev/sdb1 /mnt/usb

# 挂载光盘
mkdir /mnt/cdrom
mount /dev/cdrom /mnt/cdrom
mount -t iso9660 /dev/sr0 /mnt/cdrom

# 挂载ISO镜像文件
mount -o loop ubuntu-20.04.iso /mnt/iso

# 使用特定选项挂载
mount -t ext4 -o noatime,data=ordered /dev/sdc1 /data

# 重新挂载为只读(系统维护时)
mount -o remount,ro /

# 挂载NFS网络文件系统
mount -t nfs 192.168.1.100:/shared /mnt/nfs

# 挂载Windows共享
mount -t cifs //server/share /mnt/windows -o username=user,password=pass

3.2 /etc/fstab 文件 - 自动挂载配置

文件格式说明

设备/UUID/LABEL   挂载点   文件系统类型   挂载选项   备份标记   检查顺序

配置示例

# /etc/fstab 示例
UUID=a1b2c3d4... /       ext4    defaults        1 1
UUID=e5f67890... /boot   ext4    defaults        1 2
UUID=12345678... none    swap    sw              0 0
/dev/cdrom      /mnt/cdrom iso9660 ro,user,noauto 0 0
//server/backup /mnt/backup cifs credentials=/root/smbpass 0 0

管理操作

# 重新挂载所有fstab中的文件系统
mount -a

# 测试fstab配置是否正确
mount -fav

# 使用LABEL代替设备名(推荐)
blkid                                    # 查看UUID和LABEL
mount LABEL=ROOT /mnt/test

# 使用UUID(最稳定,设备名可能变化)
mount UUID="a1b2c3d4..." /mnt/test

四、LVM(逻辑卷管理)

4.1 LVM 基本概念

LVM 层次结构

物理磁盘 → 物理卷(PV) → 卷组(VG) → 逻辑卷(LV) → 文件系统

LVM 优势

  • 弹性扩展:在线调整大小
  • 快照功能:创建时间点副本
  • 条带化:提高性能
  • 镜像:数据冗余

4.2 LVM 基本命令

物理卷(PV)管理

# 创建物理卷
pvcreate /dev/sdb /dev/sdc

# 查看物理卷信息
pvs
pvdisplay
pvscan

# 移除物理卷
pvremove /dev/sdb

# 移动数据到其他PV
pvmove /dev/sdb

卷组(VG)管理

# 创建卷组
vgcreate vg0 /dev/sdb /dev/sdc

# 查看卷组信息
vgs
vgdisplay

# 扩展卷组(添加新磁盘)
vgextend vg0 /dev/sdd

# 缩减卷组(移除磁盘前先移动数据)
pvmove /dev/sdb
vgreduce vg0 /dev/sdb

# 删除卷组
vgremove vg0

逻辑卷(LV)管理

# 创建逻辑卷
lvcreate -L 20G -n lv_data vg0                    # 指定大小
lvcreate -l 100%FREE -n lv_home vg0              # 使用全部空间

# 查看逻辑卷信息
lvs
lvdisplay

# 扩展逻辑卷(先扩展LV,再扩展文件系统)
lvextend -L +10G /dev/vg0/lv_data                # 增加10G
lvextend -l +100%FREE /dev/vg0/lv_data           # 使用全部空闲空间

# 缩减逻辑卷(危险!需要先卸载并检查文件系统)
umount /data
e2fsck -f /dev/vg0/lv_data
resize2fs /dev/vg0/lv_data 15G                    # 先调整文件系统
lvreduce -L 15G /dev/vg0/lv_data                  # 再调整LV
mount /data

# 创建快照
lvcreate -L 5G -s -n lv_data_snap /dev/vg0/lv_data

# 删除逻辑卷
lvremove /dev/vg0/lv_data

文件系统调整

# ext4文件系统调整大小
resize2fs /dev/vg0/lv_data                        # 扩展到LV最大
resize2fs /dev/vg0/lv_data 30G                    # 调整到指定大小

# XFS文件系统调整大小(只能扩展)
xfs_growfs /data

# 检查文件系统
e2fsck -f /dev/vg0/lv_data
xfs_repair /dev/vg0/lv_data

五、综合实战示例

5.1 完整LVM创建流程

# 1. 准备新磁盘
lsblk                                    # 确认新磁盘,比如/dev/sdb

# 2. 创建物理卷
pvcreate /dev/sdb
pvs

# 3. 创建卷组
vgcreate vg_data /dev/sdb
vgs

# 4. 创建逻辑卷
lvcreate -L 50G -n lv_files vg_data
lvs

# 5. 创建文件系统
mkfs.ext4 /dev/vg_data/lv_files

# 6. 创建挂载点并挂载
mkdir /data
mount /dev/vg_data/lv_files /data

# 7. 配置开机自动挂载
echo "/dev/vg_data/lv_files /data ext4 defaults 0 0" >> /etc/fstab

# 8. 验证
df -hT /data
mount | grep data

5.2 磁盘空间监控脚本

#!/bin/bash
# disk_monitor.sh

# 阈值设置
WARNING=80
CRITICAL=90

# 检查磁盘使用率
df -h | grep -E '^/dev/' | while read output; do
    usage=$(echo $output | awk '{print $5}' | cut -d'%' -f1)
    partition=$(echo $output | awk '{print $1}')
    mountpoint=$(echo $output | awk '{print $6}')

    if [ $usage -ge $CRITICAL ]; then
        echo "严重: $partition ($mountpoint) 使用率 ${usage}%"
        # 发送报警邮件
        echo "磁盘空间严重不足: $partition ${usage}%" | mail -s "磁盘报警" admin@company.com
    elif [ $usage -ge $WARNING ]; then
        echo "警告: $partition ($mountpoint) 使用率 ${usage}%"
    fi
done

# 检查inode使用率
df -i | grep -E '^/dev/' | while read output; do
    iusage=$(echo $output | awk '{print $5}' | cut -d'%' -f1)
    partition=$(echo $output | awk '{print $1}')

    if [ $iusage -ge $CRITICAL ]; then
        echo "严重: $partition inode使用率 ${iusage}%"
    fi
done

六、综合课堂练习

练习1:磁盘空间分析(20分钟)

任务:分析系统磁盘使用情况

# 1. 查看所有文件系统使用情况(人类可读)
# 2. 找出占用空间最大的5个目录
# 3. 检查inode使用情况
# 4. 生成磁盘使用报告

参考答案

# 1. 查看文件系统使用情况
df -hT

# 2. 找出占用空间最大的目录
du -h --max-depth=1 / 2>/dev/null | sort -hr | head -5
du -h --max-depth=1 /home 2>/dev/null | sort -hr | head -5
du -h --max-depth=1 /var 2>/dev/null | sort -hr | head -5

# 3. 检查inode使用情况
df -i
df -hi

# 4. 生成报告
echo "=== 磁盘使用报告 ===" > /tmp/disk_report.txt
echo "生成时间: $(date)" >> /tmp/disk_report.txt
echo "" >> /tmp/disk_report.txt
echo "=== 文件系统使用情况 ===" >> /tmp/disk_report.txt
df -hT >> /tmp/disk_report.txt
echo "" >> /tmp/disk_report.txt
echo "=== 大目录分析 ===" >> /tmp/disk_report.txt
du -h --max-depth=1 / 2>/dev/null | sort -hr | head -10 >> /tmp/disk_report.txt

练习2:LVM管理实战(30分钟)

任务:创建和管理LVM卷

# 1. 使用虚拟磁盘创建LVM
# 2. 扩展逻辑卷大小
# 3. 创建快照并测试
# 4. 清理环境

参考答案

# 1. 创建测试用的虚拟磁盘
dd if=/dev/zero of=/tmp/disk1.img bs=1M count=100
dd if=/dev/zero of=/tmp/disk2.img bs=1M count=100
losetup /dev/loop0 /tmp/disk1.img
losetup /dev/loop1 /tmp/disk2.img

# 2. 创建LVM
pvcreate /dev/loop0 /dev/loop1
vgcreate vg_test /dev/loop0 /dev/loop1
lvcreate -L 50M -n lv_test vg_test
mkfs.ext4 /dev/vg_test/lv_test
mkdir /mnt/test
mount /dev/vg_test/lv_test /mnt/test

# 3. 扩展逻辑卷
lvextend -L +50M /dev/vg_test/lv_test
resize2fs /dev/vg_test/lv_test
df -h /mnt/test

# 4. 创建快照
lvcreate -L 20M -s -n lv_test_snap /dev/vg_test/lv_test
mkdir /mnt/snap
mount /dev/vg_test/lv_test_snap /mnt/snap

# 5. 清理
umount /mnt/test /mnt/snap
lvremove /dev/vg_test/lv_test_snap
lvremove /dev/vg_test/lv_test
vgremove vg_test
pvremove /dev/loop0 /dev/loop1
losetup -d /dev/loop0 /dev/loop1
rm /tmp/disk1.img /tmp/disk2.img

练习3:自动挂载配置(15分钟)

任务:配置USB设备自动挂载

# 1. 查看USB设备信息
# 2. 创建稳定的挂载配置
# 3. 测试自动挂载
# 4. 配置自动清理临时文件

参考答案

# 1. 插入USB设备并查看信息
lsblk -f
blkid /dev/sdb1

# 2. 使用UUID创建稳定的fstab条目
echo "UUID=$(blkid -s UUID -o value /dev/sdb1) /mnt/usb auto defaults,user,noauto 0 0" >> /etc/fstab

# 3. 创建挂载点并设置权限
mkdir -p /mnt/usb
chmod 755 /mnt/usb

# 4. 测试挂载
mount /mnt/usb
df -h /mnt/usb

# 5. 创建自动清理脚本
cat > /usr/local/bin/clean_tmp.sh << 'EOF'
#!/bin/bash
# 清理7天前的临时文件
find /tmp -type f -atime +7 -delete
find /var/tmp -type f -atime +7 -delete
echo "临时文件清理完成: $(date)"
EOF

chmod +x /usr/local/bin/clean_tmp.sh

练习4:故障排查模拟(25分钟)

任务:模拟和解决常见磁盘问题

# 1. 模拟磁盘空间不足
# 2. 模拟inode耗尽
# 3. 修复文件系统错误
# 4. 恢复误删文件

参考答案

# 1. 磁盘空间不足排查
# 查看哪个分区空间不足
df -h

# 查找大文件
find / -type f -size +100M 2>/dev/null | xargs du -h | sort -hr

# 清理日志文件
journalctl --disk-usage
journalctl --vacuum-size=100M

# 2. inode耗尽排查
df -i
find / -type f -name "*.log" -exec rm -f {} +  # 清理小文件

# 3. 文件系统修复(卸载后操作)
umount /dev/sdb1
fsck -y /dev/sdb1
mount /dev/sdb1

# 4. 使用extundelete恢复误删文件(ext4文件系统)
yum install -y extundelete  # 或 apt-get install extundelete
extundelete /dev/sdb1 --restore-all

七、性能优化和最佳实践

7.1 磁盘性能监控

# 实时监控磁盘IO
iostat -x 1
iotop

# 监控特定分区
iostat -x /dev/sda1 1

# 磁盘性能测试
hdparm -Tt /dev/sda
dd if=/dev/zero of=/tmp/test bs=1M count=1024 oflag=direct

7.2 挂载选项优化

# 性能优化选项
mount -o noatime,nodiratime,data=writeback /dev/sdb1 /data

# SSD优化选项
mount -o noatime,nodiratime,discard /dev/sdb1 /ssd

# 安全选项
mount -o nosuid,noexec,nodev /dev/sdb1 /mnt

7.3 LVM最佳实践

# 使用条带化提高性能
lvcreate -L 100G -i 2 -I 64 -n lv_fast vg0  # 2个条带,64KB大小

# 定期监控
vgs
lvs
pvs

# 备份LVM配置
vgcfgbackup vg0

通过本教程的深入学习,你应该能够熟练管理Linux文件系统,处理各种磁盘相关任务,并优化系统存储性能。

作者:严锋  创建时间:2023-12-07 14:47
最后编辑:严锋  更新时间:2025-11-04 14:01