Systemctl loại bỏ dịch vụ. Chạy các tập lệnh systemd gốc. Kiểm tra trạng thái của dịch vụ

Systemd Unit là một tập lệnh thực hiện các hành động khác nhau (bất cứ điều gì bạn viết vào nó). Tôi thường viết các đoạn mã như vậy để khởi động các dịch vụ khác nhau mà tôi biên dịch bằng tay hoặc khi tôi sử dụng phần mềm làm sẵn.

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

Các đơn vị là các đối tượng có thể được quản lý bởi hệ thống (Về cơ bản, một đại 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 một tập hợp các daemon).

Đơn vị, theo một nghĩa nào đó, có thể được gọi là dịch vụ hoặc công việc, tuy nhiên, đơn vị có định nghĩa rộng hơn nhiều vì nó có thể được sử dụng cho các dịch vụ trừu tượng, tài nguyên mạng, thiết bị, gắn kết hệ thống tệp và nhóm tài nguyên riêng biệt.

Một số tính năng dễ thực hiện:

  • Kích hoạt dựa trên ổ cắm: Các socket được liên kết với một dịch vụ tốt nhất nên được lấy ra từ chính daemon để được xử lý riêng. Điều này có một số ưu điểm, chẳng hạn như trì hoãn việc bắt đầu dịch vụ cho đến khi có sẵn ổ cắm thích hợp. Nó cũng cho phép hệ thống tạo tất cả các socket trước khi quá trình bắt đầu, điều này cho phép các dịch vụ liên quan được tải song song.
  • Kích hoạt dựa trên xe buýt: 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. Thiết bị có thể được khởi động khi có sẵn bus tương ứng.
  • Kích hoạt dựa trên đường dẫn: Unit có thể được khởi động dựa trên hoạt động hoặc sự hiện diện của các đường dẫn hệ thống tệp nhất định. Nó 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 phần cứng liên quan lần đầu tiên khả dụng (được kết nối) bằng cách sử dụng các sự kiện udev.
  • Ánh xạ phụ thuộc ngầm định: Phần lớn cấu trúc phụ thuộc cho các đơn vị có thể được xây dựng bởi chính hệ thống. Bạn vẫn có thể thêm thông tin phụ thuộc, nhưng hầu hết công việc khó khăn sẽ được thực hiện cho bạn.
  • Phiên bản và mẫu: Các tệp khối mẫu có thể được sử dụng để tạo nhiều phiên bản của cùng một thiết bị chung. Điều này cho phép bạn tạo các biến thể nhỏ hoặc các đơn vị duy nhất cung cấp cùng một chức năng chung.
  • Một sự đơn giản hóa bảo mật đơn giản: 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 nào có thể được sử dụng (đọc, ghi) khi làm việc với hệ thống tệp, giới hạn khả năng của hạt nhân, đặt thư mục riêng / tmp và quyền truy cập mạng.
  • Drop-in và đoạn trích: Các đơn vị có thể được mở rộng dễ dàng bằng cách cung cấp các đoạn mã sẽ ghi đè các phần của tệp hệ thống. Điều này giúp bạn dễ dàng chuyển đổi giữa các triển khai vani và tùy chỉnh.

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

Làm cách nào để tôi có thể tìm / Đơn vị Systemd trong Unix / Linux ở đâu?

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

Tất cả các bản sao của tệp hệ thống của hệ thống (ý tôi là tất cả các đơn vị) có thể được tìm thấy trong thư mục / lib / systemd / system. Các tệp được lưu trữ ở đây có thể được bắt đầu và dừng theo yêu cầu, nhưng trong phiên. Đây sẽ là một tệp đơn vị vani chung thường được viết bởi các nhà phát triển dự án bên thứ ba, những người này sẽ chạy 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 được chỉnh sửa các tập tin trong thư mục này. Thay vào đó, bạn phải ghi đè tệp (nếu cần) bằng một vị trí tệp khác sẽ thay thế tệp tại vị trí đó.

Nếu bạn muốn thay đổi cách thức hoạt động của một thiết bị nào đó, thì bạn cần phải chuyển đến thư mục / etc / systemd / system, bởi vì - các tệp được tìm thấy trong thư mục này được ưu tiên hơn bất kỳ vị trí nào khác trong hệ thống tệp.

Nếu bạn chỉ muốn ghi đè các chỉ thị nhất định từ các tệp đơn vị hệ thống, bạn thực sự có thể cung cấp các phân đoạn tệp đơn vị trong một thư mục con. Họ sẽ thêm hoặc thay đổi chỉ thị vào các bản sao của hệ thống, cho phép bạn chỉ định các tùy chọn bạn muốn thay đổi.

Cách chính xác để làm điều này là tạo một thư mục được đặt tên theo tệp với ".d" được thêm vào cuối. Do đó, một thư mục con my_test.service.d nên được tạo cho đơn vị có tên my_test.service. Trong thư mục này, tệp kết thúc bằng .conf có thể được sử dụng để ghi đè hoặc mở rộng các thuộc tính tệp đơn vị.

Ngoài ra còn có một nơi để xác định các đơn vị thời gian chạy trong / run / systemd / system. Các tệp được tìm thấy trong thư mục này được ưu tiên giữa / etc / systemd / system và / lib / systemd / system.

Các tệp ở vị trí này có mức độ ưu tiên thấp hơn vị trí cũ, nhưng mức độ ưu tiên cao hơn vị trí cuối cùng. Bản thân quy trình systemd sử dụng vị trí này cho các tệp đơn vị được tạo động được tạo trong thời gian chạy. Thư mục này có thể được sử dụng để thay đổi hành vi thiết bị của hệ thống trong toàn bộ phiên. Tất cả các thay đổi được thực hiện đối với thư mục này sẽ bị mất khi máy chủ được khởi động lại.

Các loại tệp đơn vị hệ thống

Cách dễ nhất để xác định loại thiết bị là xem hậu tố của nó, hậu tố này được thêm vào cuối tên tài nguyên (đơn vị). Danh sách sau đây mô tả các loại đơn vị có sẵn cho systemd:

  • .dịch vụ: Đơn vị này mô tả cách quản lý dịch vụ hoặc ứng dụng trên máy chủ. Nó sẽ bao gồm việc bắt đầu hoặc dừng dịch vụ, trong những trường hợp nào nó sẽ tự động khởi động, cũng như thông tin phụ thuộc cho phần mềm tương ứng.
  • .ổ cắm: Tệp thiết bị ổ cắm mô tả mạng, ổ cắm IPC hoặc bộ đệm FIFO mà systemd sử dụng để kích hoạt ổ cắm. Chúng luôn có một tệp .service được liên kết sẽ được bắt đầu trên hoạt động socket xác định khối này.
  • .thiết bị: Đơn vị mô tả thiết bị đã được chỉ định khi cần thiết để điều khiển systemd bằng udev hoặc hệ thống tệp sysfs. Không phải tất cả các thiết bị đều có tệp .device. Một số tập lệnh có thể yêu cầu thiết bị .device để gắn và truy cập thiết bị.
  • .mount: Khối này xác định một điểm gắn kết trên hệ thống được quản lý bởi systemd. Chúng được đặt tên theo đường dẫn gắn kết, với "/" được đổi thành dấu gạch ngang. Các mục bên trong / etc / fstab có thể có các khối được tạo tự động.
  • .automount: Mô-đun .automount thiết lập một điểm gắn kết sẽ được đặt tự động và phải được xác định sau điểm gắn kết mà chúng tham chiếu đến và phải có một mô-đun .mount tương ứng để xác định các điểm gắn kết cụ thể.
  • .tráo đổi: Đơn vị này mô tả SWAP (không gian hoán đổi) trong hệ thống. Tên của các khối này phải phản ánh đường dẫn đến thiết bị hoặc tệp.
  • .Mục tiêu: Bộ phận này dùng để cung cấp điểm đồng bộ cho các thiết bị khác khi khởi động hoặc thay đổi trạng thái. Chúng cũng có thể được sử dụng để đưa hệ thống sang trạng thái mới.
  • .đường dẫn: Đơn vị này xác định một đường dẫn có thể được sử dụng để kích hoạt dựa trên đường dẫn. Theo mặc định, đơn vị sẽ được bắt đầu với cùng một tên cơ sở. Điều này sử dụng inotify để theo dõi các thay đổi đường dẫn.
  • .timer: Đơn vị này xác định một bộ đếm thời gian sẽ được quản lý bởi systemd (tương tự như một công việc cron) để kích hoạt bị trì hoãn hoặc theo lịch trình. Khi đạt đến bộ đếm thời gian, khối tương ứng sẽ chạy.
  • .snapshot: Đơn vị này được tạo tự động bằng lệnh snapshot systemctl. Nó cho phép bạn khôi phục trạng thái hiện tại của hệ thống sau khi thực hiện các thay đổi. Ảnh chụp nhanh không được lưu giữa các phiên và được sử dụng để khôi phục trạng thái tạm thời.
  • .lát cắt: Nó được liên kết với các nút của nhóm điều khiển Linux, cho phép bạn giới hạn tài nguyên hoặc gán chúng cho bất kỳ quy trình nào được liên kết với Slice. Tên phản ánh vị trí thứ bậc của nó trong cây nhóm. Các đơn vị được đặt trong các lát nhất định theo mặc định tùy thuộc vào loại của chúng.
  • .phạm vi: Chúng được tạo tự động bởi systemd từ thông tin nó nhận được từ 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 có thể thấy, có nhiều đơn vị khác nhau mà hệ thống tương tác với nhau. Nhiều người trong số họ làm việc cùng nhau để thêm chức năng. Hầu hết, .service được sử dụng vì tính hữu ích của chúng.

Cấu trúc của các tệp đơn vị systemd

Cấu trúc bên trong của tệp được tổ chức bằng cách sử dụng các phần. Các phần được ký hiệu bằng hai dấu ngoặc vuông "[" và "]" với tên của phần được đặt bên trong. Mỗi phần tiếp tục đến đầu phần tiếp theo hoặc đến cuối tệp.

Tên phần được xác định rõ ràng và phân biệt chữ hoa chữ thường. Do đó, phần này sẽ không được hiểu chính xác nếu nó được viết là. Nếu bạn cần thêm phân vùng không chuẩn để phân tích cú pháp (ngoài systemd), bạn có thể thêm tiền tố X vào tên phân vùng.

Trong các phần này, hành vi và siêu dữ liệu của thiết bị được xác định bằng các lệnh đơn giản sử dụng định dạng khóa-giá trị với phép gán dấu bằng, ví dụ:

Chỉ thị1 = giá trị Chỉ thị2 = giá trị .......

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

Chỉ thị1 = default_value

Giá trị mặc định có thể được bỏ qua trong tệp ghi đè bằng cách chỉ định Chỉ thị1 (không có giá trị), như sau:

Chỉ thị1 =

Bây giờ chúng ta hãy xem xét từng đơn vị riêng biệt.

Phần đầu tiên được tìm thấy trong hầu hết các tệp đơn vị là. Nó thường được sử dụng để xác định siêu dữ liệu của thiết bị và đặt mối quan hệ của thiết bị với các thiết bị khác.

Mặc dù thứ tự của các phần không quan trọng đối với systemd khi phân tích cú pháp một tệp, nhưng phần này thường được đặt lên hàng đầu vì nó cung cấp cái nhìn tổng quan về thiết bị. Một số hướng dẫn chung bạn sẽ tìm thấy trong phần:

  • Mô tả =: Chỉ thị này có thể được sử dụng để mô tả tên và chức năng cơ bản của thiết bị. Nó được trả lại bởi các công cụ systemd khác nhau, vì vậy, thật tốt khi đặt một cái gì đó ngắn gọn, cụ thể và nhiều thông tin.
  • tài liệu =: Chỉ thị này cung cấp các vị trí tài liệu. Đây có thể là các trang trợ giúp có sẵn nội bộ hoặc có sẵn trên Internet (URL). Lệnh "status system your_service" sẽ hiển thị thông tin này.
  • Yêu cầu =: Chỉ thị này liệt kê tất cả các đơn vị mà đơn vị này (dịch vụ hoặc thiết bị) phụ thuộc vào. Nếu khối 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 sẽ không thành công. Các khối này chạy song song với thiết bị mặc định hiện tại.
  • Muốn =: Chỉ thị này tương tự như Request = nhưng ít hạn chế hơn. Systemd sẽ cố gắng khởi động bất kỳ thiết bị nào được liệt kê ở đây khi thiết bị này được kích hoạt. Nếu các thiết bị này không được phát hiện hoặc khởi động, khối hiện tại sẽ tiếp tục hoạt động. Đây là cách được khuyến nghị để định cấu hình hầu hết các phụ thuộc. Một lần nữa, điều này ngụ ý kích hoạt song song trừ khi được sửa đổi bởi các chỉ thị khác.
  • BindsTo =: Lệnh này tương tự như Request = nhưng cũng khiến thiết bị hiện tại dừng khi nút tương ứng kết thúc.
  • trước =: Các đơn vị được liệt kê trong chỉ thị này sẽ không được khởi động cho đến khi khối hiện tại được đánh dấu là đang chạy nếu chúng được kích hoạt cùng một lúc.
  • Sau =: Các đơn vị được liệt kê trong chỉ thị này sẽ được khởi động trước khi thiết bị (đơn vị) hiện tại được khởi động.
  • Xung đột =: Đơn vị này có thể được sử dụng để hiển thị các đơn vị không thể chạy cùng lúc với thiết bị hiện tại. Khởi động thiết bị bằng kết nối này sẽ khiến các thiết bị khác dừng lại.
  • Điều kiện… =: Có một số lệnh bắt đầu với một điều kiện cho phép quản trị viên 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ó thể được sử dụng để cung cấp một tệp phần tử chung sẽ chỉ chạy trên các hệ thống đủ điều kiện. Nếu điều kiện không được đáp ứng, thiết bị sẽ bị bỏ qua.
  • Khẳng định… =: Tương tự như lệnh ở trên (Điều kiện… =), nhưng bộ lệnh kiểm tra các khía cạnh khác nhau của môi trường hoạt động để quyết định xem thiết bị có nên được kích hoạt hay không. Tuy nhiên, không giống như các chỉ thị Điều kiện… =, một kết quả âm gây ra lỗi trong chỉ thị này.

