在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
产品名称:桌面
2条答案
按热度按时间vs3odd8k1#
在Windows
%userprofile%
目录(通常为C:\Users\<username>
)中,使用以下命令创建或编辑文件.wslconfig
:然后退出任何WSL示例
wsl --shutdown
,并重新启动。WSL现在通过一些附加配置支持Systemd。如果您选择在WSL上启用Systemd,则用于在
/etc/sysctl.conf
中持久化vm.max_map_count
(和其他参数)的"常规"方法将起作用。有关先决条件和如何启用,请参阅this Community Wiki answer或my original version。你实际上有三个(密切相关的)问题:
.wslconfig
来完成吗?/etc/sysctl.conf
不去持久化它呢?我们将把前两个问题结合起来,因为答案是"是的,您可以通过
.wslconfig
来完成它"。这并不容易找到,因为这是最近的变化,它是curtesy this answer。
从内核发行版5.8开始,您可以在内核命令行上使用
sysctl.*
前缀来设置sysctl
值。因此,只要您已经升级了WSL内核(我在我的两个系统上 * 没有 * 升级,因为
wsl --update
最近才在21H1发布),就可以如上所述设置%userprofile%\.wslconfig
。/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
(作为根用户)的方法:/etc/wsl.conf
(通过sudo
):这将在每次WSL示例启动时在root下运行。据我所知,这也将在
docker-desktop
示例中运行,但我还没有能够测试它。wsl.exe
-d docker-desktop sh -c "sysctl -w vm.max_map_count=262144"
请注意,如果Docker-Desktop WSL示例在任何时候终止,则更改将丢失,直到下次重新引导。但是,由于Docker Desktop在引导/登录时运行,因此该示例 * 应该 * 保持运行,并保留此更改。
docker-desktop
示例。为了避免每次启动时都键入
sudo
密码,请在.bashrc
(或等效程序)中使用以下行:owfi6suc2#
我安装了Windows 10 Docker桌面和Git,按照@NotTheDr01ds提供的说明,我打开了一个Git bash控制台:
修改之后,SonarQube的ElasticSearch启动时没有任何错误。