elasticsearch 使用Docker-Desktop for Windows,如何配置sysctl参数以在重新启动后继续运行?

kwvwclae  于 8个月前  发布在  ElasticSearch
关注(0)|答案(2)|浏览(69)

在win10 [wsl 2] docker-desktop中运行elasticsearch需要通过sysctl -w vm.max_map_count=262144将mmap计数增加到262144

C:\Users\<username>>wsl -d docker-desktop
<hostname>:/tmp/docker-desktop-root/mnt/host/c/Users/<username># sysctl -w vm.max_map_count=262144

在对这个问题和elastic's doc的回答中,建议相应地更新/etc/sysctl.conf中的vm.max_map_count以将该值设置为永久值,即。e.使其在重启后存活。
请注意下面的输出,显示在我尝试遵循此建议并重新引导后,有效的mmap计数没有适应sysctl.conf中定义的值。
为什么没有?

PS C:\Users\<username>> wsl -d docker-desktop
<hostname>:/tmp/docker-desktop-root/mnt/host/c/Users/<username># sysctl vm.max_map_count
vm.max_map_count = 65530
<hostname>:/tmp/docker-desktop-root/mnt/host/c/Users/<username># cd /etc
<hostname>:/etc# cat sysctl.conf
# content of this file will override /etc/sysctl.d/*
vm.max_map_count=262144

考虑到在etc/中更改了错误的sysctl.conf,我尝试在<hostname>:/tmp/docker-desktop-root/etc#中更改sysctl.conf。这是不允许的,因为这是一个Read-only file system
是否可以/是否应该在.wslconfig中参数化,如果可以,如何参数化?
使用openSUSE Leap 15.2而不是Win10的PowerShell并没有改变结果。

<username@hostname>:~> sysctl vm.max_map_count
vm.max_map_count = 65530
<username@hostname>:~> cat /etc/sysctl.conf
####
#
# /etc/sysctl.conf is meant for local sysctl settings
#
# sysctl reads settings from the following locations:
#   /boot/sysctl.conf-<kernelversion>
#   /lib/sysctl.d/*.conf
#   /usr/lib/sysctl.d/*.conf
#   /usr/local/lib/sysctl.d/*.conf
#   /etc/sysctl.d/*.conf
#   /run/sysctl.d/*.conf
#   /etc/sysctl.conf
#
# To disable or override a distribution provided file just place a
# file with the same name in /etc/sysctl.d/
#
# See sysctl.conf(5), sysctl.d(5) and sysctl(8) for more information
#
####
vm.max_map_count=262144

值得注意的是,上述sysctl.conf文件中的头文件引用了/boot/sysctl.conf-<kernelversion>。考虑到mmap count可能需要在这个文件中定义,以便在引导时考虑,我试图在那里设置所需的参数,但没有权限这样做。

<username@hostname>:/boot> sudo echo 'vm.max_map_count=262144' >> sysctl.conf-5.10.16.3-microsoft-standard-WSL2
-bash: sysctl.conf-5.10.16.3-microsoft-standard-WSL2: Permission denied

openSUSE:WSL - openSUSE Wiki中报告的一个已知问题和限制是
WSL中的系统实际上并不 Boot ,也不使用systemd。专有的Microsoft /init二进制文件初始化系统。因此,服务管理的工作方式与VM不同。它的行为更像是一个交互式容器。
有谁能证明这就是为什么参数化sysctl.conf不能有效地实现当前目的的原因吗?

系统

主机
操作系统:Microsoft Windows 10
版本:10.0.18363 Build 18363
Docker
委托方:
版本:20.10.8
API版本:1.41
Go版本:go1.16.6
Git提交:3967 b7 d
建成时间:2021年7月30日星期五19:54:02
操作系统/架构:linux/Linux
外挂程序:
compose:Docker Compose(Docker Inc.,v2.0.0-rc.2)
scan:Docker Scan(Docker Inc.,v0.8.0)
伺服器:
发动机:
版本:20.10.8
API版本:1.41(最低版本1.12)
Go版本:go1.16.6
Git提交:75249 d8
建成时间:2021年07月30日星期五19:52:10
操作系统/架构:linux/Linux
集装箱:
版本:1.4.9
GitCommit:e25210fe30a0a703442421b0f60afac609f950a3
Runc:
版本号:1.0.1
GitCommit:v1.0.1-0-g4144b63
停靠站初始化:
版本:0.19.0
GitCommit:de40ad0
核心版本:5.10.16.3-Microsoft标准-WSL 2
操作系统:Docker Desktop
操作系统类型:Linux
体系结构:x86_64处理器
CPU:4
总内存:12.39GiB
Name:life's a game

