我的 Linux 服务器报告安装在 / 上的设备 /dev/sda4 的磁盘空间使用率很高,如下所示:
[root@stormtrooper03 /]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda4 126G 114G 5.5G 96% /
tmpfs 32G 0 32G 0% /dev/shm
/dev/sda2 239M 118M 109M 53% /boot
/dev/sda1 150M 264K 150M 1% /boot/efi
/dev/sda5 63G 52M 60G 1% /home
/dev/sda6 63G 54M 60G 1% /tmp
/dev/sda7 63G 2.6G 58G 5% /usr
/dev/sda3 539G 11G 501G 3% /var
/dev/sdb1 917G 857G 51G 95% /data/1
/dev/sdc1 917G 861G 47G 95% /data/2
/dev/sdd1 917G 282G 627G 31% /data/3
/dev/sde1 917G 861G 47G 95% /data/4
/dev/sdf1 917G 858G 50G 95% /data/5
但是,我知道运行所使用的量远少于此量,du -sh /*
如下所示。我需要清理该设备上的文件设置,但我找不到它们!
[root@stormtrooper03 /]# du -sh /*
6.7M /bin
116M /boot
3.7T /data
356K /dev
30M /etc
172K /home
638M /lib
20M /lib64
16K /lost+found
4.0K /media
4.0K /mnt
3.8G /opt
0 /proc
42M /root
9.2M /sbin
4.0K /selinux
4.0K /srv
0 /sys
2.1M /tmp
2.5G /usr
11G /var
更新
我找到了原因:安装了一个新磁盘,/data/3
该磁盘上有 110GB 的数据,并且在安装磁盘后从文件系统中隐藏起来。
问题的答案为什么挂载发生在现有目录上解释了如何使用来发现原始数据mount --bind
,但它没有解释如果您事先不知道如何查找您的系统是否具有此类“影子”目录。
有没有一种快速方法可以获取安装在非空目录上的磁盘列表,而无需通过 单独检查每个磁盘mount --bind
?
答案1
我解决了这个问题!通过跟踪该服务器上与其他服务器不同的操作,我发现安装在 /data/3 上的磁盘一度停止工作,因此在 /etc/fstab 中将其注释掉。然而系统中的进程并不知道这一点并继续写入/data/3。此时是/中的一个目录。后来更换了坏磁盘并更新了 fstab 条目,因此现在 /data/3 已安装在新磁盘上。不知怎的,旧数据是隐因为似乎没有指向它或其他东西的指针。
当我知道这一点后,我卸载了磁盘 /data/3,现在我可以看到 110GB 的数据设置,我将其删除,然后重新安装磁盘,一切恢复正常。
我不知道是否有任何工具可以找到这样的孤立目录。
答案2
[编辑]: 将此答案保留为一般说明,它不会回答问题的精炼版本。
目录统计是一个很好的图形实用程序,用于查看大文件和目录在系统上的位置。它提供了热图和排序列表。
答案3
如果您在其他地方挂载可能包含隐藏数据的文件系统,那么您可以进入挂载可能隐藏数据的相对位置并查看那里是否有任何数据。
如果sudo ls -A $MOUNTPOINT
产生任何结果,则 处有东西$MOUNTPOINT
。
要查看安装的内容,请mount
单独运行该命令。
以下是一些可用于查找隐藏数据的代码。
#!/bin/bash
TMP="/media/root" # temp location to mount the directory that might have data hidden by a mount point
sudo mkdir -p "$TMP"
sudo mount --bind --read-only -- "/" "$TMP" # if "/" holds the mount point with the hidden by mountpoint data, replace "/" if needed.
# replace `$(mount | awk '{print $3}')` below with the directories you wish to test for hidden data
for LOCATION in $(mount | awk '{print $3}') ; do
if [ -n "$(sudo ls -A "$TMP$LOCATION" 2>/dev/null)" ]; then
echo "data on unmounted \"$LOCATION\"";
fi;
done;
sudo umount "$TMP"
示例输出:
data on unmounted "/run"
data on unmounted "/"
data on unmounted "/var"