如何在 Linux / Unix 中使用 df 命令(附示例)
我们使用 df 命令来查找 Linux / Unix 文件系统上的总磁盘空间和可用空间。让我们看看如何使用 df 命令查看 Linux、macOS、*BSD 和 Unix 文件系统上剩余的可用空间量。我们还将解释如何自动监控磁盘空间并向您的移动设备发送电子邮件警报或推送通知。
df 是开发人员必不可少的工具,因为它可以报告 Linux 或 Unix 文件系统上使用的和可用的磁盘空间量。
df 命令详细信息 | |
---|---|
描述 | 报告可用磁盘空间 |
类别 | 磁盘管理 |
难度等级 | 简单的 |
Root 权限 | 不 |
操作系统兼容性 | FreeBSD • Linux • macOS • NetBSD • OpenBSD • Unix • WSL |
预计阅读时间 | 6 分钟 |
df 命令是什么?↑
df 是“disk free”的缩写。
df 命令显示文件系统上已使用和可用的空间量。文件系统不过是目录的层次结构。例如,图 01 显示了安装在我的 Linux 笔记本电脑上的根目录 (/) 中的所有内容,它是使用tree 命令的目录层次结构中的顶级目录。某些文件系统(例如 /mirror-example-m6700 或 /media)的物理位置位于不同的分区/USB 磁盘或网络上的另一台计算机上。
图 01:以 / (根目录)为顶级目录的目录层次结构
目的↑
使用 df 命令显示文件系统上的可用空间:
- 查看已用空间。
- 查看可用磁盘空间。
- 显示已挂载的文件系统。
- 查看分区或其他设备联网设备是否已达到磁盘容量。
- 列出Linux 和 Unix 系统上仍可用的inode数量
- 了解给定分区上是否有足够的空间,以便开发人员或系统管理员可以安装/升级应用程序
- 当磁盘空间不足时,使用shell 脚本或Perl 脚本发送电子邮件警报或文本消息。
语法↑
df 命令的基本语法是 strethforward:
df 命令以 1k 块为单位显示所有已挂载的磁盘空间。
$ df
$ df /dir
$ df [option] [/dev/DEVICE]
使用df命令
要查看有关所有已安装的 Linux 或 Unix 文件系统的信息,请输入:
$ df
GNU/Linux 版本的 df 的输出可能略有不同:
Filesystem 1K-blocks Used Available Use% Mounted on devtmpfs 10240 0 10240 0% /dev shm 3702044 0 3702044 0% /dev/shm rpool/ROOT/alpine 471240576 96435456 374805120 20% / tmpfs 740412 220 740192 0% /run /dev/sda1 91869 28015 56686 33% /boot
df 命令和空间可以为每个设备名称提供以下信息:
- Filesystem:您的文件系统/设备的名称。
- 1K-blocks:以 1KB 块为单位的大小。
- Used:文件系统 (FS) 中现有文件分配和使用的空间总量。
- Avail():文件系统中可用于创建新文件的总空间量(空闲空间)。Used Available
- Capacity(Use%):FS使用的块百分比。
- Mounted on:挂载点就是挂载到的目录。
请注意,一些高级文件系统和 df 版本也可以报告系统保留的空间。
示例↑
df 命令还有更多选项。让我们来探索一下最常用的选项。
文件系统信息
要显示有关文件系统的信息/boot,/rsnapshot请运行:
这是我看到的:
$ df /boot
$ df /rsnapshot
Filesystem 1K-blocks Used Avail Capacity Mounted on zroot/rsnapshot 3133726266 83069592 3050656673 3% /rsnapshot
我们可以以各种块格式显示信息。例如,查看 1M 字节块,运行:
对于 1 Gibibyte 块,运行:
我们可以明确使用 512 字节块:
传递1024 字节块(默认):
除了 FS 挂载点(例如 /aws_efs)外,我们还可以指定 ZFS 设备,例如 zroot/var/log 或 /dev/md0(Linux RAID)和 /dev/sdb1(Linux 分区):
$ df -m
$ df -m /boot
$ df -g
$ df -g /var
$ df -b
$ df -b /usr
-k
$ df -k
$ df -k zroot/var/log
$ df /aws_efs
$ df zroot/ROOT/default
$ df /dev/md0
$ df -h /dev/sdb1
人类可读的输出
也许最重要的是通过传递选项实现“人类可读”的输出-h。它使用单位后缀,例如字节、千字节、兆字节、吉字节、太字节和皮字节(基于 1024 的幂)。由于 df 将位数减少到四位或更少,因此您可以轻松阅读。请注意,-H与 相同,-h但基于 1000 的幂:
$ df -h # lowercase 'h'
$ df -H # UPPERCASE 'H'
$ df -H zroot/tmp
$ df -H /dev/md0
Filesystem Size Used Avail Capacity Mounted on zroot/ROOT/default 3.3T 129G 3.1T 4% / devfs 1.0k 1.0k 0B 100% /dev zroot/tmp 3.1T 164k 3.1T 0% /tmp zroot 3.1T 131k 3.1T 0% /zroot zroot/rsnapshot 3.2T 85G 3.1T 3% /rsnapshot zroot/backuplxdimages 3.5T 350G 3.1T 10% /backuplxdimages zroot/jails 3.1T 131k 3.1T 0% /jails zroot/usr/home 3.2T 33G 3.1T 1% /usr/home zroot/var/crash 3.1T 638M 3.1T 0% /var/crash zroot/var/mail 3.1T 257k 3.1T 0% /var/mail zroot/var/audit 3.1T 131k 3.1T 0% /var/audit zroot/var/log 3.1T 2.6M 3.1T 0% /var/log zroot/usr/ports 3.1T 1.0G 3.1T 0% /usr/ports zroot/var/tmp 3.1T 131k 3.1T 0% /var/tmp zroot/usr/src 3.1T 131k 3.1T 0% /usr/src zroot/jails/dnscrypt 3.1T 887M 3.1T 0% /jails/dnscrypt zroot/jails/fullbasejail 3.1T 692M 3.1T 0% /jails/fullbasejail devfs 1.0k 1.0k 0B 100% /jails/dnscrypt/dev
打印文件系统类型
想要在 df 命令输出中包含文件系统类型?尝试传递-T选项:
以下输出表明 /dev/md0 格式为 ext4:
$ df -T
$ df -T -H
$ df -T -H zroot/usr/ports
$ df -T -H /dev/md0
Filesystem Type Size Used Avail Use% Mounted on
/dev/md0 ext4 3.9G 350M 3.4G 10% /boot
另一个输出表明我的 Thinkpad 笔记本电脑上的 vfat FS 安装在 /boot/efi 上:
$ df -T -H /dev/nvme0n1p1
Filesystem Type Size Used Avail Use% Mounted on /dev/nvme0n1p1 vfat 998M 46M 952M 5% /boot/efi
我们还可以看到包含文件 /backuplxdimages/ncbz01/01-03-2021/rss-feed-worker-backup.tar.xz 的文件系统的可读信息:
$ df -HT /backuplxdimages/ncbz01/01-03-2021/rss-feed-worker-backup.tar.xz
Filesystem Type Size Used Avail Capacity Mounted on
zroot/backuplxdimages zfs 3.5T 350G 3.1T 10% /backuplxdimage
显示有关可用和已用 inode 数量的统计信息
传递-i如下命令来显示索引节点(inodes)信息:
现在我们也知道了 inode 的数量:
$ df -i
$ df -i -H
$ df -i -H -T
Filesystem Type Inodes IUsed IFree IUse% Mounted on udev devtmpfs 2.1M 317 2.1M 1% /dev tmpfs tmpfs 2.1M 556 2.1M 1% /run /dev/xvda1 ext4 41M 105k 41M 1% / tmpfs tmpfs 2.1M 1 2.1M 1% /dev/shm tmpfs tmpfs 2.1M 3 2.1M 1% /run/lock tmpfs tmpfs 2.1M 18 2.1M 1% /sys/fs/cgroup /dev/loop0 squashfs 17 17 0 100% /snap/amazon-ssm-agent/2996 /dev/loop1 squashfs 16 16 0 100% /snap/amazon-ssm-agent/3552 /dev/loop3 squashfs 13k 13k 0 100% /snap/core/10958 /dev/loop4 squashfs 11k 11k 0 100% /snap/core18/1988 /dev/loop5 squashfs 11k 11k 0 100% /snap/core18/1997 /dev/loop6 squashfs 1.6k 1.6k 0 100% /snap/lxd/20371 tmpfs tmpfs 2.1M 3 2.1M 1% /var/snap/lxd/common/ns /dev/loop8 squashfs 13k 13k 0 100% /snap/core/11081 /dev/loop2 squashfs 1.6k 1.6k 0 100% /snap/lxd/20400 tmpfs tmpfs 2.1M 22 2.1M 1% /run/user/1000
获取总可用磁盘空间
--total我们可以省略所有对可用空间无关紧要的条目,并通过将选项传递给 df 命令来产生如下总数:
$ df -h --total
$ df -t ext4 -t vfat -h --total -T
Filesystem Type Size Used Avail Use% Mounted on /dev/mapper/vgubuntu-root ext4 915G 165G 705G 19% / /dev/nvme0n1p2 ext4 1.4G 392M 925M 30% /boot /dev/nvme0n1p1 vfat 511M 30M 482M 6% /boot/efi total - 917G 165G 706G 19% -
显示所有挂载点,包括使用各种标志挂载的挂载点
传递-a以查看所有文件系统:
$ df -a
在大多数情况下,您可能希望隐藏文件系统的输出,例如 udev、tmpfs、cgroup、securityfs、lxcfs、devfs 等。我们可以使用grep 命令/ egrep 命令或通过传递-t FS_TYPE选项来限制列出 FS_TYPE 类型的文件系统::
$ df -T | grep -v squashfs
$ df -T | grep -E -v 'squashfs|lxcfs|udev'
$ df -t ext4
$ df -t zfs
$ df -t zfs,ext4,vfat
自定义 df 命令输出
我们可以使用以下语法自定义输出:
$ df --output=FIELD_LIST
有效字段名称为:“source”、“fstype”、“itotal”、“iused”、“iavail”、“ipcent”、“size”、“used”、“avail”、“pcent”、“file”和“target”。因此:
$ df -h --output=source,fstype,size
磁盘警报shell脚本↑
下面是一个示例 shell 脚本,用于监控我的 AWS EC2 和 Linode 服务器磁盘空间使用情况,并在磁盘使用率超过 90% 时发送电子邮件警报和推送移动通知
#!/bin/bash # Name: disk-monitor-script.sh # Usage: Poor mans disk space monitoring script to alert sysadmin/developer before running # out of disk/partition space. # Author: Vivek Gite under GPLv 2.x+ # # Warning: *** DO NOT USE THIS SCRIPT BLINDLY. *** # *** This script mostly fails in your environment if requirements are not met. *** # # Prerequisite (or as per your set up): # You must have working SMTPD/email routing in place and subscription to pushover # notifications service for Android, iPhone, iPad, etc all: # a) Pushover - https://www.example.com/mobile-devices/android/how-to-push-send-message-to-ios-and-android-from-linux-cli/ # b) AWS SES - https://www.example.com/faq/how-to-send-emails-with-postfix-and-amazon-aws-ses-on-rhel-centos-8/ # # Tested on - RHEL 7.x/8.x and Debian/Ubuntu LTS versions # # Last revised - 12/Jan/2017 by Vivek Gite, added $DC_P # ----------------------------------------------------------------------------------------- DC_P="AWS" # either AWS or Linode ADMIN="foo@somewhere-tld" FROM="system-user-ec2@my-corp-tld" SUBJECT="Alert out of disk space - $HOSTNAME [${DC_P}]" # Set alert level 90% is default ALERT=90 # See https://www.example.com/mobile-devices/android/how-to-push-send-message-to-ios-and-android-from-linux-cli/ source /home/scripts/cli_app.sh # Send html email and push notification to my iPhone/Android device df -H | grep -vE '^Filesystem|tmpfs|udev' | awk '{ print $5 " " $1 }' | while read -r output; do usep=$(echo "$output" | awk '{ print $1}' | cut -d'%' -f1 ) partition=$(echo "$output" | awk '{ print $2 }' ) if [ $usep -ge $ALERT ]; then ( echo "From: $FROM" echo "To: $ADMIN" echo "Subject: $SUBJECT" echo "Content-Type: text/html" echo echo "<html>" echo "<p>Hostname : $HOSTNAME</p>" echo "<p>Date : $(date)</p>" echo "<p>Running out of disk space on: <strong>$partition</strong> <span style='color: rgb(255, 0, 0);'>${usep}</span>%</p>" echo "<p><h4>Current disk space usage:</h4>" echo "$(df -H | column -t)" echo "</p>" echo "<p><h4>Current memory usage:</h4>" echo "$(free -m)" echo "</p>" echo "You own me one." echo "<p>-- $0</p>" echo "</html>" echo ) | sendmail -f "$FROM" "$ADMIN" push_to_mobile "$0" "Alert out of disk space - $HOSTNAME [${DC_P}] Running out of disk space on: $partition (${usep}%) Current disk space usage: $(df -H | column -t) " fi done
使用cron job运行此脚本:
@daily /path/to/disk-monitor-script.sh
获取有关 df 命令的帮助↑
以上都是标准的 df 命令选项。但是,不同的 Unix 版本提供了额外的选项。您可以通过键入以下 man 命令来了解这些选项,或者在线查看*BSD 和 macOS 使用的 BSD/df 版本。请参阅此处的 GNU/Linux df版本帮助页面:
$ man df
$ df --help
总结↑
您了解了Linux 或 Unix 上的 df 命令及其选项。我们还解释了各种df 命令示例。Linux 开发人员和 Unix 系统管理员需要监视磁盘空间使用情况。否则,您可能会耗尽磁盘空间。以下是供您参考的简要摘要:
df 选项 | 描述 |
---|---|
-P | POSIX 输出格式。明确使用 512 字节块。 |
-k | 1024 字节块(默认) |
-m | 1M 字节块 |
-g | 1 GiB 区块 |
-h | 人类可读(例如 1K 243M 2G) |
-H | 1000 个区块可供人类阅读 |
-T | 打印文件系统类型 |
-t type | 限制列出类型为 TYPE 的文件系统 |
-a | 显示所有文件系统 |
-i | 获取有关 Inode 的信息 |
-B SIZE | 设置块大小。您也可以使用BLOCKSIZE环境变量。例如, BLOCKSIZE=512 df |
使用 man 命令或 help 命令查看以下手册页:
$ man df
# gnu/linux df #
$ df --help