Linux 查看磁盘空间使用情况

Linux文件系统

1 什么是文件系统

文件系统(Filesystem) 是 用于存储、组织和管理文件 的结构和规则集合。

在 Linux 中,所有东西都是文件,所有存储设备最终都会被挂载到某个目录下。

2 什么是挂载点

挂载点(Mount Point)是文件系统在目录结构中的入口,它表示某个文件系统(磁盘、分区、远程存储)被挂载到哪个目录下。

在 Linux 里,所有存储设备(硬盘、U 盘、网络存储)都必须挂载(mount)到某个目录后才能使用。例如:

/ 代表根目录,所有文件和目录的起点。

/boot 存储 Linux 内核和启动相关的文件。

/mnt 和 /media 一般用于挂载额外的存储设备,如网络磁盘或 USB 设备。

3 挂载点和文件系统的关系

文件系统(Filesystem) 和 挂载点(Mount Point) 是 Linux/Unix 系统中紧密相关的概念。简单来说:

文件系统 是用于存储、组织和管理数据的方式(比如 ext4、xfs、NFS)。挂载点 是文件系统在目录结构中的入口,让用户可以访问存储设备的数据。

一个文件系统必须挂载到某个挂载点,才能被用户和系统访问。

换句话说,挂载点是一个目录,文件系统是数据的存储方式。

1. df命令

功能:显示文件系统的整体磁盘空间使用情况。工作原理:读取文件系统的超级块信息,显示文件系统的总容量、已用空间、可用空间以及挂载点。特点:

显示的是整个分区的空间使用情况,而不是单个文件或目录的空间。输出单位通常是 KB(默认),可以使用 -h 选项以人类可读的形式(如 MB、GB)显示。

示例:

df -h

Filesystem Size Used Avail Use% Mounted on

tmpfs 51G 13M 51G 1% /run

/dev/mapper/ubuntu--vg-ubuntu--lv 394G 367G 9.5G 98% /

tmpfs 252G 0 252G 0% /dev/shm

tmpfs 5.0M 0 5.0M 0% /run/lock

/dev/sda2 2.0G 212M 1.6G 12% /boot

/dev/sda1 1.1G 6.1M 1.1G 1% /boot/efi

tmpfs 10G 32M 10G 1% /tmp

192.168.206.106:/data 28T 22T 5.4T 80% /mnt

tmpfs 1.0M 0 1.0M 0% /var/snap/lxd/common/ns

tmpfs 51G 8.0K 51G 1% /run/user/1003

tmpfs 51G 8.0K 51G 1% /run/user/1000

以上结果的含义

**你的 / 根分区快满了(98%)⚠️

/dev/mapper/ubuntu--vg-ubuntu--lv 只有 9.5G 可用,可能会影响系统运行。建议:

清理 /var/log 下的日志文件:

sudo journalctl --vacuum-time=7d # 只保留最近 7 天日志清理 Docker 镜像:

docker system prune -a查找大文件:

sudo du -ah / | sort -rh | head -20

你使用了一个 28TB 的远程存储

/mnt 挂载了 192.168.206.106:/data,说明你在用 NFS 服务器 作为存储,已使用 22TB,剩余 5.4TB。

大量的 tmpfs

tmpfs 是基于 RAM(内存) 的文件系统,系统重启后会清空:

/dev/shm 用于共享内存,适合进程间通信。/run、/run/user/1000 这些是运行时数据存储。

启动相关分区

/boot(2GB)和 /boot/efi(1.1GB)用来存放 Linux 内核和 UEFI 引导程序。

df -h 单独列出 /mnt

/mnt 本身还是在 / 目录下,但它指向的是远程服务器上的数据,而不是本地磁盘!

df -h 是基于 挂载的文件系统 来显示数据,而不是简单地显示 / 下面所有的内容。

假设 /mnt 只是 / 分区上的普通目录,而没有单独挂载存储,那么 df -h 只会显示 /,不会列出 /mnt:

2. du命令

