백그라운드 프로세스 및 서비스를 시작하지 않고 패키지 설치


43

때로는 일부 응용 프로그램을 설치하면 설치시 자동으로 실행되는 응용 프로그램에서 프로세스 또는 서비스가 시작됩니다. 시작하지 않고 어떻게 설치합니까?


이런 종류의 구성을 사용하여 커널 또는 DKMS 패키지를 설치할 때 시스템이 불안정한 상태로 유지 될 가능성이 무엇인지 궁금합니다. 나는이 영역에 대해 잘 모른다.
ændrük

@ ændrük 그건 걱정이되었습니다. 드라이브에 최소한의 Ubuntu를 설치하고 부팅하는 대신 Live CD / USB를 chroot사용하여 필요한 패키지를 설치하는 것을 알 수 있습니다. 물론 드라이버, 특히 GPU 드라이버는 존재하지 않으므로 설치해야합니다.
Oxwivi

답변:


35

자동 설치 스크립트에서 한동안 사용해온 약간 해킹이지만 상당히 안정적인 방법이 있습니다.

먼저 예를 들어 /root/fake, /bin/true호출 된 심볼릭 링크가 포함 된 디렉토리를 만듭니다 .

initctl
invoke-rc.d
restart
start
stop
start-stop-daemon
service
deb-systemd-helper

아무것도하지 않고 성공을 리턴하는 스크립트를 bash로 만들 수도 있습니다.

그런 다음 $PATH패키지를 설치할 때 해당 디렉토리를 포함 시키십시오 .

PATH=/root/fake:$PATH apt-get install whatever

이것은 initramfs 작성과 같은 작업이 여전히 수행되는 동안 데몬이 시작 / 다시 시작되는 것을 방지합니다.

설명

패키지 설치 및 제거시 실행되는 스크립트는 invoke-rc.d서비스를 시작 및 중지하기 위해 언급 된 명령 중 다른 명령을 실행 합니다. 그러나 그들은 절대 경로로 그들을 부르지 않습니다 (적어도 나는 그것을 만나지 못했습니다).

따라서 시작 부분에 가짜 "작동 없음"명령을 삽입하면 $PATH실제 명령이 호출되지 않습니다.

서비스를 시작 / 중지하는 데 사용 된 명령 만 위조되기 때문에 initramfs-images 업데이트 / 작성과 같은 중요한 작업은 여전히 ​​작동합니다.


심볼릭 링크에 익숙하지 않은 경우 수행하는 모든 단계를 자세히 설명 할 수 있습니까?
Oxwivi

심볼릭 링크는 내용이없는 특수한 유형의 파일이며 대신 경로 / 이름으로 다른 파일을 참조합니다. ln -s이 경우 예를 들어을 사용하여 만들 수 있습니다 ln -s /bin/true /root/fake/initctl.
bseibold

데몬이 시작 / 다시 시작되는 것을 어떻게 방지합니까? @psusi의 답변에 따르면 invoke-rc.d책임이 있습니다.
Oxwivi

$PATH변수 시작 부분에 faked 명령이있는 디렉토리를 배치하면 invoke-rc.d데몬을 시작 및 중지하는 데 사용할 수있는 모든 호출 및 기타 호출 이 fake 명령을 사용합니다. 즉, 절대 경로로 호출되지 않는 한이 문제가 발생하지 않았습니다.
bseibold

아, 이제 어떻게 작동하는지 봅니다. 기본적으로 심볼릭 링크는 막 다른 골목으로 이어집니다. 그러나 정확히 무엇 /bin/true입니까? 그리고 패키지와 관련된 나머지 명령은 무엇입니까? 그들은 특정에 의해 트랙 밖으로 던져지지 $PATH않습니까?
Oxwivi

27

백그라운드 데몬은로 시작합니다 invoke-rc.d. 이는 rc 스크립트가 현재 시스템 실행 수준에서 실행되지 않아야한다고 데몬이 시작되면 데몬이 시작되지 않도록합니다. 환경 변수 RUNLEVEL을 설정하여 현재 시스템 실행 레벨에 대한 아이디어를 대체 할 수 있습니다. 런레벨 0과 6에서는 아무것도 실행되지 않지만, invoke-rc.d이런 런레벨을 사용하면 버그가 있고 어쨌든 작동합니다. 대부분의 데몬은 런레벨 1에서 실행되지 않으므로 다음과 같이 설치시 데몬이 시작되지 않도록 할 수 있습니다.

sudo RUNLEVEL=1 apt-get install redis-server

