Điều kiện cho phép các tệp systemd thông qua bao bì Debian


8

Tôi đã tạo một gói gỡ lỗi để cài đặt một dịch vụ.

Trên các thiết bị nhúng của chúng tôi, tôi muốn gói này tự động kích hoạt dịch vụ. Trên các máy trạm dành cho nhà phát triển của chúng tôi, tôi muốn các nhà phát triển thực hiện systemctl start foothủ công (đó là một dịch vụ nặng và do đó, nó chỉ tiêu tốn tài nguyên nếu chạy toàn bộ thời gian trên môi trường máy tính để bàn).

Làm thế nào tôi có thể đi về việc nhắc nhở người dùng về quyết định của họ trong apt-getbước này? Đó có phải là giải pháp tốt nhất?

Lưu ý, tôi đã tạo ra các gói sử dụng dh_makedebhelpervà kích hoạt nó với:

%:
    dh $@ --with=systemd

override_dh_systemd_enable:
    dh_systemd_enable --name=foo foo.service

Câu trả lời:


11

Bạn có thể sử dụng các cài đặt trước systemd để ảnh hưởng đến việc dịch vụ systemd sẽ mặc định được bật hay tắt khi cài đặt.

Debian đặt sẵn mặc định để bật tất cả các dịch vụ khi chúng được cài đặt, do đó bạn chỉ cần gửi một cài đặt sẵn cho các máy trạm phát triển (hành vi mặc định khớp với những gì bạn muốn xảy ra trong sản xuất), bằng cách gửi một tệp như /etc/systemd/system-preset/80-foo.presetchứa một dòng có chứa một dòng có chứa một dòng nói

disable foo.service

Nếu bạn quản lý các máy trạm dành cho nhà phát triển của mình bằng hệ thống như Puppet, Chef, Ansible, v.v., bạn có thể sử dụng chúng để gửi cấu hình cài sẵn systemd như vậy, điều đó giúp bạn dễ dàng áp dụng chính sách cho các máy trạm của nhà phát triển và không sản xuất máy móc.

Gói .deb của bạn nên sử dụng systemctl presetlệnh để kích hoạt dịch vụ, vì lệnh đó sẽ tôn trọng cấu hình cài sẵn.

Như @JdeBP@sourcejedi chỉ ra, các macro Debian trong trình trợ giúp gỡ lỗi (chẳng hạn như dh_systemd_enable) đã làm điều đó rồi, chúng sẽ gọi deb-systemd-helpernó sẽ sử dụng systemctl presettheo mặc định (với một cảnh báo nhỏ nếu bạn gỡ bỏ (nhưng không xóa) gói và sau đó cài đặt lại nó, sau đó nó sẽ không kích hoạt dịch vụ, ngay cả khi bạn loại bỏ các tập tin cài đặt trước) See. nhận xét này trong deb-systemd-helper's enablehoạt động :

    # 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.

Để biết thêm thông tin về tính năng systemd của các cài đặt trước, hãy xem trang man của các cài đặt trước systemd và lệnh systemctl presetthực hiện nó.


1
Đây chính xác là những gì tôi cần. Tôi triển khai môi trường dev thông qua gói meta và vì vậy tôi có thể cài đặt các *.presettệp này như một phần của gói đó.
Stewart

4
Một điều khó hiểu quan trọng cần biết là các cài đặt trước chỉ được tham khảo ý kiến deb-systemd-helperkhi lần đầu tiên gói được cài đặt. Sau đó, cơ sở dữ liệu song song được duy trì bởi các công cụ Debian được tham khảo thay vào đó, cho đến khi gói bị xóa. news.ycombinator.com/item?id=18320131
JdeBP

1
Vì vậy, deb-systemd-helperxuất hiện để sử dụng cài đặt trước. Và điều này sẽ hoạt động mà không cần một lệnh cài đặt thủ công systemctl bên trong gói .deb. Cách giải quyết dành riêng cho Debian là những gì xảy ra nếu bạn xóa (nhưng không xóa) gói. Nếu sau này bạn cài đặt lại gói, thì nó sẽ không kích hoạt dịch vụ, ngay cả khi bạn xóa tệp đặt trước. salsa.debian.org/debian/init-system-helpers/blob/debian/1.56/...
sourcejedi

@sourcejedi Kết hợp các bình luận của bạn và liên kết đến bình luận của người trợ giúp deb-systemd vào câu trả lời. Cảm ơn!
filbranden

5

Nếu bạn muốn nhắc người dùng trong khi cài đặt, bạn nên sử dụngdebconf . Điều này có một số lợi thế, ngay cả khi bạn không ở trong bối cảnh Chính sách Debian có liên quan: nó cung cấp trải nghiệm người dùng cuối nhất quán, với sự hỗ trợ cho nhiều loại tiền tuyến; nó hỗ trợ các cấp độ khác nhau nó hỗ trợ trước khi gieo hạt. Pre-seed có nghĩa là gói có thể được cấu hình sẵn, trong trường hợp đó nó sẽ không nhắc nhở gì cả. Các mức khác nhau có nghĩa là một dấu nhắc có thể được thiết lập để chỉ hiển thị trong một số trường hợp nhất định; sau đó bạn có thể cài đặt gói mà không cần nhắc theo mặc định (đối với các mục tiêu được nhúng) và hướng dẫn các nhà phát triển của bạn thiết lập giao diện của họ một cách thích hợp khi cài đặt gói để họ thấy dấu nhắc.

Tuy nhiên, tôi nghĩ tốt hơn hết là tránh nhắc nhở hoàn toàn khi có thể. Điều này đặc biệt đúng đối với các dịch vụ có cách xử lý khác với tùy chọn của người dùng cuối và khi xử lý tùy chọn người dùng làm phức tạp các tập lệnh bảo trì (xem tập lệnh được tạo trong gói của bạn, họ đã xử lý một số vấn đề tinh vi, sử dụng deb-systemd-helper- bạn 'phải sao chép tất cả những thứ đó, với việc xử lý tùy chọn của bạn lên hàng đầu).

Nếu nhà phát triển của bạn không bao giờ cần chạy dịch vụ, họ có thể che dấu trước khi cài đặt gói và dịch vụ sẽ không bao giờ được bật:

sudo systemctl mask foo

Nếu nhà phát triển của bạn đôi khi cần chạy dịch vụ, sử dụng đơn vị systemd, họ có thể vô hiệu hóa nó sau khi cài đặt gói lần đầu tiên và các lần cài đặt tiếp theo sẽ ghi nhớ điều này:

sudo apt install foo
sudo systemctl disable --now foo

Mặc định sau đó sẽ là để kích hoạt dịch vụ.


Câu trả lời tốt. debconftrông giống như những gì tôi đã nghĩ, nhưng tôi đồng ý rằng tốt nhất là tránh nhắc nhở khi có thể. Tôi biết về systemctl disable, nhưng tôi đã cố gắng giúp người dùng tránh "bỏ qua một bước" trong khi cài đặt. Các *.presetsgiải pháp được đề xuất bởi Filippe giải quyết này.
Stewart

Thật vậy, cài đặt trước phù hợp với hóa đơn hoàn hảo!
Stephen Kitt
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.