Thứ ba, 17/02/2015 | 00:00 GMT+7

Hiểu đơn vị Systemd và tệp đơn vị

Ngày càng có nhiều bản phân phối Linux đang áp dụng hoặc có kế hoạch áp dụng systemd init. Bộ phần mềm mạnh mẽ này có thể quản lý nhiều khía cạnh của server của bạn, từ các dịch vụ đến các thiết bị được mount và trạng thái hệ thống.

Trong systemd , một unit đề cập đến bất kỳ tài nguyên nào mà hệ thống biết cách vận hành và quản lý. Đây là đối tượng chính mà các công cụ systemd biết cách xử lý. Các tài nguyên này được xác định bằng cách sử dụng file cấu hình được gọi là file đơn vị.

Trong hướng dẫn này, ta sẽ giới thiệu cho bạn các đơn vị khác nhau mà systemd có thể xử lý. Ta cũng sẽ đề cập đến một số trong nhiều lệnh được dùng trong các file đơn vị để định hình cách các tài nguyên này được xử lý trên hệ thống.

Các đơn vị Systemd cung cấp cho bạn những gì?

Các đơn vị là các đối tượng mà systemd biết cách quản lý. Về cơ bản, đây là một biểu diễn tiêu chuẩn hóa của các tài nguyên hệ thống có thể được quản lý bởi bộ các trình duyệt và được thao tác bởi các tiện ích được cung cấp.

Các đơn vị theo một số cách có thể nói là tương tự như các dịch vụ hoặc công việc trong các hệ thống init khác. Tuy nhiên, một đơn vị có định nghĩa rộng hơn nhiều, vì chúng được dùng để tóm tắt các dịch vụ, tài nguyên mạng, thiết bị, mount hệ thống file và các group tài nguyên biệt lập.

Ý tưởng mà trong các hệ thống init khác có thể được xử lý bằng một định nghĩa dịch vụ thống nhất có thể được chia thành các đơn vị thành phần theo trọng tâm của chúng. Điều này sắp xếp theo chức năng và cho phép bạn dễ dàng bật, tắt hoặc mở rộng chức năng mà không cần sửa đổi hành vi cốt lõi của một đơn vị.

Một số tính năng mà các đơn vị có thể triển khai dễ dàng là:

  • kích hoạt dựa trên socket : Các socket được liên kết với một dịch vụ tốt nhất nên được tách ra khỏi chính daemon để được xử lý riêng biệt. Điều này cung cấp một số lợi thế, chẳng hạn như trì hoãn việc bắt đầu dịch vụ cho đến khi socket liên quan được truy cập lần đầu tiên. Điều này cũng cho phép hệ thống tạo tất cả các socket sớm trong quá trình khởi động, giúp có thể khởi động song song các dịch vụ liên quan.
  • kích hoạt dựa trên bus : Các đơn vị cũng có thể được kích hoạt trên giao diện bus do D-Bus cung cấp. Một đơn vị có thể được bắt đầu khi một bus liên kết được xuất bản.
  • kích hoạt dựa trên đường dẫn : Một đơn vị có thể được khởi động dựa trên hoạt động hoặc tính khả dụng của các đường dẫn hệ thống file nhất định. Điều này sử dụng inotify .
  • kích hoạt dựa trên thiết bị : Các đơn vị cũng có thể được khởi động khi có phần cứng liên quan đầu tiên bằng cách tận dụng các sự kiện udev .
  • ánh xạ phụ thuộc ngầm định : Hầu hết cây phụ thuộc cho các đơn vị có thể được xây dựng bởi chính systemd . Bạn vẫn có thể thêm thông tin về người phụ thuộc và đặt hàng, nhưng hầu hết các công việc nặng nhọc đều do bạn đảm nhận.
  • phiên bản và mẫu : Các file đơn vị mẫu được dùng để tạo nhiều version của cùng một đơn vị chung. Điều này cho phép các biến thể nhỏ hoặc các đơn vị anh em đều cung cấp cùng một chức năng chung.
  • tăng cường bảo mật dễ dàng : Các đơn vị có thể triển khai một số tính năng bảo mật khá tốt bằng cách thêm các chỉ thị đơn giản. Ví dụ, bạn có thể chỉ định quyền truy cập không hoặc chỉ đọc vào một phần của hệ thống file , giới hạn khả năng của kernel và gán quyền truy cập mạng /tmp và riêng tư.
  • drop-in và đoạn trích : Các đơn vị có thể dễ dàng được mở rộng bằng cách cung cấp các đoạn trích sẽ overrides các phần của file đơn vị của hệ thống. Điều này giúp dễ dàng chuyển đổi giữa triển khai vani và đơn vị tùy chỉnh.

Có nhiều lợi thế khác mà đơn vị systemd có so với các hạng mục công việc khác của hệ thống init, nhưng điều này sẽ cung cấp cho bạn ý tưởng về sức mạnh có thể được tận dụng bằng cách sử dụng các chỉ thị cấu hình root .

Tệp đơn vị Systemd được tìm thấy ở đâu?

Các file xác định cách systemd sẽ xử lý một đơn vị có thể được tìm thấy ở nhiều vị trí khác nhau, mỗi vị trí có mức độ ưu tiên và ý nghĩa khác nhau.

Bản sao của hệ thống của các file đơn vị thường được giữ trong folder /lib/systemd/system . Khi phần mềm cài đặt các file đơn vị trên hệ thống, đây là vị trí đặt chúng theo mặc định.

Các file đơn vị được lưu trữ ở đây có thể được bắt đầu và dừng theo yêu cầu trong một phiên. Đây sẽ là file đơn vị chung chung, thường được viết bởi những người bảo trì của dự án thượng nguồn, sẽ hoạt động trên bất kỳ hệ thống nào triển khai systemd trong việc triển khai tiêu chuẩn của nó. Bạn không nên chỉnh sửa các file trong folder này. Thay vào đó, bạn nên overrides file , nếu cần, sử dụng một vị trí file đơn vị khác sẽ thay thế file ở vị trí này.

