Linux系统作为服务器和开发环境的主流选择,存储模块的稳定性直接影响业务运行,日常使用中会遇到多种存储相关故障,需要掌握对应的排查和解决思路。

一、磁盘空间不足问题
磁盘空间不足是Linux系统中最高频的存储问题,通常表现为写入文件失败、服务无法启动、日志报错提示空间不足等。
排查方法
首先可以通过df -h命令查看所有挂载点的磁盘使用情况,定位空间使用率过高的分区:
# 查看磁盘空间使用情况,-h参数表示以人类可读的单位显示 df -h
如果定位到某个分区使用率过高,再通过du -sh *命令进入该分区根目录,逐层排查占用空间较大的文件或目录:
# 进入根目录 cd / # 查看当前目录下所有文件/目录的大小,按从大到小排序 du -sh * | sort -rh
解决方法
- 清理无用的日志文件、临时文件、过期备份文件,比如清理/var/log目录下超过30天的日志:
# 删除/var/log下30天前修改的.log文件 find /var/log -name "*.log" -mtime +30 -delete
- 如果是有大文件被删除但进程仍占用,可以通过
lsof | grep deleted找到对应进程,重启进程释放空间 - 如果是业务数据确实需要更多空间,可以进行磁盘扩容操作
二、文件系统损坏问题
异常断电、强制关机、磁盘硬件故障等都可能导致Linux文件系统损坏,表现为分区无法挂载、读取文件报错、系统启动失败等。
排查方法
如果分区无法正常挂载,可以尝试手动挂载查看报错信息,或者通过dmesg | tail查看内核日志中的文件系统相关错误。
解决方法
首先需要卸载对应的分区,如果分区是根分区,需要进入单用户模式或者使用Live CD启动系统后再操作:
# 卸载损坏的分区,假设分区为/dev/sda1 umount /dev/sda1
然后使用fsck工具修复文件系统,根据文件系统类型选择对应的参数,比如ext4文件系统:
# 修复ext4文件系统的/dev/sda1分区,-y参数表示自动确认所有修复操作 fsck.ext4 -y /dev/sda1
修复完成后重新挂载分区即可,如果修复失败可能需要考虑从备份恢复数据。
三、磁盘无法挂载问题
新增磁盘或者移动磁盘到Linux系统后,经常会出现无法挂载的情况,表现为执行mount命令报错。
排查方法
首先检查磁盘是否被系统识别,使用lsblk命令查看所有块设备:
# 查看所有块设备信息 lsblk
如果磁盘已经被识别,再检查分区是否存在文件系统,使用blkid命令查看分区的文件系统类型:
# 查看所有分区的UUID和文件系统类型 blkid
解决方法
- 如果磁盘没有分区,需要先使用
fdisk或者parted工具进行分区操作 - 如果分区没有文件系统,需要格式化分区,比如创建ext4文件系统:
# 将/dev/sdb1分区格式化为ext4文件系统 mkfs.ext4 /dev/sdb1
- 如果是挂载时提示权限不足或者挂载点不存在,需要创建挂载点并赋予对应权限:
# 创建挂载点/data mkdir -p /data # 挂载/dev/sdb1到/data目录 mount /dev/sdb1 /data
- 如果需要开机自动挂载,需要将挂载信息写入/etc/fstab文件,格式为
UUID=分区UUID 挂载点 文件系统类型 defaults 0 0
四、磁盘扩容问题
当原有磁盘空间无法满足业务需求时,需要对磁盘进行扩容,分为新增磁盘扩容和原有磁盘扩容两种场景。
原有磁盘扩容(比如云服务器扩容系统盘)
首先确保底层存储已经扩容完成,比如云服务器控制台已经将磁盘容量从50G扩容到100G,然后执行以下步骤:
# 查看磁盘容量,确认底层已经扩容 lsblk # 如果是ext4文件系统,执行扩容命令,假设分区为/dev/sda1 resize2fs /dev/sda1 # 如果是xfs文件系统,执行扩容命令 xfs_growfs /挂载点
新增磁盘扩容
新增磁盘识别后,先分区、格式化,然后可以选择直接挂载新分区,或者将新分区加入LVM卷组扩展原有逻辑卷:
# 将新磁盘/dev/sdb创建为物理卷 pvcreate /dev/sdb # 将物理卷加入现有卷组vg_data vgextend vg_data /dev/sdb # 扩展逻辑卷lv_data,增加所有空闲空间 lvextend -l +100%FREE /dev/vg_data/lv_data # 刷新文件系统大小 resize2fs /dev/vg_data/lv_data
五、存储读写性能下降问题
磁盘读写性能下降通常表现为文件读写速度慢、服务响应延迟,可能由磁盘坏道、I/O调度策略不合理、磁盘满载等原因导致。
排查方法
使用iostat命令查看磁盘I/O使用情况,关注%util字段,如果该值长期接近100%说明磁盘I/O已经饱和:
# 查看磁盘I/O状态,每2秒输出一次 iostat -x 2
也可以使用badblocks命令检测磁盘是否存在坏道:
# 检测/dev/sda磁盘是否存在坏道,-s参数显示进度 badblocks -s /dev/sda
解决方法
- 如果是I/O调度策略不合理,可以根据磁盘类型调整调度策略,SSD建议使用noop或者deadline调度:
# 临时将/dev/sda的调度策略改为deadline echo deadline > /sys/block/sda/queue/scheduler
- 如果是磁盘坏道导致,轻微坏道可以通过
fsck修复,严重坏道需要更换磁盘并迁移数据 - 如果是I/O满载,可以优化业务读写逻辑,或者将高I/O业务迁移到其他磁盘
日常使用中建议定期监控Linux系统的存储状态,设置磁盘空间、I/O使用率的告警阈值,提前发现潜在问题,同时做好重要数据的定期备份,避免存储故障导致数据丢失。