패키지가 업데이트될 때 대체되지 않는 /etc/services에 대한 시스템 전체 "확장"이 있습니까?

패키지가 업데이트될 때 대체되지 않는 /etc/services에 대한 시스템 전체 "확장"이 있습니까?

나는 그것을 사용하는 방법을 알고 있지만 /etc/services, 그것을 변경하고 inetd나중에 패키지를 apt-get새로운 기본 패키지로 업데이트하면 변경 사항이 사라집니다( apt-get dist-upgradeDebian Wheezy에서 Jessie로 전환했을 때 발생했습니다). 백업에 저장되지만 변경 사항을 다시 통합해야 합니다. 그렇지 않으면 패키지 관리자에서 새 기본 버전 설치를 건너뛰어 새 기본값이 누락될 위험이 있습니다.

/etc/services사용자가 생성한 시스템 전체 "확장" 도 로드하고 내 변경 사항만 포함하여 패키지 업데이트로 인해 구성이 손상되지 않도록 하는 방법이 있습니까 ?

나는 Debian Jessie를 조사하고 있습니다(해당되는 경우).

답변1

/etc/services구성 파일따라서 로컬에서 수정하고 수정된 버전으로 새 패키지 버전을 설치한 경우 dpkg는 해당 버전을 유지할지 아니면 새 버전을 설치할지 묻습니다. 불행하게도 변경 사항을 병합하는 쉬운 방법은 제공되지 않습니다.

당신은 할 수옮기다패키지 /etc/services와 나만의 패키지가 제공됩니다.

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

자신의 항목을 연결하거나 데비안 파일을 변환하려는 경우 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

이는 때때로 다양한 버그 추적기에 표시되는 것 같습니다.데비안 #46049,데비안 #711001,오른쪽 #133683. 그러나 이들 중 어느 것도 구현되지 않은 것으로 보입니다.

요약하자면:이름 서비스 스위치다음과 같은 정보를 /etc/nsswitch.conf찾을 수 있는 곳을 읽어보세요 .services

$ strace -f -e open,stat getent 서비스 > /dev/null
[...]
open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY | O_CLOEXEC) = 3
open("/etc/nsswitch.conf", O_RDONLY | O_CLOEXEC) = 3
open("/usr/lib/libnss_db.so.2", O_RDONLY | O_CLOEXEC) = 3
open("/lib/x86_64-linux-gnu/libnss_files.so.2", O_RDONLY | O_CLOEXEC) = 3
open("/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(해당 파일이나 디렉터리 없음)
open("/etc/services", O_RDONLY | O_CLOEXEC) = 3
+++ 0으로 종료++++

libnss_db.so.2내가 설치했기 때문에 이것을 찾을 수 있었습니다libnss 데이터베이스더 일찍. 따라서 누군가가버클리 데이터베이스추가 서비스 이름이 있는 데이터베이스가 /var/lib/misc/services.db작동합니다.

고쳐 쓰다:(Debian/unstable here) 의 경우 libnss-db실제로 가능합니다.

$ 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#

관련 정보