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)
实际取消链接在哪里?
我无法理解这些线条:
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:我完全清楚如何在用户级程序中做这个非常简单的事情.但这不是我的任务.我必须在内核空间中完成它.我需要帮助(特别是在我熟悉内核编程时理解代码).
这里没有好的答案,当然也不是单个文件的级别.在简单的文件系统(FAT,ext2)上,通常只需打开文件并覆盖它就足够了.但是几乎所有的现代系统都失败了.现代文件系统几乎总是可以配置为记录数据更改(尽管这很少是默认设置),并且数据将保留在日志中,直到它将来恰好被覆盖.即使您知道文件系统已"忘记"存储系统可能没有的数据 - 考虑实时备份或脱机LVM卷的情况.或驱动程序:NAND驱动程序会在写入时常规重新映射块,从而留下"陈旧"内容.甚至是硬件本身:像SSD或MMC这样的闪存技术完全执行相同类型的块重映射,让旧数据通过JTAG等进行读取...
如果您想确保您的数据不在持久存储上,那么现代世界中唯一干净的解决方案就是永远不要在那里写它.将其缓存在RAM中,或将其写入tmpfs(不支持swap!),或者提出某种加密方案,确保存储泄露不会使攻击者可以使用它...