f1tvaqid

f1tvaqid1#

  • 简短回答:*

在Windows %userprofile%目录(通常为C:\Users\<username>)中,使用以下命令创建或编辑文件.wslconfig

[wsl2]
kernelCommandLine = "sysctl.vm.max_map_count=262144"

然后退出任何WSL示例wsl --shutdown并重新启动。

> sysctl vm.max_map_count
vm.max_map_count = 262144
  • 替代(更新)简短回答:*

WSL现在通过一些额外的配置支持Systemd。如果您选择在WSL上启用Systemd,那么在/etc/sysctl.conf中持久化vm.max_map_count(和其他参数)的“正常”方法将有效。请参阅this Community Wiki answermy original version了解先决条件和如何启用。

  • 更多详情:*

你真的有三个(密切相关的)问题:

  • (主要)如何最好地坚持这种设置
  • 可以通过.wslconfig实现吗?
  • 是否可以/应该在.wslconfig中参数化,如果可以,如何参数化?*
  • 为什么/etc/sysctl.conf不能持久化它?
  • /etc/sysctl.conf将此值设置为永久值,e.使它在重新启动后幸存下来。为什么没有?*

我们将合并与前两个结合起来,因为答案是“是的,您可以通过.wslconfig来实现。”
这是不容易找到的,因为变化是相当近。这是礼貌this answer
从内核版本5.8开始,您可以在内核命令行上使用sysctl.*前缀来设置sysctl值。
所以只要你升级了你的WSL内核(我在我的两个系统上没有升级,因为wsl --update最近才在21 H1发布),你就可以像上面那样设置你的%userprofile%\.wslconfig

/etc/sysctl.conf

  • /etc/sysctl.conf将此值设置为永久值,e.使它在重新启动后幸存下来。为什么没有?*

在写这个问题的时候,这是一个带有WSL 2的known issue。根本问题是,虽然sysctl和Systemd/systemctl是两个完全不同的东西,但正如(Microsoft WSL团队的)therekenc所指出的那样,something 必须读取和处理/etc/sysctl.conf。在大多数Linux发行版中,这是Systemd或SysVInit脚本。
WSL当时不支持Systemd,所以...在启动时,/etc/sysctl.conf上没有任何读取和操作。

  • 这个答案的其余部分包括一些不需要的systcl.conf解决方法,因为我们可以用.wslconfig来做。这是为了以防万一有人发现它出于某种原因有用。

有几种解决方法。所有这些都将涉及找到一种自动运行sysctl -w vm.max_map_count=262144(作为root)的方法:

  • 首先,最新版本的WSL有一个新特性来简化这一点。只需使用以下命令创建/编辑/etc/wsl.conf(通过sudo):
[boot]
command="sysctl -w vm.max_map_count=262144"

这将在每次WSL示例启动时在根目录下运行。据我所知,这也可以在docker-desktop示例中工作,但我还没有测试过。

  • 如果Docker Desktop设置为在登录时运行,那么您可以添加一个计划任务(通过Windows任务管理器)也在登录时运行。这将是:
  • “基本任务”
  • 将“程序”设置为wsl.exe
  • 参数设置为-d docker-desktop sh -c "sysctl -w vm.max_map_count=262144"

请注意,如果docker-desktop WSL示例在任何时候终止,则更改将丢失,直到下次重新启动。但是,由于Docker Desktop是在 Boot /login时运行的,因此示例 * 应该 * 保持不变。

  • 根据您的工作流程,这可能适合也可能不适合。如果您使用的是单独的WSL示例(例如,Ubuntu),您可以让 that 示例在启动时修改docker-desktop示例。

为了避免每次启动时都要输入sudo密码,请在.bashrc(或同等产品)中使用以下行:

wsl.exe -d docker-desktop sh -c "sysctl -w vm.max_map_count=262144"
qoefvg9y

qoefvg9y2#

我有Windows 10,安装了Docker Desktop和Git。按照@NotTheDr01ds提供的说明,我打开了一个Git bash控制台:

$ wsl -d docker-desktop sh -c "sysctl -w vm.max_map_count=262144"
vm.max_map_count = 262144

在此更改之后,SonarQube的ElasticSearch启动时没有错误。

相关问题