ypdomainname 在 rhel8 / centos8 上改变了哪些文件?

ypdomainname 在 rhel8 / centos8 上改变了哪些文件?

当我运行 时ypdomainname somedomain,它显然会生效,因为ypdomainname会显示更改之前和之后的状态。我需要通过配置管理来部署此更改,但找不到 ansible 模块来执行此操作,因此解决方案可能是使用lineinfile或类似的东西来部署更改;唯一的问题是:我找不到它更改了文件系统上的哪些文件。它更改了哪些文件?

手册页提到了/etc/hostname但是/etc/hosts这些保持不变,所以我认为手册页不准确或不完整。

当我创建前后文件系统快照时,我发现没有差异/etc或任何我认为相关的其他更改。也许我错过了什么...

当我运行 时strace ypdomainname somedomain,它显示它不访问任何文件;它setdomainname()从 调用该函数libc。此处记录了以下内容:http://man7.org/linux/man-pages/man2/setdomainname.2.html不幸的是,它似乎没有提供任何关于它实际上做什么的信息。

答案1

第一个提示是 strace 实际上并没有显示 libc 函数——它显示内核系统调用(它们只是碰巧有相似的名称。)由于历史原因,YP/NIS 域名由内核存储(与主机名一起),尽管 NIS 客户端软件在用户空间中运行,但它始终从内核获取域名。

因此,“ypdomainname”命令确实不会访问任何文件——其目的不是进行永久性更改,而是上传域名/etc 到瞬时内核内存,并使用专用的内核系统调用来实现这一点。

域名的永久存储确实是 /etc 中的一个文件,但你必须使用常规文本编辑器更改它,然后然后运行“ypdomainname”将该更改上传到当前正在运行的内核(每次重启时也会执行此操作)。不同的发行版将 YP/NIS 域名存储在不同的位置;这/etc/domainname是一种选择,但它也可能位于 /etc/sysconfig 或 /etc/defaults 中。

但幸运的是,内核还将 YP/NIS 域名公开为普通的 sysctl – kernel.domainname– 您可以通过运行系统的虚拟 /proc/sys/kernel/domainname 路径进行设置,也可以通过 /etc/sysctl.d 以独立于发行版的方式永久更改。Ansible 甚至似乎有一个专用的系统控制进行此类更改的模块:

-系统控制:
    名称:“内核.域名”
    值:“示例”
    sysctl_set:是

答案2

domainnameypdomainnamenisdomainname返回 RAM 中为内核参数设置的任何值kernel.domainname。例如,调用domainname mydomain会将该变量设置为mydomain,而不会将其保存到磁盘。运行sysctl -a以获取内核参数的完整列表。

有两种不同的方法可以使此状态在系统重启后继续存在:

  1. echo 'kernel.domainname=mydomain' >> /etc/sysctl.d/99-nisdomain.conf

这是一个兼容性更强的选项,因为它依赖于更普遍的sysctl程序来从这些文件中加载值。在启动时加载这些值只需要进行一些进程调用,sysctl --system据我所知,每个 Linux 发行版都会这样做。

  1. echo 'NISDOMAIN=mydomain' >> /etc/sysconfig/network

/etc/sysconfig/network还可用于设置主机名以及其他一些选项。

这依赖于基于 systemd 的 init 系统。

相关内容