Sử dụng các lệnh này và một số lệnh khác, bạn có thể đặt thông tin chung về thiết bị và mối quan hệ của nó với hệ điều hành.

Ở cuối tệp, phần nằm -. Phần này là tùy chọn và được sử dụng để xác định hành vi hoặc đơn vị nếu nó được bật hoặc tắt. Bật thiết bị có nghĩa là nó tự động khởi động khi khởi động. Về cơ bản, điều này đạt được bằng cách cố định thiết bị được đề cập vào một khối khác, nằm ở đâu đó trong dòng các đơn vị sẽ được khởi động khi 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 cho biết điều gì sẽ xảy ra khi thiết bị được bật:

  • WantedBy =: Chỉ thị này là cách phổ biến nhất để xác định cách một thiết bị nên được bật. Chỉ thị này cho phép bạn chỉ định một phụ thuộc (tương tự như chỉ thị Wants = trong phần). Sự khác biệt là chỉ thị này được bao gồm trong một khối phụ trợ, cho phép khối chính vẫn tương đối sạch. Khi một thiết bị được chỉ định bằng chỉ thị này, một thư mục trong / etc / systemd / sẽ được tạo trên hệ thống, được đặt tên theo thiết bị được chỉ định, nhưng có thêm ".wants" ở cuối. Trong trường hợp này, một liên kết tượng trưng sẽ được tạo đến khối hiện tại tạo ra sự phụ thuộc. Ví dụ: nếu khối hiện tại có WantedBy = multi-user.target, một thư mục có tên multi-user.target.wants sẽ được tạo trong / etc / systemd / system (nếu chưa có) và một liên kết tượng trưng đến khối hiện tại sẽ được đặt bên trong. Việc vô hiệu hóa thiết bị này sẽ xóa liên kết và xóa phần phụ thuộc.
  • Bắt buộcBy =: 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 bắt buộ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 kích hoạt, một đơn vị có chỉ thị này sẽ tạo một thư mục kết thúc bằng .requires.
  • Bí danh =: Chỉ thị này cho phép bạn kích hoạt thiết bị 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 các tính năng đa nhà cung cấp có sẵn để các bộ phận tương ứng có thể tra cứu bất kỳ nhà cung cấp nào có bí danh chung.
  • cũng =: Lệnh này cho phép bạn bật hoặc tắt các khối dưới dạng một tập hợp. Tại đây, bạn có thể chỉ định các thiết bị hỗ trợ luôn sẵn sàng khi thiết bị này hoạt động. Chúng sẽ được quản lý như một nhóm cho các tác vụ cài đặt.
  • DefaultInstance =: Đối với các đơn vị mẫu (sau này) có thể khởi tạo các khối với tên không thể đoán trước, điều này có thể được sử dụng làm dự phòng cho tên nếu tên thích hợp không được cung cấp.

Phần này đượ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 chính cần được chỉ rõ trong phần này là Type = dịch vụ. Nó phân loại các dịch vụ theo quy trình và hành vi ma quỷ của chúng. Điều này rất quan trọng vì nó cho systemd biết cách quản lý dịch vụ đúng cách và biết trạng thái của nó.

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

  • giản dị: Quá trình chính của dịch vụ được liệt kê trên dòng bắt đầu. Đây là giá trị mặc định nếu các chỉ thị Type = và Busname = không được đặt, nhưng ExecStart = được đặt. Mọi thông báo phải được xử lý bên ngoài thiết bị thông qua khối thứ hai thuộc loại thích hợp (ví dụ: qua khối .socket nếu dịch vụ đó giao tiếp bằng cách sử dụng các ổ cắm).
  • rèn: Loại dịch vụ này được sử dụng khi dịch vụ tách các quy trình con khi quy trình mẹ thoát ra trong giây lát. Điều này cho systemd biết rằng quá trình này vẫn đang chạy, mặc dù phiên bản gốc đã kết thúc phiên. Rất thích hợp, ví dụ, để chạy php-fpm, nginx, tomcat.
  • một Châu: Loại này chỉ ra rằng quá trình sẽ tồn tại trong thời gian ngắn và hệ thống nên đợi quá trình hoàn tất trước khi tiếp tục với các thiết bị khác. Giá trị mặc định cho Type = và 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 có nghĩa là thiết bị sẽ sử dụng tên từ xe buýt D-Bus. Khi điều này xảy ra, systemd sẽ tiếp tục xử lý khối tiếp theo.
  • thông báo: Điều này cho biết rằng dịch vụ sẽ gửi một thông báo khi nó kết thúc quá trình khởi động. Quá trình systemd sẽ đợi điều này xảy ra trước khi chuyển sang các thiết bị khác.
  • nhàn rỗi: Điều này có nghĩa là dịch vụ sẽ không bắt đầu cho đến khi tất cả các công việc đã được gửi.

Khi sử dụng một số loại dịch vụ nhất định, một số chỉ thị bổ sung có thể được yêu cầu. Ví dụ:

  • RemainAfterExit =: Chỉ thị này thường được sử dụng với loại onehot. Điều này có nghĩa là dịch vụ phải được coi là đang 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 tệp, đường dẫn này phải chứa số ID quy trình của "con" chính cần được giám sát.
  • BusName =: Chỉ thị này phải được đặt thành tên D-Bus mà dịch vụ sẽ cố gắng lấy khi sử dụng loại dịch vụ "dbus".
  • NotifyAccess =: Chỉ thị này chỉ định quyền truy cập socket sẽ được sử dụng để lắng nghe các thông báo khi "thông báo" được chọn. Nó có thể là "không", "chính" hoặc "tất cả". Mặc định "không" 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 các thông báo từ quy trình chính, trong khi tùy chọn "tất cả" sẽ xử lý tất cả các thành viên của nhóm kiểm soát của dịch vụ.

Cho đến nay, chúng ta đã thảo luận về một số thông tin cơ bản, nhưng chưa thực sự nói về cách quản lý các dịch vụ của chúng tôi. Các chỉ thị sau đây có sẵn cho việc này:

  • ExecStart =: Bạn phải chỉ định đường dẫn đầy đủ và các đối số của lệnh phải đượ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ụ "onehot"). Nếu đường dẫn lệnh đứng trước dấu 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 thiết bị là thất bại.
  • ExecStartPre =: Bạn phải chỉ định đường dẫn đầy đủ và các đối số lệnh phải được thực thi trước khi quá trình chính bắt đầu. Điều này có thể được sử dụng nhiều lần.
  • ExecStartPost =: Điều này có cùng chất lượng với ExecStartPre = ngoại trừ chỉ thị này chỉ định các lệnh sẽ được chạy sau khi tiến trình chính bắt đầu.
  • ExecReload =: Chỉ thị tùy chọn này chỉ định lệnh cần thiết để tải lại cấu hình dịch vụ, nếu có.
  • ExecStop =: Điều này cho biết lệnh được yêu cầu để dừng dịch vụ. Nếu điều này không được chỉ định, 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ó thể được sử dụng để chỉ định các lệnh sẽ được thực hiện sau khi lệnh bị 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ụ.
  • khởi động lại =: Đ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ụ. Nó có thể được đặt thành "luôn luôn", "khi thành công", "khi thất bại", "bất thường", "đang hủy bỏ" hoặc "cơ quan giám sát". Thao tác này sẽ khởi động lại theo cách dịch vụ bị dừng.
  • TimeoutSec =: Điều này đặt khoảng thời gian hệ thống sẽ đợi một dịch vụ dừng lại trước khi đánh dấu dịch vụ đó là không thành công hoặc buộc phải ngừng hoạt động. Bạn có thể đặt thời gian chờ riêng lẻ với TimeoutStartSec = và TimeoutStopSec =.

Sockets 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à đồng thời tốt hơn. Mỗi khối ổ cắm phải có một mô-đun dịch vụ tương ứng sẽ được kích hoạt khi ổ cắm nhận được hoạt động.

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

Để chỉ định ổ cắm thực tế, các lệnh sau thường gặp:

  • ListenStream =: Điều này chỉ định một địa chỉ cho một luồng socket hỗ trợ giao tiếp nhất quán, đáng tin cậy. Các dịch vụ sử dụng TCP phải sử dụng loại ổ cắm này.
  • ListenDatagram =: Điều này chỉ định một địa chỉ cho một ổ cắm datagram hỗ trợ các gói truyền thông nhanh, không đáng tin cậy. Các dịch vụ sử dụng UDP phải đặt loại ổ cắm này.
  • ListenSequentialPacket =: Điều này chỉ định một địa chỉ cho các liên lạc nhất quán, đáng tin cậy với các sơ đồ dữ liệu tối đa duy trì các ranh giới thông điệp. Điều này là phổ biến nhất trên các ổ cắm Unix.
  • ListenFIFO: Cùng với các kiểu nghe khác, bạn cũng có thể chỉ định bộ đệm FIFO thay vì ổ cắm.

Có nhiều loại chỉ thị kết nối 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 ổ cắm có thể được kiểm soát bằng các chỉ thị bổ sung:

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

Mô-đun gắn kết cho phép bạn kiểm soát điểm gắn kết từ bên trong systemd. Các điểm gắn kết được đặt tên theo thư mục mà chúng quản lý, sử dụng một thuật toán dịch.

Ví dụ: dấu gạch chéo ở đầu (dấu gạch chéo hoặc "/") 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à ký tự không in đượ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 như tên của máy chủ gắn kết. Các đơn vị gắn kết sẽ có sự phụ thuộc ngầm định vào các đơn vị gắn kết khác ở trên nó trong hệ thống phân cấp.

Các đơn vị gắn kết thường được dịch trực tiếp từ tệp / 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 bạn muốn xác định trong một tệp:

  • Cái gì =: Đường dẫn tuyệt đối đến tài nguyên được gắn kết.
  • Ở đâu =: Đường dẫn tuyệt đối của điểm gắn kết nơi tài nguyên sẽ được gắn kết. Tên này phải giống với tên tệp thiết bị, ngoại trừ việc sử dụng ký hiệu hệ thống tệp tiêu chuẩn.
  • gõ =: Loại hệ thống tệp để gắn kết.
  • Tùy chọn =: Bất kỳ tùy chọn gắn kết nào bạn muốn áp dụng. Đây là danh sách được phân tách bằng dấu phẩy.
  • SloppyOptions =: Giá trị Boolean (0 hoặc 1) chỉ định việc gắn kết có bị lỗi hay không nếu có tùy chọn gắn kết không được công nhận.
  • DirectoryMode =: Nếu thư mục mẹ cần được tạo cho điểm gắn kết, điều này xác định chế độ quyền của các thư mục đó.
  • TimeoutSec =: Đặt khoảng thời gian hệ thống sẽ đợi cho đến khi thao tác gắn kết được đánh dấu là thất bại.

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

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

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

Các module hoán đổi được sử dụng để cấu hình hoán đổi (swap) trong hệ thống. Các đơn vị phải được đặt tên theo tên của tệp hoặc thiết bị hoán đổi, sử dụng cách truyền hệ thống tệp tương tự như đã thảo luận ở trên.

Giống như các tùy chọn gắn kết, các khối hoán đổi có thể được tạo tự động từ / etc / fstab hoặc có thể được định cấu hình thông qua một tệp đơn vị chuyên dụng.

Phần này có thể chứa các chỉ thị cấu hình sau:

  • Cái gì =: Đường dẫn tuyệt đối đến vị trí hoán đổi (có thể là tệp hoặc thiết bị).
  • Ưu tiên =: Tùy chọn này chấp nhận một số nguyên chỉ định mức độ ưu tiên cho cài đặt hoán đổi.
  • Tùy chọn =: Bất kỳ tùy chọn nào thường được đặt trong tệp / etc / fstab đều có thể được đặt bằng cách sử dụ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 =: Tùy chọn này đặt khoảng thời gian hệ thống chờ kích hoạt hoán đổi trước khi đánh dấu hoạt động là không thành công.

Khối đường dẫn xác định đường dẫn hệ thống tệp mà systmed có thể theo dõi các thay đổi. Phải có một khối khác 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 của một đường dẫn được xác định bởi thực tế là nó không ảnh hưởng đến các sự kiện.

Phần này có thể chứa các chỉ thị sau:

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

Bộ hẹn giờ, được sử dụng để lên lịch cho các tác vụ chạy tại một thời điểm cụ thể hoặc sau một khoảng thời gian trễ cụ thể. Loại thiết bị này thay thế hoặc bổ sung một số chức năng cron và daemon. Một khối thích hợp phải được cung cấp, khối này sẽ được kích hoạt khi đạt đến bộ đếm thời gian.

Phần này có thể chứa một số chỉ thị sau:

  • OnActiveSec =: Chỉ thị này cho phép kích hoạt khối tương ứng liên quan đến kích hoạt mô-đun .timer.
  • OnBootSec =: Chỉ thị này đặt thời gian thiết bị tương ứng sẽ được kích hoạt sau khi hệ thống khởi động.
  • OnStartupSec =: Lệnh này tương tự như bộ đếm thời gian ở trên, nhưng chỉ định thời điểm quá trình systemd sẽ thức dậy sau khi hệ thống khởi động.
  • OnUnitActiveSec =: Điều này đặt bộ hẹn giờ tùy thuộc vào thời điểm kích hoạt bộ hẹn giờ cuối cùng.
  • OnUnitInactiveSec =: Điều này đặt bộ hẹn giờ khi thiết bị không hoạt động.
  • OnCalendar =: Điều này cho phép bạn kích hoạt khối tương ứng bằng cách chỉ định tuyệt đối (thay vì tương đối).
  • AccuracySec =: Bộ phận này dùng để đặt mức độ chính xác với bộ đếm thời gian được dán. Theo mặc định, khối liên kết với nó sẽ được kích hoạt trong vòng một phút.
  • đơn vị =: Chỉ thị này được sử dụng để chỉ định những gì sẽ được kích hoạt khi bộ hẹn giờ hết hạn. Nếu không được đặt, Systemd sẽ tìm kiếm một khối có tên .service.
  • Kiên trì =: Nếu điều này được đặt, Systemd sẽ chạy trình kích hoạt khối thích hợp.
  • WakeSystem =: Thiết lập chỉ thị này cho phép hệ thống được "đánh thức" từ chế độ chờ nếu đạt đến bộ đếm thời gian.

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

