Instal paket tanpa memulai proses dan layanan latar belakang

43

Terkadang menginstal beberapa aplikasi akan memulai proses atau layanan dari aplikasi yang dijalankan secara otomatis pada saat instalasi. Bagaimana saya menginstal tanpa memulai mereka?

Oxwivi
sumber
Saya bertanya-tanya apa potensi yang ada untuk meninggalkan sistem dalam keadaan tidak stabil ketika menginstal paket kernel atau DKMS menggunakan konfigurasi semacam ini. Saya tidak tahu banyak tentang bidang ini.
ændrük
@ ændrük Itu membuat saya khawatir. Anda lihat saya menginstal minimal Ubuntu pada drive, kemudian bukannya boot ke dalamnya, saya menggunakan Live CD / USB untuk chrootdan menginstal paket yang saya butuhkan. Tentu saja driver, khususnya, driver GPU tidak ada dan perlu diinstal.
Oxwivi

Jawaban:

35

Ada sedikit peretasan, tetapi cara yang cukup andal untuk melakukan ini yang telah saya gunakan untuk sementara waktu dalam skrip instalasi otomatis.

Pertama buat direktori, misalnya /root/fake, yang berisi symlink untuk /bin/truedipanggil:

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

Anda juga bisa membuatnya bash script yang tidak melakukan apa pun dan mengembalikan kesuksesan.

Kemudian sertakan direktori itu di bagian depan $PATHsaat menginstal paket:

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

Ini hanya mencegah daemon memulai / memulai ulang, sementara hal-hal seperti membuat initramfs masih dilakukan.

Penjelasan

Skrip yang sedang dieksekusi di instalasi paket dan penghapusan mengeksekusi invoke-rc.datau orang lain dari perintah yang disebutkan untuk memulai dan menghentikan layanan. Namun mereka tidak memanggil mereka dengan jalur absolut (setidaknya saya belum menemukan yang benar).

Jadi dengan memasukkan perintah "tidak ada operasi" yang dipalsukan di awal $PATH, perintah yang sebenarnya tidak pernah dipanggil.

Karena hanya perintah yang digunakan untuk memulai / menghentikan layanan yang dipalsukan, yang lainnya, terutama tugas-tugas penting seperti memperbarui / membuat initramfs-gambar masih berfungsi.

bseibold
sumber
Tidak terlalu akrab dengan symlink, dapatkah Anda menguraikan semua langkah yang Anda ambil?
Oxwivi
Symlink adalah jenis file khusus yang tidak memiliki konten, melainkan merujuk ke file lain (berdasarkan jalur / nama). Mereka dapat dibuat dengan ln -s, dalam hal ini misalnya ln -s /bin/true /root/fake/initctl.
bseibold
Bagaimana cara mencegah daemon memulai / memulai ulang? Menurut jawaban @ psusi invoke-rc.dbertanggung jawab.
Oxwivi
Dengan menempatkan direktori dengan perintah palsu di awal $PATHvariabel, semua panggilan ke invoke-rc.ddan lainnya yang dapat digunakan untuk memulai dan menghentikan daemon menggunakan perintah palsu. Yaitu, kecuali mereka dipanggil dengan jalan absolut, tetapi saya tidak pernah menemui ini.
bseibold
Ah, sekarang saya melihat cara kerjanya - pada dasarnya, symlink mengarah ke jalan buntu. Tapi apa /bin/truemasalahnya? Dan bagaimana dengan sisa perintah yang terlibat dalam paket? Bukankah mereka akan dilempar keluar jalur sesuai yang ditentukan $PATH?
Oxwivi
27

Latar belakang daemon dimulai dengan invoke-rc.d, yang memastikan bahwa daemon tidak dimulai jika skrip rcnya mengatakan itu tidak seharusnya dijalankan di runlevel sistem saat ini. Anda dapat mengesampingkan idenya tentang runlevel sistem saat ini dengan mengatur variabel lingkungan RUNLEVEL. Tidak ada yang seharusnya dijalankan di runlevel 0 dan 6, tetapi tampaknya invoke-rc.dbuggy dan menjalankan banyak hal jika Anda menggunakan runlevel ini. Sebagian besar daemon tidak berjalan di runlevel 1, sehingga Anda dapat mencegahnya untuk mulai menginstal seperti ini:

sudo RUNLEVEL=1 apt-get install redis-server
psusi
sumber
Saya menginstal Ubuntu minimal pada drive, kemudian bukannya boot ke dalamnya, saya menggunakan Live CD / USB untuk chrootdan menginstal paket yang saya butuhkan. Karena hal-hal mulai berjalan, kadang-kadang saya beralih dari sesi ubuntu (live CD). Pokoknya, hal yang saya ingin tanyakan adalah, bagaimana cara menggunakan ini RUNLEVELdi chroot?
Oxwivi
@Oxwivi, dengan cara yang sama, tetapi seharusnya mendeteksi secara otomatis Anda berada di chroot dan melewatkan start daemon.
psusi
Apakah mungkin buggy invoke-rc.dbertanggung jawab atas masalah yang saya hadapi?
Oxwivi
@ Owiwivi, itu mungkin, tetapi lebih mungkin bahwa paket tertentu bermasalah dan tidak digunakan invoke-rc.d. Paket apa ini?
psusi
Saya tidak tahu, saya hanya mendaftar semua paket untuk menginstal dan tidak keberatan terminal lebih jauh untuk melihat output.
Oxwivi
5

Saya yakin Anda perlu menggunakan --no-triggersopsi baris perintah saat Anda dpkgmenginstal. Sesuatu seperti ini:

dpkg -i --no-triggers SomeBigPackage.deb

Untuk membuat pengaturan ini gigih sehingga apt-get installtidak menjalankan pemicu apa pun, buat file konfigurasi dpkg khusus di /etc/dpkg/dpkg.cfg.d/custom:

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

Perhatikan bahwa dpkg masih mencatat bahwa pemicu telah berjalan meskipun belum:

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

Atau, Anda dapat meminta skrip pemasang menjalankan serviceperintah untuk mematikan layanan baru:

service name_of_service stop
dan_linder
sumber
1
Adakah yang apt-getsetara? Atau apakah ada cara untuk mengkonfigurasi dpkguntuk dijalankan dengan --no-triggersapakah menggunakan dpkgsecara langsung atau apt-getmenginstal sesuatu?
Oxwivi
dan_linder, saya harap Anda tidak keberatan saya mengedit jawaban untuk pertanyaan @ Oxwivi. Jangan ragu untuk memodifikasi / mengembalikannya jika tidak sesuai dengan keinginan Anda.
ændrük
5
Ini salah. Pemicu tidak ada hubungannya dengan memulai daemon. Pemicu adalah satu paket yang melakukan beberapa tindakan untuk mengkonfigurasi ulang dirinya sebagai tanggapan terhadap yang lain, seperti jika Anda menginstal paket yang menambahkan kait initramfs, itu memicu paket initramfs-tools untuk membangun kembali initramfs Anda.
psusi
3

Apa yang akhirnya saya lakukan adalah meniru apa yang dilakukan debootstrap ketika menginstal paket, kecuali saya menggunakan dpkg-divert:

Pertama-tama pindahkan file yang sebenarnya:

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

Kemudian buat versi dummy:

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"

Kemudian lakukan upgrade apt-get, instal, dll., Lalu bersihkan dengan:

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

Saya tahu ada perintah lain yang dapat digunakan untuk menghentikan / memulai layanan, tetapi debootstrap hanya peduli start-stop-daemondan initctl, jadi saya mengikutinya.

Tal
sumber
3

Satu kalimat cepat:

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
pl1nk
sumber
Sehubungan dengan orang yang meletakkan "quick one-liner", Anda lupa untuk mengatur /usr/sbin/policy-rc.d sebagai yang dapat dieksekusi. Sebaliknya akan diabaikan.