elasticsearch 使用Docker-Desktop for Windows,如何配置sysctl参数以渗透到重新启动中?

nwo49xxi  于 2022-12-26  发布在  ElasticSearch
关注(0)|答案(2)|浏览(186)

在win10 [wsl2] 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,以将此值设置为永久值,即使其在重新启动后仍然存在。
请注意下面的输出,显示在我尝试遵循此建议并重新启动后,有效的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中的系统实际上并不引导,也不使用systemd。专有的Microsoft/init二进制文件初始化系统。因此,服务管理的工作方式与VM不同。它的行为更像是一个交互式容器。
有人能证明这就是为什么参数化sysctl.conf不能成为实现当前目的的有效方法的原因吗?

系统

主持人
操作系统:Windows 10企业版
版本:10.0.18363内部版本号18363
多克尔
委托单位:
版本:2008年10月20日
API版本:1.41
Go语言版本:go1.16.6
Git提交:3967b7d
构建日期:2021年7月30日星期五19:54:02
操作系统/Arch:Linux/Linux +
插件:
合成:Docker合成(Docker公司,v2.0.0-rc.2)
扫描:Docker扫描(Docker Inc.,版本0.8.0)
服务器:
发动机:
版本:2008年10月20日
API版本:1.41(最低版本1.12)
Go语言版本:go1.16.6
Git提交:75249d8
构建日期:2021年7月30日星期五19:52:10
操作系统/Arch:Linux/Linux +
容器d:
版本号:1.4.9
GitCommit文件名:e25210
运行:
版本号:1.0.1
GitCommit版本号:1.0.1 - 0-g4144b63
对接器初始化:
版本号:0.19.0
GitCommit:删除40ad0
内核版本:5.10.16.3-微软标准-WSL2
操作系统:Docker桌面
操作系统类型:Linux
架构:x86_64
CPU:4个
总内存:12.39GiB
产品名称:桌面

vs3odd8k

vs3odd8k1#

  • 简短答案:*

在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设置这个值为永久的,也就是说,使它在重新启动后仍然存在......为什么没有呢?*

我们将把前两个问题结合起来,因为答案是"是的,您可以通过.wslconfig来完成它"。
这并不容易找到,因为这是最近的变化,它是curtesy this answer
从内核发行版5.8开始,您可以在内核命令行上使用sysctl.*前缀来设置sysctl值。
因此,只要您已经升级了WSL内核(我在我的两个系统上 * 没有 * 升级,因为wsl --update最近才在21H1发布),就可以如上所述设置%userprofile%\.wslconfig

/etc/sysctl.conf
  • /etc/sysctl.conf设置这个值为永久的,也就是说,使它在重新启动后仍然存在......为什么没有呢?*

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

  • 此答案的其余部分包括一些systcl.conf解决方案,由于我们可以使用.wslconfig执行此操作,因此不需要这些解决方案。这只是为了以防有人出于某种原因发现它有用。*

这里有一些变通方法,所有这些都涉及到找到一种自动运行sysctl -w vm.max_map_count=262144(作为根用户)的方法:

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

这将在每次WSL示例启动时在root下运行。据我所知,这也将在docker-desktop示例中运行,但我还没有能够测试它。

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

请注意,如果Docker-Desktop WSL示例在任何时候终止,则更改将丢失,直到下次重新引导。但是,由于Docker Desktop在引导/登录时运行,因此该示例 * 应该 * 保持运行,并保留此更改。

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

为了避免每次启动时都键入sudo密码,请在.bashrc(或等效程序)中使用以下行:

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

owfi6suc2#

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

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

修改之后,SonarQube的ElasticSearch启动时没有任何错误。

相关问题