Lý thuyết đủ rồi, chúng ta hãy chuyển sang thực hành.

Viết tệp đơn vị systemd

Điều đầu tiên cần làm là kiểm tra quá trình khởi tạo:

# ps -s1 | awk "(in $ 4)" | grep -Ev "CMD"

Tái bút: Đây là một bài viết ngắn:

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

[email được bảo vệ]

Từ khối đã tạo (ở trên), bạn có thể tạo một thể hiện của một khối khác trông giống như sau:

[email được bảo vệ]

Sức mạnh của tệp mô-đun mẫu chủ yếu là do khả năng chèn động thông tin liên quan vào định nghĩa thiết bị theo môi trường (ENV). Điều này được thực hiện bằng cách thiết lập các chỉ thị trong tệp mẫu như bình thường, nhưng thay thế các giá trị nhất định hoặc các phần của giá trị bằng các mã chỉ định biến.

Sau đây là một số từ định nghĩa 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 thích hợp:

  • %N: Bất cứ nơi nào điều này được sử dụng, tên đầy đủ của phần tử sẽ được thêm vào.
  • %N: Điều này tương tự 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 tệp sẽ bị bỏ qua.
  • %P: Điều này chỉ định tiền tố tên đơn vị. Đây là một phần của tên đơn vị đứng trước biểu tượng @.
  • %P: Điều này tương tự như trên, nhưng với bất kỳ sự lạc đề nào.
  • %tôi: Điều này đề cập đến tên cá thể, là định danh theo sau @ trong cá thể. Nó là một trong những thông số kỹ thuật được sử dụng phổ biến nhất vì nó 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 cấu hình có ý nghĩa. Ví dụ: cổng mà dịch vụ sẽ chạy có thể được sử dụng làm định danh cá thể và mẫu có thể sử dụng mã định danh này để tùy chỉnh đặc tả cổng.
  • %TÔI: Bộ chỉ định này giống như trên, nhưng với bất kỳ phủ định nào.
  • % f: Tên này sẽ được thay thế bằng tên đơn vị không thoát hoặc tên tiền tố được thêm vào "/".
  • %c: Điều này sẽ trỏ đến nhóm điều khiển của thiết bị với phân cấp gốc chuẩn / sys / fs / cgroup / ssytemd.
  • % u: Tên người dùng được định cấu hình để chạy đơn vị.
  • % U: Tương tự như trên, UID thay vì tên.
  • % H: Tên máy chủ của hệ thống mà thiết bị đang chạy.
  • %% : Điều này được sử dụng để chèn một dấu phần trăm chữ cái.

Sử dụng các số nhận dạng ở trên trong mẫu tệp, 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 cá thể đơn vị.

Ví dụ về tệp đơn vị hệ thống

Hãy xem xét ví dụ sau - đây là viết một script systemd để khởi động tomcat. Để thực hiện việc này, hãy mở tệp:

# vim /etc/systemd/system/tomcat9.service

Và viết đoạn mã sau vào đó:

Description = Tomcat9 After = syslog.target network.target Type = forking User = tomcat Group = tomcat Environment = CATALINA_PID = / usr / local / tomcat9 / tomcat9.pid Environment = TOMCAT_JAVA_HOME = / usr / bin / java Môi trường = CATALINA_HOME = / usr / local / tomcat9 Môi trường = CATALINA_BASE = / usr / local / tomcat9 Môi trường = CATALINA_OPTS = # Môi trường = "CATALINA_OPTS = -Xms512M -Xmx1024M -server -XX: + UseParallelGC" Môi trường = "JAVA_OPTS = -Dfile.encoding = UTF-8coding Dnet.sf.ehcache.skipUpdateCheck = true -XX: + UseConcMarkSweepGC -XX: + CMSClassUnloadingEnabled -XX: + UseParNewGC -XX: MaxPermSize = 128m -Xms512m -Xmx512m "ExecStart / local / startup.shr ExecStart / tom = / bin / kill -15 $ MAINPID WantedBy = multi-user.target

Hãy khởi động lại dịch vụ:

# systemctl daemon-tải lại

Thêm Tomcat vào khởi động hệ điều hành:

# systemctl bật tomcat9

Khởi động lại tomcat:

# systemctl khởi động lại tomcat9

Để kiểm tra trạng thái, hãy chạy:

# systemctl status tomcat9 ● tomcat9.service - Tomcat9 đã tải: đã tải (/etc/systemd/system/tomcat9.service; đã kích hoạt) Đang hoạt động: hoạt động (đang chạy) kể từ Thứ ba 2017-05-09 22:04:58 EEST; 6 giây trước Quy trình: 28528 ExecStop = / bin / kill -15 $ MAINPID (mã = thoát, trạng thái = 0 / THÀNH CÔNG) Quy trình: 28531 ExecStart = / usr / local / tomcat9 / bin / startup.sh (mã = thoát, trạng thái = 0 / THÀNH CÔNG) PID chính: 28541 (java) Nhóm CG: /system.slice/tomcat9.service └─28541 / usr / bin / java -Djava.util.logging.config.file = / usr / local / tomcat9 / conf / logging.properties -Djava.ut ... 09 tháng 5 22:04:58 debian systemd: Khởi động Tomcat9 ... 09 tháng 5 22:04:58 debian startup.sh: Tomcat khởi động. 09 tháng 5 22:04:58 debian systemd: Khởi động Tomcat9.

Như bạn có thể thấy, mọi thứ hoạt động tốt. Về điều này, tôi có tất cả mọi thứ! Các ví dụ khác sẽ theo sau. Tôi sẽ thêm chúng khi cần thiết. Nhưng về cơ bản, tôi sử dụng mẫu ở trên (chỉ cần sửa đổi nó một chút).

Bài "Viết file Unit systemd" đã hoàn thành.

Daemon hệ thống là một trong những hệ thống con UNIX quan trọng. Không chỉ các khả năng của hệ điều hành, mà các thông số như tính dễ sử dụng và thậm chí tốc độ làm việc cũng phụ thuộc vào cách chúng được viết tốt và chính xác. Trong bài viết này, chúng ta sẽ xem xét bốn ví dụ về việc triển khai chính xác các daemon có thể giúp làm việc trong hệ thống thuận tiện, hiệu quả và nhanh hơn.

systemd: nhanh hơn ánh sáng

Lược đồ khởi động cho một bản phân phối Linux điển hình trông giống như sau: hạt nhân khởi tạo phần cứng và bắt đầu quá trình / sbin / init, quá trình này sẽ chạy các tập lệnh khởi tạo. Các tập lệnh gắn kết các hệ thống tệp, định cấu hình mạng, các thiết bị khác nhau và bắt đầu khởi chạy tuần tự các daemon: syslogd, cron, cốc và những thứ khác được liệt kê trong tệp cấu hình. Cuối cùng, init khởi động trình quản lý đăng nhập: getty hoặc xdm (kdm, gdm). Đơn giản và hợp lý, phải không? Tuy nhiên, sơ đồ như vậy còn khá sơ khai và so với Windows và Mac OS X, nó nói chung là cổ điển. Hệ thống khởi tạo của chúng chạy các tác vụ song song mà không cần đợi một tác vụ hoàn thành trước khi chuyển quyền điều khiển cho tác vụ tiếp theo. Nếu một trong số chúng ngừng hoạt động trên I / O, thì hệ thống kia sẽ kiểm soát ngay lập tức, do đó, thời gian tải tổng thể được giảm xuống, đến mức hệ thống truyền thống bị tụt lại rất xa.

Trong thế giới Linux, chỉ có Ubuntu hoạt động theo cách này, và thậm chí sau đó chỉ trong hai năm qua. Những người khác vẫn tiếp tục khởi động hệ thống theo cách cũ hoặc sử dụng nạng tự lắp ráp song song với quá trình khởi động một cách vụng về và thường xuyên sai sót (xin chào Gentoo và Arch!). Một giải pháp thực sự phổ quát vẫn chưa được tìm ra, vì vậy nhiều lập trình viên đang nghiên cứu ý tưởng về một hệ thống khởi tạo song song.

Lennart Pottering của Red Hat và tác giả của PulseAudio là một trong số họ. Thành tựu mới nhất của anh là daemon systemd, một ứng cử viên khác cho danh hiệu kẻ giết người / sbin / init, có thể dễ dàng trôi qua nếu ý tưởng ẩn chứa nó không trở nên thú vị và đúng đắn như vậy.

Systemd khác với bất kỳ hệ thống init nào khác ở chỗ nó cố ý làm cho những thứ phức tạp trở nên đơn giản. 99% tất cả các hệ thống init đồng thời khác đều thất bại đơn giản bởi vì, so với sự đơn giản và dễ hiểu, ngay cả với man rợ / sbin / init, chúng trông giống như những con quái vật nguy hiểm. Để có thể chạy song song mà không vào hệ điều hành ở trạng thái không nhất quán (có thể xảy ra, ví dụ: nếu bạn cố gắng cấu hình mạng trước khi tải trình điều khiển mạng hoặc khởi động daemon mà không gắn đúng FS), đồng bộ hóa khác nhau các phương pháp đã được sử dụng. Về cơ bản, đây là những loại "dấu phụ thuộc" không cho phép bước khởi tạo tiếp theo hoạt động nếu bước được mô tả trong phần phụ thuộc của nó không được hoàn thành.
Ví dụ, cron phụ thuộc vào nhật ký hệ thống vì nó cần lưu giữ nhật ký; syslog phụ thuộc vào thiết lập mạng vì nó có thể nhận nhật ký từ các máy từ xa, v.v. Do đó, các tập lệnh khởi tạo trở thành một chuỗi khối khó hiểu và quá trình biên dịch của chúng trở nên phức tạp hơn nhiều. Systemd đơn giản hơn nhiều, nó không theo dõi các phụ thuộc, nó chỉ chạy mọi thứ cùng một lúc.

Tôi không đùa. Systemd chỉ sử dụng cơ chế kiểm soát phụ thuộc trong giai đoạn đầu khởi tạo, bằng cách nào đó phải diễn ra tuần tự (gắn hệ thống tệp gốc, hoán đổi gắn kết, tải mô-đun, v.v.). Khi nói đến daemon, chiếm 90% thời gian khởi động hệ điều hành để khởi động, systemd quên đi các phụ thuộc và khởi động tất cả chúng cùng một lúc, cho thấy tốc độ đáng kinh ngạc.

Điều này hoạt động vì systemd nhận thức được cách thức hoạt động của các daemon và cách chúng giao tiếp với nhau.

Thật vậy, trên thực tế, các daemon hoàn toàn không cần các daemon khác, mà chỉ cần "các kênh giao tiếp" cung cấp trao đổi dữ liệu: cron không phụ thuộc vào syslog, nó cần một ổ cắm / dev / log để nó có thể ghi nhật ký của mình, tương tự. đúng với bất kỳ con quỷ nào khác. Tất cả chúng đều giao tiếp qua các socket, và lý do duy nhất tại sao daemon A cần phải được khởi động trước các daemon B, C và D là vì daemon A cần tạo ra socket mà chúng cần. Systemd tính đến điều này, do đó, cơ chế khởi động song song của nó dựa vào các socket mà nó tạo trước cho từng daemon và sau đó khởi động các daemon cùng một lúc. Đồng thời, trách nhiệm đồng bộ hóa và “theo dõi phụ thuộc” giờ đây được chuyển sang kernel, trong đó cơ chế socket được thực hiện.

Ví dụ: nếu cron có được quyền kiểm soát trước nhật ký hệ thống, sẽ không có gì xấu xảy ra - cron sẽ tìm thấy / dev / log yêu thích của nó và thậm chí có thể viết tin nhắn cho nó (tất nhiên là nếu nó muốn), điều này sẽ, không, không. ném ra ngoài, nhưng được đệm trong socket, nhưng chỉ cho đến khi cron muốn viết thông báo vào socket có thể làm tràn nó. Trong trường hợp này, hạt nhân sẽ chặn tiến trình cron và chuyển quyền điều khiển cho tiến trình tiếp theo trong hàng đợi thực thi (daemon tiếp theo). Ngay sau đó (hoặc có thể ngay lập tức), đến lượt sẽ đến nhật ký hệ thống, nhật ký này sẽ bắt đầu, đọc các thông báo được tích lũy trong / dev / log, xử lý chúng và tự chặn đối với một thứ gì đó (hoặc dành thời gian được phân bổ cho nó) và quyền kiểm soát sẽ chuyển cho daemon tiếp theo. Đa nhiệm điển hình mà không cần thêm nạng.

Hơn nữa, nhờ sơ đồ này, hầu hết các daemon chỉ có thể được khởi động khi chúng thực sự cần thiết. Vì vậy, ví dụ, CUPS không cần phải được khởi động trong quá trình khởi tạo hệ điều hành, khi tải trên hệ thống đã cao. Hợp lý hơn là bắt đầu nó khi tài liệu đầu tiên được gửi đi để in. Systemd cho phép bạn thực hiện việc này bằng cách theo dõi hoạt động của socket và thực hiện một cách tiếp cận tương tự để gắn hệ thống tệp, chỉ gắn chúng vào điểm gắn khi bạn cố gắng truy cập tệp (daemon cũng có thể được khởi động khi một tệp thiết bị cụ thể xuất hiện trên hệ thống) .

Công bằng mà nói, điều đáng nói là một giải pháp khéo léo như vậy cho vấn đề phụ thuộc đã được phát minh và triển khai trong Mac OS X ngay từ những ngày đầu ra đời, nhưng vì lý do nào đó mà không ai chú ý đến nó trước tác giả của systemd.

Nhân tiện, bản thân systemd có một đặc điểm khác rõ ràng là duy nhất đối với Linux: nó có thể nhóm các quy trình bằng cách sử dụng các nhóm với các giới hạn thời gian chạy khác nhau trên toàn bộ nhóm (giới hạn tài nguyên, thư mục làm việc và gốc, umask, cài đặt sát thủ OOM, tham số đẹp, ưu tiên hoạt động I / O, mức độ ưu tiên sử dụng CPU và hơn thế nữa). Tức là, daemon giờ đây có thể được đặt trong môi trường ảo mà không cần sử dụng bất kỳ phần mềm bổ sung nào, chỉ đơn giản bằng cách ghi một vài dòng vào tệp cấu hình systemd.

