Mengaktifkan file systemd dengan persyaratan melalui kemasan Debian

8

Saya telah membuat paket deb yang memasang layanan.

Pada perangkat tertanam kami, saya ingin paket ini mengaktifkan layanan secara otomatis. Di workstation pengembang kami, saya ingin para pengembang untuk systemctl start foosecara manual (ini adalah layanan yang berat, dan itu hanya menghabiskan sumber daya jika dijalankan sepanjang waktu di lingkungan desktop).

Bagaimana saya bisa mendorong pengguna untuk keputusan mereka selama apt-getlangkah? Apakah itu solusi terbaik?

Catatan, saya telah membuat paket menggunakan dh_makedan debhelperdan diaktifkan dengan:

%:
    dh $@ --with=systemd

override_dh_systemd_enable:
    dh_systemd_enable --name=foo foo.service
Stewart
sumber

Jawaban:

11

Anda dapat menggunakan preset systemd untuk memengaruhi apakah layanan systemd akan secara default diaktifkan atau dinonaktifkan pada waktu instalasi.

Prasetel standar Debian untuk mengaktifkan semua layanan saat mereka diinstal, jadi Anda hanya perlu mengirimkan preset ke workstation pengembangan (perilaku default cocok dengan apa yang Anda inginkan terjadi dalam produksi), dengan mengirimkan file seperti /etc/systemd/system-preset/80-foo.presetberisi baris yang kata

disable foo.service

Jika Anda mengelola workstation pengembang Anda menggunakan sistem seperti Wayang, Koki, Ansible, dll., Anda dapat menggunakannya untuk mengirimkan konfigurasi preset systemd, yang seharusnya memudahkan Anda untuk menerapkan kebijakan ke workstation pengembang saja dan bukan produksi mesin.

Paket .deb Anda harus menggunakan systemctl presetperintah untuk mengaktifkan layanan, karena perintah itu akan menghormati konfigurasi yang telah ditetapkan.

Seperti yang ditunjukkan oleh @JdeBP dan @sourcejedi , makro Debian di deb-helper (seperti dh_systemd_enable) sudah melakukan itu, mereka memanggil deb-systemd-helperyang akan digunakan systemctl presetsecara default (dengan peringatan kecil bahwa jika Anda menghapus (tetapi tidak membersihkan) paket, dan kemudian kembali menginstalnya, maka tidak akan mengaktifkan layanan ini, bahkan jika Anda menghapus file yang telah ditetapkan) Lihat. komentar ini di deb-systemd-helper's enableoperasi :

    # We use 'systemctl preset' on the initial installation only.
    # On upgrade, we manually add the missing symlinks only if the
    # service already has some links installed. Using 'systemctl
    # preset' allows administrators and downstreams to alter the
    # enable policy using systemd-native tools.

Untuk informasi lebih lanjut tentang fitur systemd dari preset, lihat halaman manual preset systemd dan dari perintah systemctl presetyang mengimplementasikannya.

filbranden
sumber
1
Inilah yang saya butuhkan. Saya menyebarkan lingkungan dev melalui paket meta dan jadi saya dapat menginstal *.presetfile - file ini sebagai bagian dari paket itu.
Stewart
4
Suatu kekhasan penting untuk diketahui adalah bahwa preset hanya dikonsultasikan pada deb-systemd-helpersaat pertama kali suatu paket diinstal. Setelah itu, database paralel yang dikelola oleh alat-alat Debian dikonsultasikan, sampai paket dihapus. news.ycombinator.com/item?id=18320131
JdeBP
1
Jadi deb-systemd-helpertampaknya menggunakan preset. Dan ini seharusnya bekerja tanpa memerlukan perintah preset systemctl manual di dalam paket .deb. Keunikan khusus Debian adalah apa yang terjadi jika Anda menghapus (tetapi tidak membersihkan) paket. Jika nanti Anda menginstal ulang paket, maka tidak akan mengaktifkan layanan, bahkan jika Anda menghapus file yang telah ditetapkan. salsa.debian.org/debian/init-system-helpers/blob/debian/1.56/…
sourcejedi
@sourcejedi Masukkan komentar Anda dan tautkan ke deb-systemd-helper comment ke dalam jawabannya. Terima kasih!
filbranden
5

Jika Anda ingin meminta pengguna selama instalasi, Anda harus menggunakandebconf . Ini memiliki sejumlah keuntungan, bahkan jika Anda tidak berada dalam konteks di mana Kebijakan Debian relevan: ini memberikan pengalaman pengguna akhir yang konsisten, dengan dukungan untuk berbagai frontend; mendukung "level" yang berbeda; ini mendukung pra-seeding. Pra-seeding berarti bahwa paket tersebut dapat pra-konfigurasi, dalam hal ini ia tidak akan meminta sama sekali. Level yang berbeda berarti bahwa prompt dapat diatur untuk hanya ditampilkan dalam keadaan tertentu; Anda kemudian dapat menginstal paket tanpa diminta secara default (untuk target yang disematkan), dan menginstruksikan pengembang Anda untuk mengatur frontend mereka dengan tepat ketika menginstal paket sehingga mereka melihat prompt.

Namun, saya pikir lebih baik untuk menghindari dorongan sama sekali bila memungkinkan. Ini terutama berlaku untuk layanan yang memiliki cara lain untuk berurusan dengan preferensi pengguna akhir, dan ketika berurusan dengan preferensi pengguna mempersulit skrip pengelola (lihat skrip yang dihasilkan dalam paket Anda, mereka sudah berurusan dengan sejumlah masalah halus, menggunakan deb-systemd-helper- Anda Anda harus meniru semua itu, dengan penanganan preferensi Anda di atas).

Jika pengembang Anda tidak perlu menjalankan layanan, mereka dapat menutupinya sebelum menginstal paket, dan layanan tidak akan pernah diaktifkan:

sudo systemctl mask foo

Jika pengembang Anda kadang-kadang perlu menjalankan layanan, menggunakan unit systemd, mereka dapat menonaktifkannya setelah menginstal paket untuk pertama kalinya, dan instalasi selanjutnya akan mengingat ini:

sudo apt install foo
sudo systemctl disable --now foo

Defaultnya adalah mengaktifkan layanan.

Stephen Kitt
sumber
Jawaban yang bagus. debconfsepertinya apa yang ada dalam pikiran saya, tetapi saya setuju bahwa yang terbaik adalah menghindari dorongan bila memungkinkan. Saya tahu tentang itu systemctl disable, tetapi saya mencoba membantu pengguna untuk menghindari "melewatkan langkah" selama instalasi. The *.presetssolusi yang disarankan oleh Filippe memecahkan ini.
Stewart
Memang, preset sesuai dengan tagihan!
Stephen Kitt