长话短说
当通过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的回答是最好的。