Systemd đã có sẵn để tải xuống và có thể được đưa vào bản phát hành trong tương lai của Fedora như một hệ thống init thay thế. Hướng dẫn cài đặt cho các bản phân phối khác có thể được tìm thấy trên trang chính thức: freedesktop.org/wiki/Software/systemd.

Bạn có thể cài đặt Systemd trên Ubuntu bằng cách chạy các lệnh sau:

$ sudo add-apt-repository ppa: andrew-edmunds / ppa
$ sudo apt-get cập nhật
$ sudo apt-get install systemd

Tiếp theo, chỉnh sửa /boot/grub/grub.cfg, thêm dòng init = / sbin / systemd vào các tham số hạt nhân. Sau khi khởi động lại, bản phân phối sẽ hoạt động với hệ thống init mới, có thể được xác minh bằng lệnh:

$ sudo systemctl units-list

Các đối số trạng thái, bắt đầu, dừng và kích hoạt được sử dụng để kiểm tra trạng thái, bắt đầu, dừng và kích hoạt các dịch vụ.

Ulatencyd: phản hồi tức thì

Theo bạn, tham số quan trọng nhất của hệ điều hành máy tính để bàn là gì? GUI tốt? Số lượng ứng dụng có sẵn? Dễ sử dụng?

Vâng, tất cả những điều này đều quan trọng, nhưng ngày nay, khi ngay cả các hệ điều hành máy chủ cũng có thể dễ dàng được ban tặng những đặc tính này, các yếu tố hoàn toàn khác trở nên quyết định, trong đó quan trọng nhất là khả năng đáp ứng của hệ thống.

Một hệ điều hành máy tính để bàn tốt phải hy sinh mọi thứ vì lợi ích của khả năng phản hồi cao. Bất kể tốc độ hiển thị khi ghi tệp vào đĩa, bao nhiêu hiệu ứng màn hình mà nó mang lại cho người dùng, liệu nó có phản ứng chính xác với việc xóa ổ đĩa flash đột ngột hay không, tất cả những điều này sẽ không thành vấn đề nếu hệ điều hành khiến người dùng phải chờ đợi.

Đối với các nhà phát triển hệ điều hành, đây là sự thật phổ biến, vì vậy họ luôn tìm cách làm cho hệ điều hành của họ tương tác hơn. Đối với một số người, nó hoạt động tốt (xin chào BeOS), đối với những người khác, nó không hoạt động tốt (nơi không có MS), nhưng cũng có những người không thành công chút nào. Trong một thời gian dài, các nhà phát triển Linux hoàn toàn không quan tâm đến chủ đề về khả năng đáp ứng của Linux trên máy tính để bàn. Con Kolivas đã chỉ ra các vấn đề với họ nhiều lần, nói về sự ì ạch và chậm chạp của Linux, viết các bản vá, mã hóa các bộ lập lịch tác vụ mới vào ban đêm và tìm cách đưa chúng vào nhân. Tất cả đều vô ích, hết lần này đến lần khác các bản vá bị từ chối, và bản thân tác giả đã bị loại khỏi doanh nghiệp một cách thô bạo.

Tuy nhiên, theo thời gian, công lao của Kon Kolivas đã được đền đáp. Ingo Molnar đọc các nguồn của mình và viết bộ lập lịch CFS (Complete Fair Scheduler), và Linux ngay lập tức đưa nó vào kernel 2.6.23. Kể từ đó, mọi thứ đã được cải thiện rất nhiều trên máy tính để bàn, và Linux cũng trở nên nhanh hơn nhiều (mặc dù dù sao việc triển khai của Kohn vẫn tiếp tục cho thấy những kết quả ấn tượng hơn).

Cột mốc quan trọng thứ hai trên con đường đến với máy tính để bàn của Linux là việc đưa bản vá lỗi 200 trang nổi tiếng vào hạt nhân 2.6.38, cũng như sự xuất hiện của đối tác của nó trong ngôn ngữ bash. Vì vậy, Linux đã học cách tách các quy trình tương tác khỏi tất cả các daemon, máy chủ và các tập lệnh bash khác và đưa ra mức độ ưu tiên cao hơn cho chúng. Sự kiện này đã cải thiện thêm tình hình và làm cho nó gần như lý tưởng: giờ đây Linux không bị chậm lại ngay cả khi hạt nhân đang được xây dựng lại thành một số luồng trong nền.
Cuối cùng, bước quan trọng thứ ba đối với Linux dành cho máy tính để bàn (và đây là bước quan trọng nhất) là sự xuất hiện của daemon ulatencyd, có thể tự động điều chỉnh khả năng đáp ứng của hệ thống, điều chỉnh nó theo các hoàn cảnh thay đổi.

Giống như bản vá hạt nhân, ulatencyd sử dụng cơ chế cgroups để nhóm các quá trình tương tác và thay đổi mức độ ưu tiên của chúng, nhưng công việc của nó không kết thúc ở đó. Daemon sử dụng phương pháp heuristics để phát hiện các quy trình "tương tác nhất" cũng như các phần mềm phá hoại hệ thống rõ ràng như bom ngã ba và các chương trình bị rò rỉ bộ nhớ lớn. Đồng thời, cái trước thậm chí còn nhận được ưu tiên lớn hơn, trong khi cái sau bị hạn chế nghiêm trọng về khả năng của chúng (nhận mức ưu tiên thấp, hạn chế về bộ nhớ khả dụng), bị cô lập hoặc bị phá hủy. Nhưng quan trọng nhất, bất cứ lúc nào, daemon đều có thể được dạy các quy tắc lựa chọn quy trình mới, để giờ đây chúng ta có thể chỉ định mức độ ưu tiên cao nhất (thậm chí theo thời gian thực) cho các trò chơi, trình phát video và trình duyệt yêu thích của mình.

Daemon hỗ trợ các plugin, do đó, chức năng của nó có thể được mở rộng đến những khả năng tuyệt vời. Ví dụ: một trình cắm đã có sẵn (và theo tiêu chuẩn), trình cắm này giám sát công việc của người dùng trong X và chỉ định mức độ ưu tiên cao nhất cho các ứng dụng và quy trình mới mở có cửa sổ ở nền trước.

Để cài đặt ulatencyd, bạn cần tải xuống các nguồn của nó từ trang và xây dựng nó bằng cách sử dụng cmake chuẩn và thực hiện:

$ cmake
$ make
$ sudo thực hiện cài đặt

$ sudo / usr / local / sbin / ulatencyd -v 2

Và xem cách anh ấy nhóm các quy trình theo mức độ ưu tiên:

$ ps xaf -eo pid, session, args, cgroup

Không cần cài đặt. Theo mặc định, daemon ủng hộ các ứng dụng tương tác đa phương tiện và được sử dụng nhiều nhất, để các tác vụ nền chạy yên tĩnh mà không can thiệp vào hệ thống chính.

relayd: trên ba mặt trận

Mối quan hệ giữa giám sát máy chủ lưu trữ mạng, cân bằng tải và máy chủ proxy là gì? Đây có phải là tất cả các chức năng của một máy không? Vâng, nó hoàn toàn có thể. Nhưng điều gì sẽ xảy ra nếu tôi nói rằng cả ba chức năng này đều có liên quan chặt chẽ với nhau và nên được triển khai trong một ứng dụng phổ quát? Rave? Không có gì.

Lấy ví dụ, một chức năng máy chủ khá phổ biến trong các vòng tròn hẹp được gọi là "cân bằng tải giữa một số máy chủ DNS." Điều gì là cần thiết để giải quyết nó? Thứ nhất, khả năng chuyển hướng lưu lượng DNS đến một máy chủ khác (từ bộ cân bằng đến một trong các máy chủ DNS thực).

Điều này có thể được thực hiện thông qua tường lửa hoặc BIND được cấu hình đặc biệt (hơi nặng). Thứ hai, khả năng chọn ứng viên phù hợp nhất để xử lý yêu cầu từ danh sách các máy chủ DNS. Điều này đã phức tạp hơn, và ở đây bạn có thể cần một phần mềm chuyên dụng hoặc một lần nữa, một bức tường lửa (nhưng một bức tường lửa rất tốt). Thứ ba, khả năng kiểm tra các máy chủ DNS về tính khả dụng và loại bỏ những máy chủ đã bị loại khỏi danh sách. Bạn cần một tập lệnh ping lưu trữ và quản lý danh sách hoặc các khả năng tường lửa đặc biệt (có điều gì như vậy không?). Nói chung, việc xây dựng một chiếc xe đạp kéo dài tẻ nhạt hoặc mua một giải pháp chuyên biệt cho một nhiệm vụ cụ thể với mức giá phi thực tế. Nhưng điều gì sẽ xảy ra nếu ngày mai bạn đột nhiên cần làm điều gì đó tương tự cho SMTP?

Tất cả chỉnh sửa hoặc mở lại ví? Chẳng đáng là bao, tốt hơn hết nên để dành đồ trong ví, để lại chiếc nạng chở xe đạp cho các vận động viên. Trình nền relayd, được giới thiệu trong OpenBSD 4.3, cho phép bạn giải quyết vấn đề này và một số lượng lớn các tác vụ khác, tương tự nhưng không phải vậy, chỉ trong vài phút.

Nó bao gồm các khả năng của bộ cân bằng tải cho các giao thức lớp 3, 4 và 7, proxy lớp 7 (rơ le) và một dịch vụ để kiểm tra tính khả dụng của các nút mạng (từ đó nó phát triển).

Bạn có thể xây dựng nhiều loại cấu hình dựa trên relayd, từ máy chủ proxy đơn giản hoặc trình tăng tốc SSL đến các giải pháp phức tạp như proxy web trong suốt với tính năng lọc yêu cầu và cân bằng tải giữa một số máy chủ web. Và tất cả những điều này với sự trợ giúp của một tệp cấu hình đơn giản, độ dài của tệp này, ngay cả trong các cấu hình phức tạp nhất, hiếm khi vượt quá 50 dòng.

Vâng, tất nhiên, không có ví dụ, tất cả những điều này chỉ là lời nói. Vì vậy, đây là một cấu hình hoạt động đáp ứng đầy đủ các yêu cầu được đưa ra ở đầu phần:

#vi /etc/relayd.conf

Biến và Macro

Địa chỉ và cổng chuyển tiếp của chúng tôi

relayd_addr = "127.0.0.1"
relayd_port = "8053"

Địa chỉ của ba máy chủ DNS sẽ xử lý

yêu cầu

bàn { 192.168.1.1, 192.168.1.2, 192.168.1.3 }

Cài đặt chung

Khoảng thời gian giữa các lần kiểm tra tính khả dụng của máy chủ

(10 giây)

Hết thời gian chờ để kiểm tra tính khả dụng của các máy chủ sử dụng phương thức TCP

(nếu máy chủ không phản hồi trong hơn 200 mili giây - nó bị lỗi)

Chúng tôi chia máy chủ thành 5 quy trình để hiệu quả hơn

yêu cầu xử lý

Ghi lại kết quả của việc kiểm tra các máy chủ để biết tính khả dụng

Cài đặt giao thức DNS

Tùy chọn tối ưu hóa kết nối

giao thức dns "dnsfilter" (tcp (nút, bao tải, bộ đệm ổ cắm 1024, tồn đọng 1000))

Cài đặt chuyển tiếp

relay dnsproxy (

Địa chỉ nghe và cổng

nghe trên cổng $ relayd_addr $ relayd_port

Chúng tôi làm việc với giao thức được mô tả trước đó

giao thức "dnsfilter"

Chúng tôi gửi các gói DNS đến một trong những gói được liệt kê trong bảng

Máy chủ DNS, sau khi kiểm tra tính khả dụng

chuyển tiếp đến cổng 53
chế độ cân bằng tải kiểm tra tcp
}

Các phần quan trọng nhất của cấu hình này nằm trong phần thân của giao thức dns và các chỉ thị chuyển tiếp. Đầu tiên là một loại mẫu được sử dụng để tránh lặp lại cài đặt giao thức tương tự trong các phần khác của tệp cấu hình (relayd hỗ trợ ba giao thức: HTTP, DNS và TCP). Thứ hai là cài đặt chuyển tiếp, chỉ định cổng lắng nghe, giao thức được ủy quyền, cài đặt của nó và thông tin về cách thức và máy chủ lưu trữ các gói sẽ được chuyển hướng. Trong trường hợp của chúng tôi, proxy phải gửi một truy vấn DNS đến một trong ba máy chủ để kiểm tra trước khả năng truy cập (điều này sử dụng kiểu bắt tay TCP, nhưng relayd hỗ trợ nhiều phương pháp khác, từ ping đến cố gắng thiết lập kết nối SSL). Đồng thời, nếu một trong các máy chủ DNS gặp sự cố, relayd sẽ tự động loại nó khỏi danh sách cho đến khi kiểm tra tính khả dụng theo lịch trình (khoảng thời gian giữa các lần kiểm tra được chỉ định trong tùy chọn khoảng thời gian) cho thấy khả năng hoạt động của nó.

Bạn có thể sử dụng biểu mẫu khởi chạy relayd sau để kiểm tra cấu hình của mình:

# relayd -d -vv -f /etc/relayd.conf

Vì vậy, con quỷ sẽ không đi vào nền và sẽ giữ một danh sách chi tiết về tất cả các hành động của nó. Sau khi gỡ lỗi cấu hình, bạn có thể cấu hình daemon để bắt đầu vào thời gian khởi động hệ thống. Để thực hiện việc này, chỉ cần đặt dòng relayd_flags = "" trong tệp /etc/rc.conf.local.

FreeBSD fscd: vẻ đẹp của chủ nghĩa tối giản

Phần này lẽ ra không có trong bài báo. Daemon fscd là một công cụ đơn giản đến mức có vẻ thừa nếu viết riêng về nó. Mặt khác, không thể không viết về nó, bởi vì nó là một trong những ví dụ rõ ràng nhất về giải pháp chính xác của một bài toán theo kiểu UNIX. Và nhiệm vụ của các nhà phát triển FreeBSD là sau đây.
Nhiều hệ thống khác nhau và không phải daemon có thể bị sập theo thời gian (hoặc bắt đầu cư xử như những kẻ ngốc, điều này thậm chí còn tồi tệ hơn). Trên máy gia đình, điều này không đáng sợ; bạn có thể dùng tay khởi động lại máy bị rơi hoặc gửi máy tính khởi động lại. Nhưng phải làm gì trên một máy chủ hiếm quản trị viên?