Nếu bạn muốn sửa đổi cách thức hoạt động của một đơn vị, thì vị trí tốt nhất để thực hiện là trong folder /etc/systemd/system . Các file đơn vị được tìm thấy trong vị trí folder này được ưu tiên hơn bất kỳ vị trí nào khác trên hệ thống file . Nếu bạn cần sửa đổi bản sao của hệ thống của một file đơn vị, đặt một file thay thế vào folder này là cách an toàn và linh hoạt nhất để thực hiện việc này.

Nếu bạn chỉ muốn overrides các chỉ thị cụ thể từ file đơn vị của hệ thống, bạn có thể cung cấp các đoạn mã file đơn vị trong một folder con. Những điều này sẽ thêm hoặc sửa đổi các chỉ thị của bản sao của hệ thống, cho phép bạn chỉ định các tùy chọn mà bạn muốn thay đổi.

Cách chính xác để làm điều này là tạo một folder được đặt tên theo file đơn vị với .d thêm vào ở cuối. Vì vậy, đối với một đơn vị được gọi là example.service , một folder con có tên là example.service.d có thể được tạo. Trong folder này, file kết thúc bằng .conf được dùng để overrides hoặc mở rộng các thuộc tính của file đơn vị của hệ thống.

Ngoài ra còn có một vị trí cho các định nghĩa đơn vị thời gian /run/systemd/system tại /run/systemd/system . Các file đơn vị được tìm thấy trong folder này có điểm ưu tiên giữa các file trong /etc/systemd/system/lib/systemd/system . Các file ở vị trí này có trọng lượng ít hơn vị trí cũ, nhưng trọng lượng nhiều hơn vị trí sau.

Bản thân quy trình systemd sử dụng vị trí này cho các file đơn vị được tạo động được tạo trong thời gian chạy. Thư mục này được dùng để thay đổi hành vi đơn vị của hệ thống trong suốt thời gian của phiên. Tất cả các thay đổi được thực hiện trong folder này sẽ bị mất khi server được khởi động lại.

Các loại đơn vị

Systemd phân loại các đơn vị theo loại tài nguyên mà chúng mô tả. Cách dễ nhất để xác định kiểu của một đơn vị là với hậu tố kiểu của nó, được nối vào cuối tên tài nguyên.Danh sách sau đây mô tả các loại đơn vị có sẵn cho systemd :

  • .service : Đơn vị dịch vụ mô tả cách quản lý dịch vụ hoặc ứng dụng trên server . Điều này sẽ bao gồm cách bắt đầu hoặc dừng dịch vụ, trong trường hợp nào nó sẽ được tự động khởi động, và thông tin về dependencies và đặt hàng cho phần mềm liên quan.
  • .socket : Tệp đơn vị socket mô tả mạng hoặc socket IPC hoặc cache FIFO mà systemd sử dụng để kích hoạt dựa trên socket . Chúng luôn có một file .service liên kết sẽ được bắt đầu khi hoạt động được nhìn thấy trên socket mà đơn vị này xác định.
  • .device : Đơn vị mô tả một thiết bị đã được udev hoặc hệ thống file sysfs chỉ định là cần quản lý systemd . Không phải tất cả các thiết bị sẽ có file .device . Một số tình huống trong đó đơn vị .device có thể cần thiết để đặt hàng, lắp và truy cập thiết bị.
  • .mount : Đơn vị này xác định một điểm mount trên hệ thống sẽ được quản lý bởi systemd . Chúng được đặt tên theo đường dẫn mount , với dấu gạch chéo được thay đổi thành dấu gạch ngang. Các mục trong /etc/fstab có thể có các đơn vị được tạo tự động.
  • .automount : Đơn vị .automount cấu hình điểm mount sẽ được tự động mount . Chúng phải được đặt tên theo điểm mount mà chúng tham chiếu đến và phải có đơn vị .mount phù hợp để xác định các chi tiết cụ thể của mount .
  • .swap : Đơn vị này mô tả không gian swap trên hệ thống. Tên của các đơn vị này phải phản ánh thiết bị hoặc đường dẫn file của không gian.
  • .target : Một đơn vị đích được sử dụng để cung cấp các điểm đồng bộ hóa cho các đơn vị khác khi khởi động hoặc thay đổi trạng thái. Chúng cũng được dùng để đưa hệ thống về trạng thái mới. Các đơn vị khác xác định mối quan hệ của chúng với các mục tiêu để gắn liền với hoạt động của mục tiêu.
  • .path : Đơn vị này xác định một đường dẫn được dùng để kích hoạt dựa trên đường dẫn. Theo mặc định, một đơn vị .service có cùng tên cơ sở sẽ được bắt đầu khi đường dẫn đạt đến trạng thái được chỉ định. Điều này sử dụng inotify để theo dõi đường dẫn cho các thay đổi.
  • .timer : Một đơn vị .timer xác định bộ đếm thời gian sẽ được quản lý bởi systemd , tương tự như một cron việc cron để kích hoạt bị trì hoãn hoặc theo lịch trình. Một đơn vị phù hợp sẽ được bắt đầu khi đạt đến bộ đếm thời gian.
  • .snapshot : Một đơn vị .snapshot được tạo tự động bằng lệnh systemctl snapshot . Nó cho phép bạn xây dựng lại trạng thái hiện tại của hệ thống sau khi áp dụng các thay đổi . Ảnh chụp nhanh không tồn tại trong các phiên và được sử dụng để khôi phục trạng thái tạm thời.
  • .slice : Một đơn vị .slice được liên kết với các node của Group điều khiển Linux, cho phép tài nguyên bị hạn chế hoặc được gán cho bất kỳ quy trình nào được liên kết với lát cắt. Tên phản ánh vị trí thứ bậc của nó trong cây cgroup . Các đơn vị được đặt trong một số lát theo mặc định tùy thuộc vào loại của chúng.
  • .scope : Các đơn vị phạm vi được systemd tạo tự động từ thông tin nhận được từ các giao diện bus của nó. Chúng được sử dụng để quản lý tập hợp các quy trình hệ thống được tạo ra bên ngoài.

