관련 서비스를 시작하지 않고 패키지를 어떻게 설치합니까?


13

아시다시피, Debian 또는 Ubuntu 기반 시스템에 패키지를 설치할 때 기본적으로 패키지에 서비스가 포함되어 있으면 패키지를 설치할 때 해당 서비스가 일반적으로 활성화되고 자동으로 시작됩니다.

이것은 나에게 문제가된다.

LXC 컨테이너 빌드를위한 템플릿을 관리해야한다는 것을 알게되었습니다. 각각 데비안 또는 우분투 릴리스에 해당하는 여러 컨테이너가 있습니다. (Red Hat 기반 컨테이너도 있지만 여기서는 관련이 없습니다.)

/var/lib/libvirt/filesystems/debian6_template
/var/lib/libvirt/filesystems/debian7_template
/var/lib/libvirt/filesystems/ubuntu1004_template
/var/lib/libvirt/filesystems/ubuntu1204_template

때로는 템플릿에 누락 된 패키지가 있거나 다른 변경이 필요하다는 것을 알기 때문에 패키지를 설치하기 위해 chroot 할 것입니다. 불행히도 그렇게 할 때 패키지 서비스의 여러 사본이 실행됩니다!

예를 들어, 템플릿에 syslog 데몬이없는 것을 발견하여 하나를 설치했습니다.

for template in /var/lib/libvirt/filesystems/{debian,ubuntu}*_template; do
    chroot $template apt-get install rsyslog
done

그리고 rsyslog의 사본 4 개가 즉시 실행됩니다. exim4의 두 사본은 말할 것도 없습니다. 죄송합니다!


chroot에서 실행할 때 서비스를 시작하지 않아야하지만 여기서는 분명히 일어나지 않는다는 것을 어딘가에서 읽습니다 (지금은 다시 찾을 수는 없지만).

한 잠재적으로 가능한 불쾌한 해킹 일시적으로 실제와 같은 서비스를 시작, 다양한 명령 대체 통화 start-stop-daemoninitctl이 정말하고 싶었던 것보다 훨씬 더 많은 작업이 비록을. 그래도 다른 선택이 없다면 ...

여기서 이상적인 해결책은 데비안 기반 시스템이이 헛소리를 멈추는 것이지만 실패하거나 문서화되지 않은 apt-get?

명확하지 않은 경우 가능한 경우 템플릿 외부 에서 템플릿 관리와 관련된 것을 유지하고 싶습니다 .

답변:


23

데비안의 경우 policy-rc.d 로이를 수행 할 수 있습니다 . 다음은 한 가지 설명입니다 .

패키지의 관리자 스크립트는 invoke-rc.d, update-rc.d 및 LSB 초기화 스크립트 헤더를 사용하여 init 시스템과 만 인터페이스해야합니다 ... invoke-rc.d는 조치를 취하기 전에 /usr/sbin/policy-rc.d는 실행 가능하며 명령 줄에서 해당 서비스 이름과 현재 런레벨 번호로 호출하고 종료 코드에 따라 작동합니다. 예를 들어, 리턴 값 101은 계획된 조치를 수행하지 못하게합니다. 여기에는 패키지 설치시 서비스의 자동 시작 및 패키지 제거시 서비스 중지가 포함되며 패키지 업그레이드 중 업그레이드 업그레이드 중지 의식을 줄여 업그레이드를 수행하여 이전 버전의 서비스를 계속 실행할 수 있습니다.

어떤 서비스도 시작하기를 원하지 않기 때문에 policy-rc.d 스크립트는 단순히

#!/bin/sh
exit 101

이것은 pbuilder 및 Docker의 mkimage-debootstrap 과 같은 도구에서 사용하는 기술 입니다.

불행히도이 기술 은 우분투 chroot 에서는 작동하지 않습니다 . upstart init 시스템과 통합 된 패키지는 설치 중에 invoke-rc.d 대신 / usr / sbin / initctl을 호출하며 initctl은 policy-rc.d를 참조하지 않습니다. upstart의 저자에 따르면 해결 방법은 / sbin / initctl을 chroot에서 / bin / true에 대한 심볼릭 링크로 바꾸는 것입니다. mkimage-debootstrap에서도 볼 수 있습니다.

dpkg-divert --local --rename --add /sbin/initctl
ln -sf /bin/true sbin/initctl

템플릿에서 컨테이너를 만들기 전에 제거해야하지만 꽤 깨끗해 보입니다.
Michael Hampton

1
고마워 Docker의 mkimage-debootstrap 스크립트를 찢어 버릴 수도 있습니다. 주로이 문제를 해결 한 것으로 보입니다.
Michael Hampton

4

넌 할 수있어:

export RUNLEVEL=1
for template in /var/lib/libvirt/filesystems/{debian,ubuntu}*_template; do
    chroot $template apt-get install rsyslog
done
exit

chroot로 테스트하지는 않았지만 작동합니다. 처음에는 RUNLEVEL 환경 변수를 설정하므로 apt-get으로 시작된 프로세스는 시스템이 단일 모드에서 실행중인 것으로 "생각"하기 때문에 서비스를 시작 하지 않습니다 . 환경이 향후 명령에 영향을 줄 수있는 방식으로 수정되었으므로 수정 된 환경이 더 이상 필요하지 않은 경우 셸을 종료해야합니다.이 작업 은 마지막 에 종료 명령으로 수행됩니다 . 단일 모드에서 제대로 설치되지 않는 일부 (희귀 한) 패키지 가있을 수 있습니다 (그러나 AFAIK는 대부분의 경우 문제가되지 않습니다).


export RUNLEVEL=1중요한 부분은 여기? 정확히 어떤 일이 발생합니까?
Michael Hampton

@MichaelHampton RUNLEVEL 환경 변수가 현재 실행 수준을 제공한다고 생각합니다. 이 경우 그는 그냥 덮어 쓰므로 모든 응용 프로그램이 1에서 실행되고 있다고 생각할 것입니다. "kludge"의 일종이지만 충분합니다.
WinkyWolly

원래 답변에 설명을 추가했습니다. 기본적으로 이것은 @WinkyWolly가 말한 것입니다.
DavisNT

불행히도 rsyslog이런 방식으로 설치하려고 할 때 완전히 터지는 "희귀 한"패키지 중 하나가되었습니다. 그래도 여전히 유용 할 수 있으므로 공감대를 유지할 수 있습니다 :)
Michael Hampton
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.