linux - 在 Linux 中创建一个虚拟文件

标签 linux file-io filesystems virtual

我正在使用一些我无法更改的现有软件,它从一堆配置文件中加载其配置数据,所有配置文件都遵循相同的命名方案——比方说,file_param1.conf、file_param2.conf、file_param3.conf等等。文件内容之间的区别只是 param1 vs param2 vs param3,所以典型的配置文件看起来像

foo=bar
x=param1

foo=bar
x=param2

是否有任何关于在 Linux 中创建虚拟文件系统的示例,可以让我在访问 file_param1.conf 时使用适当的参数变量动态生成文件?我知道 scriptfs 但不知道有关使用它的任何教程。

最佳答案

(作为答案发布,因为这对于评论来说太长了。)

您可能会发现使用 LD_PRELOAD 库并插入 open()/fopen()/open64 更容易() 或您现有软件用来访问您的配置文件并将应用程序提供的文件名替换为指向您要使用的文件的文件名的任何确切的库调用。

这段代码不在我的脑海中,我还没有尝试编译它:

#include <dlfcn.h>

// don't want to #include anything else or we're likely to get
// the vararg prototype for open()
int strcmp( const char *s1, const char *s2 );

// typedef a function pointer
typedef int ( *open_func_ptr_t )( const char *, int, mode_t );
static open_func_ptr_t real_open = NULL;

int open( const char *pathname, int flags, mode_t mode )
{
    // find the real open() call
    if ( real_open == NULL )
    {
        real_open = ( open_func_ptr_t ) dlsym( RTLD_NEXT, "open" );
    }

    if ( 0 == strcmp( pathname, "/path/to/config/file" );
    {
        pathname = "/path/to/replacement/config/file";
    }

    return( real_open( pathname, flags, mode ) );
}

该代码依赖于这样一个事实,尽管 open() 由于当前 C 代码的限制而被声明为可变参数函数,但最初 C 没有原型(prototype),因此所有函数都是 事实上可变参数函数。 open() 调用仅在需要时访问 mode 参数,因此 open() 并不总是需要传递 模式参数。对于当前的 C,唯一的方法是使用 vararg 函数。这使得 #include 文件与此代码有问题,因为 open() 的任何声明都将是 vararg 声明,这将导致代码无法编译。为了编译,您可能需要将 mode_t 替换为 int(或 typedef 的任何内容)。

cc [-m64|-m32] -shared source.c -ldl -o mylib.so 编译它。您需要 -ldl 链接到 dlsym(),并且您需要正确的 -m64-m32选择获取 64 位或 32 位库以匹配您的应用程序。

然后将 LD_PRELOAD 设置为您的 .so 文件:

LD_PRELOAD=/path/to/mylib.so
export LD_PRELOAD

然后使用设置的 LD_PRELOAD 运行您的应用程序。您还需要非常小心,您的应用程序生成的任何子进程都与共享对象 LD_PRELOAD 设置的一样,都是 32 位或 64 位的。如果您不想混合处理 32 位和 64 位进程,请阅读 man page for ld.so并特别注意 $PLATFORM 部分。

另请注意,由于修改 real_open 的竞争条件,该代码不可重入,并且可能存在对 open() 的多线程访问问题。

关于linux - 在 Linux 中创建一个虚拟文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34026247/

相关文章:

c - 为什么我的简单 C 程序向标准输出显示垃圾信息?

java - 文件到数组到 JTable(索引越界)

android - 使用外部 Android 应用程序安全地打开文件,无需将文件复制到外部存储

python - 如何用python获取某个路径的设备文件和分区号?

java - 是否可以使用 Java 格式化内存棒、笔式驱动器或磁盘?

c++ - 关于意外断电的原子写入

Java 获取 bash root 访问权限

c++ - P2P 连接的 NAT 穿越实现

linux - bash 和 linux 内核中的 Shebang 行限制

python - 如何将 Wireshark 处理的数据转发给 python?用什么样的方法?