ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Linux 服务器运维实战(4):磁盘文件与日志管理

Linux 服务器运维实战(4):磁盘文件与日志管理 上一篇让 systemd 监管进程和定时任务本篇处理它们持续产生的状态数据、缓存和日志。磁盘告警不能只看一个使用率容量、inode、挂载点、文件描述符和日志保留共同决定服务是否还能写入。一、痛点df 与 du 为什么对不上df从文件系统视角统计已分配块du遍历目录项汇总可见文件。进程打开文件后即使路径被删除数据块仍由文件描述符引用du 看不到df 仍计费直到进程关闭或重启。挂载点覆盖原目录也会让 du 漏看下层文件。排查差异时用lsof L1找无链接但仍打开的文件再确认挂载层次不能靠删除更多目录碰运气。还有 inode 耗尽数百万个小文件可能只占少量容量却无法新建文件。df -h看块df -i看 inode。日志、会话、邮件队列与构建缓存都容易形成小文件风暴。真正的治理是设置生命周期和上限而不是磁盘满后临时清空。二、原理文件系统边界与保留策略应用数据、日志和临时文件应有明确目录、所有者与恢复级别。/var/lib放持久状态/var/log放日志/run是重启即失的运行时状态/tmp也不能当可靠存储。分区或独立卷能限制日志挤占数据库但同时引入容量碎片和挂载依赖需要监控每个文件系统。日志轮转的关键是写入者如何切换。copytruncate复制后截断原文件不要求进程重开却存在复制与截断之间丢日志的窗口更可靠的是重命名旧文件后向进程发送 reopen 信号。使用 journald 的服务可按总量和空闲空间限制不必再对同一数据重复写文件。删除前先确认可再生成、已备份或超过保留期。find -mtime 7是按 24 小时区间计算和“七个自然日”不完全相同先不带-delete打印审阅。路径参数必须固定且经过校验清理脚本尤其不能对空变量递归操作。三、实现生成可行动的磁盘报告下面脚本只读检查所有本地挂载点、inode、顶层目录和已删除打开文件。它使用df -P的稳定列格式阈值可通过参数设置。du -x不跨文件系统避免把别的卷重复算入根目录。#!/usr/bin/env bashset-euopipefailthreshold${1:-80}[[$threshold~^[0-9]$]]((threshold0threshold100))||{echo阈值必须为 1..992;exit2;}fail0printf文件系统容量\nwhileread-rfs blocks used avail percentmount;do[[$percentUse%]]continuevalue${percent%%%}printf%-24s %3s %s\n$fs$percent$mount((valuethreshold))fail$((fail1))done(df-P-xtmpfs-xdevtmpfs)printf\ninode 使用\ndf-Pi-xtmpfs-xdevtmpfsprintf\n根目录一级占用不跨文件系统\ndu-x-d1-h/2/dev/null|sort-h|tail-n12ifcommand-vlsof/dev/null21;thenprintf\n已删除但仍打开\nlsofL12/dev/null||truefiprintf\n超过阈值的文件系统%d\n$failexit$fail运行输出文件系统 类型 使用率 可用空间 /dev/vda1 ext4 41% 28G 超过阈值的文件系统0下面为一个应用日志建立轮转规则并先用logrotate -d调试。应用收到 USR1 后必须实现关闭并重开日志文件若不支持应改用其官方信号或让 systemd/journald 接管不能生搬硬套。#!/usr/bin/env bashset-euopipefail[[$EUID-eq0]]||{echo请使用 root 运行2;exit1;}unit${1:-example.service}systemctlcat$unit/dev/nullcat/etc/logrotate.d/example-appEOF /var/log/example-app/*.log { daily rotate 14 size 100M missingok notifempty compress delaycompress create 0640 root adm sharedscripts postrotate /bin/systemctl kill -s USR1 --kill-whomain$unitendscript } EOFinstall-d-m0750-oroot-gadm /var/log/example-applogrotate-d/etc/logrotate.d/example-appecho配置已通过调试解析未强制执行轮转运行输出reading config file /etc/logrotate.d/example-app Reading state from file: /var/lib/logrotate/status Allocating hash table for state file, size 64 entries 配置已通过调试解析未强制执行轮转四、踩坑清空日志也可能破坏现场事故中日志是证据直接rm会丢失时间线且对打开文件未必释放空间。先保存相关区间、校验权限和备份再按写入者的重开机制处理。急救时可对确认无保留价值的普通日志使用truncate -s 0但这只是止血之后必须补上上限和根因修复。不要解析人类可读的du -h做自动判断也不要假定文件名没有空格或换行。批量处理使用find -print0与 NUL 分隔。备份目录和快照也会消耗空间CoW 文件系统的快照保留旧块使“删除大文件后空间没回来”要同时检查快照策略。五、验证从增长速度看提前量告警不仅设 80% 和 90%还应计算最近增长速度与预计耗尽时间。容量大的卷从 80% 到满可能仅几小时小卷则可能几个月。验证轮转时写入测试行、强制轮转、通知进程再确认新旧文件各自内容连续、权限正确且压缩按期发生。日志读取链路也要确认没有因 inode 变化停止采集。磁盘稳定后下一篇进入网络。我们会从 DNS、路由、监听、连接到 TLS 分层定位故障避免把所有超时都归咎于“网络不通”。参考来源GNU CoreutilsdfGNU Coreutilsdulogrotate Manualjournald.conf 手册 觉得有用就点个赞 收藏方便回头查阅有疑问直接在评论区留言我看到都会回。 本文属于《Linux 服务器运维实战》系列持续更新关注不迷路。 文章里的代码都能直接跑。想要可直接 clone 的完整工程 配套部署脚本 / 踩坑清单评论一声或发邮件到cj2664qq.com我免费发你。如果你正好在做类似系统、或有工程化难题想找人做也欢迎邮件聊一句——我按实际情况评估能落地的就接单或出方案。评论和邮件都能直接找到我不用跳别的平台。
返回列表