드라이브에 최소한의 Ubuntu를 설치하고 부팅하는 대신 Live CD / USB를 chroot사용하여 필요한 패키지를 설치합니다. 일이 시작되기 때문에 때로는 우분투 (라이브 CD) 세션에서 벗어날 수 있습니다. 어쨌든, 내가 부탁하고 싶은 것은, 어떻게이 사용합니까됩니다 RUNLEVELchroot?
Oxwivi

@Oxwivi와 같은 방식이지만 자동으로 chroot에 있는지 감지하고 데몬 시작을 건너 뜁니다.
psusi

버그 invoke-rc.d가 내가 직면 한 문제에 대한 책임이 있습니까?
Oxwivi

@Oxwivi, 가능하지만 특정 패키지가 버그가 있고를 사용하지 않을 가능성이 큽니다 invoke-rc.d. 이것은 어떤 패키지입니까?
psusi

나는 전혀 설치할 패키지를 모두 나열했으며 출력을보기 위해 터미널을 더 이상 신경 쓰지 않았다.
Oxwivi


5

설치 --no-triggers를 할 때 명령 행 옵션 을 사용해야한다고 생각합니다 dpkg. 이 같은:

dpkg -i --no-triggers SomeBigPackage.deb

apt-get install트리거를 실행하지 않도록 이 설정을 지속적으로 유지하려면 다음 위치 에 사용자 정의 dpkg 구성 파일을 작성하십시오 /etc/dpkg/dpkg.cfg.d/custom.

# Install packages without starting background processes and services
# See http://askubuntu.com/q/74061  
no-triggers

dpkg는 여전히 트리거가 실행되지 않은 경우에도 트리거를 기록합니다.

$ sudo apt-get install redis-server 
…
Starting redis-server: redis-server.
$ service redis-server status
redis-server is not running

또는 설치 관리자 스크립트가 service명령을 실행 하여 새 서비스를 끄도록 할 수 있습니다 .

service name_of_service stop

1
어떤 apt-get동등한? 아니면 직접 사용하든 설치 하든 dpkg실행 하도록 구성 할 수 있는 방법이 있습니까? --no-triggersdpkgapt-get
Oxwivi

dan_linder, @Oxwivi의 질문에 대한 답변으로 편집하는 것을 신경 쓰지 않기를 바랍니다. 마음에 들지 않으면 언제든지 수정 / 복귀하십시오.
ændrük

5
이것은 올바르지 않습니다. 트리거는 데몬 시작과 ​​아무 관련이 없습니다. 트리거는 initramfs 후크를 추가하는 패키지를 설치하는 경우 initramfs-tools 패키지를 트리거하여 initramfs를 다시 빌드하는 것과 같이 다른 패키지에 대한 응답으로 자체 재구성을 수행하는 하나의 패키지입니다.
psusi

3

내가 한 일은 dpkg-divert를 사용한 것을 제외하고 패키지를 설치할 때 debootstrap이 수행하는 작업을 모방하는 것입니다.

먼저 실제 파일을 방해하지 마십시오.

dpkg-divert --add --rename --local /sbin/start-stop-daemon
dpkg-divert --add --rename --local /sbin/initctl

그런 다음 더미 버전을 만듭니다.

echo \
"#!/bin/sh
echo
echo \"Warning: Fake start-stop-daemon called, doing nothing\"" > "/sbin/start-stop-daemon"
chmod 755 "/sbin/start-stop-daemon"

echo \
"#!/bin/sh
echo
echo \"Warning: Fake initctl called, doing nothing\"" > "/sbin/initctl"
chmod 755 "/sbin/initctl"

그런 다음 apt-get 업그레이드, 설치 등을 수행 한 후 다음을 정리하십시오.

rm /sbin/initctl /sbin/start-stop-daemon
dpkg-divert --remove --rename /sbin/initctl
dpkg-divert --remove --rename /sbin/start-stop-daemon

서비스를 중지 / 시작하는 데 사용할 수있는 다른 명령이 있지만 debootstrap은 start-stop-daemonand 만 신경 쓰므로 initctl알았습니다.


3

빠른 원 라이너 :

echo -e '#!/bin/sh\nexit 101' | install -m 755 /dev/stdin /usr/sbin/policy-rc.d && apt-get install **Package** && rm -f /usr/sbin/policy-rc.d

"빠른 one-liner"를 넣은 사람과 관련하여 /usr/sbin/policy-rc.d를 실행 파일로 설정하는 것을 잊었습니다. 그렇지 않으면 무시됩니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.