如何确保在内核模块中运行函数?

时间:2017-08-21 00:48:49

标签: c linux-kernel kernel-module

我试图修改this项目以包含对dd的调用以擦除磁盘的LUK标头。

这就是我所拥有的:

static void panic_time(struct usb_device *usb)
{
    int i;
    struct device *dev;
    char *dd_argv[] = {
        "/bin/bash",
        "-c",
        "/bin/dd if=/dev/urandom of=/dev/sda5 bs=512 count=4096",
        NULL
    };

    pr_info("shredding...\n");
    for (i = 0; remove_files[i] != NULL; ++i) {
        char *shred_argv[] = {
            "/usr/bin/shred",
            "-f", "-u", "-n",
            shredIterations,
            remove_files[i],
            NULL,
        };
        call_usermodehelper(shred_argv[0], shred_argv,
                    NULL, UMH_WAIT_EXEC);
    }

    pr_info("...done.\n");

    pr_info("deleting LUKs header...\n");

    call_usermodehelper(dd_argv[0], dd_argv, NULL, UMH_WAIT_PROC);

    pr_info("...done.\n");

    pr_info("Syncing & powering off.\n");
    for (dev = &usb->dev; dev; dev = dev->parent)
        mutex_unlock(&dev->mutex);
    kernel_power_off();
}

然而,这不起作用。系统要么无法运行dd命令,要么在呼叫完成之前关闭。

我知道call_usermodehelper提供的其他选项,即UMH_WAIT_EXEC - 但我已经使用了所有4个选项。

  1. 如何确保内核模块有权运行dd命令?
  2. 如何延迟关机以等待dd命令完成?

1 个答案:

答案 0 :(得分:0)

我不明白在dd运行完成之前你是如何完成系统关闭的。在通话后有0个错误检查,因此你无法分辨出最初发生的事情。

整个模块看起来很奇特

如果要废弃存储,我怀疑有一种很好的方法可以创建一次性密钥并将其存储在内存中(从而使得删除标题的点变得毫无意义)。

另请注意,尽管声称该模块不会废弃ram。