我知道如何使用/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
,shadow
和group
信息。
答案3
不幸的是没有办法做到这一点。一种选择是“保留”该netbase
包,这样它就不会自动更新。
echo "netbase hold" | dpkg --set-selections
另一种选择可能是声明一个/etc/services.local
补丁并将其提交给netbase
维护者,以合并该文件及其自己的/etc/services
.我不认为这会太困难,除非需要修改排序/合并来理解#
注释行。