以 root 用户身份运行 ElasticSearch

Posted

技术标签:

【中文标题】以 root 用户身份运行 ElasticSearch【英文标题】:Running ElasticSearch as the root user 【发布时间】:2017-04-07 13:42:23 【问题描述】:

当我尝试使用 ./elasticsearch 启动 ElasticSearch 5.0 时出现以下错误:

[2016-11-23T13:44:09,507][WARN ][o.e.b.ElasticsearchUncaughtExceptionHandler] [] uncaught exception in thread [main]
org.elasticsearch.bootstrap.StartupException: java.lang.RuntimeException: can not run elasticsearch as root
    at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:116) ~[elasticsearch-5.0.1.jar:5.0.1]
    at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:103) ~[elasticsearch-5.0.1.jar:5.0.1]
    at org.elasticsearch.cli.SettingCommand.execute(SettingCommand.java:54) ~[elasticsearch-5.0.1.jar:5.0.1]
    at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:96) ~[elasticsearch-5.0.1.jar:5.0.1]
    at org.elasticsearch.cli.Command.main(Command.java:62) ~[elasticsearch-5.0.1.jar:5.0.1]
    at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:80) ~[elasticsearch-5.0.1.jar:5.0.1]
    at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:73) ~[elasticsearch-5.0.1.jar:5.0.1]
Caused by: java.lang.RuntimeException: can not run elasticsearch as root
    at org.elasticsearch.bootstrap.Bootstrap.initializeNatives(Bootstrap.java:96) ~[elasticsearch-5.0.1.jar:5.0.1]
    at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:155) ~[elasticsearch-5.0.1.jar:5.0.1]
    at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:286) ~[elasticsearch-5.0.1.jar:5.0.1]
    at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:112) ~[elasticsearch-5.0.1.jar:5.0.1]
    ... 6 more

我切换到另一个用户并尝试sudo ./elasticsearch 并得到同样的错误。

如何以 root 用户身份启动 ElasticSearch?

【问题讨论】:

第二行:java.lang.RuntimeException: can not run elasticsearch as root。稍后再发一次:Caused by: java.lang.RuntimeException: can not run elasticsearch as root. 【参考方案1】:

Elasticsearch 不能以 root 用户运行。 Elasticsearch 本身限制了这一点。当我们安装 elasticsearch 时,会自动创建一个名为 elasticsearch 的新用户和一个名为 elasticsearch 的组。可以使用以下命令检查条目

$ sudo less /etc/passwd | grep "elasticsearch"
$ sudo less /etc/group | grep "elasticsearch"

我们需要更改所有elasticsearch related files 的所有权。请按照以下步骤操作。

步骤:

1. 使用下面的示例 cmd 将所有 ES 相关文件的所有权从 root 更改为 elasticsearch。

$ sudo chown elasticsearch:elasticsearch -R /usr/share/elasticsearch
$ sudo chown elasticsearch:elasticsearch -R /var/log/elasticsearch
$ sudo chown elasticsearch:elasticsearch -R /var/lib/elasticsearch
$ sudo chown elasticsearch:elasticsearch -R /etc/default/elasticsearch
$ sudo chown elasticsearch:elasticsearch -R /etc/elasticsearch

2.打开/etc/default/elasticsearch文件并做以下事情

  a)JAVA_HOME=your/java/home/path
  b)add the following entries at the end
      i)   START_DAEMON=true
      ii)  ES_USER=elasticsearch
      iii) ES_GROUP=elasticsearch

3.现在开启elasticsearch服务并启动

  $ sudo systemctl enable elasticsearch
  $ sudo systemctl start elasticsearch
  $ sudo systemctl status elasticsearch

4.使用curl测试elasticsearch。假设你的主机 ip 是 192.168.5.194 并且 ES 在端口 9200 上运行

$ curl -X GET ‘192.168.5.194:9200’

完成!!

参考。 :https://***.com/a/48390311/1445978

【讨论】:

【参考方案2】:

此问题的根本原因是: ElasticSearch 不允许从 root 所有者运行。 此问题还有另一种可能性“仅为 root 用户设置 Java 路径,而不为所有其他用户设置”。 此问题的解决方案:

第一步: 通过命令将elasticSearch目录的所有权从root更改为其他用户。 $sudo chown -R current_User:Group_Name elasticsearch-5.5.0

Setp 2:检查当前用户的类路径中的 Java 集[不仅适用于 root]。如果命令:$java -version 或 echo $JAVA_HOME 命令给出空结果。这意味着我们应该在类路径 [system env varible] 中为当前用户设置 Java,然后按照步骤 3 进行操作。 否则启动 elasticsearch 服务。

第 3 步:编辑 /etc/profile 并根据您的系统目录添加两行 export JAVA_HOME="Java 目录位置"

导出 PATH=$JAVA_HOME/bin:$PATH 跑步 $source source /etc/profile

在此之后运行 elasticSearch 服务。它非常适合我。

【讨论】:

【参考方案3】:

有两种方法可以解决这个问题:

方法一: 下载 zip 文件 n 解压缩,然后按照以下命令开始

bin/elasticsearch -Des.insecure.allow.root=true -d