功能:统计文件或目录占用的磁盘空间。工作原理:递归遍历指定目录下的所有文件和子目录,并计算其大小总和。特点:

可以用于查看单个目录、文件的空间占用情况,而不是整体文件系统。默认输出是以 KB 为单位,可以使用 -h 选项以人类可读形式显示。支持 --max-depth 选项限制递归深度。

例子

du -sh /var/log

输出

2.5G /var/log

参数含义

-s, --summarize display only a total for each argument

-d, --max-depth=N print the total for a directory (or file, with --all)

line argument; --max-depth=0 is the same as

-h, --human-readable print sizes in human readable format (e.g., 1K 234M 2G)

3为什么 ls 不能统计文件夹的大小?

ls 是用来列出文件和目录的信息的工具,它并不直接统计目录的大小。以下是原因:

目录大小只代表元数据占用的空间:

ls -l 输出的目录大小显示的是该目录的元数据,而不是其内容的大小。元数据包括了该目录内的文件名、权限等信息,而不是目录内所有文件和子目录的总大小。

目录本身在磁盘上占用少量空间(一般是 4 KB 左右,具体取决于文件系统),因此用 ls 查看时,目录的大小通常显示为固定值(如 4096 字节)。

递归统计需要更多操作:

统计整个目录的大小需要递归遍历所有子目录和文件,而 ls 并没有设计用于这类操作。

4 本地磁盘和其余磁盘

df -Th

Type 列显示文件系统类型:

本地磁盘:通常是 ext4, xfs, btrfs 或类似类型。

网络文件系统:如 nfs, cifs 等。

临时文件系统:如 tmpfs(通常是基于内存的虚拟文件系统)。

通过文件系统类型,可以快速判断哪些是本地磁盘,哪些是网络文件系统或临时存储。

Filesystem Type Size Used Avail Use% Mounted on

tmpfs tmpfs 152G 3.1M 152G 1% /run

/dev/mapper/ubuntu--vg-ubuntu--lv ext4 98G 16G 78G 17% /

tmpfs tmpfs 756G 0 756G 0% /dev/shm

tmpfs tmpfs 5.0M 0 5.0M 0% /run/lock

/dev/sda2 ext4 2.0G 208M 1.6G 12% /boot

/dev/sda1 vfat 1.1G 6.1M 1.1G 1% /boot/efi

tmpfs tmpfs 152G 8.0K 152G 1% /run/user/1001

tmpfs tmpfs 152G 8.0K 152G 1% /run/user/1002

192.168.206.106:/data nfs4 28T 18T 8.8T 67% /mnt

tmpfs tmpfs 152G 8.0K 152G 1% /run/user/1003

这是因为 /mnt 挂载了一个网络文件系统(NFS),它实际上使用的是远程服务器的存储空间,而不是本地的磁盘空间。因此,/mnt 的存储大小和 / 的大小是分开的,互不相关。

具体原因如下:

挂载机制:

Linux 的目录结构是层级化的树状结构,但挂载机制允许将外部设备(如硬盘分区、网络存储)“挂载”到某个目录上。

当一个文件系统挂载到某个目录(例如 /mnt)时,原来属于该目录的内容会被临时隐藏,显示的是挂载的文件系统内容。

本地磁盘与网络存储的区别:

/ 的大小由本地硬盘的分区(在此例中是 /dev/mapper/ubuntu–vg-ubuntu–lv)决定,总共 98GB。

/mnt 是挂载点,实际存储空间来自网络文件系统 192.168.206.106:/data,它有 28TB 的总空间,其中 8.8TB 可用,18TB 已使用

总结

du 是专门为统计目录及其内容的磁盘占用量而设计的工具,因此更适合此类任务。df不光考虑文件占用空间,还统计被命令和程序占用的空间du命令只计算文件或目录占用的空间

# 查看整体文件系统的空间

df -h

# 查看某个目录的总占用空间

du -sh /path/to/directory

# 列出文件和目录信息

ls -l

Top