长话短说

长话短说

长话短说

当通过mount命令安装fuse文件系统时,环境变量不会传递给fuse脚本。为什么?

语境

我正在尝试通过fuse挂载hdfs(hadoop文件系统)。

这在命令行上很容易:

# Short example version:
LD_LIBRARY_PATH=blah hadoop-fuse-dfs -onotrash  dfs://ambari:8020 /mnt/hdfsfuse
# Actual version with full path for completeness
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/hadoop/yarn/local/filecache/11/mapreduce.tar.gz/hadoop/lib/native /usr/hdp/2.5.0.0-1245/hadoop/bin/hadoop-fuse-dfs -onotrash  dfs://ambari:8020 /mnt/hdfsfuse

这一切都很好,但是如果我将 FS 的定义放在 /etc/fstab 中然后使用 mount 命令,我最终会得到:

fusion_dfs:加载共享库时出错:libjvm.so:无法打开共享对象文件:没有这样的文件或目录

查看 hadoop-fuse-dfs 脚本并添加调试输出,我发现 LD_LIBRARY_PATH 在此脚本中被视为空(如果我首先导出 LD_LIBRARY_PATH 或在命令开头添加它,这都是正确的)

系统

hdp 2.5、centos 7

问题

如果没有将挂载脚本重写为硬编码 LD_LIBRARY_PATH,我如何才能通过挂载传递一般环境变量?

答案1

您可以编写自己的安装熔丝助手,然后它调用真正的熔丝脚本。在 fstab 条目的简单情况下,例如:

dfs://ambari:8020  /mnt/hdfsfuse  fuse.mydfshelper  flag,flag,...

然后/usr/bin/mydfshelper用 args 调用你的脚本

dfs://ambari:8020 /mnt/hdfsfuse -o flag,flag,...

所以你只需要写一行内容,mydfshelper比如:

#!/bin/bash
LD_LIBRARY_PATH=blah hadoop-fuse-dfs -onotrash "$@"

答案2

为了解决我的特定问题(LD_LIBRARY_PATH),我发现最简单的方法是将变量的内容添加到 /etc/ld.so.conf.d 下的文件中。例如,我创建了 /etc/ld.so.conf.d/hdp.conf ,内容如下:

/usr/java/jdk1.8.0_66/jre/lib/amd64/server
/usr/hdp/2.5.0.0-1245/usr/lib

以 root 身份运行一次后ldconfig,这个新的“ld_library_path”在系统范围内可用。

为了回答一般环境变量的问题,来自@meuh的回答是最好的。

相关内容