ELK,萌萌哒

java.nio.file.AccessDeniedException: /tmp/3319998682015762985

Elasticsearch | 作者 MissSad | 发布于2017年12月02日 | 阅读数:8184

我的环境:
elasticsearch:6.0.0
centos:6.5
 我执行的是如下操作:
 
[yutao@master01 elasticsearch-6.0.0]$ bin/elasticsearch-plugin install file:///home/yutao/download/x-pack-6.0.0.zip 
也就是安装x-pack插件
 
我就是想知道为什么,它要往 /tmp 这个目录下写东西,我知道是因为我没有写权限造成的;
 
这个可不可以改呢?就是我让他写到别的路径中(我有权限的路径);
 
我在jvm.options文件中加入了
-Djava.io.tmpdir=/home/yutao/tmp/elasticsearch
-Djna.tmpdir=/home/yutao/tmp/elasticsearch
但是还是没用;
如何改变 x-pack 往 /tmp 目录里写东西?
已邀请:

MissSad

赞同来自:

这个问题,昨晚看源码到凌晨1点半,被我找到原因:
 
elasticsearch之所以要往这个文件写东西,其下载的x-pack.zip,就是临时存放到那里,并且还有记录点东西之类的,所以需要有这个文件的写权限:
部分源码如下:
public Environment(final Settings settings, final Path configPath) {
// 重点就是这句
this.tmpFile = PathUtils.get(System.getProperty("java.io.tmpdir"), new String[0]);
if (Environment.PATH_HOME_SETTING.exists(settings)) {
final Path homeFile = PathUtils.get((String)Environment.PATH_HOME_SETTING.get(settings), new String[0]).normalize();
if (configPath != null) {
this.configFile = configPath.normalize();
}
else {
this.configFile = homeFile.resolve("config");
}
this.pluginsFile = homeFile.resolve("plugins");
final List<String> dataPaths = (List<String>)Environment.PATH_DATA_SETTING.get(settings);
final ClusterName clusterName = (ClusterName)ClusterName.CLUSTER_NAME_SETTING.get(settings);
if (!dataPaths.isEmpty()) {
this.dataFiles = new Path[dataPaths.size()];
this.dataWithClusterFiles = new Path[dataPaths.size()];
for (int i = 0; i < dataPaths.size(); ++i) {
this.dataFiles[i] = PathUtils.get((String)dataPaths.get(i), new String[0]);
this.dataWithClusterFiles[i] = this.dataFiles[i].resolve(clusterName.value());
}
}
else {
this.dataFiles = new Path[] { homeFile.resolve("data") };
this.dataWithClusterFiles = new Path[] { homeFile.resolve("data").resolve(clusterName.value()) };
}
if (Environment.PATH_SHARED_DATA_SETTING.exists(settings)) {
this.sharedDataFile = PathUtils.get((String)Environment.PATH_SHARED_DATA_SETTING.get(settings), new String[0]).normalize();
}
else {
this.sharedDataFile = null;
}
final List<String> repoPaths = (List<String>)Environment.PATH_REPO_SETTING.get(settings);
if (!repoPaths.isEmpty()) {
this.repoFiles = new Path[repoPaths.size()];
for (int j = 0; j < repoPaths.size(); ++j) {
this.repoFiles[j] = PathUtils.get((String)repoPaths.get(j), new String[0]);
}
}
else {
this.repoFiles = new Path[0];
}
if (Environment.PATH_LOGS_SETTING.exists(settings)) {
this.logsFile = PathUtils.get((String)Environment.PATH_LOGS_SETTING.get(settings), new String[0]).normalize();
}
else {
this.logsFile = homeFile.resolve("logs");
}
if (Environment.PIDFILE_SETTING.exists(settings)) {
this.pidFile = PathUtils.get((String)Environment.PIDFILE_SETTING.get(settings), new String[0]).normalize();
}
else {
this.pidFile = null;
}
this.binFile = homeFile.resolve("bin");
this.libFile = homeFile.resolve("lib");
this.modulesFile = homeFile.resolve("modules");
final Settings.Builder finalSettings = Settings.builder().put(settings);
finalSettings.put(new Object[] { Environment.PATH_HOME_SETTING.getKey(), homeFile });
if (Environment.PATH_DATA_SETTING.exists(settings)) {
finalSettings.putArray(Environment.PATH_DATA_SETTING.getKey(), (List)dataPaths);
}
finalSettings.put(new Object[] { Environment.PATH_LOGS_SETTING.getKey(), this.logsFile });
this.settings = finalSettings.build();
return;
}
throw new IllegalStateException(Environment.PATH_HOME_SETTING.getKey() + " is not configured");
}

我自己也记录下:
elasticsearch 源码简单分析之【tmp目录】

要回复问题请先登录注册