当我运行 时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
domainname
,ypdomainname
并nisdomainname
返回 RAM 中为内核参数设置的任何值kernel.domainname
。例如,调用domainname mydomain
会将该变量设置为mydomain
,而不会将其保存到磁盘。运行sysctl -a
以获取内核参数的完整列表。
有两种不同的方法可以使此状态在系统重启后继续存在:
echo 'kernel.domainname=mydomain' >> /etc/sysctl.d/99-nisdomain.conf
这是一个兼容性更强的选项,因为它依赖于更普遍的sysctl
程序来从这些文件中加载值。在启动时加载这些值只需要进行一些进程调用,sysctl --system
据我所知,每个 Linux 发行版都会这样做。
echo 'NISDOMAIN=mydomain' >> /etc/sysconfig/network
/etc/sysconfig/network
还可用于设置主机名以及其他一些选项。
这依赖于基于 systemd 的 init 系统。