Các dịch vụ phải được theo dõi và khởi động lại nếu cần. Làm thế nào để làm nó? Đương nhiên, để xây dựng chức năng này vào hệ thống khởi tạo (sau cùng, chính cô ấy là người khởi động các daemon). Và, ví dụ, Solaris đã làm điều đó, một cách ngông cuồng đến mức chính Linus Torvalds sẽ đánh gãy chân anh ấy trong khi anh ấy đang tìm cách cấu hình nó. Các nhà phát triển FreeBSD đã dễ dàng. Họ đã viết một daemon riêng biệt có thể chạy các tập lệnh init của FreeBSD trong khi vẫn là một hệ thống hoàn toàn độc lập. Vấn đề là fscd rất đơn giản nên bạn có thể sử dụng nó mà không cần đọc các trang nam hay lo lắng về việc nó bị treo. Hãy tự đánh giá, để tạo ra màn hình fscd, chẳng hạn như sshd, bạn chỉ cần nhập một lệnh:

# fscadm bật sshd /var/run/sshd.pid

Vậy là xong, fscd sẽ ghi nhớ sự lựa chọn này và tự động kích hoạt tính năng giám sát sau khi máy được khởi động lại. Điều kiện duy nhất là daemon được kiểm soát phải có tệp khởi tạo trong thư mục /etc/rc.d (hoặc /usr/local/etc/rc.d) và một mục nhập trong tệp /etc/rc.conf bao gồm nó. (điều này là hiển nhiên).

Daemon fscd sẽ chỉ có sẵn trong FreeBSD 9.0, nhưng hoàn toàn có thể tải xuống từ trang chính thức (people.freebsd.org/~trhodes/fsc) và xây dựng nó cho 8.0.

phát hiện

Mỗi ngày một cái gì đó mới xuất hiện trong thế giới của UNIX, nhưng rất hiếm khi cái mới này trở thành một cái gì đó đáng để chúng ta chú ý. Trong bài viết này, tôi đã nói về bốn thành phần hệ thống UNIX không chỉ đáng được quan tâm đặc biệt mà còn có giá trị sử dụng thực sự. Ai biết được, có thể trong tương lai chúng sẽ không thể thiếu với UNIX như lệnh grep hoặc daemon nhật ký hệ thống.

Liên kết

  • trang chủ của systemd dưới cánh: freedesktop.org/wiki/Software/systemd; freesktop.org
  • nguồn systemd: cgit.freedesktop.org/systemd;
  • mã ulatencyd: github.com/poelzi/ulatencyd;
  • nguồn fscd: people.freebsd.org/~trhodes/fsc.

thông tin

  • Về lâu dài, tác giả dự định biến systemd thành một trình quản lý phiên chính thức có thể thay thế gnomesession và kdeinit.
  • Trong số những thứ khác, systemd có các chức năng giám sát daemon, vì vậy các khả năng của fscd được tích hợp sẵn trong nó ngay từ khi mới sinh.
  • Không sử dụng tập lệnh là một cách để tăng tốc quá trình tải xuống. Nhiều tác vụ khởi tạo có thể được thực hiện bởi systemd thông qua việc gọi trực tiếp các lệnh cần thiết mà không cần sử dụng script.
  • Tên cũ của relayd - được lưu trữ (từ trạng thái máy chủ lưu trữ, "trạng thái máy chủ"), đã được thay đổi thành tên hiện tại liên quan đến việc mở rộng chức năng.

systemd là một trình nền khởi tạo hệ thống Linux mới, cuối cùng sẽ thay thế daemon initd SysV cổ điển. Các nhiệm vụ chính mà nó được thiết kế để giải quyết, thứ nhất là tăng tốc khởi động hệ thống bằng cách tối đa hóa số lượng dịch vụ chạy song song, thứ hai, cải thiện khả năng quản lý hệ thống thông qua việc sử dụng các tính năng cụ thể do nhân Linux cung cấp và thứ ba, thống nhất toàn hệ thống cài đặt và tổng quát hóa tối đa của mã để khởi chạy các dịch vụ khác nhau. Ít nhất thì đó là cảm giác của tôi sau khi đọc tài liệu.

Tôi muốn cảm ơn Sergey Ptashnik về bản dịch tuyệt vời của tài liệu systemd: systemd cho quản trị viên từ chính tác giả của hệ thống, Lennart Potering. Tôi cũng muốn nói lời cảm ơn vì rất nhiều ghi chú cho tài liệu, những tài liệu này luôn luôn đúng. Điều này và các ghi chú tiếp theo của tôi về cơ bản dựa trên tài liệu này, hay đúng hơn, trên phiên bản PDF của nó.

1. Cài đặt systemd

Cài đặt systemd khá dễ dàng. Hãy cài đặt gói trước:
# apt-get install systemd Và viết cách sử dụng systemd trong cài đặt nhân Linux. Để thực hiện việc này, hãy mở tệp với cài đặt bộ nạp khởi động GRUB 2:
# vi / etc / default / grub Và thêm một tùy chọn bổ sung init = / lib / systemd / systemd vào cài đặt GRUB_CMDLINE_LINUX_DEFAULT. Sau khi chỉnh sửa, tùy chọn này trông giống như sau:
GRUB_CMDLINE_LINUX = "video = VGA-1: 640x480 video = TV-1: 640x480 rootfstype = ext4 init = / lib / systemd / systemd" Bây giờ hãy áp dụng các thay đổi bằng cách tạo tệp cấu hình bộ nạp khởi động mới:
# update-grub Bây giờ bạn có thể khởi động lại hệ thống để bắt đầu sử dụng systemd:
# shutdown -r now 2. Giải quyết vấn đề

2.1. Bản địa hóa bảng điều khiển văn bản

Sự cố đầu tiên tôi gặp phải là lỗi khi chạy tập lệnh console-cyrillic. Tập lệnh này phải được chạy với bảng điều khiển văn bản đang hoạt động và systemd chạy tất cả các tập lệnh init một cách không đồng bộ, khiến tập lệnh này chạy khi máy chủ X đang chạy. Do đó, thay vì các chữ cái tiếng Nga, các hình vuông được hiển thị trong bảng điều khiển, bạn không thể chuyển đổi bố cục và chuyển về phiên đồ họa.

Console-cyrillic là một gói lỗi thời còn sót lại trên hệ thống của tôi từ khi tôi cài đặt nó (trong những ngày Etch). Gói này hiện diện trong các phiên bản Debian mới hơn và vẫn được hỗ trợ, nhưng các gói cấu hình bàn phím và thiết lập bảng điều khiển là những lựa chọn thay thế chung chung hơn. Bài viết Hiển thị tiếng Nga trong bảng điều khiển Ubuntu 11.04 Natty mô tả các bước cần thiết để thiết lập chúng.

Cài đặt các gói cần thiết:
# apt-get install console-setup keyboard-configuration Nếu vì lý do nào đó mà trình cấu hình gói không được khởi chạy khi cài đặt các gói, bạn có thể buộc cấu hình gói:
# dpkg-recfigure console-setup # dpkg-resfigure keyboard-configuration Nói chung, systemd cung cấp các tệp cấu hình mới để thiết lập bảng điều khiển văn bản, nhưng những cài đặt đó không hoạt động trên hệ thống của tôi.

2.2. Tiết kiệm thời gian hệ thống vào đồng hồ phần cứng BIOS

Khi thay đổi cài đặt thời gian, vì lý do nào đó, thời gian không được lưu trong đồng hồ BIOS. Bạn có thể lưu thời gian hệ thống hiện tại vào đồng hồ phần cứng bằng lệnh:
# hwclock -w Thời gian thực sẽ được lưu trong đồng hồ BIOS phụ thuộc vào dòng thứ ba của / etc / adjtime. Trong trường hợp là chuỗi UTC, Giờ chuẩn Greenwich sẽ được lưu, trong trường hợp là chuỗi LOCAL, thời gian của múi giờ hiện tại sẽ được lưu.

Cần lưu ý rằng kể từ Wheezy, cài đặt UTC đã bị xóa khỏi tệp / etc / default / rcS và cài đặt khỏi / etc / adjtime: release-Notes: utc / local timezone không còn trong / etc / default / rcS tệp được sử dụng thay thế.

Gốc của vấn đề nằm ở việc tôi sử dụng openntpd, không phải ntpd. Trong trường hợp ntpd đang chạy trong nhân hệ thống, tính năng lưu thời gian hệ thống hiện tại trong bộ hẹn giờ phần cứng 11 phút một lần. Các nhà phát triển của systemd cảm thấy rằng điều này là đủ. Nếu ntpd không được sử dụng, thì không thể xác định đồng hồ nào chính xác hơn - phần cứng hay hệ thống, vì vậy không có ích gì khi bạn thích đồng hồ này hơn đồng hồ khác. Nếu cần, người dùng phải cài đặt đồng hồ theo cách thủ công khi cần thiết.

Để giải quyết vấn đề này, tôi quyết định viết tệp dịch vụ của riêng mình cho daemon openntpd. Nội dung của tệp dịch vụ /etc/systemd/system/openntpd.service:
Description = openntpd After = network.target Type = simple ExecStart = / usr / sbin / ntpd -dsf /etc/openntpd/ntpd.conf ExecStartPost = / bin / chown ntpd /var/lib/openntpd/ntpd.drift ExecStop = / sbin / hwclock -w WantedBy = multi-user.target Bây giờ chúng ta cần dừng phiên bản openntpd đang chạy, nói với systemd rằng cấu hình của nó đã thay đổi:
# systemctl stop openntpd.service # systemctl daemon-reload Tự động tải lại tệp dịch vụ mới tạo và khởi động openntpd:
# systemctl enable openntpd.service # systemctl start openntpd.service 3. Quản lý dịch vụ

Systemd, không giống như inetd, có thể giám sát độc lập tất cả các quy trình do dịch vụ tạo ra. Đối với điều này, cái gọi là nhóm kiểm soát của quá trình - cgroups được sử dụng. Mỗi dịch vụ bắt đầu với ID nhóm riêng của nó. Tất cả các quy trình bổ sung được sinh ra trong dịch vụ cũng nhận được mã định danh này. Điều này giúp loại bỏ nhu cầu sử dụng tệp PID để quản lý dịch vụ. Ngoài ra, nhờ các nhóm, các quy trình được tạo ra bởi một dịch vụ không bao giờ bị mất. Ví dụ: quy trình CGI sẽ bị dừng cùng với máy chủ web, ngay cả khi máy chủ web không quan tâm đến việc dừng nó và đưa ID quy trình vào tệp PID. Các quy trình của người dùng cũng được đặt trong một nhóm điều khiển riêng biệt và được giám sát bởi hệ thống con logind, hệ thống thay thế ConsoleKit.

Tính năng quan trọng thứ hai của systemd là nó có hệ thống ghi nhật ký riêng gọi là journald. Hệ thống này tổng hợp thông tin từ các nguồn khác nhau và liên kết nó với các dịch vụ. Thu thập các thông điệp hạt nhân, xử lý các thông báo được gửi qua nhật ký hệ thống, các thông báo được gửi bằng API gốc của journald và các thông báo được gửi bởi một quy trình tới đầu ra tiêu chuẩn (STDOUT) và đến luồng tiêu chuẩn cho thông báo chẩn đoán (STDERR) ở một nơi, được liên kết với một dịch vụ. Systemd cũng theo dõi các mã thoát quy trình. Nhờ đó, tất cả các thông tin chẩn đoán của dịch vụ có thể được xem ở một nơi và thuận tiện cho việc chẩn đoán các vấn đề.

systemctl- xem các trạng thái dịch vụ. Nếu đầu ra của lệnh không được chuyển hướng đến một nơi nào đó, nhưng đến được bảng điều khiển, thì một chương trình máy nhắn tin sẽ tự động được khởi chạy để xem trạng thái của các dịch vụ, thường thì nó sẽ ít hơn,
trạng thái systemctl openntpd.service - chế độ xem chi tiết về trạng thái của dịch vụ được chỉ định (openntpd),
trạng thái systemctl --follow openntpd.service - xem trạng thái của dịch vụ được chỉ định (openntpd) với việc hiển thị các thông báo từ dịch vụ trong quá trình nhận. Tùy chọn này có một đối ngắn hơn - -f, vì một số lý do không hoạt động trên hệ thống của tôi. Có lẽ thực tế là tùy chọn -f cũng có nghĩa thứ hai - --force và systemctl không thể xác định tùy chọn nào có nghĩa là,
trạng thái systemctl -n10 openntpd.service - xem trạng thái của dịch vụ được chỉ định (openntpd) với đầu ra của 10 thông báo cuối cùng của dịch vụ,
systemctl reset-fail- đặt lại tất cả các trạng thái kết thúc được hiển thị bằng lệnh trạng thái dịch vụ xem,
systemd-cgls- xem thứ bậc của các nhóm kiểm soát quá trình (có thể lấy một thứ tương tự bằng cách sử dụng lệnh ps xawf -eo pid, user, cgroups, args),
systemctl daemon-tải lại- tải lại cấu hình systemd,
bắt đầu systemctl openntpd.service - khởi động dịch vụ được chỉ định (openntpd), tương tự như update-rc.d openntpd bắt đầu cho SysV initd,
systemctl dừng openntpd.service - dừng dịch vụ được chỉ định (openntpd), tương tự như update-rc.d openntpd dừng cho SysV initd,
khởi động lại systemctl openntpd.service - khởi động lại dịch vụ được chỉ định (openntpd),
bật systemctl openntpd.service - cho phép khởi động dịch vụ được chỉ định (openntpd) khi khởi động hệ thống, tương tự như update-rc.d openntpd cho phép SysV initd,
vô hiệu hóa systemctl openntpd.service - vô hiệu hóa việc khởi động dịch vụ được chỉ định (openntpd) khi khởi động hệ thống, tương tự như update-rc.d openntpd vô hiệu hóa cho SysV initd,
mặt nạ systemctl openntpd.service - cấm khởi động dịch vụ được chỉ định (openntpd), thậm chí sẽ không thể khởi động nó theo cách thủ công,
systemctl bật mí openntpd.service - quyền để bắt đầu dịch vụ được chỉ định (openntpd), nó có thể được khởi động theo cách thủ công, nó cũng sẽ được phép bắt đầu khi khởi động hệ thống, nếu nó đã được định cấu hình,
diệt systemctl openntpd.service - gửi tín hiệu (theo mặc định là tín hiệu SIGTERM được gửi) đến tất cả các quá trình trong nhóm điều khiển của dịch vụ (openntpd),
systemctl kill -s SIGKILL openntpd.service - gửi một tín hiệu SIGKILL đến tất cả các quá trình trong nhóm điều khiển của dịch vụ (openntpd). Bạn cũng có thể sử dụng tên viết tắt của tín hiệu - KILL,
systemctl kill -s HUP --kill-who = main dịch vụ crond - Gửi tín hiệu SIGHUP tới tiến trình chính của nhóm điều khiển dịch vụ (crond). Ví dụ này sẽ buộc crond phải đọc lại tệp cấu hình, trong khi các công việc do crond bắt đầu sẽ không nhận được tín hiệu này và sẽ tiếp tục hoạt động bình thường,
systemctl trợ giúp openntpd.service - xem tài liệu dịch vụ (không hoạt động trong Debian Wheezy),
systemd-phân tích đổ lỗi- hiển thị danh sách các dịch vụ, được sắp xếp theo thứ tự giảm dần của thời gian dành cho việc bắt đầu của chúng. Lệnh có thể hữu ích để tìm các nút cổ chai trong quá trình khởi tạo hệ thống,
systemd-analysis plot> plot.svg- đầu ra của biểu đồ thời gian ở định dạng SVG, minh họa trình tự (và tính song song) của các dịch vụ bắt đầu.