Như bạn thấy, có rất nhiều đơn vị khác nhau mà systemd biết cách quản lý.Nhiều loại đơn vị hoạt động cùng nhau để thêm chức năng. Ví dụ, một số đơn vị được sử dụng để kích hoạt các đơn vị khác và cung cấp chức năng kích hoạt.

Ta sẽ chủ yếu tập trung vào các đơn vị .service do tiện ích của chúng và tính nhất quán trong đó administrator cần quản lý các đơn vị này.

Giải phẫu của một file đơn vị

Cấu trúc bên trong của các file đơn vị được tổ chức với các phần. Các phần được biểu thị bằng một cặp dấu ngoặc vuông “ [ ” và “ ] ” với tên phần được đặt bên trong. Mỗi phần kéo dài cho đến đầu phần tiếp theo hoặc cho đến cuối file .

Đặc điểm chung của file đơn vị

Tên phần được xác định rõ ràng và phân biệt chữ hoa chữ thường. Vì vậy, phần [Unit] sẽ không được hiểu chính xác nếu nó được viết như [UNIT] . Nếu bạn cần thêm các phần không chuẩn để được phân tích cú pháp bởi các ứng dụng khác ngoài systemd , bạn có thể thêm tiền tố X- vào tên phần.

Trong các phần này, hành vi của đơn vị và metadata được xác định thông qua việc sử dụng các lệnh đơn giản bằng cách sử dụng định dạng key-value với phép gán được chỉ định bằng dấu bằng, như sau:

[Section] Directive1=value Directive2=value  . . . 

Trong trường hợp file overrides (chẳng hạn như những file chứa trong folder unit . type .d ), các chỉ thị có thể được đặt lại bằng cách gán chúng vào một chuỗi trống. Ví dụ: bản sao của hệ thống của một file đơn vị có thể chứa một chỉ thị được đặt thành một giá trị như sau:

Directive1=default_value 

Các default_value thể được loại bỏ trong một file overrides bằng cách tham khảo Directive1 mà không có một giá trị, như thế này:

Directive1= 

Nói chung, systemd cho phép cấu hình dễ dàng và linh hoạt. Ví dụ: nhiều biểu thức boolean được chấp nhận ( 1 , yes , on , true cho câu khẳng định và 0 , no offfalse cho câu trả lời ngược lại). Thời gian có thể được phân tích cú pháp thông minh, với số giây được giả định cho các giá trị không đơn vị và kết hợp nhiều định dạng được thực hiện nội bộ.

[Đơn vị] Chỉ thị phần

Phần đầu tiên được tìm thấy trong hầu hết các file đơn vị là phần [Unit] . Điều này thường được sử dụng để xác định metadata cho đơn vị và cấu hình mối quan hệ của đơn vị với các đơn vị khác.

Mặc dù thứ tự phần không quan trọng đối với systemd khi phân tích cú pháp file , phần này thường được đặt ở trên cùng vì nó cung cấp tổng quan về đơn vị. Một số chỉ thị phổ biến mà bạn sẽ tìm thấy trong phần [Unit] là:

  • Description= : Chỉ thị này được dùng để mô tả tên và chức năng cơ bản của đơn vị. Nó được trả về bởi các công cụ systemd khác nhau, vì vậy tốt hơn là bạn nên đặt nó thành một cái gì đó ngắn gọn, cụ thể và nhiều thông tin.
  • Documentation= : Chỉ thị này cung cấp một vị trí cho danh sách các URI cho tài liệu. Đây có thể là các trang man có sẵn nội bộ hoặc các URL có thể truy cập web. systemctl status sẽ hiển thị thông tin này, cho phép dễ dàng phát hiện ra.
  • Requires= : Chỉ thị này liệt kê bất kỳ đơn vị nào mà đơn vị này về cơ bản phụ thuộc vào. Nếu đơn vị hiện tại được kích hoạt, các đơn vị được liệt kê ở đây cũng phải kích hoạt thành công, nếu không đơn vị này sẽ thất bại. Các đơn vị này được khởi động song song với đơn vị hiện tại theo mặc định.
  • Wants= : Chỉ thị này tương tự như Requires= , nhưng ít nghiêm ngặt hơn. Systemd sẽ cố gắng khởi động bất kỳ đơn vị nào được liệt kê ở đây khi đơn vị này được kích hoạt. Nếu không tìm thấy các thiết bị này hoặc không khởi động được, thiết bị hiện tại sẽ tiếp tục hoạt động. Đây là cách được khuyến khích để cấu hình hầu hết các mối quan hệ phụ thuộc. , điều này ngụ ý một kích hoạt song song trừ khi được sửa đổi bởi các chỉ thị khác.
  • BindsTo= : Chỉ thị này cũng tương tự như Requires= , mà còn gây ra các đơn vị hiện tại để dừng khi chấm dứt đơn vị liên quan.
  • Before= : Các đơn vị được liệt kê trong chỉ thị này sẽ không được khởi động cho đến khi đơn vị hiện tại được đánh dấu là đã khởi động nếu chúng được kích hoạt cùng một lúc. Điều này không bao hàm mối quan hệ phụ thuộc và phải được sử dụng cùng với một trong các chỉ thị trên nếu điều này được mong muốn.
  • After= : Các đơn vị được liệt kê trong chỉ thị này sẽ được khởi động trước khi bắt đầu đơn vị hiện tại. Điều này không ngụ ý mối quan hệ phụ thuộc và một mối quan hệ phải được cài đặt thông qua các chỉ thị trên nếu điều này được yêu cầu.
  • Conflicts= : Điều này được dùng để liệt kê các đơn vị không thể chạy cùng lúc với đơn vị hiện tại. Bắt đầu một đơn vị với mối quan hệ này sẽ làm cho các đơn vị khác bị dừng lại.
  • Condition...= : Có một số chỉ thị bắt đầu bằng Condition cho phép người quản trị kiểm tra các điều kiện nhất định trước khi khởi động thiết bị. Điều này được dùng để cung cấp một file đơn vị chung sẽ chỉ được chạy khi trên các hệ thống thích hợp.Nếu điều kiện không được đáp ứng, thiết bị được bỏ qua một cách dễ dàng.
  • Assert...= : Tương tự như các lệnh bắt đầu bằng Condition , các lệnh này kiểm tra các khía cạnh khác nhau của môi trường đang chạy để quyết định xem thiết bị có nên kích hoạt hay không. Tuy nhiên, không giống như các chỉ thị Condition , một kết quả âm tính gây ra lỗi với chỉ thị này.

