为什么我的空文件夹有 134 GB 大小?

为什么我的空文件夹有 134 GB 大小?

我将文件从旧服务器移到了新服务器。我不知道为什么,但当我想压缩文件夹时,它总是挂在某个文件夹中。

一开始我以为失败了,所以按 取消ctrl+c,但是我试了多次,结果总是一样。

我的 zip 命令是:

zip -r backup.zip /var/www -x '*.log*'

我尝试了很多zip带有或不带有参数/arg 的命令但仍然挂在/admin/storage/logs/0目录中。

挂断时,zip 过程仍在运行,因此我尝试等待大约 3 个小时,直到它完成。

完成后,我将.zip这个 7.7 GB 大小的文件移动到新服务器,然后尝试提取它。提取时返回:

/admin/storage/logs/0:写入错误(磁盘已满?)

我的新服务器有 160 GB,而旧服务器只有大约 15 GB。是什么导致新服务器已满?

经过研究,我发现文件夹/admin/storage/logs/有 134 GB 大小,但当我运行命令时ls它是空的。我删除了该文件夹,但当我运行时,df -h使用的磁盘空间仍然相同。

以下是我的命令历史记录:

root@ip-172-26-4-220:/var/www/www/admin/storage# du -hs * | sort -rh
134G    logs
1.2G    app
32K framework
8.0K    debugbar
root@ip-172-26-4-220:/var/www/www/admin/storage# cd logs/
root@ip-172-26-4-220:/var/www/www/admin/storage/logs# du -hs * | sort -rh
134G    0
root@ip-172-26-4-220:/var/www/www/admin/storage/logs# cd ..
root@ip-172-26-4-220:/var/www/www/admin/storage# rm -r logs/
root@ip-172-26-4-220:/var/www/www/admin/storage# du -hs * | sort -rh
1.2G    app
32K framework
8.0K    debugbar
root@ip-172-26-4-220:/var/www/www/admin/storage# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/root       156G  156G  2.2M 100% /
devtmpfs        3.9G     0  3.9G   0% /dev
tmpfs           3.9G     0  3.9G   0% /dev/shm
tmpfs           796M  832K  796M   1% /run
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           3.9G     0  3.9G   0% /sys/fs/cgroup

如何释放空间?

旧服务器上的admin/storage/logs文件夹只有 52M:

[root@server storage]# du -hs * | sort -rh
3.4G    app
52M logs
2.7M    framework
4.0K    oauth-public.key
4.0K    oauth-private.key
4.0K    debugbar

为什么解压的 .zip 文件大小超过了 134 GB?

[root@server admin]# cd storage/logs/
[root@server logs]# ls -lh
total 51M
-rwxrwxrwx 1 root   root   1.0T Sep 30  2020 0
drwxr-xr-x 2 root   root   8.0K Sep  1 12:00 cron
-rwxrwxrwx 1 apache apache 1.6K Mar  6  2020 frontend-response-2020-03-06.log
-rwxrwxrwx 1 apache apache  720 Mar 23  2020 frontend-response-2020-03-23.log
-rwxrwxrwx 1 apache apache  353 Apr 29  2020 frontend-response-2020-04-29.log
-rwxrwxrwx 1 apache apache  719 Apr 30  2020 frontend-response-2020-04-30.log
-rw-r--r-- 1 apache apache  51M Sep  1 18:00 laravel.log
[root@server logs]# df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        1.9G     0  1.9G   0% /dev
tmpfs           1.9G     0  1.9G   0% /dev/shm
tmpfs           1.9G  188M  1.7G  10% /run
tmpfs           1.9G     0  1.9G   0% /sys/fs/cgroup
/dev/sda2        36G   25G   11G  71% /
tmpfs           379M     0  379M   0% /run/user/0

哇,文件0有 1 TB 大小。但为什么df只使用了 25GB?也许我需要先将其删除,然后再进行迁移?

答案1

该文件/var/www/admin/storage/logs/0很可能是一个稀疏文件。也就是说,它不包含整个长度的实际数据。有些部分从未被写入,因此不占用磁盘上的任何空间。如果读取这些部分,则 Linux 内核只会返回一系列值为 0 的字节,这些字节的压缩效果非常好,因此将zip整个 1 TB 文件放入 7.7 GB 的存档中毫无问题。但是,在解压存档时,unzip它会尝试将所有这些零写入磁盘,因为它不知道旧服务器上实际上并不存在这些零。

您有两种可行的行动方案:

a) 删除旧服务器上的文件,或者至少将其从 zip 存档中排除。它可能不包含任何有用的东西。稀疏日志文件很不常见,通常只会因为某些故障、日志轮换不当或类似情况而发生。

b) 不要使用,而是zip使用支持稀疏文件的归档程序,例如 GNU tar,它能够在新服务器上重新创建稀疏文件。

相关内容