Làm thế nào để tạo một mục tiêu systemd?


16

Sau khi tìm kiếm rất nhiều thông qua nhiều bài đăng, video trên Youtube và "tài liệu" về vấn đề systemd, tôi vẫn không biết gì.

Liên kết ( https://wiki.archlinux.org/index.php/systemd#Create_custom_target ) có vẻ đầy hứa hẹn, nhưng hơi mơ hồ (với tôi).

Câu hỏi

Làm thế nào một người sẽ đi về việc tạo một mục tiêu systemd tùy chỉnh (IE: foo.target) để người ta có thể khởi động với các đơn vị dịch vụ được chọn?

Thí dụ

  1. Hệ thống khởi động default.target (symlink của "foo.target")
  2. "foo.target" chỉ khởi động chương trình GUI và máy chủ barebones X, nói "gvim".

Lý do

Tôi chỉ đơn giản là tìm cách tạo mục tiêu tùy chỉnh để nhanh chóng khởi chạy một chương trình X. Tôi rất vui được loại trừ tất cả các dịch vụ tôi không cần.

Cảm ơn trước!

Câu trả lời:


16

Đọc qua man 5 systemd.unitman 5 systemd.targetcho chúng tôi biết rằng các tệp đơn vị được sử dụng để xác định mục tiêu cũng như mọi thứ khác systemd. Không có tài liệu cụ thể về cách tạo mục tiêu , vì vậy thật khó để xác định cách thực hiện nó, nhưng nó không quá khác biệt so với việc tạo một dịch vụ.

Khi bạn tạo mục tiêu của mình, bạn sẽ cần tạo liên kết tượng trưng đến target.wantsthư mục từ thư mục dịch vụ systemd. Sau đó, bạn có thể thiết lập / khởi động mục tiêu của bạn. Đây là cách nó có thể được đưa ra ví dụ của bạn.

/etc/systemd/system/foo.target

Đây là tập tin đơn vị của mục tiêu. Nếu đồ họa được nhắm mục tiêu làm ví dụ, chúng ta có thể tạo mục tiêu của riêng mình bằng cách sử dụng nó làm cơ sở.

[Unit]
Description=Foobar boot target
Requires=multi-user.target
Wants=foobar.service
Conflicts=rescue.service rescue.target
After=multi-user.target rescue.service rescue.target
AllowIsolate=yes

Để giải thích các tùy chọn được lấy từ các trang web systemd;

  • Description- Mô tả mục tiêu. Bạn nên hiểu
  • Requires- Phụ thuộc cứng của mục tiêu. Bạn nên để hệ thống cơ bản bắt đầu trước khi bạn bắt đầu (các) dịch vụ của riêng bạn
  • Wants- Phụ thuộc mềm. Mục tiêu không yêu cầu những thứ này để bắt đầu.
  • Conflicts - Nếu một đơn vị có cài đặt Xung đột trên đơn vị khác, bắt đầu đơn vị trước sẽ dừng đơn vị sau và ngược lại.
  • After - Khởi động sau các dịch vụ này
  • AllowIsolate- Thực sự tùy thuộc vào bạn và môi trường của bạn. Thông tin chi tiết có sẵn trong trangsystemd.unit(5)

/etc/systemd/system/foo.target.wants/

Đây là thư mục nơi bạn sẽ liên kết các dịch vụ bạn tạo / yêu cầu cho mục tiêu của mình. Nó tương đương với Wants=tùy chọn trong tệp đơn vị. Tạo thư mục này và sau đó tạo liên kết tượng trưng như vậy; ln -s /usr/lib/systemd/system/bar.service /etc/systemd/system/foo.target.wants/bar.service. Điều này tạo ra một liên kết tượng trưng từ bar.service trong thư mục hệ thống đến thư mục foo.target.wants của bạn.


Tôi nghĩ rằng việc tạo một tệp đơn vị cho một dịch vụ nằm ngoài phạm vi của câu trả lời này và câu hỏi đó chắc chắn là có nhiều tài liệu hơn nên tôi sẽ bỏ nó ngay bây giờ. Khi bạn tạo tệp đơn vị của mình, chỉ cần liên kết nó vào thư mục target.wants hoặc thêm nó vào lệnh Wants=.


Tôi đã làm theo cách trên để tạo mục tiêu mới và thêm một vài mục tiêu vào dịch vụ của mình. Tuy nhiên, không có dịch vụ nào trong số đó được khởi động bởi systemd. Có một ví dụ hoàn chỉnh chứng minh các dịch vụ trong mục tiêu mới được thêm vào không?
linuxfan

1
Xem bài đăng ngăn xếp của người cần thiết nếu bạn đang tìm kiếm các bước đơn giản để thiết lập dịch vụ tùy chỉnh để chạy khi khởi động.
Pilbox

@linuxfan Tôi thêm foo.targetvào Requireslĩnh vực và Beforelĩnh vực multi-user.target, và nó thích Requires: base.target foo.target. Sau đó, tôi khởi động lại Arch Linux vm của mình và foobar.servicesẽ tự động chạy dưới dạng daemon.
L_K

2
Câu trả lời hay, nhưng nó không thực sự hoạt động như bạn mong đợi. 1. Chỉ vì muốn mà không có nghĩa là dịch vụ sẽ bắt đầu với mục tiêu đó. 2. Multi -user.target dường như có một số loại ẩn giúp nó hoạt động.
Otheus
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.