Tôi để tập tin đơn vị systemd của tôi ở đâu?


59

Tôi đọc rằng có hai thư mục cho các tập tin đơn vị (không ở chế độ người dùng).

/usr/lib/systemd/system/: units provided by installed packages
/etc/systemd/system/: units installed by the system administrator

Mâu thuẫn với sự hiểu biết này là câu trả lời sau: https://unix.stackexchange.com/a/47715/33386 . Ai đó có thể điền thông tin còn thiếu để tôi hiểu chuyện gì đang xảy ra không? ( CẬP NHẬT: Câu trả lời đã được cập nhật và sự hiểu biết của tôi không còn mâu thuẫn với nó nữa. )

Ngoài ra, có vẻ như các tập lệnh được tổ chức trong các thư mục con trong /etc/systemd/system/thư mục:

getty.target.wants
multi-user.target.wants

Ở một địa điểm khác tôi đọc được rằng có những địa điểm khác. Có vẻ như đây là những dịch vụ dành riêng cho người dùng.

/usr/lib/systemd/user/ where services provided by installed packages go.
/etc/systemd/user/ where system-wide user services are placed by the system administrator.
~/.config/systemd/user/ where the user puts its own services.

Cập nhật 2015-08-31:

Vì lợi ích của người khác, đây là một liên kết đến một câu hỏi liên quan mà tôi đã hỏi gần đây: Tôi đặt các tập lệnh được thực thi bởi các đơn vị systemd ở đâu?


4
/etc/systemd/systemlà nơi bạn đặt tập lệnh của mình, pacman đặt tập lệnh gói vào /usr/lib/systemd/systemvà phát hành systemctl enable foo.servicetạo liên kết tượng trưng từ /usrđến /etc...
jasonwryan

1
Xem man systemd.target: nó giải thích lý do đằng sau các nhóm.
jasonwryan

Câu trả lời:


57

Nơi tốt nhất để đặt các tệp đơn vị hệ thống : /etc/systemd/system Chỉ cần đảm bảo thêm mục tiêu trong phần [Cài đặt], đọc "Làm sao nó biết?" để biết chi tiết. CẬP NHẬT : /usr/local/lib/systemd/systemlà một tùy chọn khác, đọc "Vùng xám" để biết chi tiết. "

Nơi tốt nhất để đặt các tệp đơn vị người dùng : /etc/systemd/user hoặc $HOME/.config/systemd/user nhưng nó phụ thuộc vào quyền và tình huống.

Sự thật là các đơn vị systemd (hoặc như câu giới thiệu gọi chúng là "cấu hình đơn vị") có thể đi bất cứ nơi nào mà bạn đã sẵn sàng tạo ra các liên kết thủ công và bạn biết về sự cẩn thận. Nó làm cho cuộc sống dễ dàng hơn để đặt đơn vị nơi systemctl daemon-reloadcó thể tìm thấy nó vì một số lý do tốt:

  • Sử dụng một vị trí tiêu chuẩn có nghĩa là các trình tạo systemd sẽ tìm thấy chúng và giúp chúng dễ dàng kích hoạt khi khởi động cùng systemctl enable. Điều này là do đơn vị của bạn sẽ tự động được thêm vào cây phụ thuộc đơn vị (bộ đệm đơn vị).
  • Bạn không cần phải suy nghĩ về các quyền, bởi vì chỉ những người dùng đặc quyền đúng mới có thể viết thư cho các khu vực được chỉ định.

Làm sao nó biết?

Và làm thế nào chính xác systemctl enablebiết nơi để tạo ra các liên kết tượng trưng? Bạn mã cứng nó trong đơn vị dưới [install]phần. Thông thường có một dòng như

[Install]
WantedBy = multi-user.target

tương ứng với một vị trí được xác định trước trên hệ thống tập tin. Bằng cách này, systemctlbiết rằng đơn vị này phụ thuộc vào một nhóm các tệp đơn vị được gọi là multi-user.target("đích" là thuật ngữ được sử dụng để chỉ định các nhóm phụ thuộc đơn vị. Bạn có thể liệt kê tất cả các nhóm với systemctl list-units --type target). Nhóm các tập tin đơn vị được tải với một mục tiêu được đặt trong một targetname.target.wantsthư mục. Đây chỉ là một thư mục đầy đủ các liên kết tượng trưng (hoặc thực tế). Nếu bạn [Install]phần nói nó là WantedBysự multi-user.target, nhưng nếu một liên kết tượng trưng để nó không tồn tại trong multi-user.target.wantsthư mục, sau đó nó sẽ không tải. Khi trình tạo đơn vị systemd thêm tệp đơn vị của bạn vào bộ đệm của cây phụ thuộc khi khởi động (bạn có thể tự kích hoạt trình tạo systemctl daemon-reload), nó sẽ tự động biết nơi đặt symlink trong trường hợp này trong thư mục/etc/systemd/system/multi-user.target.wants/ bạn nên kích hoạt nó

Các điểm chính trong Hướng dẫn:

Các đơn vị bổ sung có thể được tải vào systemd ("được liên kết") từ các thư mục không nằm trên đường dẫn tải đơn vị. Xem lệnh liên kết cho systemctl (1).

Trong systemctl, tìm kiếm các lệnh tập tin đơn vị