4. Các tệp cấu hình hệ thống mới

Systemd giới thiệu một số tệp cấu hình mới cho cài đặt toàn hệ thống. Dự kiến ​​rằng các tệp này cuối cùng sẽ trở thành tiêu chuẩn và thay thế các tệp cấu hình hệ thống dành riêng cho các bản phân phối khác nhau. Cho đến khi điều đó xảy ra, systemd sẽ sử dụng tệp cấu hình của bản phân phối nếu không có tệp mới.

Ngoài ra, vì tất cả các dịch vụ bây giờ sẽ được bắt đầu bằng cách sử dụng tệp dịch vụ, nên không cần sử dụng tệp có trong tập lệnh shell. Đây là các tệp nằm trong / etc / default (họ Debian) và / etc / sysconfig (họ RedHat). Vì việc điều hướng trong các tệp dịch vụ dễ dàng hơn nhiều so với trong các tập lệnh shell, nên không cần phải di chuyển cài đặt dịch vụ thành các tệp riêng biệt - tất cả các cài đặt cần thiết có thể được nhập trực tiếp vào tệp dịch vụ.

Dưới đây là các tệp cấu hình mới được giới thiệu bởi systemd:

/ etc / hostname- tên mạng của hệ thống,
/etc/vconsole.conf- phông chữ bảng điều khiển hệ thống và cài đặt bố cục bàn phím,
/etc/locale.conf- cài đặt ngôn ngữ hệ thống,
/etc/modules-load.d/*.conf- một thư mục để liệt kê các mô-đun hạt nhân buộc phải tải khi khởi động hệ thống,
/etc/sysctl.d/*.conf- thư mục cho cài đặt tham số hạt nhân, bổ sung cho tệp /etc/sysctl.conf cổ điển,
/etc/tmpfiles.d/*.conf- thư mục để quản lý cài đặt tệp tạm thời,
/etc/binfmt.d/*.conf- thư mục để đăng ký các định dạng tệp thực thi, chẳng hạn như các định dạng Java, Mono, WINE,
/ etc / os-release- một tệp có định danh của bản phân phối và phiên bản của nó,
/ etc / machie-id- một tệp có định danh hệ thống duy nhất vĩnh viễn,
/ etc / machie-info- một tệp có tên mạng mô tả cho hệ thống. Biểu tượng hệ thống sẽ được hiển thị trong các shell đồ họa cũng được định cấu hình ở đây. Tệp được phục vụ bởi daemon có tên máy chủ systemd.

5. Hệ thống con ghi nhật ký của Japan

Như đã đề cập, systemd giới thiệu một hệ thống ghi nhật ký mới thu thập thông tin từ nhiều nguồn khác nhau (thông điệp hạt nhân, thông báo được gửi đến nhật ký hệ thống, STDOUT và STDERR) ở một nơi. Hệ thống này không buộc bạn phải từ bỏ daemon ghi nhật ký hệ thống tiêu chuẩn - bạn có thể sử dụng song song cả hai hệ thống ghi nhật ký.

Journald sử dụng hai thư mục để lưu trữ thông tin tạp chí:
/ run / log / journal- thư mục có bộ đệm đổ chuông các tin nhắn gần đây,
/ var / log / journal- thư mục với lưu trữ vĩnh viễn của tất cả các tin nhắn.

Theo mặc định, chỉ thư mục đầu tiên được sử dụng và để cho phép lưu trữ liên tục tất cả thư, thư mục thứ hai phải được tạo theo cách thủ công (trong Debian Wheezy, thư mục này được tạo tự động khi cài đặt systemd và thư mục đầu tiên không được sử dụng):
# mkdir -p / var / log / journald Sau đó, bạn có thể, nhưng không cần phải xóa daemon nhật ký rsyslog hoặc ng-syslog mặc định.

Cài đặt daemon launcher của Debian Wheezy được lưu trữ trong một tệp /etc/systemd/systemd-journald.conf. Đặc biệt, ở đó bạn có thể đặt cài đặt nén cho tệp nhật ký, đặt giới hạn về kích thước tệp nhật ký, định cấu hình sao chép thông báo vào bảng điều khiển hệ thống hoặc daemon nhật ký hệ thống.

Người dùng root và người dùng trong nhóm adm có quyền truy cập vào tất cả các thông báo trong nhật ký, trong khi người dùng bình thường chỉ có quyền truy cập vào các thông báo được tạo bởi các quy trình của họ.

Để xem thông báo tạp chí trong Debian Wheezy, bạn có thể sử dụng lệnh systemd-journalctl (sổ tay chỉ định lệnh journalctl):
systemd-journalctl- xem tất cả các tin nhắn. Như trong trường hợp của systemctl, nếu đầu ra của lệnh không được chuyển hướng đến bất kỳ đâu, nhưng đến được bảng điều khiển, một chương trình máy nhắn tin sẽ tự động được khởi chạy để xem thư thuận tiện hơn, thường là ít hơn,
systemd-journalctl -f- xem tin nhắn trong quá trình nhận,
systemd-journalctl -n10- xem 10 tin nhắn gần đây nhất,
systemd-journalctl -b- xem các thông báo được tạo từ khi khởi động hệ thống (không hoạt động trên Debian Wheezy),
systemd-journalctl -b -p err- xem các thông báo được tạo từ khi khởi động hệ thống và có lỗi ưu tiên trở lên (không hoạt động trong Debian Wheezy),
systemd-journalctl --since = hôm qua- xem tất cả các thư được tạo từ hôm qua (không hoạt động trong Debian Wheezy),
systemd-journalctl --since = 2012-10-15 --until = "2012-10-16 23:59:59"- xem tất cả các thư được tạo vào ngày 15 và 16 tháng 10 năm 2012 (không hoạt động trên Debian Wheezy),
systemd-journalctl -u httpd --since = 00: 00 --until = 09: 30- xem tất cả các thư do người dùng httpd tạo hôm nay từ nửa đêm đến chín giờ rưỡi (không hoạt động trên Debian Wheezy),
systemd-journalctl / dev / sdc- xem tất cả các thông báo đề cập đến ổ sdc (không hoạt động trên Debian Wheezy),
systemd-journalctl / usr / sbin / vpnc- xem tất cả thư từ các tiến trình / usr / sbin / vpnc (không hoạt động trong Debian Wheezy),
systemd-journalctl / usr / sbin / vpnc / usr / sbin / dhclient- xem tất cả thư từ các tiến trình / usr / sbin / vpnc và / usr / sbin / dhclient, được kết hợp và sắp xếp theo thời gian (không hoạt động trong Debian Wheezy),

Ngoài việc chỉ xem tin nhắn văn bản, bạn có thể xem siêu dữ liệu mà chính tạp chí này đã thêm vào mỗi mục nhật ký. Để xem các trường này, chỉ cần sử dụng tùy chọn sau, tùy chọn này sẽ chuyển đổi định dạng đầu ra dữ liệu:
systemd-journalctl -o verbose- Hiển thị tất cả siêu dữ liệu đi kèm với thông báo ở dạng con người có thể đọc được cùng với thông báo từ nhật ký. Các định dạng khả dụng khác: export - định dạng dài dòng giống nhau, nhưng không có thụt lề, json - output ở định dạng JSON, cat - chỉ xuất văn bản tin nhắn mà không có thêm dữ liệu nào.

Tên trường bắt đầu bằng dấu gạch dưới có thể được sử dụng để lọc thư. Tạp chí được lập chỉ mục trên tất cả các lĩnh vực, vì vậy việc tìm kiếm diễn ra nhanh chóng. Ví dụ về lọc thư theo siêu dữ liệu:
systemd-journalctl _UID = 70- hiển thị tất cả các thông báo từ các quy trình của người dùng với ID 70,
systemd-journalctl _UID = 70 _UID = 71- đầu ra của tất cả các thông báo từ các quy trình của người dùng với số nhận dạng 70 và 71. Việc chỉ định các trường cùng tên sẽ tự động ngụ ý một phép toán HOẶC logic,
systemd-journalctl _HOSTNAME = epsilon _COMM = avahi-daemon- xuất tất cả các thông báo từ các tiến trình có tên là avahi-daemon chạy trên máy tính có tên là epsilon. Trong trường hợp này, các trường khác nhau được chỉ định, vì vậy phép toán AND logic được ngụ ý,
systemd-journalctl _HOSTNAME = theta _UID = 70 + _HOSTNAME = epsilon _COMM = avahi-daemon- hiển thị các tin nhắn phù hợp với bất kỳ bộ lọc nào trong hai bộ lọc kết hợp với dấu +. Dấu + cho biết một phép toán OR logic rõ ràng, có mức độ ưu tiên thấp hơn AND,
systemd-journalctl -F _SYSTEMD_UNIT- đầu ra của tất cả các giá trị của trường _SYSTEMD_UNIT có sẵn trong nhật ký. Các giá trị kết quả có thể được sử dụng để lọc các bản ghi quan tâm (không hoạt động trên Debian Wheezy).

Tôi đã mất một ngày để viết một tập lệnh bash đơn giản để liên tục theo dõi thư mục về sự hiện diện của các tệp * .pdf trong đó, với việc chuyển đổi sau đó sang định dạng txt. Tập lệnh được cho là chạy ở chế độ nền và chạy tự động khi khởi động lại.

Để triển khai công việc ở chế độ nền, đầu tiên tôi viết Linux - một con quỷ trong C, nhưng sau đó tôi quyết định rằng điều này là quá sức với nhiệm vụ của tôi và tôi đã triển khai nó bằng Systemd.

Trước tiên, bạn cần đảm bảo rằng bản phân phối của bạn hoạt động với Systemd, bằng lệnh:

readlink / proc / 1 / exe
nếu đầu ra là / sbin / init- khi đó bạn đang sử dụng SysV và bạn cần phải nâng cấp bản phân phối, như trong trường hợp của tôi, tôi đã nâng cấp Debian 7 Wheezy lên Debian 8 Jessie hoặc triển khai công việc nền theo cách khác.

Nếu đầu ra là:
/ lib / systemd / systemd- sau đó mọi thứ đều theo thứ tự, bạn có Systemd.

Systemd thực hiện công việc của nó với những gì được gọi là đơn vị systemd.
Đơn vị là một tệp cấu hình nằm trong một trong các thư mục:

/ run / systemd / system /- Các đơn vị được tạo trong thời gian chạy. Thư mục này có quyền ưu tiên hơn thư mục có các đơn vị được cài đặt từ các gói.
/ etc / systemd / system /- các đơn vị do người quản trị hệ thống tạo và quản lý. Thư mục này được ưu tiên hơn thư mục của các đơn vị được tạo trong thời gian chạy. Trong thư mục này, chúng tôi sẽ tạo đơn vị của chúng tôi.

Chúng tôi đi đến thư mục / etc / systemd / system / và tạo nó hoặc sao chép một số tệp hiện có, ví dụ sshd.service và viết vào đó:

    [Đơn vị]

    Mô tả = MyBashScript

    After = syslog.target

  1. [Dịch vụ]

  2. ExecStart = / bin / bash "/home/user/scripts/script.sh"

    Type = forking

  3. [Cài đặt]

    WantedBy = multi-user.target

    Bí danh = bash.service

Thông tin thêm về từng phần:
Tiết diện :
Chứa thông tin chung về dịch vụ, mô tả của nó và nó sẽ bắt đầu sau khi daemon Syslog đang chạy.

Tiết diện
Thông tin trực tiếp về dịch vụ của chúng tôi.
Tham số ExecStart trỏ đến tệp thực thi của dịch vụ của chúng tôi. Bạn cần chỉ định các đường dẫn tuyệt đối, trong trường hợp là tập lệnh bash, chúng tôi đưa đường dẫn đến tập lệnh trong dấu ngoặc kép.
Type = forking có nghĩa là tập lệnh đang được chạy sẽ chạy ở chế độ daemon. Nếu chúng ta muốn script được thực thi một lần, thì chúng ta chỉ định Type = simple.

Tiết diện
Phần cuối cùng chứa thông tin về mục tiêu mà dịch vụ sẽ bắt đầu. Trong trường hợp này, chúng tôi muốn dịch vụ được khởi động khi multi-user.target được kích hoạt (điều này tương đương với init 3 trong SysV).
Alias ​​= bash.service - để thuận tiện, hãy tạo một bí danh để quản lý dịch vụ của chúng tôi dễ dàng hơn thông qua systemctl.

Đây là một tệp dịch vụ Systemd đang hoạt động, có ít chức năng. Lưu tệp và chạy lệnh systemctl daemon-tải lạiđể Systemd biết về dịch vụ của chúng tôi và bạn có thể bắt đầu bằng lệnh systemctl start bash.service.
Lần đầu tiên nó không hoạt động với tôi, vì lúc đầu tôi đã chỉ định một đường dẫn không tuyệt đối trong tham số ExecStart của phần này. Sau khi khắc phục, Systemd vẫn phàn nàn về lỗi tương tự, khởi động lại đã giúp.

Để xem trạng thái, bắt đầu, dừng, khởi động lại, bật hoặc tắt các dịch vụ hệ thống, hãy sử dụng lệnh systemctl. Các phiên bản trước của Systemd đã sử dụng dịch vụ và lệnh chkconfig và chúng vẫn được đưa vào hệ thống, chủ yếu là để tương thích ngược.

Dưới đây là các lệnh systemctl chính:

tên bắt đầu systemctl.service- dịch vụ bắt đầu.
systemctl stop name.service- dừng dịch vụ
systemctl khởi động lại tên.service- khởi động lại dịch vụ
systemctl try-restart name.service- khởi động lại dịch vụ chỉ khi nó đang chạy
systemctl tải lại tên.service- tải lại cấu hình dịch vụ
tên trạng thái systemctl.service- kiểm tra xem dịch vụ có đang chạy hay không với đầu ra trạng thái dịch vụ chi tiết
systemctl is-active name.service- kiểm tra xem dịch vụ đang chạy với phản hồi đơn giản: hoạt động hay không hoạt động
systemctl list-units --type service --all- hiển thị trạng thái của tất cả các dịch vụ
systemctl cho phép name.service- kích hoạt dịch vụ (cho phép nó khởi động trong quá trình khởi động hệ thống)
systemctl vô hiệu hóa name.service- hủy kích hoạt dịch vụ
systemctl reenable name.service- hủy kích hoạt dịch vụ và ngay lập tức kích hoạt nó
systemctl được kích hoạt tên.service- kiểm tra xem dịch vụ đã được kích hoạt chưa
systemctl list-unit-files --type service- hiển thị tất cả các dịch vụ và kiểm tra xem những dịch vụ nào đã được kích hoạt
systemctl mask name.service- thay thế tệp dịch vụ bằng một liên kết tượng trưng đến / dev / null, làm cho đơn vị không thể truy cập được vào systemd
systemctl bật mí tên.service- trả về một tệp dịch vụ, làm cho đơn vị có sẵn cho systemd

Systemd là một hệ thống init và trình quản lý hệ thống đang trở thành tiêu chuẩn mới cho các máy Linux. Cuộc tranh luận về hiệu suất của systemd so với các hệ thống init SysV truyền thống vẫn đang diễn ra, tuy nhiên, hầu hết các bản phân phối đều có kế hoạch triển khai hệ thống này và nhiều bản đã làm như vậy.

Tìm hiểu và làm việc với các công cụ và daemon của systemd sẽ giúp bạn đánh giá tốt hơn sức mạnh, tính linh hoạt và các tính năng khác của hệ thống hoặc ít nhất là giải quyết những rắc rối nhỏ nhất.

Hướng dẫn này sẽ dạy bạn cách làm việc với lệnh systemctl, công cụ quản lý chính của hệ thống systemd init. Bạn sẽ học cách quản lý dịch vụ, kiểm tra trạng thái và làm việc với các tệp cấu hình.

Quản lý dịch vụ

Mục đích chính của hệ thống init là khởi tạo các thành phần sẽ được khởi động sau khi nhân Linux được tải (theo truyền thống được gọi là các thành phần "tùy chỉnh"). Hệ thống init cũng được sử dụng để quản lý các dịch vụ máy chủ và daemon. Với ý nghĩ đó, chúng ta hãy bắt đầu phần giới thiệu về systemd với các thao tác quản lý dịch vụ đơn giản.

Trong systemd, mục tiêu của hầu hết các hành động là các đơn vị, là các tài nguyên mà systemd có thể quản lý. Các đơn vị được phân loại theo loại tài nguyên mà chúng đại diện. Các đơn vị được định nghĩa trong cái gọi là tệp đơn vị. Loại của mỗi đơn vị có thể được xác định bằng hậu tố ở cuối tệp.

Các tệp đơn vị có hậu tố .service dành cho các tác vụ quản lý dịch vụ. Tuy nhiên, trong hầu hết các trường hợp, hậu tố .service có thể bị bỏ qua, vì systemd đủ thông minh để tìm ra những việc cần làm khi sử dụng các lệnh điều khiển dịch vụ mà không có hậu tố này.

Bắt đầu và dừng dịch vụ

Để bắt đầu một dịch vụ systemd, hãy sử dụng lệnh start. Nếu bạn không ở trong phiên root, bạn cần sử dụng sudo vì lệnh này sẽ ảnh hưởng đến trạng thái của hệ điều hành:

sudo systemctl start application.service

Như đã đề cập trước đó, systemd biết tìm kiếm các tệp * .service cho các lệnh quản lý dịch vụ, vì vậy lệnh này có thể được nhập như sau:

sudo systemctl bắt đầu ứng dụng

Định dạng trên có thể được sử dụng trong công việc hàng ngày, nhưng trong hướng dẫn sử dụng để rõ ràng hơn, chúng tôi sẽ sử dụng hậu tố .service.

Để dừng dịch vụ, chỉ cần nhập lệnh dừng:

sudo systemctl dừng application.service

Khởi động lại và khởi động lại

Để khởi động lại dịch vụ, hãy sử dụng khởi động lại:

sudo systemctl khởi động lại application.service

Nếu ứng dụng được chỉ định có thể tải lại các tệp cấu hình của nó (mà không cần khởi động lại), thì có thể sử dụng tải lại:

sudo systemctl tải lại application.service

Nếu bạn không biết liệu một dịch vụ có thể tải lại các tệp của nó hay không, hãy sử dụng lệnh tải lại hoặc khởi động lại. Nó sẽ khởi động lại dịch vụ và nếu không được, nó sẽ khởi động lại.

sudo systemctl reload-or-restart application.service

Bật và tắt dịch vụ

Các lệnh trên là bắt buộc khi làm việc với dịch vụ trong phiên hiện tại. Để thêm một dịch vụ vào tự động tải hệ thống, bạn cần bật dịch vụ đó.

Có một lệnh kích hoạt cho việc này:

sudo systemctl kích hoạt application.service

Thao tác này sẽ tạo một liên kết tượng trưng đến bản sao của tệp dịch vụ (thường là trong / lib / systemd / system hoặc / etc / systemd / system) tại điểm trên đĩa nơi systemd tìm kiếm các tệp để tự khởi động (thường là / etc / systemd / system /some_target.target.want, hãy tìm hiểu thêm về điều này ở phần sau của hướng dẫn).

Để xóa dịch vụ khỏi khởi động, bạn cần nhập:

sudo systemctl vô hiệu ứng dụng.service

Hãy nhớ rằng việc bật một dịch vụ sẽ không khởi động dịch vụ đó trong phiên hiện tại. Nếu bạn muốn khởi động dịch vụ và đưa nó vào khởi động, bạn cần chạy lệnh khởi động và kích hoạt.

Kiểm tra trạng thái của dịch vụ

Để kiểm tra trạng thái của một dịch vụ, hãy nhập:

systemctl status application.service

Lệnh này sẽ xuất trạng thái của dịch vụ, phân cấp nhóm và một vài dòng đầu tiên của nhật ký.

Ví dụ: khi kiểm tra trạng thái của máy chủ Nginx, bạn có thể thấy đầu ra như sau:

nginx.service - Máy chủ web hiệu suất cao và máy chủ proxy ngược
Đã tải: đã tải (/usr/lib/systemd/system/nginx.service; đã bật; cài đặt trước của nhà cung cấp: đã vô hiệu hóa)
Hoạt động: hoạt động (đang chạy) kể từ Thứ Ba 2015-01-27 19:41:23 EST; 22 giờ trước
PID chính: 495 (nginx)
CGroup: /system.slice/nginx.service
├─495 nginx: master process / usr / bin / nginx -g pid /run/nginx.pid; error_log stderr;
└─496 nginx: quy trình công nhân
27 Jan 19:41:23 desktop systemd: Khởi động một máy chủ web hiệu suất cao và một máy chủ proxy ngược ...
27 tháng 1 19:41:23 hệ thống máy tính để bàn: Đã khởi động Một máy chủ web hiệu suất cao và một máy chủ proxy ngược.

Điều này cung cấp một cái nhìn tổng quan về trạng thái hiện tại của ứng dụng, thông báo cho bạn về bất kỳ vấn đề nào và bất kỳ hành động nào có thể được yêu cầu trong tương lai.

Ngoài ra còn có các phương pháp để kiểm tra các trạng thái cụ thể. Ví dụ: để kiểm tra xem một đơn vị nhất định có đang hoạt động (đang chạy) hay không, bạn có thể sử dụng lệnh đang hoạt động:

systemctl is-active application.service

Thao tác này sẽ hiển thị trạng thái hiện tại của thiết bị, thường là hoạt động hoặc không hoạt động. Mã thoát sẽ là "0" nếu đơn vị đang hoạt động, điều này giúp đơn giản hóa quá trình phân tích.

Để tìm hiểu xem một đơn vị đã được bật hay chưa, bạn có thể sử dụng lệnh được bật:

systemctl được kích hoạt application.service

Lệnh này sẽ báo nếu dịch vụ được bật và trả mã thoát về "0" hoặc "1" tùy thuộc vào kết quả.

Lệnh thứ ba cho phép bạn xác định xem thiết bị có ở trạng thái không. Điều này cho thấy rằng đã xảy ra sự cố khi khởi động thiết bị được đề cập:

systemctl bị lỗi application.service

Lệnh sẽ hoạt động trở lại nếu thiết bị hoạt động bình thường và không thành công nếu xảy ra lỗi. Nếu thiết bị bị dừng cố ý, lệnh có thể trả về không xác định hoặc không hoạt động. Mã thoát "0" có nghĩa là lỗi đã xảy ra, trong khi "1" cho biết bất kỳ trạng thái nào khác.

Tổng quan về tình trạng hệ thống

Trước đây chúng ta đã đề cập đến các lệnh cần thiết để điều khiển các dịch vụ riêng lẻ, nhưng chúng không hữu ích lắm để kiểm tra trạng thái hiện tại của hệ thống. Có một số lệnh systemctl cung cấp thông tin này.

Xem danh sách các đơn vị hiện tại

Để yêu cầu danh sách các đơn vị systemd hiện tại, hãy sử dụng lệnh list-units:

đơn vị danh sách systemctl

Lệnh này sẽ liệt kê tất cả các đơn vị hiện đang tồn tại trên hệ thống systemd. Kết quả sẽ giống như sau:

ĐƠN VỊ TẢI TRỌNG SUB MÔ TẢ CHỦ ĐỘNG
atd.service đã tải hoạt động chạy daemon ATD
avahi-daemon.service đã tải hoạt động đang chạy Avahi mDNS / DNS-SD Stack
dbus.service đã tải đang hoạt động Xe buýt thông báo hệ thống D-Bus
dcron.service đã tải đang hoạt động Bộ lập lịch lệnh định kỳ
dkms.service đã tải Hệ thống mô-đun hạt nhân động đang hoạt động đã thoát
[email được bảo vệ]đã tải hoạt động chạy Getty trên tty1
. . .

Đầu ra có các cột sau:

  • UNIT là tên của đơn vị systemd.
  • LOAD Cho biết cấu hình của thiết bị đã được systemd xử lý hay chưa. Cấu hình của các đơn vị đã tải được lưu trữ trong bộ nhớ.
  • ACTIVE - trạng thái tóm tắt của đơn vị. Điều này thường cho phép bạn nhanh chóng xác định xem thiết bị hiện tại đã khởi động thành công hay chưa.
  • SUB: Trạng thái cấp phụ cung cấp thông tin chi tiết về thiết bị. Điều này thường phụ thuộc vào loại thiết bị, trạng thái và phương pháp thực tế mà thiết bị đang chạy.
  • MÔ TẢ - mô tả ngắn gọn về các chức năng của đơn vị.

Vì lệnh list-units chỉ hiển thị các đơn vị đang hoạt động theo mặc định, tất cả các mục ở trên sẽ hiển thị được tải trong cột LOAD và hiện hoạt trong cột ACTIVE. Định dạng này là hành vi mặc định của systemctl khi được gọi mà không có lệnh bổ sung, vì vậy bạn sẽ thấy điều tương tự nếu bạn gọi systemctl mà không có đối số:

Với systemctl, bạn có thể truy vấn nhiều thông tin khác nhau bằng cách thêm cờ. Ví dụ: để xem tất cả các đơn vị mà systemd đã tải (hoặc cố tải), cho dù chúng hiện đang hoạt động hay không, bạn có thể sử dụng cờ -all:

systemctl list-units - tất cả

Lệnh này sẽ báo cáo các đơn vị mà systemd đã tải hoặc cố gắng tải, bất kể trạng thái hiện tại của chúng. Sau khi khởi động, một số đơn vị trở nên không hoạt động và các đơn vị mà systemd cố gắng tải không được tìm thấy trên đĩa.

Bạn có thể sử dụng các cờ khác để lọc kết quả. Ví dụ, cờ --state = có thể được sử dụng để chỉ định các trạng thái LOAD, ACTIVE hoặc SUB. Cờ --all phải được để lại để hệ thống hiển thị các đơn vị không hoạt động:

systemctl list-units --all --state = inactive

Một bộ lọc phổ biến khác là --type =. Nó cho phép bạn lọc các đơn vị theo loại. Ví dụ: để chỉ yêu cầu các đơn vị đang hoạt động, bạn có thể nhập:

systemctl list-units --type = service

Danh sách các tệp đơn vị

Lệnh list-units chỉ liệt kê các đơn vị mà systemd đã cố gắng xử lý và tải vào bộ nhớ. Vì systemd chỉ đọc một cách chọn lọc những tệp đơn vị mà nó cho là nó cần, nên danh sách sẽ không bao gồm tất cả các tệp đơn vị có sẵn. Để liệt kê tất cả các tệp đơn vị có sẵn (bao gồm cả những tệp mà systemd không cố tải), hãy sử dụng lệnh list-unit-files.

systemctl list-unit-files

Đơn vị là đại diện của tài nguyên mà systemd biết về. Bởi vì systemd không nhất thiết phải đọc tất cả các định nghĩa đơn vị, nó chỉ trình bày thông tin về bản thân các tệp. Kết quả bao gồm hai cột: UNIT FILE và STATE.

ĐƠN VỊ FILE STATE
proc-sys-fs-binfmt_misc.automount static
dev-bigpages.mount static
dev-mqueue.mount static
proc-fs-nfsd.mount static
proc-sys-fs-binfmt_misc.mount static
sys-fs-fuse-results.mount static
sys-kernel-config.mount static
sys-kernel-debug.mount static
tmp.mount tĩnh
var-lib-nfs-rpc_pipefs.mount static
org.cups.cupsd.path đã được bật
. . .

Thông thường, cột STATE chứa các giá trị được bật, tắt, tĩnh hoặc bị che. Trong ngữ cảnh này, tĩnh có nghĩa là không có phần cài đặt trong tệp đơn vị, được sử dụng để kích hoạt đơn vị. Do đó, các đơn vị này không thể được kích hoạt. Điều này thường có nghĩa là đơn vị thực hiện một hành động một lần hoặc chỉ được sử dụng như một phần phụ thuộc của một đơn vị khác và không nên được bắt đầu bởi chính nó.

Quản lý đơn vị

Bây giờ bạn biết cách làm việc với các dịch vụ và hiển thị thông tin về các đơn vị và tệp đơn vị mà systemd biết. Bạn có thể biết thêm thông tin cụ thể về các đơn vị bằng cách sử dụng một số lệnh bổ sung.

Hiển thị tệp đơn vị

Để hiển thị tệp đơn vị mà systemd đã tải, bạn có thể sử dụng lệnh cat (được thêm trong phiên bản systemd 209). Ví dụ, để xem tệp đơn vị daemon lập lịch biểu atd, bạn có thể nhập:

systemctl mèo atd.service
Mô tả = ATD daemon
Type = forking
ExecStart = / usr / bin / atd
WantedBy = multi-user.target

Trên màn hình, bạn sẽ thấy một tệp đơn vị được biết đến với quy trình systemd hiện đang chạy. Điều này có thể quan trọng nếu bạn đã thay đổi các tệp đơn vị của mình gần đây hoặc nếu bạn đang ghi đè một số tùy chọn trong một phân đoạn tệp đơn vị (sẽ tìm hiểu thêm về điều đó sau).

Ánh xạ phụ thuộc

Để xem cây phụ thuộc của một đơn vị, hãy sử dụng lệnh:

systemctl list-dependencies sshd.service

Nó sẽ hiển thị một hệ thống phân cấp các phụ thuộc mà hệ thống cần xử lý để chạy đơn vị này. Sự phụ thuộc trong ngữ cảnh này là những đơn vị được yêu cầu cho hoạt động của các đơn vị khác cao hơn trong hệ thống phân cấp.

sshd.service
├─system.slice
└─basic.target
├─microcode.service
├─rhel-autorelabel-mark.service
├─rhel-autorelabel.service
├─rhel-configure.service
├─rhel-dmesg.service
├─rhel-loadmodules.service
├─paths.target
├─slices.target
. . .

Phụ thuộc đệ quy chỉ được hiển thị cho các đơn vị .target biểu thị trạng thái hệ thống. Để liệt kê đệ quy tất cả các phụ thuộc, hãy thêm cờ --all.

Để hiển thị các phụ thuộc ngược (các đơn vị phụ thuộc vào một phần tử được chỉ định), bạn có thể thêm cờ --reverse vào lệnh. Các cờ --before và - after cũng rất hữu ích, chúng hiển thị các đơn vị phụ thuộc vào đơn vị được chỉ định và chạy trước hoặc sau nó.

Kiểm tra thuộc tính đơn vị

Để xem các thuộc tính cấp thấp của một đơn vị, bạn có thể sử dụng lệnh show. Thao tác này sẽ hiển thị danh sách các thuộc tính cho đơn vị được chỉ định ở định dạng key = value.

systemctl hiển thị sshd.service
Id = sshd.service
Names = sshd.service
Yêu cầu = basic.target
Muốn = system.slice
WantedBy = multi-user.target
Xung đột = shutdown.target
Before = shutdown.target multi-user.target
After = syslog.target network.target Auditd.service systemd-journald.socket basic.target system.slice
Mô tả = Daemon máy chủ OpenSSH
. . .

Để hiển thị một trong các thuộc tính, hãy chuyển cờ -p và chỉ định tên thuộc tính. Ví dụ: để xem xung đột trong đơn vị sshd.service, bạn sẽ nhập:

systemctl hiển thị sshd.service -p Xung đột
Xung đột = shutdown.target

Ngụy trang đơn vị

Systemd có thể khóa một đơn vị (tự động hoặc thủ công) bằng cách tạo liên kết biểu tượng đến / dev / null. Điều này được gọi là mặt nạ đơn vị và được thực hiện bằng lệnh mặt nạ:

sudo systemctl mask nginx.service

Giờ đây, dịch vụ Nginx sẽ không bắt đầu tự động hoặc thủ công miễn là tính năng giả mạo được bật.

Nếu bạn kiểm tra danh sách-đơn vị-tệp, bạn sẽ thấy rằng dịch vụ được đánh dấu là bị che:

systemctl list-unit-files
. . .
kmod-static-node.service static
ldconfig.service tĩnh
mandb.service tĩnh
messagebus.service tĩnh
nginx.service mặt nạ
quotaon.service tĩnh
rc-local.service static
rdisc.service bị vô hiệu hóa
dịch vụ cứu hộ tĩnh
. . .

Nếu bạn cố gắng khởi động dịch vụ, bạn sẽ nhận được thông báo sau:

sudo systemctl start nginx.service
Không thể khởi động nginx.service: Đơn vị nginx.service bị che.

Để hiển thị một đơn vị và làm cho đơn vị đó khả dụng, hãy sử dụng tính năng mở mặt nạ:

sudo systemctl bật mí nginx.service

Thao tác này sẽ đưa dịch vụ trở lại trạng thái trước đó.

Chỉnh sửa tệp đơn vị

Mặc dù định dạng cụ thể của các tệp đơn vị không được thảo luận trong sách hướng dẫn này, systemctl cung cấp các cơ chế tích hợp để chỉnh sửa và sửa đổi các tệp đơn vị. Chức năng này đã được thêm vào phiên bản systemd 218.

Lệnh chỉnh sửa sẽ mở đoạn mã tệp đơn vị theo mặc định:

sudo systemctl chỉnh sửa nginx.service

Đây sẽ là một tệp trống có thể được sử dụng để ghi đè hoặc thêm chỉ thị vào định nghĩa đơn vị. Một thư mục sẽ được tạo trong thư mục / etc / systemd / system có chứa tên thiết bị với hậu tố .d. Ví dụ, đối với nginx.service, thư mục nginx.service.d sẽ được tạo.

Bên trong thư mục này, một đoạn mã có tên override.conf sẽ được tạo. Khi đơn vị được tải, systemd sẽ hợp nhất đoạn mã ghi đè trong bộ nhớ với phần còn lại của tệp đơn vị. Các chỉ thị đoạn mã sẽ được ưu tiên hơn những chỉ thị được chỉ định trong tệp đơn vị nguồn.

Nếu bạn muốn chỉnh sửa toàn bộ tệp đơn vị thay vì tạo đoạn mã, bạn có thể chuyển cờ --full:

sudo systemctl chỉnh sửa - đầy đủ nginx.service

Thao tác này sẽ tải tệp đơn vị hiện tại vào trình chỉnh sửa nơi nó có thể được sửa đổi. Khi trình chỉnh sửa đóng, tệp đã sửa đổi sẽ được ghi vào / etc / systemd / system và sẽ được ưu tiên hơn định nghĩa đơn vị hệ thống (thường nằm ở đâu đó trong / lib / systemd / system).

Để xóa bất kỳ bổ sung nào bạn đã thực hiện, hãy xóa thư mục config.d hoặc tệp dịch vụ đã sửa đổi khỏi / etc / systemd / system. Ví dụ: để xóa một đoạn mã, bạn có thể nhập:

sudo rm -r /etc/systemd/system/nginx.service.d

Để xóa toàn bộ tệp đã chỉnh sửa, hãy nhập:

sudo rm /etc/systemd/system/nginx.service

Sau khi xóa một tệp hoặc thư mục, quy trình systemd phải được tải lại để hệ thống không còn cố gắng tham chiếu đến các tệp này nữa và trở lại sử dụng các bản sao hệ thống. Để thực hiện việc này, hãy nhập:

sudo systemctl daemon-tải lại

Thay đổi cấp độ chạy

Mục tiêu là các tệp đơn vị đặc biệt mô tả các cấp hệ thống hoặc các điểm đồng bộ hóa. Giống như các đơn vị khác, tệp đích có thể được xác định bằng một hậu tố. Trong trường hợp này, hậu tố .target được sử dụng. Các mục tiêu tự nó không làm gì cả, thay vào đó chúng được sử dụng để nhóm các đơn vị khác.

Mục tiêu có thể được sử dụng để đưa hệ thống vào một trạng thái nhất định. Tương tự, các hệ thống init khác sử dụng runlevel. Chúng được sử dụng làm tài liệu tham khảo khi có một số tính năng nhất định, cho phép bạn chỉ định trạng thái mong muốn thay vì định cấu hình các đơn vị riêng lẻ cần thiết để tạo trạng thái đó.

Ví dụ: có một swap.target được sử dụng để cho biết rằng hoán đổi đã sẵn sàng để sử dụng. Các đơn vị là một phần của quá trình này có thể được đồng bộ hóa với phần cuối này bằng cách sử dụng lệnh WantedBy = hoặc RequiredBy =. Các đơn vị cần hoán đổi có thể chỉ định điều kiện này thông qua thông số kỹ thuật Muốn =, Yêu cầu =, hoặc Sau =.

Kiểm tra và đặt mục tiêu mặc định

Quá trình systemd có một mục tiêu mặc định mà nó sử dụng khi hệ thống khởi động. Cung cấp một tập hợp các phụ thuộc cho mục tiêu duy nhất này sẽ đưa hệ thống vào trạng thái mong muốn. Để tìm mục tiêu mặc định, hãy nhập:

systemctl get-default
multi-user.target

Nếu bạn muốn đặt một mục tiêu mặc định khác, bạn có thể sử dụng set-default. Ví dụ: nếu bạn đã cài đặt màn hình đồ họa và muốn hệ thống tải nó theo mặc định, bạn có thể thay đổi mục tiêu cho phù hợp:

sudo systemctl set-default graphical.target

Danh sách các mục tiêu có sẵn

Bạn có thể xem danh sách các mục tiêu có sẵn bằng lệnh:

systemctl list-unit-files --type = target

Không giống như runlevels, nhiều mục tiêu có thể được kích hoạt cùng một lúc. Một mục tiêu đang hoạt động chỉ ra rằng systemd sẽ cố gắng khởi động tất cả các đơn vị liên kết với mục tiêu đó và sẽ không cố gắng vô hiệu hóa chúng. Để xem tất cả các mục tiêu đang hoạt động, hãy nhập:

systemctl list-units --type = target

Mục tiêu cô lập

Có thể bắt đầu tất cả các đơn vị được liên kết với mục tiêu và dừng tất cả các đơn vị không phải là một phần của cây phụ thuộc. Lệnh cô lập được sử dụng cho việc này. Nó tương tự như thay đổi runlevel trong các hệ thống init khác.

Ví dụ: nếu bạn đang làm việc trong môi trường đồ họa nơi mục tiêu graphical.target đang hoạt động, bạn có thể tắt hệ thống đồ họa và đặt hệ thống ở trạng thái dòng lệnh nhiều người dùng bằng cách cô lập multi-user.target. Vì graphical.target phụ thuộc vào multi-user.target nhưng không phải ngược lại, tất cả các đơn vị đồ họa sẽ bị dừng lại.

Bạn có thể xem xét các yếu tố phụ thuộc của mục tiêu bị cô lập trước khi thực hiện quy trình này để đảm bảo bạn không ngừng các dịch vụ quan trọng:

systemctl list-dependencies multi-user.target

Nếu mọi thứ phù hợp với bạn, bạn có thể cô lập mục tiêu:

sudo systemctl cô lập multi-user.target

Các từ viết tắt

Có các mục tiêu được xác định cho các sự kiện quan trọng như tắt máy hoặc khởi động lại. systemctl cũng cung cấp một số phím tắt để truy cập nhanh.

Ví dụ: để đặt hệ thống vào chế độ gỡ lỗi, bạn có thể chỉ cần nhập cứu hộ thay vì cô lập cứu hộ. Mục tiêu:

cứu hộ sudo systemctl

Điều này sẽ cung cấp chức năng bổ sung - nó sẽ thông báo cho tất cả người dùng của hệ thống về sự kiện này.

Để tạm dừng hệ thống, bạn có thể sử dụng lệnh dừng:

sudo systemctl tạm dừng

Để bắt đầu tắt hoàn toàn, bạn có thể sử dụng lệnh poweroff:

sudo systemctl poweroff

Khởi động lại có thể được bắt đầu bằng lệnh khởi động lại:

khởi động lại sudo systemctl

Các lệnh này sẽ thông báo cho người dùng hệ thống về các sự kiện, điều mà lệnh chuẩn sẽ không thực hiện. Lưu ý rằng hầu hết các máy sử dụng các lệnh ngắn hơn cho các hoạt động này để làm cho chúng hoạt động bình thường với systemd.

Ví dụ, để khởi động lại hệ thống, bạn có thể chỉ cần gõ:

Sự kết luận

Bây giờ bạn đã làm quen với các cơ chế cơ bản của systemctl và biết cách điều khiển hệ thống init bằng công cụ này.

Mặc dù systemctl hoạt động chủ yếu với quy trình systemd, có những thành phần khác trong hệ thống systemd được điều khiển bởi các tiện ích khác. Ví dụ: các daemon và tiện ích riêng biệt được sử dụng để quản lý các phiên ghi nhật ký và người dùng (tương ứng là journald / journalctl và logind / loginctl).