【发布时间】:2012-10-05 19:13:19
【问题描述】:
如果将文件名(路径)作为唯一的输入参数,如何在 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)
}
这里实际的取消链接在哪里?
另一种方法:我刚刚使用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;
谁能给我解释一下?这样我就可以将 null 写入文件。我的函数可能看起来像这样。
static void write(struct file *file)
我需要这方面的帮助。我不是要代码,但我现在迷路了。
谢谢
PS:我非常清楚如何在用户级程序中做这个非常简单的事情。但这不是我的任务。我必须在内核空间中进行。我需要这方面的帮助(尤其是在我刚接触内核编程时理解代码)。
【问题讨论】:
-
你为什么要问?将文件管理留给内核文件子系统和内核文件系统实现。他们做得很好。 (他们也做磁盘缓冲!)。
-
@BasileStarynkevitch 我在问,因为我必须做一个任务,这是它的一部分。我被卡住了
-
您是在编写 Linux 用户级应用程序(例如 C 语言)还是内核模块???如果编写应用程序,您不应该关心内核内部的实现细节,因为您只能通过系统调用使用内核。
-
@BasileStarynkevitch 我正在为内核 v3.5 编写代码......它在 VFS 层中
-
@footy -- 简而言之:没有办法 100% 完全删除所有数据痕迹,除非将设备变成灰尘。现在,一个简单的覆盖和取消链接将阻止大多数人看到数据,这对于个人文档等来说通常已经足够了。但是,如果有足够的时间和金钱,您会惊讶于坚定的数据恢复专家可以做什么。如果您在设备上存储绝密数据,那么我建议您使用铝热剂。我已经学会了将驱动器放在带式砂光机上,直到除了灰尘什么也没有。
标签: c linux filesystems kernel system-calls