Đường dẫn tải tệp đơn vị

Các tệp đơn vị được tải từ một tập hợp các đường dẫn được xác định trong quá trình biên dịch, được mô tả trong hai bảng bên dưới. Các tệp đơn vị được tìm thấy trong các thư mục được liệt kê trước đó ghi đè các tệp có cùng tên trong các thư mục thấp hơn trong danh sách.

Khi biến $SYSTEMD_UNIT_PATHđược đặt, nội dung của biến này sẽ ghi đè đường dẫn tải đơn vị. Nếu $SYSTEMD_UNIT_PATHkết thúc bằng một thành phần trống (":"), đường dẫn tải đơn vị thông thường sẽ được thêm vào nội dung của biến.

Bảng 1 và Bảng 2 từ man systemd.unitđều tốt.

Tải đường dẫn khi chạy ở chế độ hệ thống ( --system).

  • /etc/systemd/system Cấu hình cục bộ
  • /run/systemd/system Đơn vị thời gian chạy
  • /usr/lib/systemd/system Đơn vị gói cài đặt

Tải đường dẫn khi chạy ở chế độ người dùng ( --user)

Có sự khác biệt giữa mỗi đơn vị người dùngtất cả / đơn vị người dùng toàn cầu .

Người dùng phụ thuộc

  • $XDG_CONFIG_HOME/systemd/user Cấu hình người dùng (chỉ được sử dụng khi $XDG_CONFIG_HOMEđược đặt)
  • $HOME/.config/systemd/user Cấu hình người dùng (chỉ được sử dụng khi $XDG_CONFIG_HOMEkhông được đặt)
  • $XDG_RUNTIME_DIR/systemd/user Đơn vị thời gian chạy (chỉ được sử dụng khi $XDG_RUNTIME_DIRđược đặt)

  • $XDG_DATA_HOME/systemd/user Đơn vị các gói đã được cài đặt trong thư mục chính (chỉ được sử dụng khi $XDG_DATA_HOMEđược đặt)

  • $HOME/.local/share/systemd/user Đơn vị các gói đã được cài đặt trong thư mục chính (chỉ được sử dụng khi $XDG_DATA_HOMEkhông được đặt)

--global (tất cả người dùng)

Các đơn vị áp dụng cho tất cả người dùng - cũng có nghĩa là sở hữu của mỗi người dùng. Vì vậy, mỗi người dùng có thể dừng các dịch vụ này ngay cả khi quản trị viên kích hoạt chúng khi khởi động.

  • /etc/systemd/user Cấu hình cục bộ cho tất cả người dùng ( systemctl --global enable userunit.service)
  • /usr/lib/systemd/user Đơn vị gói đã được cài đặt trên toàn hệ thống cho tất cả người dùng
  • /run/systemd/user Đơn vị thời gian chạy

Khu vực màu xám

Một mặt, Tiêu chuẩn phân cấp tệp xác định rằng /etcdành cho các cấu hình cục bộ không thực thi nhị phân. Mặt khác, nó chỉ định rằng /usr/local/"được quản trị viên hệ thống sử dụng khi cài đặt phần mềm cục bộ". Bạn cũng có thể lập luận (nếu không chỉ vì mục đích tổ chức) rằng tất cả các tệp đơn vị hệ thống nên được thực hiện /usr/local/lib/systemd/system, nhưng điều này dành cho các tệp đơn vị là một phần của "phần mềm" không phải từ trình quản lý gói. Các đơn vị người dùng systemd tương ứng trên toàn hệ thống có thể đi theo /usr/local/lib/systemd/user.


Lời khuyên về việc đưa các tập tin đơn vị vào /etc/systemd/system, đó có phải là lời khuyên chung cho các tập tin đơn vị tự tạo? Bất cứ điều gì được cài đặt bởi một người quản lý gói nên luôn luôn đặt chúng vào /usr/lib/systemd/systemví dụ.
slm

@slm Có, khi câu hỏi đề cập đến các tệp đơn vị systemd của tôi , nó nhằm ám chỉ những người tự tạo.
Jonathan Komar

Tôi sẽ phân biệt: /etc/systemd/usercho các dịch vụ người dùng trên toàn hệ thống (được bảo đảm) và ~/.config/systemd/usercho các dịch vụ cụ thể của người dùng tùy chỉnh.
Suuuehgi

16

/etc/systemd/systemlà nơi bạn đặt tập lệnh của mình , pacman đặt tập lệnh gói vào /usr/lib/systemd/system.

Phát hành systemctl enable foo.servicetạo liên kết tượng trưng từ /usrđến /etc. Xem phần Đường dẫn tải đơn vị man systemd.unit(5)để biết thêm chi tiết.


@ macmadness86 nó bị thiếu vì nó không liên quan đến câu hỏi.
jasonwryan

1

Tôi đã viết 3, một cho ntpd, một cho một giây, thẻ ethernet tĩnh và một để chạy p0f, bộ nhận dạng hệ điều hành thụ động. Tôi đặt tất cả chúng vào /etc/systemd/system. Có vẻ như tôi có thể cho phép systemdxử lý các công cụ NTP, nhưng tôi không nghĩ rằng tôi muốn dựa vào nó nhiều như vậy.

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.