/etc/services 是否有一个系统范围的“扩展”在软件包更新时不会被替换?

/etc/services 是否有一个系统范围的“扩展”在软件包更新时不会被替换?

我知道如何使用/etc/services,但如果我更改它并且inetd稍后将软件包更新为apt-get新的默认软件包,我的更改就会消失(发生在我apt-get dist-upgrade从 Debian Wheezy 到 Jessie 的情况下)。它们保存在备份中,但我仍然必须重新集成我的更改,否则可能会错过包管理器中的新默认值(通过跳过新默认版本的安装)。

有没有办法让用户生成的系统范围的“扩展”/etc/services也被加载并且仅包含我的更改,以便配置不会因包更新而被破坏?

我正在研究 Debian Jessie(如果相关的话)。

答案1

/etc/services是一个配置文件,所以如果你在本地修改了它并用修改后的版本安装了新的软件包版本,dpkg会询问你是保留你的版本还是安装新版本。不幸的是,它不会为您提供一种简单的方法来合并更改。

你可以转移提供的包/etc/services和您自己提供的。

dpkg-divert --add --local --rename --divert /etc/services.debian /etc/services

如果您想连接自己的条目或以其他方式转换 Debian 文件,您可以在 APT 完成其工作时运行挂钩脚本。在中声明脚本/etc/apt/apt.conf.d/local-etc-merge

DPkg::Post-Invoke {"cat /etc/services.local /etc/services.debian >/etc/services"}

或者,您可以使/etc/services 读取时调用命令/etc/services.local(除非您经常修改,否则这太过分了)。

答案2

这似乎不时出现在各种错误跟踪器中:Debian #46049,Debian #711001,右侧#133683。但这些似乎都没有实施。

回顾一下:名称服务开关读取/etc/nsswitch.conf在哪里寻找例如services信息:

$ strace -f -e open,stat getent 服务 > /dev/null
[...]
打开(“/lib/x86_64-linux-gnu/libc.so.6”,O_RDONLY | O_CLOEXEC)= 3
打开(“/etc/nsswitch.conf”,O_RDONLY | O_CLOEXEC)= 3
打开(“/usr/lib/libnss_db.so.2”,O_RDONLY | O_CLOEXEC)= 3
打开(“/lib/x86_64-linux-gnu/libnss_files.so.2”,O_RDONLY | O_CLOEXEC)= 3
打开(“/usr/lib/x86_64-linux-gnu/libdb-5.3.so”,O_RDONLY | O_CLOEXEC)= 3
open("/var/lib/misc/DB_CONFIG", O_RDONLY) = -1 ENOENT(没有这样的文件或目录)
stat("/var/lib/misc/services.db", 0x7ffd79d77060) = -1 ENOENT(没有这样的文件或目录)
打开(“/etc/services”,O_RDONLY | O_CLOEXEC)= 3
+++ 以 0 退出 +++

libnss_db.so.2只能找到这个,因为我安装了libnss 数据库早些时候。所以,如果有人设法创建一个伯克利数据库数据库/var/lib/misc/services.db与附加服务名称,这可以工作。

更新:对于libnss-db(Debian/不稳定这里),这确实是可能的:

$ grep ^[A-Z] /etc/default/libnss-db 
ETC = /etc/local
DBS = services
VAR_DB = /var/lib/misc
AWK = awk
MAKEDB = makedb --quiet

$ cat /etc/local/services
# Local services
foobar          1234/tcp                        # Foo
barbaz          4321/udp

$ make
services... done.

$ getent services | wc -l
559

$ getent services foobar barbaz
foobar                1234/tcp
barbaz                4321/udp

既然/etc/local不是已注册的配置目录,任何升级过程都不应触及它

否则,这些路径名似乎是硬编码的,只能在重新编译中更改/扩展,因此上面提到了愿望清单票证。

$ strings /lib/x86_64-linux-gnu/libnss_files.so.2 | grep services
/etc/services

注意:还有一个libnss 额外用户包,它似乎为 NSS 提供了附加文件,但仅限于passwd,shadowgroup信息。

答案3

不幸的是没有办法做到这一点。一种选择是“保留”该netbase包,这样它就不会自动更新。

echo "netbase hold" | dpkg --set-selections

另一种选择可能是声明一个/etc/services.local补丁并将其提交给netbase维护者,以合并该文件及其自己的/etc/services.我不认为这会太困难,除非需要修改排序/合并来理解#注释行。

相关内容