我正在使用我的项目中Ubuntu 14.04.5
的最新版本。docker-ce
我想启用 cgroup 交换限制功能,所以我正在查看您的内核不支持 cgroup 交换限制功能部分。
我不想手动执行此操作,而是想/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”)?我测试过,它似乎是这样工作的。 - 如果它确实或不覆盖早期的值,那么指定此行为的官方文档在哪里?我试图在下面的链接中找到它,但并不幸运:
解析这些命令行的不是 Grub,因此您不太可能在 Grub 手册中找到任何关于此的内容。读取这些内容的是 linux 内核、驱动程序和用户空间程序。因此,您的问题没有明确的答案 - 一般来说是的,如果它们被 linux 内核或驱动程序解析,它们确实会覆盖早期的值。但是 linux 中的任何程序都可以通过 /proc/cmdline 文件读取这些命令行并以任何方式解析它们。因此,为了安全起见,我通常建议避免这种情况。