Sử dụng các chỉ thị này và một số chỉ thị khác, thông tin chung về đơn vị và mối quan hệ của đơn vị với các đơn vị khác và hệ điều hành có thể được cài đặt .

[Cài đặt] Chỉ dẫn phần

Ở phía đối diện của file đơn vị, phần cuối cùng thường là phần [Install] . Phần này là tùy chọn và được sử dụng để xác định hành vi hoặc một đơn vị nếu nó được bật hoặc tắt. Việc kích hoạt một thiết bị sẽ đánh dấu nó được tự động khởi động khi server khởi động . Về bản chất, điều này được thực hiện bằng cách gắn thiết bị được đề cập vào một thiết bị khác nằm ở đâu đó trong dòng thiết bị được khởi động khi server khởi động .

Do đó, chỉ những đơn vị có thể được kích hoạt mới có phần này. Các chỉ thị bên trong ra lệnh điều gì sẽ xảy ra khi thiết bị được bật:

  • WantedBy= : Lệnh WantedBy= là cách phổ biến nhất để chỉ định cách một đơn vị sẽ được kích hoạt. Chỉ thị này cho phép bạn chỉ định mối quan hệ phụ thuộc theo cách tương tự như chỉ thị Wants= thực hiện trong phần [Unit] . Sự khác biệt là chỉ thị này có trong đơn vị backend cho phép đơn vị chính được liệt kê vẫn tương đối sạch. Khi một đơn vị có chỉ thị này được bật, một folder sẽ được tạo trong /etc/systemd/system được đặt tên theo đơn vị được chỉ định với .wants nối vào cuối. Trong đó, một softlink đến đơn vị hiện tại sẽ được tạo, tạo ra dependencies . Ví dụ: nếu đơn vị hiện tại có WantedBy=multi-user.target , một folder có tên multi-user.target.wants sẽ được tạo trong /etc/systemd/system (nếu chưa có) và một softlink đến đơn vị hiện tại sẽ được đặt bên trong. Việc vô hiệu hóa đơn vị này sẽ xóa liên kết và xóa mối quan hệ phụ thuộc.
  • RequiredBy= : Chỉ thị này rất giống với chỉ thị WantedBy= , nhưng thay vào đó chỉ định một phụ thuộc sẽ khiến việc kích hoạt không thành công nếu không được đáp ứng. Khi được bật, một đơn vị có chỉ thị này sẽ tạo một folder kết thúc bằng .requires .
  • Alias= : Chỉ thị này cũng cho phép đơn vị được kích hoạt dưới một tên khác. Trong số các cách sử dụng khác, điều này cho phép nhiều nhà cung cấp một chức năng có sẵn để các đơn vị liên quan có thể tìm kiếm bất kỳ nhà cung cấp nào có tên alias chung.
  • Also= : Chỉ thị này cho phép các đơn vị được bật hoặc tắt dưới dạng một tập hợp. Các đơn vị hỗ trợ luôn sẵn sàng khi đơn vị này hoạt động có thể được liệt kê ở đây. Chúng sẽ được quản lý như một group cho các việc cài đặt.
  • DefaultInstance= : Đối với các đơn vị mẫu (được đề cập sau) có thể tạo ra các version đơn vị có tên không thể đoán trước, giá trị này được dùng làm giá trị dự phòng cho tên nếu tên thích hợp không được cung cấp.

Chỉ thị phần cụ thể cho đơn vị

Nằm giữa hai phần trước, bạn có thể sẽ tìm thấy các phần dành riêng cho loại đơn vị.Hầu hết các loại đơn vị cung cấp các chỉ thị chỉ áp dụng cho loại cụ thể của chúng. Chúng có sẵn trong các phần được đặt tên theo loại của chúng. Ta sẽ đề cập đến những điều đó một cách ngắn gọn ở đây.

Các loại đơn vị device , target , snapshotscope không có chỉ thị dành riêng cho đơn vị và do đó không có phần liên quan cho loại của chúng.

Phần [Dịch vụ]

Phần [Service] được sử dụng để cung cấp cấu hình chỉ áp dụng cho các dịch vụ.

Một trong những điều cơ bản cần được chỉ định trong phần [Service]Type= của dịch vụ. Điều này phân loại các dịch vụ theo quy trình và hành vi đa dạng hóa của chúng. Điều này rất quan trọng vì nó cho systemd biết cách quản lý chính xác servie và tìm ra trạng thái của nó.

