在“GRUB_CMDLINE_LINUX_DEFAULT”中,后面的值会覆盖前面的值吗?

在“GRUB_CMDLINE_LINUX_DEFAULT”中,后面的值会覆盖前面的值吗?

我在项目中使用的Ubuntu 14.04.5是最新版本的。我想启用 cgroup 交换限制功能,因此我查看了以下部分docker-ce你的内核不支持 cgroup swap 限制功能

我不想手动执行此操作,而是想修改/etc/default/grubAnsible 剧本中的文件,因为我已经有许多剧本来设置 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任务还不是很完善,我会尽快进行改进。

我的问题是:

  1. 如果我最终得到这样的一行GRUB_CMDLINE_LINUX_DEFAULT="cgroup_enable=something swapaccount=999 cgroup_enable=memory swapaccount=1",后面的值(本例中为“memory”和“1”)会覆盖相同键的早期值(“something”和“999”)吗?我测试过,它似乎是这样工作的。
  2. 如果它确实或不覆盖先前的值,那么指定此行为的官方文档在哪里?我试图在下面的链接中找到它,但没有找到:

答案1

解析这些命令行的不是 Grub,所以您不太可能在 Grub 手册中找到有关此内容的任何信息。读取这些命令行的是 Linux 内核、驱动程序和用户空间程序。因此,您的问题没有明确的答案 - 一般来说,是的,如果 Linux 内核或驱动程序解析了这些命令行,它们会覆盖先前的值。但 Linux 中的任何程序都可以通过 /proc/cmdline 文件读取这些命令行并以任何方式解析它们。因此,我通常建议避免这种情况以确保安全。

相关内容