如何在linux kernel 3.5编程中用null/0s/1s替换文件的内容

foo*_*oty 2 c linux filesystems kernel system-calls

如何在linux内核3.5中将文件内容完全删除为0或1,并将其文件名(路径)作为唯一的输入参数?

我研究了unlink系统调用的结构,经过大量的检查调用 int vfs_unlink(struct inode *dir, struct dentry *dentry)

所以从*dentry我怎么能删除文件的内容?或者我应该使用它*dentry

编辑

回答答案:我只是想覆盖数据.我并不是在寻找一个完美的结果.我已经取得了这样的进展:

一方面:使用vfs_unlink

我对以下代码感到困惑:

error = security_inode_unlink(dir, dentry);
if (!error) {
error = dir->i_op->unlink(dir, dentry);
if (!error)
   dont_mount(dentry)
 }
Run Code Online (Sandbox Code Playgroud)

实际取消链接在哪里?

另一种方法:我只是使用write系统调用来编写数据:

我无法理解这些线条:

 143        int size = file->f_path.dentry->d_inode->i_size;
 144        loff_t offs = *off;
 145        int count = min_t(size_t, bytes, PAGE_SIZE);

 151        if (size) {
 152                if (offs > size)
 153                        return 0;
 154                if (offs + count > size)
 155                        count = size - offs;
 156        }
 157
 158        temp = memdup_user(userbuf, count);

 162        mutex_lock(&bb->mutex);
 163
 164        memcpy(bb->buffer, temp, count);
 165
 166        count = flush_write(file, bb->buffer, offs, count);
 167        mutex_unlock(&bb->mutex);
 168
 169        if (count > 0)
 170                *off = offs + count;
 171
 172        kfree(temp);
 173        return count;
Run Code Online (Sandbox Code Playgroud)

谁可以给我解释一下这个?这样我就可以将null写入文件.我的功能可能看起来像这样.

static void write(struct file *file)
Run Code Online (Sandbox Code Playgroud)

我需要帮助.我不是要求代码,但我现在迷路了.

谢谢

PS:我完全清楚如何在用户级程序中做这个非常简单的事情.但这不是我的任务.我必须在内核空间中完成它.我需要帮助(特别是在我熟悉内核编程时理解代码).

And*_*oss 5

这里没有好的答案,当然也不是单个文件的级别.在简单的文件系统(FAT,ext2)上,通常只需打开文件并覆盖它就足够了.但是几乎所有的现代系统都失败了.现代文件系统几乎总是可以配置为记录数据更改(尽管这很少是默认设置),并且数据将保留在日志中,直到它将来恰好被覆盖.即使您知道文件系统已"忘记"存储系统可能没有的数据 - 考虑实时备份或脱机LVM卷的情况.或驱动程序:NAND驱动程序会在写入时常规重新映射块,从而留下"陈旧"内容.甚至是硬件本身:像SSD或MMC这样的闪存技术完全执行相同类型的块重映射,让旧数据通过JTAG等进行读取...

如果您想确保您的数据不在持久存储上,那么现代世界中唯一干净的解决方案就是永远不要在那里写它.将其缓存在RAM中,或将其写入tmpfs(不支持swap!),或者提出某种加密方案,确保存储泄露不会使攻击者可以使用它...