Chỉ thị Type= có thể là một trong những lệnh sau:

  • đơn giản : Quá trình chính của dịch vụ được chỉ định trong dòng bắt đầu. Đây là mặc định nếu các chỉ thị Type=Busname= không được đặt, nhưng ExecStart= được đặt. Mọi giao tiếp phải được xử lý bên ngoài thiết bị thông qua thiết bị thứ hai thuộc loại thích hợp (như qua thiết bị .socket nếu thiết bị này phải giao tiếp bằng socket ).
  • forking : Loại dịch vụ này được sử dụng khi dịch vụ phân tách một quy trình con, thoát khỏi quy trình mẹ gần như ngay lập tức. Điều này cho systemd biết rằng tiến trình vẫn đang chạy mặc dù cha đã thoát.
  • oneshot : Loại này cho biết quá trình sẽ tồn tại trong thời gian ngắn và systemd nên đợi quá trình thoát trước khi tiếp tục với các đơn vị khác. Đây là kiểu mặc định Type=ExecStart= không được đặt. Nó được sử dụng cho các nhiệm vụ một lần.
  • dbus : Điều này cho biết đơn vị đó sẽ lấy tên trên xe buýt D-Bus. Khi điều này xảy ra, systemd sẽ tiếp tục xử lý đơn vị tiếp theo.
  • thông báo : Điều này cho biết rằng dịch vụ sẽ đưa ra thông báo khi quá trình khởi động hoàn tất. Quá trình systemd sẽ đợi điều này xảy ra trước khi tiếp tục với các đơn vị khác.
  • nhàn rỗi : Điều này cho biết rằng dịch vụ sẽ không được chạy cho đến khi tất cả các công việc được gửi đi.

Có thể cần một số chỉ thị bổ sung khi sử dụng một số loại dịch vụ nhất định. Ví dụ:

  • RemainAfterExit= : Lệnh này thường được sử dụng với loại oneshot . Nó cho biết dịch vụ nên được coi là hoạt động ngay cả sau khi quá trình thoát.
  • PIDFile= : Nếu loại dịch vụ được đánh dấu là “forking”, chỉ thị này được sử dụng để đặt đường dẫn của file chứa số ID tiến trình của con chính cần được theo dõi.
  • BusName= : Chỉ thị này phải được đặt thành tên xe buýt D-Bus mà dịch vụ sẽ cố gắng lấy khi sử dụng loại dịch vụ “dbus”.
  • NotifyAccess= : Điều này chỉ định quyền truy cập vào socket được sử dụng để nghe thông báo khi loại dịch vụ “thông báo” được chọn. Đây có thể là “no” , “chính” hoặc “tất cả. Mặc định, "không có", bỏ qua tất cả các thông báo trạng thái. Tùy chọn "chính" sẽ lắng nghe thông báo từ quy trình chính và tùy chọn "tất cả" sẽ xử lý tất cả các thành viên của group kiểm soát của dịch vụ.

Lúc này, ta đã thảo luận về một số thông tin cần thiết, nhưng ta chưa thực sự xác định cách quản lý dịch vụ của bạn .Các chỉ thị để làm điều này là:

  • ExecStart= : Điều này chỉ định đường dẫn đầy đủ và các đối số của lệnh sẽ được thực thi để bắt đầu quá trình. Điều này chỉ có thể được chỉ định một lần (ngoại trừ các dịch vụ "oneshot"). Nếu đường dẫn đến lệnh đứng trước một ký tự gạch ngang “-”, các trạng thái thoát khác 0 sẽ được chấp nhận mà không đánh dấu việc kích hoạt đơn vị là không thành công.
  • ExecStartPre= : Điều này được dùng để cung cấp các lệnh bổ sung cần được thực hiện trước khi quá trình chính được bắt đầu. Điều này được dùng nhiều lần. , các lệnh phải chỉ định một đường dẫn đầy đủ và chúng có thể được đặt trước bằng “-” để cho biết lỗi của lệnh sẽ được chấp nhận.
  • ExecStartPost= : Điều này có cùng chất lượng như ExecStartPre= ngoại trừ nó chỉ định các lệnh sẽ được chạy sau khi quá trình chính được bắt đầu.
  • ExecReload= : Chỉ thị tùy chọn này chỉ ra lệnh cần thiết để reload cấu hình của dịch vụ nếu có.
  • ExecStop= : Điều này cho biết lệnh cần thiết để dừng dịch vụ. Nếu điều này không được đưa ra, quá trình sẽ bị ngắt ngay lập tức khi dịch vụ bị dừng.
  • ExecStopPost= : Điều này được dùng để chỉ định các lệnh để thực hiện sau lệnh dừng.
  • RestartSec= : Nếu tự động khởi động lại dịch vụ được bật, điều này chỉ định khoảng thời gian chờ trước khi cố gắng khởi động lại dịch vụ.
  • Restart= : Điều này cho biết các trường hợp mà systemd sẽ cố gắng tự động khởi động lại dịch vụ. Điều này có thể được đặt thành các giá trị như “luôn luôn”, “thành công”, “thất bại”, “bất thường”, “tạm ngừng” hoặc “theo dõi”. Những điều này sẽ kích hoạt khởi động lại theo cách dịch vụ đã bị dừng.
  • TimeoutSec= : Tùy chọn này cấu hình lượng thời gian mà systemd sẽ đợi khi dừng hoặc dừng dịch vụ trước khi đánh dấu là không thành công hoặc buộc phải giết nó. Bạn cũng có thể đặt thời gian chờ riêng biệt với TimeoutStartSec=TimeoutStopSec= .

Phần [Socket]

Các đơn vị socket rất phổ biến trong cấu hình systemd vì nhiều dịch vụ thực hiện kích hoạt dựa trên socket để cung cấp tính linh hoạt và song song tốt hơn. Mỗi thiết bị socket phải có một đơn vị dịch vụ phù hợp sẽ được kích hoạt khi socket nhận được hoạt động.

