结论:
如果磁盘是ext2,ext3,ext4文件格式,系统默认会为磁盘保留5%的预留空间,这样能保证有些关键应用(比如数据库)在硬盘满的时候有点余地,不致于马上就 crash,给监控系统和管理员一点时间去察觉。
xfs文件格式的磁盘不会划分预留空间。
发现过程:
在一次磁盘打满的场景下,使用了df -h命令来查看磁盘使用率。
[root@test tmp]# df -h
文件系统 容量 已用 可用 已用% 挂载点
devtmpfs 28G 0 28G 0% /dev
tmpfs 28G 0 28G 0% /dev/shm
tmpfs 28G 2.8G 25G 11% /run
tmpfs 28G 0 28G 0% /sys/fs/cgroup
/dev/sda2 192G 183G 0G 100% /
/dev/sda1 488M 128M 325M 29% /boot
tmpfs 5.5G 0 5.5G 0% /run/user/0
惊奇的发现/dev/sda2的 容量≠可用+已用。diff小一点可以理解,但是有10G的差值就无法理解。这10G的空间到底哪里去了呢?
于是问了一下chatgpt,chatgpt告诉我:
在Linux系统中,磁盘的可用空间、已用空间和容量之间的关系是相互依赖的,但也可能存在一些差异。主要的原因包括:
- 文件系统的格式化和分配:在格式化磁盘并创建文件系统时,会为文件系统分配一部分空间作为文件系统的元数据、inode 表、日志等。这些分配给文件系统的空间将从总容量中减去,因此可用空间会小于磁盘的实际容量。
- 保留空间:文件系统通常会保留一部分空间,用于特定操作和系统的需要。这些保留空间用于存储特殊文件、文件系统元数据或者为写入操作提供缓冲空间。因此,这部分空间不包含在可用空间中。
- 超级用户权限:磁盘配额和权限设置可能导致某些空间仅对特定的用户或用户组可见和可用。超级用户(root)具有更高的权限,可能可以访问和使用其他用户没有权限的空间。
- 块大小:磁盘上的数据存储以块为单位进行管理。块大小的设置可能导致存储空间的浪费。当一个文件的大小不是块大小的整数倍时,将会浪费部分空间。
这些因素导致可用空间、已用空间和容量之间存在差异。要了解更准确的磁盘使用情况,可以使用命令行工具如
df
命令来查看文件系统的实际使用情况,它会提供关于可用空间、已用空间和总容量的详细信息。
不甚理解,以至于我甚至怀疑是磁盘碎片化的问题,并且在机器上不小心及进行了清理碎片化的操作。结果无变化。
[root@test tmp]# e4defrag -v /dev/sda2
[255017/256401]/usr/share/tabset/stdcrt: 100% extents: 1 -> 1 [ OK ]
[255018/256401]/usr/share/tabset/vt100: 100% extents: 1 -> 1 [ OK ]
[255019/256401]/usr/share/tabset/vt300: 100% extents: 1 -> 1 [ OK ]
[255020/256401]/usr/share/tabset/std: 100% extents: 1 -> 1 [ OK ]
[255021/256401] “/usr/games”
File is not regular file [ NG ]
Success: [ 212750/256401 ]
Failure: [ 43651/256401 ]
Total extents: 249310->219238
Fragmented percentage: 1%->0%
于是又百度了一下发现可能是磁盘预留空间的问题。于是使用了这个工具进行了磁盘预留空间的查看
[root@test tmp]# tune2fs -l /dev/sda2
tune2fs 1.42.9 (28-Dec-2013)
Filesystem volume name: <none>
Last mounted on: /
Filesystem UUID: d612809a-593c-43ef-8ab3-c81f3c14b0ec
Filesystem magic number: 0xEF53
Filesystem revision #: 1 (dynamic)
Filesystem features: has_journal ext_attr resize_inode dir_index filetype needs_recovery extent 64bit flex_bg sparse_super large_file huge_file uninit_bg dir_nlink extra_isize
Filesystem flags: signed_directory_hash
Default mount options: user_xattr acl
Filesystem state: clean
Errors behavior: Continue
Filesystem OS type: Linux
Inode count: 12779520
Block count: 51117824
Reserved block count: 2555891
Free blocks: 24156089
Free inodes: 12455220
First block: 0
Block size: 4096
Fragment size: 4096
Group descriptor size: 64
Reserved GDT blocks: 1024
Blocks per group: 32768
Fragments per group: 32768
Inodes per group: 8192
Inode blocks per group: 512
Flex block group size: 16
Filesystem created: Wed May 24 14:46:49 2023
Last mount time: Tue Jun 27 16:26:52 2023
Last write time: Tue Jun 27 16:26:48 2023
Mount count: 4
Maximum mount count: -1
Last checked: Wed May 24 14:46:49 2023
Check interval: 0 (<none>)
Lifetime writes: 56 GB
Reserved blocks uid: 0 (user root)
Reserved blocks gid: 0 (group root)
First inode: 11
Inode size: 256
Required extra isize: 28
Desired extra isize: 28
Journal inode: 8
First orphan inode: 3149122
Default directory hash: half_md4
Directory Hash Seed: 9d3dd88a-0510-41d1-abd3-103dbee0f6c9
Journal backup: inode blocks
针对以上输出结果,chatgpt告诉我
根据提供的输出,我可以看到以下关于文件系统的预留空间大小的信息:
- 文件系统位于
/dev/sda2
磁盘分区上。- 预留块数量为 2555891。
- 块大小为 4096 字节。
要计算预留空间的实际大小,您可以使用以下公式:
预留空间大小 = 预留块数量 × 块大小
在这种情况下,预留空间大小 = 2555891 × 4096 = 10,484,299,136 字节 或 9.77GB。
通过这个计算,您可以知道文件系统上的预留空间的实际大小。请注意,这个值是以字节为单位的,如果需要以其他单位表示,可以进行适当的转换。
破案了,那么如何调整这个预留空间的大小呢?
使用 tune2fs 命令可以调整文件系统的预留空间大小。预留空间是为了给文件系统保留一些空间供系统管理员使用,在磁盘空间快满的时候防止系统崩溃。
以下是通过 tune2fs 命令来调整文件系统预留空间大小的步骤:
1.打开终端或命令行界面。
2.运行以下命令,其中 /dev/sdX 是文件系统所在的磁盘设备。请将其替换为您实际使用的设备名称。
sudo tune2fs -m <percentage> /dev/sdX
是您想要设置的预留空间的百分比。例如,如果您想要将预留空间设置为 10%,则将 替换为 10。
3.输入管理员密码并确认命令。
4.命令执行成功后,文件系统的预留空间大小将被调整。
请注意,调整文件系统的预留空间可能会对系统的稳定性和性能产生影响。建议在进行此操作之前备份重要数据,并仔细评估所需的空间和系统需求。
此外,不同的文件系统可能具有不同的默认预留空间大小。您可以使用 tune2fs -l 命令查看当前文件系统的预留空间大小,并据此进行调整。