将 /proc/mnt 链接到 /proc/mounts

将 /proc/mnt 链接到 /proc/mounts

我知道/proc文件系统反映了各种进程的输出。不幸的是,我有一个专有的 ( romdump) 二进制文件,它期望挂载表显示为/proc/mtd,而我的 Android 设备似乎将其输出为/proc/mounts

我尝试创建符号链接,但显然这只适用于实际文件或目录。我怎样才能欺骗这个二进制文件来读取输出/proc/mounts而不是/proc/mtd

答案1

最简单的方法是更改​​二进制文件:

sed s-/proc/mtd-/tmp/mntx- < romdump > romdump.new
ln -s /proc/mounts /tmp/mntx
./romdump.new

由于您正在编辑二进制文件,这里的技巧是确保原始字符串/proc/mtd与新字符串的长度相同/tmp/mntx,这样您就不会更改二进制文件中任何内容的大小或位置。

这并不是万无一失的——如果二进制文件分段构建路径名而不是使用固定字符串,它将无法工作。但这很可能会奏效。

答案2

/proc我不知道在编写模块(或简单的内核代码)之外添加东西的方法。不过可能有一些实用程序。

如果您可以构建并插入一个模块,那么这非常简单:您可以创建另一个符号链接(/proc/mounts已经是一个符号链接)。

来源 (mnt_link.c):

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/proc_fs.h>

#define MODULE_VERS "0.0"
#define MODULE_NAME "mnt_link"

static int __init init_mnt_link(void)
{
    static struct proc_dir_entry *symlink;
    symlink = proc_symlink("mnt", NULL, "self/mounts");
    if(!symlink)
        return -ENOMEM;
    return 0;
}

static void __exit cleanup_mnt_link(void)
{
    remove_proc_entry("mnt", NULL);
}

module_init(init_mnt_link);
module_exit(cleanup_mnt_link);

MODULE_AUTHOR("U&L");
MODULE_LICENSE("CC-WIKI");
MODULE_DESCRIPTION("Create a /proc/mnt symlink to /proc/self/mounts");

生成文件:

obj-m := mnt_link.o
KDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
    $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules

(这假设您将为当前的 Linux 系统构建。要为 Android 构建一些东西,您可以参考:如何为 Android 创建可加载的内核模块?.)

加载模块 ( insmod mnt_link.ko) 后,您应该得到:

$ ls -l /proc/m*nt*
lrwxrwxrwx 1 root root 11 Nov 27 22:43 /proc/mnt -> self/mounts
lrwxrwxrwx 1 root root 11 Nov 27 22:43 /proc/mounts -> self/mounts

话虽如此,您的实用程序很可能会期待除此符号链接之外的其他内容。 (也许这取决于正在加载的另一个模块以在该位置提供一些信息。)

使用风险自负

答案3

可以说 /proc 文件系统存在于内存中。看http://www.kernel.org/doc/Documentation/filesystems/proc.txt了解更多信息。链接可能不起作用。

您也许可以使用 LD_PRELOAD 来拦截 open() 函数。看https://stackoverflow.com/questions/426230/what-is-the-ld-preload-trick

您还可以编辑二进制文件,将文件名从 /proc/mnt 更改为 /proc_mnt 并将其符号链接到 /proc/mounts 。

另一种选择是重新编译内核并使 /proc/mnt 成为 /proc/mounts 的别名。

答案4

您尝试过硬链接吗?

ln /proc/mnt /proc/mounts

相关内容