Bằng cách phá vỡ kiểm soát socket bên ngoài dịch vụ, socket có thể được khởi tạo sớm và các dịch vụ liên quan thường có thể được khởi động song song. Theo mặc định, tên socket sẽ cố gắng khởi động dịch vụ cùng tên khi nhận được kết nối. Khi dịch vụ được khởi tạo, socket sẽ được chuyển cho nó, cho phép nó bắt đầu xử lý bất kỳ yêu cầu nào trong cache .

Để chỉ định socket thực tế, các lệnh này thường gặp:

  • ListenStream= : Điều này xác định địa chỉ cho một socket stream hỗ trợ giao tiếp tuần tự, tin cậy . Các dịch vụ sử dụng TCP nên sử dụng loại socket này.
  • ListenDatagram= : Điều này xác định một địa chỉ cho một socket datagram hỗ trợ các gói truyền thông nhanh, không tin cậy . Các dịch vụ sử dụng UDP nên đặt loại socket này.
  • ListenSequentialPacket= : Điều này xác định một địa chỉ cho giao tiếp tuần tự, tin cậy với các biểu đồ độ dài tối đa bảo toàn ranh giới thông báo. Điều này được tìm thấy thường xuyên nhất đối với các socket Unix.
  • ListenFIFO : Cùng với các kiểu nghe khác, bạn cũng có thể chỉ định cache FIFO thay vì socket .

Có nhiều loại chỉ thị lắng nghe hơn, nhưng những loại ở trên là phổ biến nhất.

Các đặc điểm khác của socket có thể được kiểm soát thông qua các chỉ thị bổ sung:

  • Accept= : Điều này xác định liệu một version dịch vụ bổ sung có được bắt đầu cho mỗi kết nối hay không. Nếu được đặt thành false (mặc định), một version sẽ xử lý tất cả các kết nối.
  • SocketUser= : Với socket Unix, chỉ định chủ sở hữu của socket . Đây sẽ là user root nếu không được đặt.
  • SocketGroup= : Với một socket Unix, chỉ định chủ sở hữu group của socket . Đây sẽ là group root nếu cả cái này hoặc cái trên đều không được đặt. Nếu chỉ có SocketUser= được đặt, systemd sẽ cố gắng tìm một group phù hợp.
  • SocketMode= : Đối với socket Unix hoặc cache FIFO, điều này đặt các quyền trên thực thể được tạo.
  • Service= : Nếu tên dịch vụ không trùng với tên .socket , dịch vụ có thể được chỉ định bằng chỉ thị này.

Phần [Mount]

Các đơn vị mount cho phép quản lý điểm mount từ bên trong systemd . Các điểm mount được đặt tên theo folder mà chúng kiểm soát, với một thuật toán dịch được áp dụng.

Ví dụ: dấu gạch chéo đầu tiên bị xóa, tất cả các dấu gạch chéo khác được dịch thành dấu gạch ngang “-” và tất cả các dấu gạch ngang và các ký tự không in được sẽ được thay thế bằng mã thoát kiểu C. Kết quả của bản dịch này được sử dụng làm tên đơn vị ngàm. Các đơn vị mount sẽ có dependencies ngầm định vào các đơn vị mount khác ở trên nó trong hệ thống phân cấp.

Các đơn vị mount thường được dịch trực tiếp từ các file /etc/fstab trong quá trình khởi động. Đối với các định nghĩa đơn vị được tạo tự động và những định nghĩa mà bạn muốn xác định trong file đơn vị, các lệnh sau rất hữu ích:

  • What= : Đường dẫn tuyệt đối đến tài nguyên cần được mount .
  • Where= : Đường dẫn tuyệt đối của điểm mount nơi tài nguyên sẽ được mount . Tên này phải giống với tên file đơn vị, ngoại trừ việc sử dụng ký hiệu hệ thống file thông thường.
  • Type= : Loại hệ thống file của mount.
  • Options= : Bất kỳ tùy chọn mount nào cần được áp dụng. Đây là danh sách được phân tách bằng dấu phẩy.
  • SloppyOptions= : Một boolean xác định việc mount có bị lỗi hay không nếu có tùy chọn mount không được công nhận.
  • DirectoryMode= : Nếu các folder mẹ cần được tạo cho điểm mount , điều này xác định chế độ cho phép của các folder này.
  • TimeoutSec= : Cấu hình khoảng thời gian hệ thống sẽ đợi cho đến khi thao tác mount được đánh dấu là không thành công.

Phần [Số tự động]

Thiết bị này cho phép một đơn vị .mount liên quan được tự động gắn khi khởi động. Như với đơn vị .mount , các đơn vị này phải được đặt tên theo đường dẫn của điểm mount đã dịch.

Phần [Automount] khá đơn giản, chỉ cho phép hai tùy chọn sau:

  • Where= : Đường dẫn tuyệt đối của điểm tự động trên hệ thống file . Điều này sẽ trùng với tên file ngoại trừ việc nó sử dụng ký hiệu đường dẫn thông thường thay vì bản dịch.
  • DirectoryMode= : Nếu điểm tự động hoặc bất kỳ folder mẹ nào cần được tạo, điều này sẽ xác định cài đặt quyền của các thành phần đường dẫn đó.

Phần [ Swap ]

Các đơn vị swap được sử dụng để cấu hình không gian swap trên hệ thống.Các đơn vị phải được đặt tên theo file swap hoặc thiết bị swap , sử dụng cùng một bản dịch hệ thống file đã được thảo luận ở trên.

Giống như các tùy chọn mount , các đơn vị swap có thể được tạo tự động từ các mục /etc/fstab hoặc có thể được cấu hình thông qua một file đơn vị chuyên dụng.

