때로는 일부 응용 프로그램을 설치하면 설치시 자동으로 실행되는 응용 프로그램에서 프로세스 또는 서비스가 시작됩니다. 시작하지 않고 어떻게 설치합니까?
chroot사용하여 필요한 패키지를 설치하는 것을 알 수 있습니다. 물론 드라이버, 특히 GPU 드라이버는 존재하지 않으므로 설치해야합니다.
때로는 일부 응용 프로그램을 설치하면 설치시 자동으로 실행되는 응용 프로그램에서 프로세스 또는 서비스가 시작됩니다. 시작하지 않고 어떻게 설치합니까?
chroot사용하여 필요한 패키지를 설치하는 것을 알 수 있습니다. 물론 드라이버, 특히 GPU 드라이버는 존재하지 않으므로 설치해야합니다.
답변:
자동 설치 스크립트에서 한동안 사용해온 약간 해킹이지만 상당히 안정적인 방법이 있습니다.
먼저 예를 들어 /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 업데이트 / 작성과 같은 중요한 작업은 여전히 작동합니다.
ln -s이 경우 예를 들어을 사용하여 만들 수 있습니다 ln -s /bin/true /root/fake/initctl.
invoke-rc.d책임이 있습니다.
$PATH변수 시작 부분에 faked 명령이있는 디렉토리를 배치하면 invoke-rc.d데몬을 시작 및 중지하는 데 사용할 수있는 모든 호출 및 기타 호출 이 fake 명령을 사용합니다. 즉, 절대 경로로 호출되지 않는 한이 문제가 발생하지 않았습니다.
/bin/true입니까? 그리고 패키지와 관련된 나머지 명령은 무엇입니까? 그들은 특정에 의해 트랙 밖으로 던져지지 $PATH않습니까?
백그라운드 데몬은로 시작합니다 invoke-rc.d. 이는 rc 스크립트가 현재 시스템 실행 수준에서 실행되지 않아야한다고 데몬이 시작되면 데몬이 시작되지 않도록합니다. 환경 변수 RUNLEVEL을 설정하여 현재 시스템 실행 레벨에 대한 아이디어를 대체 할 수 있습니다. 런레벨 0과 6에서는 아무것도 실행되지 않지만, invoke-rc.d이런 런레벨을 사용하면 버그가 있고 어쨌든 작동합니다. 대부분의 데몬은 런레벨 1에서 실행되지 않으므로 다음과 같이 설치시 데몬이 시작되지 않도록 할 수 있습니다.
sudo RUNLEVEL=1 apt-get install redis-server
chroot사용하여 필요한 패키지를 설치합니다. 일이 시작되기 때문에 때로는 우분투 (라이브 CD) 세션에서 벗어날 수 있습니다. 어쨌든, 내가 부탁하고 싶은 것은, 어떻게이 사용합니까됩니다 RUNLEVEL에 chroot?
invoke-rc.d가 내가 직면 한 문제에 대한 책임이 있습니까?
invoke-rc.d. 이것은 어떤 패키지입니까?
설치 --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
apt-get동등한? 아니면 직접 사용하든 설치 하든 dpkg실행 하도록 구성 할 수 있는 방법이 있습니까? --no-triggersdpkgapt-get
내가 한 일은 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알았습니다.