方法二:

vi bin/elasticsearch

为允许根添加属性:

ES_JAVA_OPTS="-Des.insecure.allow.root=true"

保存并关闭。 您现在可以从 root 开始。

【讨论】:

为了让方法 1 对我有用,我必须在设置更改之前添加一个 -E 标志。 bin/eleasticsearch -E -Des.insecure.allow.root=true -d 此解决方法不再有效。似乎他们只是完全删除了这个选项。它绝对不适用于 ES 7.X。也许对于一些早期版本也是如此。【参考方案4】:

我遇到了同样的问题,我不得不与另一个用户联系。但首先,我必须授予他执行 bin/elasticsearch 的权限。

【讨论】:

考虑将其发布为评论,或扩展以包含更多详细信息。【参考方案5】:

回复有点晚,但现在仍然相关。 当我关注this 时,我遇到了同样的问题,最后的手段是更改解压缩文件夹的所有权。

刚刚sudo chown <nonrootuser> <unzipped-es-folder> -R 成功了。

PS 我是在 Ubuntu 17.04 LTS 上做的。

【讨论】:

【参考方案6】:

从根文件夹运行 bin/elasticsearch 是一个常见错误。

【讨论】:

同意。 ElasticSearch 不应该以 root 身份运行是有原因的。请参阅此文档elastic.co/blog/…。他们这样做是为了防止生产环境中的支持问题。有人认为它们是在 docker 环境中运行的,应该以其他方式处理。请参阅此discuss.elastic.co/t/… 底线。小心并了解您在做什么。【参考方案7】:

如果您尝试使用systemd 或作为服务 运行,请确保您的.service 文件以用户和组elasticsearch 的身份运行。您可以在服务字段下指定您的用户和组。

通常位于/etc/systemd/system/elasticsearch.service:

[Service]
Type=simple
ExecStart=/usr/share/elasticsearch/bin/elasticsearch
Restart=on-failure
RestartSec=10
KillMode=process
User=elasticsearch
Group=elasticsearch

【讨论】:

就像一个魅力,我在一个盒子上设置了第二个 ES 实例,这解决了我的问题。【参考方案8】:

-Ees.insecure.allow.root 方法对我不起作用,因为我使用的是 7.9.0 版。

我懒得去chown方法,@Devasish提到的。

相反,尝试了一个有点冗长的:

为 elastic-search 创建一个非 root 用户:

ubuntu ~ # adduser elasticuser

必须使用adduser 命令,而不是用户添加。 adduser 将自动创建主目录。

将elastic-search文件夹从root的主目录复制到elasticuser的主目录:

ubuntu ~ # cp -R ./elasticsearch-7.9.0 /home/elasticuser/elasticsearch-7.9.0

切换到非root用户:

ubuntu ~ # su - elasticuser

现在,从非 root 用户运行 elastic-search:

elasticuser@ubuntu ~ $ ./elasticsearch-7.9.0/bin/elasticsearch

【讨论】:

【参考方案9】:

为什么要以 root 用户身份运行所有内容。使用普通用户而不是 root 用户。

切换到普通用户并运行它。如果您没有任何其他用户,请参阅 Linuxize document 创建用户。

如果您无法以普通用户身份运行它,请检查文件的权限,使用 chmod 777 授予用户对文件或文件夹的完全访问权限。

详情请咨询chmod wiki document。

如果您想使用 root 用户,请从弹性搜索文件夹中执行以下命令。

./elasticsearch -Des.insecure.allow.root=true

重新运行弹性搜索。它肯定可以工作。

【讨论】:

【参考方案10】:

这在 ES2 之前被问过 (How to run Elasticsearch 2.1.1 as root user in Linux machine)

相同的解决方案可能适用于 5。

如前所述,您可能不应该这样..

【讨论】:

【参考方案11】:

在不授予sudo 权限的情况下创建单独的用户。 例如:adduser elasticsearch 然后将该文件夹的所有权授予该用户 例如:chown -R elasticsearch:elasticsearch elasticsearch-folder 然后切换到该用户 例如:su elasticsearch 现在尝试运行服务 例如:./elasticsearch-xxx/bin/elasticsearch

【讨论】:

【参考方案12】:

在 centos 8 上,

adduser elasticuser
chown -R elasticuser:elasticsearch /usr/share/elasticsearch/
chown -R elasticuser:elasticsearch /etc/sysconfig/elasticsearch
chown -R elasticuser:elasticsearch /etc/elasticsearch
chown -R elasticuser:elasticsearch /var/log/elasticsearch/
chown -R elasticuser:elasticsearch /var/lib/elasticsearch

运行弹性搜索:

su elasticuser
/usr/share/elasticsearch/bin/elasticsearch

【讨论】:

以上是关于以 root 用户身份运行 ElasticSearch的主要内容,如果未能解决你的问题,请参考以下文章

如何用root的身份以普通用户权限运行程序

以 root 用户身份运行 ElasticSearch

以 root 身份运行结构脚本

确保脚本以root用户身份运行

以非 root 用户身份运行 Nginx

如何以root用户身份运行Google Chrome? [关闭]