我在项目中使用的Ubuntu 14.04.5
是最新版本的。我想启用 cgroup 交换限制功能,因此我查看了以下部分docker-ce
你的内核不支持 cgroup swap 限制功能。
我不想手动执行此操作,而是想修改/etc/default/grub
Ansible 剧本中的文件,因为我已经有许多剧本来设置 IT 基础设施。
最简单的解决方案是找到该GRUB_CMDLINE_LINUX_DEFAULT
行并附加,cgroup_enable=memory swapaccount=1
而不检查它们是否已经存在。剧本任务将如下所示:
- name: Enable the memory limit.
lineinfile:
path: /etc/default/grub
backrefs: yes
regexp: '^(GRUB_CMDLINE_LINUX_DEFAULT=")(.*)(".*)$'
line: '\1\2 cgroup_enable=memory swapaccount=1\3'
when: <String `cgroup_enable=memory swapaccount=1` is not present>
(笔记最后when
一行不是有效的 Ansible 语法。我把它放在那里是为了展示这个想法。
我设置了一个when
条件,如果这两个具有所需值的标志已经存在,则不会再次附加它们。然而,在以下情况下,它们仍会被附加:
- 仅存在一个,例如:
GRUB_CMDLINE_LINUX_DEFAULT="cgroup_enable=memory"
- 两者都存在,但具有不同的价值,例如:(
GRUB_CMDLINE_LINUX_DEFAULT="cgroup_enable=something swapaccount=999"
只是一些愚蠢的价值观) - 两者都存在,但被其他东西隔开,例如:
GRUB_CMDLINE_LINUX_DEFAULT="cgroup_enable=memory somekey=somevalue swapaccount=1"
- ETC..
总结一下,playbook任务还不是很完善,我会尽快进行改进。
我的问题是:
- 如果我最终得到这样的一行
GRUB_CMDLINE_LINUX_DEFAULT="cgroup_enable=something swapaccount=999 cgroup_enable=memory swapaccount=1"
,后面的值(本例中为“memory”和“1”)会覆盖相同键的早期值(“something”和“999”)吗?我测试过,它似乎是这样工作的。 - 如果它确实或不覆盖先前的值,那么指定此行为的官方文档在哪里?我试图在下面的链接中找到它,但没有找到:
答案1
解析这些命令行的不是 Grub,所以您不太可能在 Grub 手册中找到有关此内容的任何信息。读取这些命令行的是 Linux 内核、驱动程序和用户空间程序。因此,您的问题没有明确的答案 - 一般来说,是的,如果 Linux 内核或驱动程序解析了这些命令行,它们会覆盖先前的值。但 Linux 中的任何程序都可以通过 /proc/cmdline 文件读取这些命令行并以任何方式解析它们。因此,我通常建议避免这种情况以确保安全。