加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

linux – 如何回收稀疏文件的零块?

发布时间:2020-12-13 18:28:19 所属栏目:Linux 来源:网络整理
导读:考虑一个稀疏文件,其中1s写入文件的一部分. 我想要回收这些1的磁盘上的实际空间,因为我不再需要稀疏文件的那部分.包含这些1的文件的部分应该成为一个“洞”,就像在1s被写入之前一样. 为了做到这一点,我将该地区清除为0.这不会回收磁盘上的块. 如何真正使稀疏
考虑一个稀疏文件,其中1s写入文件的一部分.

我想要回收这些1的磁盘上的实际空间,因为我不再需要稀疏文件的那部分.包含这些1的文件的部分应该成为一个“洞”,就像在1s被写入之前一样.

为了做到这一点,我将该地区清除为0.这不会回收磁盘上的块.

如何真正使稀疏文件再次稀疏?

这个问题类似于this one,但是这个问题没有一个可接受的答案.

考虑在股票Linux服务器上运行的以下事件序列:

$cat /tmp/test.c
#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
#include <string.h>

int main(int argc,char **argv) {
    int fd;
    char c[1024];

    memset(c,argc==1,1024);

    fd = open("test",O_CREAT|O_WRONLY,0777);
    lseek(fd,10000,SEEK_SET);
    write(fd,c,1024);
    close(fd);

    return 0;
}

$gcc -o /tmp/test /tmp/test.c

$/tmp/test

$hexdump -C ./test
00000000  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00002710  01 01 01 01 01 01 01 01  01 01 01 01 01 01 01 01  |................|
*
00002b10

$du -B1 test; du -B1 --apparent-size test
4096        test
11024       test

$/tmp/test clear

$hexdump -C ./test
00000000  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00002b10

$du -B1 test; du -B1 --apparent-size test
4096        test
11024       test

# NO CHANGE IN SIZE.... HMM....

编辑 –

让我进一步的资格,我不想重写文件,复制文件等.如果不可能以某种方式释放以前分配的块原位,那么是这样,但我想确定这是否实际可能或不.在这一点上似乎是“不,不是”.我想我正在寻找Linux的sys_punchhole(讨论我刚刚发现).

解决方法

现在看来,只有NTFS支持打孔.这在大多数文件系统中一直是一个问题. POSIX据我所知,没有定义一个操作系统界面打孔,所以没有一个标准的Linux文件系统有它的支持. NetApp在 WAFL文件系统中支持通过Windows打孔.有一个关于这个 here的漂亮的博文.

对于您的问题,正如其他人所指出的,唯一的解决方案是移动文件,而不包含包含零的块.是的,它会慢一点或者在Linux上为您的文件系统写一个扩展名,并在Linux内核团队中为patch patch提供good folks.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读