バックグラウンドプロセスとサービスを開始せずにパッケージをインストールする


43

一部のアプリケーションをインストールすると、インストール時に自動的に実行されるアプリケーションからプロセスまたはサービスが開始される場合があります。それらを起動せずにインストールする方法は?


この種の構成を使用してカーネルまたはDKMSパッケージをインストールすると、システムが不安定な状態になる可能性があるのではないかと思います。私はこの分野についてあまり知りません。
アーンドリューク

@ændrük心配しています。ドライブに最小限のUbuntuをインストールしているのがわかります。それから起動する代わりに、Live CD / USBを使用してchroot必要なパッケージをインストールします。もちろん、ドライバー、特にGPUドライバーは存在しないため、インストールする必要があります。
オックスウィーヴィ

回答:


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の更新/作成などの重要なタスクは引き続き機能します。


シンボリックリンクにあまり慣れていないのですが、実行するすべての手順を詳しく説明できますか?
オックスウィビ

シンボリックリンクは、コンテンツを持たない特別なタイプのファイルであり、代わりに(パス/名前で)別のファイルを参照します。これらはln -s、たとえばこの場合に作成できますln -s /bin/true /root/fake/initctl
bseibold

デーモンの起動/再起動をどのように防止しますか?@psusiの回答によるinvoke-rc.dと責任があります。
オックスウィーヴィ

$PATH変数の先頭に偽のコマンドを使用してディレクトリを配置すると、invoke-rc.dデーモンへのすべての呼び出しやデーモンの起動と停止に使用できるその他の呼び出しは、偽のコマンドを使用します。つまり、絶対パスで呼び出されない限り、これに遭遇したことはありません。
bseibold

ああ、今、私はそれがどのように機能するかを見る-基本的に、シンボリックリンクは行き止まりにつながる しかし、正確には何/bin/trueですか?また、パッケージに関係する残りのコマンドは何ですか?それらは指定されたものによって軌道外に投げられません$PATHか?
オックスウィーヴィ

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必要なパッケージをインストールします。実行が開始されたため、時々、ubuntu(ライブCD)セッションを終了します。とにかく、私が尋ねたいのは、どのようにこれを使用RUNLEVELするのchrootですか?
オックスウィーヴィ

@Oxwiviも同じ方法ですが、chrootにいることを自動的に検出し、デーモンの起動をスキップすることになっています。
psusi

invoke-rc.d私が直面した問題の原因はバギーにある可能性はありますか?
オックスウィビ

@Oxwiviは可能ですが、特定のパッケージにバグがあり、を使用していない可能性が高くなりますinvoke-rc.d。これはどのパッケージですか?
psusi

インストールするすべてのパッケージをリストしただけで、出力を表示するために端末をそれ以上気にしませんでした。
オックスウィビ


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
オックスウィーヴィ

dan_linder、@ Oxwiviの質問への回答の編集を気にしないでください。自分の好みに合わない場合は、自由に変更/元に戻してください。
アーンドリューク

5
これは間違っています。トリガーは、デーモンの起動とは関係ありません。トリガーとは、initramfsフックを追加するパッケージをインストールすると、initramfs-toolsパッケージをトリガーしてinitramfsを再構築するなど、別のアクションに応じて自身を再構成するアクションを実行するパッケージです。
psusi

3

私がやったことは、パッケージをインストールするときにdebootstrapが何をするかをエミュレートすることです。ただし、dpkg-divertを使用しました。

まず、実際のファイルを邪魔にならない場所に移動します。

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-daemonして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

「クイックワンライナー」を設定した人に関しては、/ usr / sbin / policy-rc.dを実行可能ファイルとして設定するのを忘れていました。それ以外の場合は無視されます。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.