在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
2条答案
按热度按时间f1tvaqid1#
在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
来实现。”这是不容易找到的,因为变化是相当近。这是礼貌this answer。
从内核版本5.8开始,您可以在内核命令行上使用
sysctl.*
前缀来设置sysctl
值。所以只要你升级了你的WSL内核(我在我的两个系统上没有升级,因为
wsl --update
最近才在21 H1发布),你就可以像上面那样设置你的%userprofile%\.wslconfig
。/etc/sysctl.conf
在写这个问题的时候,这是一个带有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)的方法:/etc/wsl.conf
(通过sudo
):这将在每次WSL示例启动时在根目录下运行。据我所知,这也可以在
docker-desktop
示例中工作,但我还没有测试过。wsl.exe
-d docker-desktop sh -c "sysctl -w vm.max_map_count=262144"
请注意,如果docker-desktop WSL示例在任何时候终止,则更改将丢失,直到下次重新启动。但是,由于Docker Desktop是在 Boot /login时运行的,因此示例 * 应该 * 保持不变。
docker-desktop
示例。为了避免每次启动时都要输入
sudo
密码,请在.bashrc
(或同等产品)中使用以下行:qoefvg9y2#
我有Windows 10,安装了Docker Desktop和Git。按照@NotTheDr01ds提供的说明,我打开了一个Git bash控制台:
在此更改之后,SonarQube的ElasticSearch启动时没有错误。