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?
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.
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:
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.
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:
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:
Saya tahu ada perintah lain yang dapat digunakan untuk menghentikan / memulai layanan, tetapi debootstrap hanya peduli start-stop-daemondan initctl, jadi saya mengikutinya.
Sehubungan dengan orang yang meletakkan "quick one-liner", Anda lupa untuk mengatur /usr/sbin/policy-rc.d sebagai yang dapat dieksekusi. Sebaliknya akan diabaikan.
chroot
dan menginstal paket yang saya butuhkan. Tentu saja driver, khususnya, driver GPU tidak ada dan perlu diinstal.Jawaban:
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/true
dipanggil:Anda juga bisa membuatnya bash script yang tidak melakukan apa pun dan mengembalikan kesuksesan.
Kemudian sertakan direktori itu di bagian depan
$PATH
saat menginstal paket: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.d
atau 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.
sumber
ln -s
, dalam hal ini misalnyaln -s /bin/true /root/fake/initctl
.invoke-rc.d
bertanggung jawab.$PATH
variabel, semua panggilan keinvoke-rc.d
dan 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./bin/true
masalahnya? Dan bagaimana dengan sisa perintah yang terlibat dalam paket? Bukankah mereka akan dilempar keluar jalur sesuai yang ditentukan$PATH
?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 tampaknyainvoke-rc.d
buggy 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:sumber
chroot
dan 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 iniRUNLEVEL
dichroot
?invoke-rc.d
bertanggung jawab atas masalah yang saya hadapi?invoke-rc.d
. Paket apa ini?Ada solusi yang lebih baik :
sumber
Saya yakin Anda perlu menggunakan
--no-triggers
opsi baris perintah saat Andadpkg
menginstal. Sesuatu seperti ini:Untuk membuat pengaturan ini gigih sehingga
apt-get install
tidak menjalankan pemicu apa pun, buat file konfigurasi dpkg khusus di/etc/dpkg/dpkg.cfg.d/custom
:Perhatikan bahwa dpkg masih mencatat bahwa pemicu telah berjalan meskipun belum:
Atau, Anda dapat meminta skrip pemasang menjalankan
service
perintah untuk mematikan layanan baru:sumber
apt-get
setara? Atau apakah ada cara untuk mengkonfigurasidpkg
untuk dijalankan dengan--no-triggers
apakah menggunakandpkg
secara langsung atauapt-get
menginstal sesuatu?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:
Kemudian buat versi dummy:
Kemudian lakukan upgrade apt-get, instal, dll., Lalu bersihkan dengan:
Saya tahu ada perintah lain yang dapat digunakan untuk menghentikan / memulai layanan, tetapi debootstrap hanya peduli
start-stop-daemon
daninitctl
, jadi saya mengikutinya.sumber
Satu kalimat cepat:
sumber