![无法更改 /etc/resolv.conf 上的文件属性(例如不可变)](https://linux22.com/image/987700/%E6%97%A0%E6%B3%95%E6%9B%B4%E6%94%B9%20%2Fetc%2Fresolv.conf%20%E4%B8%8A%E7%9A%84%E6%96%87%E4%BB%B6%E5%B1%9E%E6%80%A7%EF%BC%88%E4%BE%8B%E5%A6%82%E4%B8%8D%E5%8F%AF%E5%8F%98%EF%BC%89.png)
我注意到网络管理员经常更改我的 DNS 服务器,所以我想在文件上设置不可变位/etc/resolv.conf
,但没有成功。我注意到该/etc/resolv.conf
文件实际上是 的符号链接/run/resolvconf/resolv.conf
。
现在,sudo chattr +i /run/resolvconf/resolv.conf
结果是:
chattr: Inappropriate ioctl for device while reading flags on /run/resolvconf/resolv.conf
据我所知,这意味着/run/resolvconf/
不支持此类属性。对吗?
徐本图 15.10;
如何对我的resolv.conf
文件进行写保护?
答案1
/run
是一个tmpfs
(ramdisk)文件系统,不支持扩展属性:
% df -T /run
Filesystem Type 1K-blocks Used Available Use% Mounted on
tmpfs tmpfs 393016 6416 386600 2% /run
关于如何避免/etc/resolv.conf
被 NetworkManager 更改,我在Arch Linux 论坛。
创建一个resolv.conf
文件,其中包含您希望保留在系统中某处的设置(例如/etc/resolv.conf.DNSoverride
),并将此脚本放入/etc/NetworkManager/dispatcher.d
:
#! /bin/sh
cp -f /etc/resolv.conf.DNSoverride /etc/resolv.conf
脚本引用man networkmanager
:
[...] 应为 root 拥有的常规可执行文件。此外,它不能由组或其他用户写入,也不能是 setuid。[...]
引用man networkmanager
:
[...] NetworkManager 将按字母顺序执行 /etc/NetworkManager/dispatcher.d 目录或子目录中的脚本以响应网络事件。[...]
这意味着每次发生网络事件时脚本都会复制/etc/resolv.conf.DNSoverride
覆盖,从而覆盖可能所做的更改。/etc/resolv.conf
/etc/resolv.conf
答案2
这个答案解决了一些问题kos 的回答。
因为是一个符号链接,所以直接覆盖它可能会在自动运行/etc/resolv.conf
时导致错误。resolvconf -u
首先,按如下方式创建替换resolv.conf.override
。这旨在替换resolv.conf
。按如下方式匹配权限和所有者:
$ ll /etc/resolv.conf.override
-rwxrwxrwx 1 root root 172 Jun 26 20:38 resolv.conf.override*
接下来,创建一个脚本,例如20-resolv-conf-override
。按如下所示匹配权限和所有者。
$ cd /etc/NetworkManager/dispatcher.d
$ ll 20-resolv-conf-override
-rwxr-xr-x 1 root root 101 Jun 26 20:45 20-resolv-conf-override*
$ cat 20-resolv-conf-override
#!/bin/sh
cp -f /etc/resolv.conf.override /run/resolvconf/resolv.conf
$ sudo ln -f 20-resolv-conf-override ./pre-up.d/
脚本在重新启动dispatcher.d
时运行NetworkManager
。相反,脚本在dispatcher.d/pre-up.d
系统重新启动时有效运行。两者都是必需的。