如何列出安装在非空目录(影子目录)上的所有磁盘?

如何列出安装在非空目录(影子目录)上的所有磁盘?

我的 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"

相关内容