Linux磁盤空間告警?三步快速定位
背景與目的
磁盤空間告警是運維工作中最常見的告警類型之一。當(dāng)磁盤空間耗盡時,應(yīng)用程序無法寫入日志、數(shù)據(jù)庫無法正常提交、容器無法創(chuàng)建新鏡像,甚至系統(tǒng)日志寫入失敗會導(dǎo)致難以診斷的連鎖故障。本文從實際運維經(jīng)驗出發(fā),提供一套完整的磁盤空間問題定位和解決流程。
前置知識:本文假設(shè)你已經(jīng)掌握Linux基本命令和文件目錄操作。了解常見的Linux發(fā)行版(CentOS/RHEL/Rocky/Ubuntu等)。
環(huán)境說明:本文示例基于Rocky Linux 9.4(等同于RHEL 9.4),文件系統(tǒng)為XFS,工具版本:df(GNU coreutils 9.1)、du(GNU findutils 4.9)、ncdu(1.17)。
1. 磁盤告警的常見原因
1.1 日志文件暴漲
這是最常見的磁盤空間告警原因。應(yīng)用程序日志、Web訪問日志、數(shù)據(jù)庫慢查詢?nèi)罩镜龋诟卟l(fā)或異常情況下可能快速增長。
典型場景:
應(yīng)用程序debug模式未關(guān)閉,日志量暴增10倍
錯誤循環(huán)導(dǎo)致重復(fù)寫日志
日志輪轉(zhuǎn)配置缺失或失效
大流量訪問產(chǎn)生海量訪問日志
表現(xiàn)特征:
/var/log/messages 單文件超過GB級別 /var/log/nginx/access.log 單文件超過10GB /var/lib/mysql/slow-query.log 持續(xù)增長
1.2 臨時文件和緩存未清理
系統(tǒng)運行過程中產(chǎn)生的臨時文件和緩存,如果未及時清理會占用大量空間。
典型場景:
/tmp 目錄積累大量臨時文件
包管理器緩存(yum/dnf/apt)未清理
編譯產(chǎn)生的中間文件未刪除
容器鏡像/構(gòu)建緩存未清理
表現(xiàn)特征:
/var/cache 目錄占用數(shù)十GB /tmp 下有大量一個月前的文件 docker system df 顯示異常大的空間占用
1.3 數(shù)據(jù)文件自然增長
數(shù)據(jù)庫、KV存儲、日志聚合系統(tǒng)等,數(shù)據(jù)會隨時間自然增長。
典型場景:
MySQL InnoDB表空間持續(xù)增長
PostgreSQL數(shù)據(jù)目錄膨脹
Elasticsearch索引無限增長
MongoDB數(shù)據(jù)文件未啟用自動壓縮
1.4 隱藏的大文件
某些場景下,大文件可能被刪除但進程仍持有文件句柄,導(dǎo)致磁盤空間無法釋放。
典型場景:
日志文件被刪除但進程未重啟
臨時文件創(chuàng)建后刪除但進程仍寫入
鏡像文件傳輸中斷產(chǎn)生空洞文件
表現(xiàn)特征:
df顯示已滿,但du顯示使用量很少 文件明明刪除了但空間不釋放 重啟進程后空間釋放
1.5 inode耗盡
雖然少見,但inode耗盡也會導(dǎo)致"磁盤滿"的問題。inode用于存儲文件元數(shù)據(jù),每個文件至少占用一個inode。
典型場景:
小文件過多(大量緩存文件、郵件隊列)
文件系統(tǒng)創(chuàng)建時inode數(shù)量配置不足
2. 第一步:快速定位
當(dāng)收到磁盤告警時,第一步是快速判斷是哪個分區(qū)、哪個掛載點出現(xiàn)了問題。
2.1 df命令基礎(chǔ)用法
df是磁盤空間查看的基礎(chǔ)命令,必須掌握。
# 查看文件系統(tǒng)使用情況(人類可讀格式) $ df -h Filesystem Size Used Avail Use% Mounted on devtmpfs 16G 0 16G 0% /dev tmpfs 16G 0 16G 0% /dev/shm tmpfs 16G 1.2G 15G 8% /run /dev/sda1 100G 45G 55G 45% / /dev/sda2 200G 180G 20G 90% /data /dev/sdb1 500G 450G 50G 90% /var/lib/mysql # 查看inode使用情況 $ df -i Filesystem Inode IUsed IFree IUse% Mounted on /dev/sda1 524288 123456 400832 23% / /dev/sda2 1048576 523456 525120 50% /data # 顯示文件系統(tǒng)類型 $ df -hT Filesystem Type Size Used Avail Use% Mounted on /dev/sda1 xfs 100G 45G 55G 45% / /dev/sda2 ext4 200G 180G 20G 90% /data # 排除偽文件系統(tǒng),只看真實磁盤 $ df -h --output=source,size,used,avail,pcent,target | grep -E'^/dev|^/mnt|^/vol' # 查找使用率超過80%的分區(qū) $ df -h | awk'NR>1 && $5+0 > 80 {print}' /dev/sda2 200G 180G 20G 90% /data
2.2 快速定位腳本
#!/bin/bash
# script: quick_disk_check.sh
# 用途:收到告警后30秒內(nèi)定位問題
echo"=== 磁盤空間快速檢查 ==="
echo"檢查時間:$(date)"
echo""
# 1. 找出使用率超過80%的分區(qū)
echo"【1】使用率超過80%的分區(qū):"
df -h | awk'NR>1 && $5+0 > 80 {
printf " %s: %s/%s (使用率%s)
", $1, $3, $2, $5
}'
echo""
# 2. 如果是/分區(qū)告警,檢查是否boot分區(qū)問題
echo"【2】各分區(qū)使用率概覽:"
df -h | awk'NR>1 {
printf " %-30s %6s 使用率: %s
", $6, $2, $5
}'
echo""
# 3. 檢查inode
echo"【3】Inode使用情況:"
df -i | awk'NR>1 && $5+0 > 80 {
printf " 警告:%s inode使用率%s
", $6, $5
}'
echo""
# 4. 檢查最近磁盤增長趨勢(需要歷史數(shù)據(jù)支持)
echo"【4】近期活躍目錄(按修改時間):"
find / -maxdepth 3 -typed -mtime -1 2>/dev/null | head -20
echo""
echo"=== 快速檢查完成 ==="
2.3 du命令基礎(chǔ)用法
du用于查看目錄或文件的磁盤使用量,是精確定位的核心工具。
# 查看當(dāng)前目錄各子目錄大小 $ du -sh * # 查看指定目錄大小(人類可讀) $ du -sh /var/log # 查看子目錄大小并排序(人類可讀) $ du -h /var | sort -rh | head -20 # 深度2層子目錄大小 $ du -h --max-depth=2 /var # 只顯示超過100M的目錄 $ du -h --threshold=100M /var # 顯示磁盤使用總量(不顯示子目錄) $ du -sh /var/log # 排除某些掛載點 $ du -sh --exclude=/proc --exclude=/sys / # du結(jié)果導(dǎo)出 $ du -h / 2>/dev/null | sort -rh > /tmp/du_result.txt
2.4 ncdu交互式工具
ncdu是du的增強版,提供交互式界面,特別適合快速定位大目錄。
# 安裝ncdu dnf install ncdu -y # CentOS/RHEL/Rocky apt install ncdu -y # Ubuntu/Debian # 使用ncdu分析目錄 ncdu -x / # -x 不跨文件系統(tǒng),跟隨掛載點 ncdu -q / # q退出模式,適合腳本調(diào)用 # 常用快捷鍵(在ncdu界面中) # 上下箭頭:選擇目錄 # 回車:進入目錄 # d:刪除選中文件/目錄 # n:按名稱排序 # s:按大小排序 # t:顯示目錄優(yōu)先 # g:顯示百分比 # q:退出
2.5 快速定位大文件
#!/bin/bash
# script: find_large_files.sh
# 用途:快速找到系統(tǒng)中的大文件
echo"=== 大文件掃描開始 ==="
echo"掃描時間:$(date)"
echo""
# 1. 查找超過1GB的文件
echo"【1】超過1GB的文件:"
find / -typef -size +1G -execls -lh {} ; 2>/dev/null |
awk'{print $5, $9}'
echo""
# 2. 查找超過100MB的文件(限制數(shù)量)
echo"【2】超過100MB的文件(前50個):"
find / -typef -size +100M 2>/dev/null |
head -50 | xargs -I{} ls -lh {} 2>/dev/null |
awk'{print $5, $9}'
echo""
# 3. 查找最大的10個目錄
echo"【3】系統(tǒng)中最大的10個目錄:"
du -Sh / 2>/dev/null | sort -rh | head -10
echo""
# 4. 檢查特定目錄
fordirin/var /home /tmp /opt /usr;do
if[ -d"$dir"];then
echo"【4.1】${dir}目錄大小:$(du -sh $dir 2>/dev/null | cut -f1)"
fi
done
3. 第二步:深度分析
定位到問題分區(qū)后,第二步是深度分析,找出占用空間的具體文件和目錄。
3.1 分析日志文件
#!/bin/bash
# script: analyze_logs.sh
# 用途:分析/var/log目錄,定位占用空間大的日志
echo"=== 日志目錄分析 ==="
echo""
# 列出/var/log下所有目錄和文件大小
echo"【1】/var/log 各子目錄大小:"
du -sh /var/log/* 2>/dev/null | sort -rh | head -15
echo""
# 找出超過100MB的日志文件
echo"【2】超過100MB的日志文件:"
find /var/log-typef -size +100M 2>/dev/null |whilereadf;do
size=$(ls -lh"$f"| awk'{print $5}')
modified=$(stat-c %y"$f"| cut -d' '-f1)
echo" $size$modified$f"
done
echo""
# 統(tǒng)計日志文件增長趨勢(需要對比)
echo"【3】日志文件詳情:"
find /var/log-typef -execls -lh {} ; 2>/dev/null |
awk'{print $5, $6, $7, $9}'| sort -rh | head -20
echo""
# 檢查日志輪轉(zhuǎn)配置
echo"【4】日志輪轉(zhuǎn)配置狀態(tài):"
forlogfilein/var/log/messages /var/log/secure /var/log/nginx/*.log;do
if[ -f"$logfile"];then
echo" $logfile:"
ls -lh"${logfile}"* 2>/dev/null | head -5
echo""
fi
done
3.2 分析數(shù)據(jù)庫數(shù)據(jù)目錄
#!/bin/bash
# script: analyze_db_space.sh
# 用途:分析數(shù)據(jù)庫目錄占用情況
echo"=== 數(shù)據(jù)庫空間分析 ==="
echo""
# MySQL數(shù)據(jù)目錄
MYSQL_DATA="/var/lib/mysql"
if[ -d"$MYSQL_DATA"];then
echo"【1】MySQL數(shù)據(jù)目錄:${MYSQL_DATA}"
echo" 總大小:$(du -sh $MYSQL_DATA 2>/dev/null | cut -f1)"
# 按表大小排序
echo" 按表大小排序(前10):"
find"$MYSQL_DATA"-name"*.ibd"-execdu -h {} ; 2>/dev/null |
sort -rh | head -10 |whilereadsize file;do
echo" $size$(basename $file)"
done
# 檢查InnoDB表空間
echo" InnoDB表空間文件:"
ls -lh"$MYSQL_DATA"/ibdata* 2>/dev/null
echo""
fi
# PostgreSQL數(shù)據(jù)目錄
POSTGRES_DATA="/var/lib/pgsql/data"
if[ -d"$POSTGRES_DATA"];then
echo"【2】PostgreSQL數(shù)據(jù)目錄:${POSTGRES_DATA}"
echo" 總大小:$(du -sh $POSTGRES_DATA 2>/dev/null | cut -f1)"
echo" Base目錄內(nèi)容:"
du -sh"$POSTGRES_DATA/base"2>/dev/null
echo" WAL目錄:"
du -sh"$POSTGRES_DATA/pg_wal"2>/dev/null
echo""
fi
# MongoDB數(shù)據(jù)目錄
MONGO_DATA="/var/lib/mongodb"
if[ -d"$MONGO_DATA"];then
echo"【3】MongoDB數(shù)據(jù)目錄:${MONGO_DATA}"
echo" 總大小:$(du -sh $MONGO_DATA 2>/dev/null | cut -f1)"
ls -lh"$MONGO_DATA"/*.wt 2>/dev/null | head -10
echo""
fi
3.3 分析臨時文件和緩存
#!/bin/bash
# script: analyze_temp_cache.sh
# 用途:分析臨時文件和緩存占用
echo"=== 臨時文件和緩存分析 ==="
echo""
# /tmp目錄
echo"【1】/tmp 目錄分析:"
tmp_count=$(find /tmp -typef 2>/dev/null | wc -l)
tmp_size=$(du -sh /tmp 2>/dev/null | cut -f1)
echo" 文件數(shù)量:$tmp_count"
echo" 總大小:$tmp_size"
echo" /tmp 前10大文件:"
find /tmp -typef -execdu -h {} ; 2>/dev/null |
sort -rh | head -10 |whilereadsize file;do
age=$(stat-c %y"$file"2>/dev/null | cut -d' '-f1)
echo" $size$age$(basename "$file")"
done
echo""
# /var/tmp目錄
if[ -d /var/tmp ];then
echo"【2】/var/tmp 目錄分析:"
echo" 總大小:$(du -sh /var/tmp 2>/dev/null | cut -f1)"
echo" 前10大文件:"
find /var/tmp -typef -execdu -h {} ; 2>/dev/null |
sort -rh | head -10
echo""
fi
# 包管理器緩存
echo"【3】包管理器緩存:"
# DNF/YUM緩存
if[ -d /var/cache/dnf ];then
echo" DNF緩存大小:$(du -sh /var/cache/dnf 2>/dev/null | cut -f1)"
echo" DNF緩存包數(shù)量:$(find /var/cache/dnf -name "*.rpm" 2>/dev/null | wc -l)"
fi
# APT緩存
if[ -d /var/cache/apt ];then
echo" APT緩存大小:$(du -sh /var/cache/apt 2>/dev/null | cut -f1)"
fi
# Yarn緩存
if[ -d /home/*/.cache/yarn ];then
echo" Yarn緩存總大小:$(du -sh /home/*/.cache/yarn 2>/dev/null | cut -f1)"
fi
# npm緩存
if[ -d /home/*/.npm ];then
echo" npm緩存總大小:$(du -sh /home/*/.npm 2>/dev/null | cut -f1)"
fi
echo""
# Docker相關(guān)
ifcommand-v docker &> /dev/null;then
echo"【4】Docker空間占用:"
docker system df 2>/dev/null ||echo" Docker命令執(zhí)行失敗"
echo""
fi
# 舊內(nèi)核
echo"【5】舊內(nèi)核占用:"
if[ -d /boot ];then
echo" /boot總大小:$(du -sh /boot | cut -f1)"
echo" 已安裝內(nèi)核版本:"
ls /boot/vmlinuz-* 2>/dev/null | sed's/.*vmlinuz-//'|whilereadver;do
size=$(ls -lh /boot/vmlinuz-$ver2>/dev/null | awk'{print $5}')
echo" $ver($size)"
done
fi
3.4 分析隱藏的大文件
#!/bin/bash # script: find_deleted_but_open.sh # 用途:查找已刪除但仍被進程占用的文件 echo"=== 已刪除但未釋放空間的文件 ===" echo"" # 遍歷所有進程,查找已刪除但仍打開的文件 forpidin$(ls /proc | grep -E'^[0-9]+$');do if[ -d"/proc/$pid/fd"];then # 查找符號鏈接指向(deleted)的文件描述符 forfdin/proc/$pid/fd/*;do target=$(readlink"$fd"2>/dev/null) if[["$target"== *"(deleted)"* ]];then size=$(ls -lh"$fd"2>/dev/null | awk'{print $5}') cmd=$(cat /proc/$pid/cmdline 2>/dev/null | tr'?'' '| head -c 50) echo"PID:$pid| CMD:$cmd" echo" FD:$fd->$target| Size:$size" fi done fi done| head -50 echo"" echo"說明:上述文件已刪除但進程仍在使用,重啟相關(guān)進程可釋放空間"
3.5 分析容器和鏡像
#!/bin/bash # script: analyze_container_space.sh # 用途:分析容器和鏡像占用的磁盤空間 if!command-v docker &> /dev/null;then echo"Docker未安裝或未運行" exit0 fi echo"=== Docker空間占用分析 ===" echo"" # 總體空間占用 echo"【1】Docker總體空間:" docker system df echo"" # 詳細(xì)分類 echo"【2】空間占用明細(xì):" docker system df -v 2>/dev/null | head -50 echo"" # 懸空鏡像( dangling) echo"【3】懸空鏡像(無標(biāo)簽):" dangling=$(docker images -f"dangling=true"-q) if[ -n"$dangling"];then echo" 懸空鏡像數(shù)量:$(echo $dangling | wc -w)" docker images -f"dangling=true" else echo" 無懸空鏡像" fi echo"" # 停止的容器 echo"【4】停止的容器:" stopped=$(docker ps -a -f status=exited -q) if[ -n"$stopped"];then echo" 停止容器數(shù)量:$(echo $stopped | wc -w)" docker ps -a -f status=exited --format"{{.ID}} {{.Names}} {{.Status}}" else echo" 無停止的容器" fi echo"" # 各鏡像大小 echo"【5】鏡像大小排序(前10):" docker images --format"{{.Repository}}:{{.Tag}} {{.Size}}"| sort -t$' '-k2 -rh | head -10 echo"" echo"清理命令:" echo" docker system prune -a # 刪除所有未使用的鏡像和容器" echo" docker container prune # 刪除停止的容器" echo" docker image prune # 刪除懸空鏡像" echo" docker volume prune # 刪除未使用的卷"
4. 第三步:清理與預(yù)警
定位問題后,第三步是執(zhí)行清理操作并建立預(yù)警機制。
4.1 日志清理
手動清理日志:
#!/bin/bash # script: clean_old_logs.sh # 用途:清理超過指定天數(shù)的日志文件 MAX_DAYS=30 LOG_DIRS="/var/log /opt/*/logs" echo"=== 日志清理腳本 ===" echo"清理超過${MAX_DAYS}天的日志..." echo"" count=0 total_size=0 forlogdirin$LOG_DIRS;do if[ -d"$logdir"];then # 查找符合條件的日志文件 find"$logdir"-typef -name"*.log"-mtime +$MAX_DAYS2>/dev/null |whilereadlogfile;do size=$(du -k"$logfile"| cut -f1) total_size=$((total_size + size)) rm -f"$logfile" count=$((count + 1)) echo" Deleted:$logfile(${size}KB)" done # 清理gz壓縮包(保留180天) find"$logdir"-typef -name"*.gz"-mtime +180 2>/dev/null |whilereadgzfile;do size=$(du -k"$gzfile"| cut -f1) total_size=$((total_size + size)) rm -f"$gzfile" count=$((count + 1)) echo" Deleted:$gzfile(${size}KB)" done fi done echo"" echo"清理完成:刪除${count}個文件,釋放約$((total_size/1024))MB"
清空當(dāng)前日志文件(保留文件):
# 方法1:使用truncate truncate -s 0 /var/log/messages # 方法2:使用重定向 > /var/log/messages # 方法3:使用dd(對于需要保留文件句柄的場景) ddif=/dev/null of=/var/log/messages # 驗證 ls -lh /var/log/messages
4.2 配置日志輪轉(zhuǎn)
# /etc/logrotate.d/nginx 示例配置
/var/log/nginx/*.log{
daily # 每天輪轉(zhuǎn)
missingok # 忽略文件不存在錯誤
rotate 14 # 保留14個輪轉(zhuǎn)文件
compress # 壓縮舊日志
delaycompress # 延遲壓縮(保留最近一個不壓縮)
notifempty # 空日志不輪轉(zhuǎn)
create 0640 nginx adm # 創(chuàng)建新文件權(quán)限
sharedscripts # 腳本只執(zhí)行一次
postrotate
if[ -f /var/run/nginx.pid ];then
kill-USR1 `cat /var/run/nginx.pid`
fi
endscript
}
# /etc/logrotate.d/mysql 示例配置
/var/log/mysql/slow.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
create 0600 mysql mysql
}
/var/log/mysql/error.log {
daily
rotate 14
compress
delaycompress
missingok
notifempty
create 0600 mysql mysql
}
4.3 清理臨時文件
#!/bin/bash
# script: clean_temp_files.sh
# 用途:清理臨時文件和緩存
echo"=== 臨時文件清理 ==="
echo"開始時間:$(date)"
echo""
# 清理/tmp下超過7天的文件
echo"【1】清理/tmp下7天前的文件:"
tmp_deleted=$(find /tmp -typef -atime +7 2>/dev/null | wc -l)
find /tmp -typef -atime +7 -delete 2>/dev/null
echo" 刪除文件數(shù):$tmp_deleted"
# 清理/var/tmp下超過30天的文件
echo"【2】清理/var/tmp下30天前的文件:"
vartmp_deleted=$(find /var/tmp -typef -atime +30 2>/dev/null | wc -l)
find /var/tmp -typef -atime +30 -delete 2>/dev/null
echo" 刪除文件數(shù):$vartmp_deleted"
# 清理dnf緩存
echo"【3】清理DNF緩存:"
dnf clean all
echo" DNF緩存已清理"
# 清理舊內(nèi)核
echo"【4】清理舊內(nèi)核:"
ifcommand-v yum &> /dev/null;then
# 列出已安裝的內(nèi)核
current_kernel=$(uname -r)
installed_kernels=$(rpm -q kernel | wc -l)
if["$installed_kernels"-gt 1 ];then
# 保留當(dāng)前內(nèi)核和最新的一個舊內(nèi)核
rpm -q kernel | tail -n +2 | head -n -1 |whilereadkernel;do
echo" 移除內(nèi)核:$kernel"
dnf remove -y"$kernel"2>/dev/null ||true
done
fi
fi
# 清理孤兒包
echo"【5】清理孤兒包:"
dnf autoremove -y 2>/dev/null ||true
echo""
echo"清理完成:$(date)"
echo"當(dāng)前磁盤使用情況:"
df -h /
4.4 清理Docker空間
#!/bin/bash # script: clean_docker_space.sh # 用途:清理Docker占用的磁盤空間 echo"=== Docker空間清理 ===" echo"" # 查看當(dāng)前占用 echo"【1】清理前Docker空間:" docker system df echo"" # 1. 刪除停止的容器 echo"【2】刪除停止的容器:" stopped_count=$(docker ps -a -f status=exited -q | wc -l) if["$stopped_count"-gt 0 ];then docker container prune -f echo" 已刪除$stopped_count個停止的容器" else echo" 無停止的容器" fi echo"" # 2. 刪除懸空鏡像 echo"【3】刪除懸空鏡像:" dangling_count=$(docker images -f"dangling=true"-q | wc -l) if["$dangling_count"-gt 0 ];then docker image prune -f echo" 已刪除$dangling_count個懸空鏡像" else echo" 無懸空鏡像" fi echo"" # 3. 刪除未使用的卷 echo"【4】刪除未使用的卷:" unused_volumes=$(docker volume ls -f dangling=true-q | wc -l) if["$unused_volumes"-gt 0 ];then docker volume prune -f echo" 已刪除$unused_volumes個未使用的卷" else echo" 無未使用的卷" fi echo"" # 4. 刪除build緩存(可選,會刪除所有build緩存) read-p"是否刪除所有build緩存?(y/N): "confirm if["$confirm"="y"];then docker builder prune -f echo" 已刪除build緩存" fi echo"" # 5. 全面清理(可選) read-p"是否執(zhí)行全面清理(刪除所有未使用的對象)?(y/N): "full_clean if["$full_clean"="y"];then docker system prune -a -f --volumes echo" 已執(zhí)行全面清理" fi echo"" echo"【5】清理后Docker空間:" docker system df
4.5 建立磁盤監(jiān)控預(yù)警
#!/bin/bash
# script: disk_alert_monitor.sh
# 用途:監(jiān)控磁盤使用率,超過閾值時發(fā)送告警
# 配置
WARNING_THRESHOLD=80
CRITICAL_THRESHOLD=90
ALERT_LOG="/var/log/disk_alert.log"
EMAIL_TO="ops@example.com"
# 獲取磁盤使用信息
check_disk() {
localmount_point="$1"
localusage=$(df"$mount_point"| awk'NR==2 {print $5}'| sed's/%//')
localdevice=$(df"$mount_point"| awk'NR==2 {print $1}')
localsize=$(df -h"$mount_point"| awk'NR==2 {print $2}')
localused=$(df -h"$mount_point"| awk'NR==2 {print $3}')
localavail=$(df -h"$mount_point"| awk'NR==2 {print $4}')
echo"$usage|$device|$size|$used|$avail"
}
# 發(fā)送告警
send_alert() {
locallevel="$1"
localmessage="$2"
echo"[$(date '+%Y-%m-%d %H:%M:%S')] [$level]$message">>"$ALERT_LOG"
# 郵件告警(需要mailx)
ifcommand-v mailx &> /dev/null;then
echo"$message"| mailx -s"[$level] Disk Alert on$(hostname)""$EMAIL_TO"
fi
}
# 主監(jiān)控邏輯
echo"=== 磁盤監(jiān)控檢查 ==="
echo"檢查時間:$(date)"
echo""
CHECK_MOUNTS="/ /data /var /home /boot"
formount_pointin$CHECK_MOUNTS;do
if[ -d"$mount_point"];then
info=$(check_disk"$mount_point")
usage=$(echo"$info"| cut -d'|'-f1)
device=$(echo"$info"| cut -d'|'-f2)
size=$(echo"$info"| cut -d'|'-f3)
used=$(echo"$info"| cut -d'|'-f4)
avail=$(echo"$info"| cut -d'|'-f5)
echo"$mount_point($device):$usage% used ($used/$size, 可用$avail)"
if["$usage"-ge"$CRITICAL_THRESHOLD"];then
send_alert"CRITICAL""磁盤使用率危急!${mount_point}使用率${usage}%,設(shè)備${device},可用空間${avail}"
elif["$usage"-ge"$WARNING_THRESHOLD"];then
send_alert"WARNING""磁盤使用率告警!${mount_point}使用率${usage}%,設(shè)備${device},可用空間${avail}"
fi
fi
done
4.6 自動化清理腳本
#!/bin/bash
# script: automated_disk_cleanup.sh
# 用途:自動化磁盤空間維護腳本,建議通過cron定期執(zhí)行
# 配置
MAX_LOG_AGE_DAYS=30
MAX_TMP_AGE_DAYS=7
DOCKER_PRUNE_WEEKLY=true
LOG_DIR="/var/log/cleanup"
# 創(chuàng)建日志目錄
mkdir -p"$LOG_DIR"
log() {
echo"[$(date '+%Y-%m-%d %H:%M:%S')]$1"| tee -a"$LOG_DIR/cleanup_$(date +%Y%m%d).log"
}
# 主流程
log"========== 開始磁盤清理 =========="
# 1. 清理舊日志
log"步驟1:清理${MAX_LOG_AGE_DAYS}天前的日志文件"
find /var/log-typef -name"*.log"-mtime +$MAX_LOG_AGE_DAYS-delete 2>/dev/null
find /var/log-typef -name"*.gz"-mtime +180 -delete 2>/dev/null
log" 日志清理完成"
# 2. 清理臨時文件
log"步驟2:清理${MAX_TMP_AGE_DAYS}天未訪問的臨時文件"
find /tmp -typef -atime +$MAX_TMP_AGE_DAYS-delete 2>/dev/null
find /var/tmp -typef -atime +$MAX_TMP_AGE_DAYS-delete 2>/dev/null
log" 臨時文件清理完成"
# 3. 清理包管理器緩存
log"步驟3:清理包管理器緩存"
dnf clean all 2>/dev/null
log" 包管理器緩存清理完成"
# 4. 清理舊內(nèi)核(僅保留最新2個)
log"步驟4:清理舊內(nèi)核"
current_kernel=$(uname -r)
kernel_count=0
forkin$(rpm -q kernel --last | sed's/kernel-//'| cut -d' '-f1);do
if["$kernel_count"-gt 1 ];then
if["$k"!="$current_kernel"];then
dnf remove -y"kernel-$k"2>/dev/null &&log" 移除內(nèi)核:$k"||true
fi
fi
kernel_count=$((kernel_count + 1))
done
# 5. Docker清理(每周執(zhí)行)
day_of_week=$(date +%u)
if["$DOCKER_PRUNE_WEEKLY"=true] && ["$day_of_week"= 1 ];then
log"步驟5:Docker空間清理(周一執(zhí)行)"
docker system prune -f --filter"until=168h"2>/dev/null ||true
log" Docker清理完成"
fi
# 6. 清理舊日志輪轉(zhuǎn)文件
log"步驟6:清理過期的logrotate文件"
find /var/lib/logrotate -typef -mtime +60 -delete 2>/dev/null
# 7. 清理舊tmp文件(系統(tǒng))
log"步驟7:清理系統(tǒng)tmp目錄"
find /var/tmp -typef -mtime +30 -delete 2>/dev/null
log"========== 磁盤清理完成 =========="
log"清理后磁盤使用情況:"
df -h / | tee -a"$LOG_DIR/cleanup_$(date +%Y%m%d).log"
5. inode滿了怎么辦
5.1 排查inode使用
#!/bin/bash # script: check_inode_usage.sh # 用途:檢查inode使用情況 echo"=== Inode使用情況 ===" echo"" # 查看各分區(qū)inode使用 echo"【1】各分區(qū)inode使用率:" df -i echo"" # 查找inode占用最多的目錄 echo"【2】/var目錄inode分布:" find /var -typed 2>/dev/null |whilereaddir;do count=$(find"$dir"-maxdepth 1 -typef 2>/dev/null | wc -l) echo" $count$dir" done| sort -rn | head -20 echo"" # 統(tǒng)計各類型文件數(shù)量 echo"【3】文件類型統(tǒng)計:" find /var -typef 2>/dev/null | sed's/.*.//'| sort | uniq -c | sort -rn | head -20
5.2 清理inode占用
#!/bin/bash # script: free_inodes.sh # 用途:釋放inode占用的空間 echo"=== 釋放inode空間 ===" echo"" # 1. 清理/var/spool下的舊郵件 echo"【1】清理郵件隊列:" mail_count=$(find /var/spool/mail -typef 2>/dev/null | wc -l) echo" 郵件文件數(shù):$mail_count" find /var/spool/mail -typef -mtime +30 -delete 2>/dev/null echo" 已清理30天前的郵件" # 2. 清理臨時socket文件 echo"【2】清理臨時socket文件:" socket_count=$(find /tmp -types 2>/dev/null | wc -l) echo" socket文件數(shù):$socket_count" find /tmp -types -mtime +1 -delete 2>/dev/null # 3. 清理空目錄 echo"【3】清理空目錄:" find /var -typed -empty -delete 2>/dev/null # 4. 清理小的tmp文件 echo"【4】清理小的臨時文件:" find /tmp -typef -size -1k -mtime +1 -delete 2>/dev/null # 5. 清理日志目錄中的old文件 echo"【5】清理日志目錄中的歸檔文件:" find /var/log-typef -name"*.old"-mtime +7 -delete 2>/dev/null find /var/log-typef -name"*.bak"-mtime +7 -delete 2>/dev/null echo"" echo"清理完成。當(dāng)前inode使用:" df -i /
6. LVM邏輯卷擴展
當(dāng)磁盤空間真的不夠用時,需要擴展邏輯卷。
6.1 查看LVM狀態(tài)
# 查看PV(物理卷) pvs # 查看VG(卷組) vgs # 查看LV(邏輯卷) lvs # 詳細(xì)查看 pvdisplay vgdisplay lvdisplay
6.2 擴展邏輯卷
#!/bin/bash
# script: extend_lvm.sh
# 用途:擴展LVM邏輯卷
# 配置:要擴展的LV和要擴展的大小
VG_NAME="vg00"
LV_NAME="lv_data"
EXTEND_SIZE="+50G"
echo"=== LVM邏輯卷擴展 ==="
echo""
# 1. 查看當(dāng)前狀態(tài)
echo"【1】當(dāng)前狀態(tài):"
lvs
echo""
lvdisplay /dev/${VG_NAME}/${LV_NAME}
echo""
# 2. 檢查VG剩余空間
echo"【2】卷組剩余空間:"
vgs
vgextend --help| head -1
echo""
# 3. 如果VG有足夠空間,直接擴展
echo"【3】執(zhí)行擴展..."
lvextend -L +50G /dev/${VG_NAME}/${LV_NAME}
# 4. 擴展文件系統(tǒng)(XFS)
echo"【4】擴展XFS文件系統(tǒng)..."
xfs_growfs /dev/${VG_NAME}/${LV_NAME}
# 5. 驗證
echo"【5】擴展后狀態(tài):"
df -h /dev/${VG_NAME}/${LV_NAME}
6.3 添加新磁盤到VG
#!/bin/bash # script: add_disk_to_vg.sh # 用途:將新磁盤添加到卷組 NEW_PV="/dev/sdb" VG_NAME="vg00" echo"=== 添加新磁盤到VG ===" echo"" # 1. 創(chuàng)建物理卷 echo"【1】創(chuàng)建物理卷:" pvcreate"$NEW_PV" # 2. 添加到卷組 echo"【2】添加到卷組:" vgextend"$VG_NAME""$NEW_PV" # 3. 驗證 echo"【3】卷組狀態(tài):" vgs # 4. 現(xiàn)在可以擴展LV echo"【4】可以執(zhí)行:lvextend -L +/dev/${VG_NAME}/ "
7. 磁盤quota配額管理
7.1 啟用磁盤配額
# 1. 編輯/etc/fstab,添加usrquota和grpquota # /dev/mapper/vg00-lv_home /home xfs defaults,usrquota,grpquota 0 0 # 2. 重新掛載 mount -o remount /home # 3. 初始化配額數(shù)據(jù)庫 quotacheck -cug /home # 4. 啟用配額 quotaon /home
7.2 設(shè)置用戶配額
# 設(shè)置用戶磁盤限制 edquota -u username # 示例配置: # Disk quotas for user username (uid 1000): # Filesystem blocks soft hard inodes soft hard # /dev/mapper/vg00-lv_home # 1024 5000 6000 100 150 200 # blocks: 當(dāng)前使用(KB) # soft: 軟限制(超過后警告) # hard: 硬限制(不能超過) # inodes: 文件數(shù)量限制
7.3 配額管理腳本
#!/bin/bash
# script: quota_report.sh
# 用途:生成磁盤配額報告
echo"=== 磁盤配額報告 ==="
echo"生成時間:$(date)"
echo""
# 查看所有用戶的配額狀態(tài)
echo"【1】用戶配額匯總:"
repquota -aug
echo""
# 查看超過配額的用戶
echo"【2】超配額用戶:"
repquota -aug | grep -E"^*"|whilereadline;do
echo" $line"
done
echo""
# 清理超過soft limit的用戶的部分文件
echo"【3】可以建議清理的文件(按用戶分組):"
foruserin$(ls /home/);do
quota=$(quota -u"$user"2>/dev/null | tail -1 | awk'{print $3}')
if[ -n"$quota"] && ["$quota"-gt 0 ];then
usage=$(quota -u"$user"2>/dev/null | tail -1 | awk'{print $2}')
if["$usage"-gt"$quota"];then
echo" 用戶$user:使用${usage}KB,配額${quota}KB"
fi
fi
done
8. 預(yù)防性監(jiān)控方案
8.1 Zabbix監(jiān)控模板
# Zabbix Agent配置 - 磁盤監(jiān)控項 # /etc/zabbix/zabbix_agent2.d/disk.conf # 磁盤空間(百分比) UserParameter=disk.space[*],df -h"$1"| awk'NR>1 {gsub(/%/,"",$5); print $5}' # 磁盤inode(百分比) UserParameter=disk.inode[*],df -i"$1"| awk'NR>1 {gsub(/%/,"",$5); print $5}' # 磁盤IO UserParameter=disk.io[*],iostat -d"$1"| awk'NR>4 {print $2}' # 大文件檢測 UserParameter=disk.large_files,find / -typef -size +1G 2>/dev/null | wc -l
8.2 Prometheus告警規(guī)則
# prometheus/alerts/disk.yml
groups:
-name:disk
rules:
# 磁盤空間告警
-alert:DiskSpaceWarning
expr:(node_filesystem_avail_bytes{mountpoint="/"}/node_filesystem_size_bytes{mountpoint="/"})0.2
? ? ? ??for:?5m
? ? ? ??labels:
? ? ? ? ??severity:?warning
? ? ? ??annotations:
? ? ? ? ??summary:?"磁盤空間告警"
? ? ? ? ??description:?"根分區(qū)剩余空間不足20%"
? ? ??-?alert:?DiskSpaceCritical
? ? ? ??expr:?(node_filesystem_avail_bytes{mountpoint="/"}?/?node_filesystem_size_bytes{mountpoint="/"})?0.1
? ? ? ??for:?1m
? ? ? ??labels:
? ? ? ? ??severity:?critical
? ? ? ??annotations:
? ? ? ? ??summary:?"磁盤空間危急"
? ? ? ? ??description:?"根分區(qū)剩余空間不足10%,立即處理!"
? ? ??# inode告警
? ? ??-?alert:?DiskInodesWarning
? ? ? ??expr:?(node_filesystem_files_free{mountpoint="/"}?/?node_filesystem_files{mountpoint="/"})?0.1
? ? ? ??for:?10m
? ? ? ??labels:
? ? ? ? ??severity:?warning
? ? ? ??annotations:
? ? ? ? ??summary:?"Inode告警"
? ? ? ? ??description:?"Inode使用率超過90%"
8.3 自動化監(jiān)控腳本
#!/bin/bash
# script: comprehensive_disk_monitor.sh
# 用途:綜合磁盤監(jiān)控腳本,可配置cron執(zhí)行
# 配置文件
CONFIG_FILE="/etc/sysconfig/disk_monitor.conf"
# 默認(rèn)配置
WARNING_THRESHOLD=80
CRITICAL_THRESHOLD=90
LOG_FILE="/var/log/disk_monitor.log"
EXCLUDE_MOUNTS="/proc|/sys|/dev/shm|/run"
# 讀取配置(如果存在)
[ -f"$CONFIG_FILE"] &&source"$CONFIG_FILE"
log() {
echo"[$(date '+%Y-%m-%d %H:%M:%S')]$1">>"$LOG_FILE"
}
check_mount() {
localmount="$1"
# 獲取使用率
localusage=$(df"$mount"2>/dev/null | awk'NR==2 {gsub(/%/,"",$5); print $5}')
# 獲取設(shè)備
localdevice=$(df"$mount"2>/dev/null | awk'NR==2 {print $1}')
# 獲取可用空間
localavail=$(df -h"$mount"2>/dev/null | awk'NR==2 {print $4}')
if[ -z"$usage"];then
return
fi
localtimestamp=$(date'+%Y-%m-%d %H:%M:%S')
if["$usage"-ge"$CRITICAL_THRESHOLD"];then
log"CRITICAL|${timestamp}|${mount}|${device}|${usage}%|${avail}"
return2
elif["$usage"-ge"$WARNING_THRESHOLD"];then
log"WARNING|${timestamp}|${mount}|${device}|${usage}%|${avail}"
return1
else
log"OK|${timestamp}|${mount}|${device}|${usage}%|${avail}"
return0
fi
}
# 主監(jiān)控
log"========== 磁盤監(jiān)控開始 =========="
# 獲取所有掛載點
mounts=$(df -h | awk'NR>1 {print $6}'| grep -vE"^(${EXCLUDE_MOUNTS})$")
critical_count=0
warning_count=0
formountin$mounts;do
check_mount"$mount"
result=$?
if[$result-eq 2 ];then
critical_count=$((critical_count + 1))
elif[$result-eq 1 ];then
warning_count=$((warning_count + 1))
fi
done
log"========== 監(jiān)控完成 =========="
log"結(jié)果:${critical_count}個危急,${warning_count}個告警"
# 如果有告警,輸出匯總
if[$critical_count-gt 0 ] || [$warning_count-gt 0 ];then
echo""
echo"磁盤告警匯總:"
grep -E"CRITICAL|WARNING""$LOG_FILE"| tail -20
fi
9. 自動化清理腳本分享
9.1 完整清理腳本
#!/bin/bash
# script: full_disk_cleanup.sh
# 用途:一次性執(zhí)行所有常見磁盤清理操作
set-e
echo"========================================"
echo" 磁盤空間全面清理工具"
echo"========================================"
echo""
echo"開始時間:$(date)"
echo""
# 配置
MAX_LOG_DAYS=30
MAX_TMP_DAYS=7
DO_DOCKER_PRUNE=false
DO_DNF_CLEAN=false
DO_KERNEL_CLEAN=false
DRY_RUN=false
# 解析參數(shù)
while[[$#-gt 0 ]];do
case$1in
--docker)
DO_DOCKER_PRUNE=true
shift
;;
--dnf)
DO_DNF_CLEAN=true
shift
;;
--kernel)
DO_KERNEL_CLEAN=true
shift
;;
--dry-run)
DRY_RUN=true
shift
;;
--all)
DO_DOCKER_PRUNE=true
DO_DNF_CLEAN=true
DO_KERNEL_CLEAN=true
shift
;;
*)
echo"未知參數(shù):$1"
echo"用法:$0[--docker] [--dnf] [--kernel] [--all] [--dry-run]"
exit1
;;
esac
done
# 清理函數(shù)
run_cmd() {
if["$DRY_RUN"=true];then
echo"[DRYRUN]$1"
else
echo"[EXEC]$1"
eval"$1"
fi
}
# 1. 清理日志
echo"【1】清理${MAX_LOG_DAYS}天前的日志文件..."
run_cmd"find /var/log -type f -name '*.log' -mtime +${MAX_LOG_DAYS}-delete"
run_cmd"find /var/log -type f -name '*.gz' -mtime +180 -delete"
echo" 完成"
# 2. 清理臨時文件
echo"【2】清理${MAX_TMP_DAYS}天未訪問的臨時文件..."
run_cmd"find /tmp -type f -atime +${MAX_TMP_DAYS}-delete 2>/dev/null || true"
run_cmd"find /var/tmp -type f -atime +${MAX_TMP_DAYS}-delete 2>/dev/null || true"
echo" 完成"
# 3. 清理dnf緩存
if["$DO_DNF_CLEAN"=true];then
echo"【3】清理DNF緩存..."
run_cmd"dnf clean all"
echo" 完成"
fi
# 4. 清理舊內(nèi)核
if["$DO_KERNEL_CLEAN"=true];then
echo"【4】清理舊內(nèi)核..."
current_kernel=$(uname -r)
installed_kernels=$(rpm -q kernel 2>/dev/null | wc -l)
if["$installed_kernels"-gt 2 ];then
forkernelin$(rpm -q kernel 2>/dev/null | sed's/kernel-//');do
if["$kernel"!="$current_kernel"];then
run_cmd"rpm -e kernel-${kernel}2>/dev/null || true"
fi
done
fi
echo" 完成"
fi
# 5. Docker清理
if["$DO_DOCKER_PRUNE"=true];then
echo"【5】清理Docker空間..."
ifcommand-v docker &> /dev/null;then
run_cmd"docker system prune -f"
else
echo" Docker未安裝,跳過"
fi
fi
# 6. 清理yum緩存
echo"【6】清理YUM/DNF緩存..."
run_cmd"yum clean all 2>/dev/null || true"
echo" 完成"
# 7. 清理孤兒包
echo"【7】清理孤兒包..."
run_cmd"package-cleanup --leaves 2>/dev/null | head -20 || true"
echo" 完成"
# 8. 清理舊日志輪轉(zhuǎn)狀態(tài)
echo"【8】清理logrotate狀態(tài)..."
run_cmd"find /var/lib/logrotate -type f -mtime +60 -delete 2>/dev/null || true"
echo" 完成"
echo""
echo"========================================"
echo"清理完成!"
echo"結(jié)束時間:$(date)"
echo""
echo"當(dāng)前磁盤使用情況:"
df -h /
echo"========================================"
# 估算釋放空間(如果可能)
if["$DRY_RUN"=false];then
echo""
echo"各目錄清理后大小:"
fordirin/var/log/tmp /var/tmp /var/cache;do
if[ -d"$dir"];then
size=$(du -sh"$dir"2>/dev/null | cut -f1)
echo" $dir:$size"
fi
done
fi
9.2 定時任務(wù)配置
# 將以下內(nèi)容添加到crontab # 編輯: crontab -e # 每天凌晨2點執(zhí)行快速磁盤檢查 0 2 * * * /opt/scripts/quick_disk_check.sh >> /var/log/disk_check.log 2>&1 # 每天凌晨3點執(zhí)行日志清理(保留30天) 0 3 * * * /opt/scripts/clean_old_logs.sh # 每周一凌晨4點執(zhí)行全面清理 0 4 * * 1 /opt/scripts/full_disk_cleanup.sh --docker --dnf --kernel >> /var/log/weekly_cleanup.log 2>&1 # 每5分鐘執(zhí)行磁盤監(jiān)控 */5 * * * * /opt/scripts/disk_alert_monitor.sh
10. 總結(jié):磁盤管理Checklist
10.1 收到告警時的標(biāo)準(zhǔn)處理流程
【第1步:30秒內(nèi)初步判斷】 □ 查看df -h輸出,確認(rèn)是哪個掛載點告警 □ 判斷是/、/data、/var還是其他掛載點 □ 快速判斷使用率是否真的超過閾值 【第2步:5分鐘內(nèi)定位問題】 □ 使用du -h --max-depth=1 定位最大的子目錄 □ 檢查日志目錄(/var/log) □ 檢查臨時目錄(/tmp, /var/tmp) □ 如果是數(shù)據(jù)庫,檢查數(shù)據(jù)目錄 □ 如果是容器環(huán)境,檢查docker目錄 【第3步:確定清理方案】 □ 日志問題:檢查logrotate配置,執(zhí)行手動清理 □ 臨時文件:清理n天前的文件 □ 數(shù)據(jù)庫:檢查表空間,考慮歸檔或清理 □ 容器:執(zhí)行docker system prune 【第4步:執(zhí)行清理】 □ 先備份重要數(shù)據(jù) □ 執(zhí)行清理操作 □ 驗證空間釋放 □ 確認(rèn)服務(wù)正常 【第5步:建立長效機制】 □ 檢查logrotate配置 □ 配置監(jiān)控告警 □ 考慮自動化清理 □ 記錄問題根因
10.2 預(yù)防性維護清單
每日檢查:
□ 確認(rèn)沒有磁盤告警 □ 檢查關(guān)鍵服務(wù)的日志寫入是否正常
每周維護:
□ 審查日志輪轉(zhuǎn)日志 □ 檢查臨時文件增長趨勢 □ 確認(rèn)監(jiān)控告警配置正常
每月維護:
□ 執(zhí)行全面的磁盤審計 □ 清理舊的日志和臨時文件 □ 檢查inode使用率 □ 審查磁盤空間增長趨勢 □ 更新容量規(guī)劃
10.3 容量規(guī)劃參考
| 服務(wù)類型 | 單機容量建議 | 監(jiān)控閾值 |
|---|---|---|
| Web服務(wù)器 | /var/log至少50GB | 告警80% |
| MySQL | 數(shù)據(jù)目錄200GB起步 | 告警70% |
| PostgreSQL | 數(shù)據(jù)目錄100GB起步 | 告警70% |
| Redis | 內(nèi)存2倍大小 | 告警80% |
| Elasticsearch | 磁盤2倍內(nèi)存 | 告警80% |
| Docker Host | 空閑50%以上 | 告警75% |
10.4 快速命令速查表
| 場景 | 命令 |
|---|---|
| 查看磁盤使用 | df -h |
| 查看目錄大小 | du -sh /path |
| 找大文件 | find / -type f -size +1G |
| 找大目錄 | ncdu -x / |
| 清理日志 | > /var/log/xxx.log |
| 清理臨時文件 | find /tmp -type f -atime +7 -delete |
| 清理Docker | docker system prune -a |
| 查看inode | df -i |
| 清理inode | find / -type f -empty -delete |
| LVM擴展 | lvextend -L +50G /dev/vg00/lv |
| 配額的啟用 | quotaon /home |
| 檢查配額 | repquota -aug |
10.5 常見問題解答
Q: 刪除文件后空間不釋放?A: 可能是進程持有文件句柄。檢查lsof +L1,找到占用文件然后重啟相關(guān)進程。
Q: inode滿了怎么辦?A: 查找小文件過多的目錄:find / -type f -size -10k | wc -l,然后清理。
Q: 如何預(yù)測磁盤增長?A: 記錄每日df -h結(jié)果到時序數(shù)據(jù)庫,繪制趨勢圖。簡單方法:df -h >> /var/log/df_history.log。
Q: LVM卷已滿但VG沒有空間?A: 需要擴展VG:添加新磁盤,創(chuàng)建PV,vgextend加入VG,然后lvextend擴展LV。
參考信息
環(huán)境版本:
操作系統(tǒng):Rocky Linux 9.4
內(nèi)核版本:6.8.5
XFS文件系統(tǒng)版本:1.2.1
df/du版本:GNU coreutils 9.1
ncdu版本:1.17
-
Linux
+關(guān)注
關(guān)注
88文章
11801瀏覽量
219424 -
磁盤
+關(guān)注
關(guān)注
1文章
400瀏覽量
26571
原文標(biāo)題:Linux磁盤空間告警?三步快速定位
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
如何在Ubuntu系統(tǒng)中釋放磁盤空間
解決大家Protel99SE文檔太大占磁盤空間的方法
Linux webpack 10.1false磁盤空間報告錯誤
在Linux下增加磁盤空間的步驟
如何在Mac上清理磁盤空間?這些方法你用過了嗎
Linux中的可用磁盤空間如何檢查?
通過df命令顯示磁盤空間使用情況
如何釋放VMware虛擬磁盤未使用空間呢?
linux磁盤空間滿了怎么清理
Linux磁盤空間告警的常見原因和診斷方法
評論