Lua 挂载文件系统

Lua mount filesystem

我想使用 Lua 在 Linux 上安装一个文件系统,但我在 lua 5.4 manual or the LuaFileSytem 库中找不到任何功能。有什么方法可以在 Lua 或现有库中挂载文件系统吗?

与大多数 platform-dependent 系统调用一样,Lua 不会提供开箱即用的映射。 所以你需要一些 C-API 模块来完成这个任务。 看起来 https://github.com/justincormack/ljsyscall is generic "but" focused on LuaJIT and https://luaposix.github.io/luaposix/ 没有提供 mount.

我最近也有类似的需求,结束做C模块:

static int l_mount(lua_State* L)
{
    int res = 0;
    // TODO add more checks on args!
    const char *source = luaL_checkstring(L, 1);
    const char *target = luaL_checkstring(L, 2);
    const char *type   = luaL_checkstring(L, 3);
    lua_Integer flags  = luaL_checkinteger(L, 4);
    const char *data   = luaL_checkstring(L, 5);

    res = mount(source, target, type, flags, data);
    if ( res != 0)
    {
        int err = errno;
        lua_pushnil(L);
        lua_pushfstring(L, "mount failed: errno[%s]", strerror(err));
        return 2;
    }
    else
    {
        lua_pushfstring(L, "ok");
        return 1;
    }
}

#define register_constant(s)\
    lua_pushinteger(L, s);\
    lua_setfield(L, -2, #s);

// Module functions
static const luaL_Reg R[] =
{
    { "mount", l_mount },
    { NULL, NULL }
};

int luaopen_sysutils(lua_State* L)
{
    luaL_newlib(L, R);

    // do more mount defines mapping, maybe in some table.
    register_constant(MS_RDONLY);
    //...
    
    return 1;
}

将其编译为 C Lua 模块,并且不要忘记您需要 CAP_SYS_ADMIN 来调用 mount 系统调用。