Phần [Swap] của file đơn vị có thể chứa các lệnh sau để cấu hình:

  • What= : Đường dẫn tuyệt đối đến vị trí của không gian swap , cho dù đây là file hay thiết bị.
  • Priority= : Điều này nhận một số nguyên cho biết mức độ ưu tiên của swap đang được cấu hình .
  • Options= : Bất kỳ tùy chọn nào thường được đặt trong file /etc/fstab đều có thể được đặt bằng chỉ thị này. Một danh sách được phân tách bằng dấu phẩy được sử dụng.
  • TimeoutSec= : Khoảng thời gian systemd chờ kích hoạt swap trước khi đánh dấu hoạt động là thất bại.

Phần [Đường dẫn]

Đơn vị đường dẫn xác định một đường dẫn hệ thống file mà systmed có thể theo dõi các thay đổi. Một đơn vị khác phải tồn tại sẽ được kích hoạt khi hoạt động nhất định được phát hiện tại vị trí đường dẫn. Hoạt động con đường được xác định thorugh inotify sự kiện.

Phần [Path] của file đơn vị có thể chứa các lệnh sau:

  • PathExists= : Chỉ thị này được sử dụng để kiểm tra xem đường dẫn được đề cập có tồn tại hay không. Nếu có, đơn vị liên kết sẽ được kích hoạt.
  • PathExistsGlob= : Điều này giống như ở trên, nhưng hỗ trợ các biểu thức global file để xác định sự tồn tại của đường dẫn.
  • PathChanged= : Điều này xem vị trí đường dẫn để biết các thay đổi. Đơn vị liên kết được kích hoạt nếu phát hiện thay đổi khi đóng file đã xem.
  • PathModified= : Nó theo dõi các thay đổi như chỉ thị trên, nhưng nó sẽ kích hoạt khi ghi file cũng như khi file được đóng.
  • DirectoryNotEmpty= : Chỉ thị này cho phép systemd kích hoạt đơn vị liên kết khi folder không còn trống.
  • Unit= : Điều này chỉ định đơn vị sẽ kích hoạt khi các điều kiện đường dẫn được chỉ định ở trên được đáp ứng. Nếu điều này bị bỏ qua, systemd sẽ tìm kiếm file .service có cùng tên đơn vị cơ sở với đơn vị này.
  • MakeDirectory= : Điều này xác định xem systemd có tạo cấu trúc folder của đường dẫn được đề cập trước khi xem hay không.
  • DirectoryMode= : Nếu ở trên được bật, điều này sẽ đặt chế độ cho phép của bất kỳ thành phần đường dẫn nào phải được tạo.

Phần [Hẹn giờ]

Các đơn vị hẹn giờ được sử dụng để lên lịch cho các việc hoạt động tại một thời điểm cụ thể hoặc sau một thời gian trễ nhất định. Đơn vị này loại thay thế hoặc bổ sung một số chức năng của cronat daemon. Phải cung cấp một thiết bị liên kết sẽ được kích hoạt khi đạt đến bộ đếm thời gian.

Phần [Timer] Bộ [Timer] của file đơn vị có thể chứa một số lệnh sau:

  • OnActiveSec= : Chỉ thị này cho phép đơn vị liên kết được kích hoạt so với kích hoạt của đơn vị .timer .
  • OnBootSec= : Chỉ thị này được sử dụng để chỉ định khoảng thời gian sau khi hệ thống được khởi động khi thiết bị liên kết sẽ được kích hoạt.
  • OnStartupSec= : Lệnh này tương tự như bộ đếm thời gian ở trên, nhưng liên quan đến thời điểm bắt đầu quá trình systemd .
  • OnUnitActiveSec= : Điều này đặt bộ đếm thời gian theo thời điểm thiết bị liên kết được kích hoạt lần cuối.
  • OnUnitInactiveSec= : Điều này đặt bộ đếm thời gian liên quan đến thời điểm đơn vị liên kết được đánh dấu lần cuối là không hoạt động.
  • OnCalendar= : Điều này cho phép bạn kích hoạt đơn vị được liên kết bằng cách chỉ định một giá trị tuyệt đối thay vì liên quan đến một sự kiện.
  • AccuracySec= : Đơn vị này được sử dụng để đặt mức độ chính xác mà bộ đếm thời gian cần được tuân theo . Theo mặc định, thiết bị liên kết sẽ được kích hoạt trong vòng một phút kể từ khi đạt đến bộ hẹn giờ. Giá trị của chỉ thị này sẽ xác định giới hạn trên của cửa sổ mà systemd lịch kích hoạt xảy ra.
  • Unit= : Chỉ thị này được sử dụng để chỉ định đơn vị sẽ được kích hoạt khi bộ hẹn giờ trôi qua. Nếu không được đặt, systemd sẽ tìm kiếm đơn vị .service có tên trùng với đơn vị này.
  • Persistent= : Nếu điều này được đặt, systemd sẽ kích hoạt đơn vị được liên kết khi bộ đếm thời gian hoạt động nếu nó đã được kích hoạt trong repository ảng thời gian bộ đếm thời gian không hoạt động.
  • WakeSystem= : Cài đặt chỉ thị này cho phép bạn đánh thức hệ thống khỏi trạng thái tạm ngừng nếu đạt đến bộ đếm thời gian khi ở trạng thái đó.

Phần [Slice]

Phần [Slice] của một file đơn vị thực sự không có bất kỳ cấu hình đơn vị .slice cụ thể nào. Thay vào đó, nó có thể chứa một số chỉ thị quản lý tài nguyên thực sự có sẵn cho một số đơn vị được liệt kê ở trên.

