先说一下最基础也最常用的磁盘检查命令——df,全称是 display free disk space,中文常称为“磁盘空间显示命令”。使用起来非常简单,直接输入 df 就能看到各个挂载点的磁盘占用情况。


在 FreeBSD 系统下,查看磁盘和目录的空间占用,主要依靠两个命令:df 和 du。从实际运维经验来看,这两个命令各有明确分工,搭配使用才是高效管理磁盘的最佳方式。
先看 df 的几个核心参数:
a:显示全部文件系统及各分区磁盘使用情况
i:显示 inode 的使用量
k:大小用 KB 表示(默认值)
t:只显示某个文件系统的所有分区磁盘使用量
x:显示不属于某个文件系统的所有分区磁盘使用量
T:显示每个分区所属的文件系统名称
日常用得最多的组合是 df -hi,既能查看磁盘空间,又能查看 inode 占用情况。
操作详解
直接看一个实际例子:
# df -h
Filesystem Size Used A vail Capacity Mounted on
/dev/ad0s1a 1.9G 389M 1.4G 21% /
devfs 1.0K 1.0K 0B 100% /dev
/dev/ad0s1d 989M 54K 910M 0% /tmp
/dev/ad0s1f 4.8G 3.8G 657M 86% /usr
/dev/ad0s1e 1.9G 149M 1.6G 8% /var
/dev/ad0s1g 26G 890K 24G 0% /volume2
/dev/da0s1d 325G 261G 38G 87% /volume1
加上参数 -h 后,输出会以 GB、MB 等人类可读格式显示。上面第一列是文件系统名称,最后一列是挂载点。可以看到 /dev/ad0s1a 挂载在根目录下。注意命名规则:ad 代表 IDE 硬盘,s1 表示第一个主分区。另外还有一个 SCSI 硬盘用 da 命名,主要存放数据。devfs 是个特殊文件系统,不是真正的磁盘,而是 FreeBSD 管理硬件设备的虚拟文件系统。
后面几列——Size、Used、A vail、Capacity——分别代表分区容量、已用量、剩余量和使用百分比。有个细节值得留意:当硬盘快满时,使用百分比可能超过100%。这是因为 FreeBSD 会给 root 预留一些空间,确保管理员在磁盘满时还能写入文件做运维操作。
再看看 inode 的情况,用参数 -i:
# df -ih
Filesystem Size Used A vail Capacity iused ifree %iused Mounted on
/dev/ad0s1a 1.9G 389M 1.4G 21% 20495 262127 7% /
devfs 1.0K 1.0K 0B 100% 0 0 100% /dev
/dev/ad0s1d 989M 62K 910M 0% 24 141286 0% /tmp
/dev/ad0s1f 4.8G 3.8G 657M 86% 311439 348015 47% /usr
/dev/ad0s1e 1.9G 149M 1.6G 8% 1758 280864 1% /var
/dev/ad0s1g 26G 890K 24G 0% 12 3532786 0% /volume2
/dev/da0s1d 325G 261G 38G 87% 707277 43311409 2% /volume1
根目录下已用 inode 是 20495,还剩 262127 可用。有经验的运维都知道,inode 的重要性不容忽视——有时候磁盘空间没满,但就是写不进新文件,十有八九是 inode 耗尽了。
话说回来,什么是 inode?简单理解,inode 就是存储文件和目录元数据的地方,包括时间戳、文件名、用户和组信息等。分区时系统会预先分配一批 inode,这个数量决定了该分区能承载的文件和目录总数。如果存储的都是小文件,相同空间下文件数量会更多,自然需要更多的 inode 来支撑。
du:查看文件或目录的磁盘占用
du 命令的参数也很有用:
a:显示全部目录和子目录下每个文件占用的磁盘空间
b:大小用字节表示(默认 KB)
c:最后显示总计(默认)
s:只显示各文件大小的总和
x:只计算同一文件系统中的文件
L:计算所有文件大小
常用组合是 du -a。
操作详解
du 命令以指定目录下的子目录为单位,显示每个目录内所有文件占用的磁盘空间。看个例子:
# du -h /etc
104K /etc/defaults
6.0K /etc/X11
8.0K /etc/bluetooth
4.0K /etc/gnats
52K /etc/isdn
388K /etc/mail
68K /etc/mtree
2.0K /etc/ntp
38K /etc/pam.d
44K /etc/periodic/daily
6.0K /etc/periodic/monthly
42K /etc/periodic/security
16K /etc/periodic/weekly
110K /etc/periodic
6.0K /etc/ppp
318K /etc/rc.d
2.0K /etc/skel
130K /etc/ssh
10K /etc/ssl
1.7M /etc
同样用了 -h 参数输出可读格式。实际排查磁盘占用时,du 的输出往往很长,可以用 -s 参数只显示目录总和:
# du -sh /etc
1.7M /etc
更实用的操作是把结果传给 sort 做排序,快速定位磁盘空间占用大头:
# du /etc | sort -nr | more
1746 /etc
388 /etc/mail
318 /etc/rc.d
130 /etc/ssh
110 /etc/periodic
104 /etc/defaults
68 /etc/mtree
52 /etc/isdn
44 /etc/periodic/daily
42 /etc/periodic/security
38 /etc/pam.d
16 /etc/periodic/weekly
10 /etc/ssl
8 /etc/bluetooth
6 /etc/ppp
6 /etc/periodic/monthly
6 /etc/X11
4 /etc/gnats
2 /etc/skel
2 /etc/ntp
sort 的 -nr 参数表示按数字反向排序。需要注意,排序时不能使用 human-readable 格式输出,否则带 K、M 的字母会导致排序错乱。
实用技巧:如果想快速查看 /pig 目录下所有文件夹按大小倒序排列,可以这样写:
# du -sh /pig/* | sort -nr | more