Bạn có thể tìm thấy một số chỉ thị phổ biến trong phần [Slice] , cũng được dùng trong các đơn vị khác trong trang người systemd.resource-control . Những điều này hợp lệ trong các phần dành riêng cho đơn vị sau:

  • [Slice]
  • [Scope]
  • [Service]
  • [Socket]
  • [Mount]
  • [Swap]

Tạo đơn vị version từ file đơn vị mẫu

Ta đã đề cập trước đó trong hướng dẫn này ý tưởng về các file đơn vị mẫu được sử dụng để tạo nhiều version của đơn vị. Trong phần này, ta có thể xem xét khái niệm này chi tiết hơn.

Các file đơn vị mẫu, theo hầu hết các cách, không khác gì các file đơn vị thông thường. Tuy nhiên, những điều này cung cấp sự linh hoạt trong việc cấu hình các đơn vị bằng cách cho phép một số phần nhất định của file sử dụng thông tin động sẽ có sẵn trong thời gian chạy.

Tên đơn vị mẫu và version

Các file đơn vị mẫu có thể được xác định vì chúng chứa ký hiệu @ sau tên đơn vị cơ sở và trước hậu tố loại đơn vị. Tên file đơn vị mẫu có thể trông giống như sau:

example@.service 

Khi một cá thể được tạo từ một mẫu, một số nhận dạng cá thể được đặt giữa ký hiệu @ và dấu chấm biểu thị sự bắt đầu của loại đơn vị. Ví dụ: file đơn vị mẫu ở trên được dùng để tạo một đơn vị cá thể trông giống như sau:

example@instance1.service 

Tệp cá thể thường được tạo dưới dạng một softlink đến file mẫu, với tên liên kết bao gồm cả định danh cá thể. Bằng cách này, nhiều liên kết với số nhận dạng duy nhất có thể trỏ về một file mẫu duy nhất. Khi quản lý một đơn vị cá thể, systemd sẽ tìm kiếm một file có tên cá thể chính xác mà bạn chỉ định trên dòng lệnh để sử dụng. Nếu nó không thể tìm thấy một, nó sẽ tìm kiếm một file mẫu được liên kết.

Bộ chỉ định mẫu

Sức mạnh của file đơn vị mẫu chủ yếu được nhìn thấy thông qua khả năng thay thế động thông tin thích hợp trong định nghĩa đơn vị theo môi trường hoạt động. Điều này được thực hiện bằng cách đặt các chỉ thị trong file mẫu như bình thường, nhưng thay thế các giá trị hoặc phần nhất định của giá trị bằng các chỉ định biến.

Sau đây là một số từ chỉ định phổ biến hơn sẽ được thay thế khi một đơn vị thể hiện được diễn giải với thông tin liên quan:

  • %n : Bất kỳ nơi nào điều này xuất hiện trong file mẫu, tên đơn vị kết quả đầy đủ sẽ được chèn.
  • %N : Điều này giống như ở trên, nhưng bất kỳ lối thoát nào, chẳng hạn như những lối thoát có trong các mẫu đường dẫn file , sẽ bị đảo ngược.
  • %p : Điều này tham chiếu đến tiền tố tên đơn vị. Đây là một phần của tên đơn vị đứng trước ký hiệu @ .
  • %P : Điều này tương tự như trên, nhưng với bất kỳ thoát nào sẽ bị đảo ngược.
  • %i : Điều này tham chiếu đến tên cá thể, là mã định danh theo sau @ trong đơn vị cá thể. Đây là một trong những thông số kỹ thuật được sử dụng phổ biến nhất vì nó sẽ được đảm bảo là động. Việc sử dụng số nhận dạng này khuyến khích việc sử dụng các số nhận dạng quan trọng trong cấu hình. Ví dụ: cổng mà dịch vụ sẽ được chạy tại được dùng làm định danh cá thể và mẫu có thể sử dụng mã định danh này để cài đặt đặc tả cổng.
  • %I : Thông số này giống như ở trên, nhưng với bất kỳ thoát nào bị đảo ngược.
  • %f : Tên này sẽ được thay thế bằng tên version không thoát hoặc tên tiền tố, được thêm vào trước bằng dấu / .
  • %c : Điều này sẽ cho biết group điều khiển của thiết bị, với phân cấp root tiêu chuẩn của /sys/fs/cgroup/ssytemd/ đã bị loại bỏ.
  • %u : Tên của user được cấu hình để chạy đơn vị.
  • %U : Giống như trên, nhưng ở dạng UID số thay vì tên.
  • %H : Tên server của hệ thống đang chạy đơn vị.
  • %% : Điều này được sử dụng để chèn một dấu phần trăm theo nghĩa đen.

Bằng cách sử dụng các số nhận dạng ở trên trong file mẫu, systemd sẽ điền vào các giá trị chính xác khi diễn giải mẫu để tạo một đơn vị version .

Kết luận

Khi làm việc với systemd , việc hiểu các đơn vị và file đơn vị có thể làm cho việc quản trị trở nên đơn giản. Không giống như nhiều hệ thống init khác, bạn không cần phải biết ngôn ngữ kịch bản để thông dịch các file init được sử dụng để khởi động dịch vụ hoặc hệ thống. Các file đơn vị sử dụng một cú pháp khai báo khá đơn giản cho phép bạn xem nhanh mục đích và tác dụng của một đơn vị khi kích hoạt.

Việc chia nhỏ chức năng chẳng hạn như logic kích hoạt thành các đơn vị riêng biệt không chỉ cho phép các quy trình systemd nội bộ tối ưu hóa việc khởi tạo song song, nó còn giữ cho cấu hình khá đơn giản và cho phép bạn sửa đổi và khởi động lại một số đơn vị mà không cần phá bỏ và xây dựng lại các kết nối liên quan của chúng. Tận dụng những khả năng này có thể mang lại cho bạn sự linh hoạt và quyền hơn trong quá trình quản lý.


Tags:

Các tin liên quan