Lúc chiều có ông anh ngồi cạnh ở công ty bảo chú chưa viết về systemd à? Yep, phải rồi, tôi đã có bài linux boot process, build kernel linux đúng là còn thiếu 1 bài về systemd để thực sự kết thúc series linux thức giấc. Oki okie hôm nay tui sẽ dành chút thời gian viết về systemd ae ạ, trước khi dự định chuyển qua một cái gì đó mơi mới ^)^

Be happy

0. Như thường lệ đây là mục giới thiệu ngắn mà không ngắn lắm :)

Ở bài Linux boot process tôi có nhắc tới một thứ gọi là init system (không rõ ae còn nhớ không) - Thứ được khởi chạy đầu tiên ngay sau khi kernel được load vào và cũng là ông anh cả cam đủ việc trong nhà Linux từ việc load, start các serivce, đến khi ta login thì quản lý phiên, rồi dùng cuối cùng khi ae đi ngủ ông anh cũng làm nhiệm vụ bấm công tắc nguồn tắt đèn (nguồn) :) Anh cả #damdang quá. Vâng, systemd thự sự là một init system ae ạ.

Theo man page:

Systemd1

Để gt cho định nghĩ kia, tôi xin lấy 1 ví dụ: Giả sử ae viết 1 script python, sau đó để có thể “disconnected” phiên ssh mà service vẫn chạy ae hay cho chạy ở background (Chạy thêm dấu & ở cuối command). Ờ ok ngon đóa. Nhưng giờ do update code ae muốn restart để nó ăn code mới ae làm ntn? Ae lại phải ps aux <process_name> để tìm pid, dùng lệnh kill -9 <pid_id> sau đó start lại script như ở bước đầu. Công việc mất t/g quá ae nhỉ bn bước :). Đau đầu vl. Chưa kể giờ hệ thống có cả vài chục service, mỗi cài đặt 1 chỗ, start 1 kiểu ae làm ntn sao được? lúc này cần một cái gì đó thống nhất. Ví dụ chỉ cần gõ systemcl restart <service_name> như mấy gói ta cài ở repo là xong? … Việc này người ta gọi là service management - Quản lý suốt vòng đời của 1 service (start/restart/pause/resume/restart).

System management tương tự. Bình thường đíu cần quan tâm OS nó làm gì? Thích restart/shutdown máy anh em chỉ cần #systemctl restart/poweroff là xong. Mặc cho nó làm bao nhiêu công việc ở dưới start/kill toàn bộ process đúng quy trình, đúng thứ tự, liên lạc với hardware cắt nguồn,… Đó là môt ví dụ điển hình của system manangement - Quản lý suốt vòng đời của cả system.

Theo định nghĩa trên kia systemd là system and service manager (Công cụ quản lý system và service). Để hiểu gộp lại 2 ý ở trên: systemd thực sự cung cấp khả năng service management & system management, thống nhất chuẩn chỉnh :) trong sáng với người dùng. Quá tuyệt vời phải k0? TÔI CẦN systemd <3

Vài điểm chú ý nhe nhẹ

  • systemd là cái được start đầu tiên sau khi load nhân (đã nói ở trên) nên pid luôn là 1 (Quy ước cmnr). Systemdpid

  • systemd là một System theo nghĩa nó không phải là một process là mà một tập các process

  • Ngoài systemd có nhiều cái tương tự Upstart, SystemV. Nhưng máy cái này hết đát rồi :) đã về vườn quá nửa. Giờ là thế kỷ của systemd (hầu hết distro linux nhân 3.x trở lên đều dùng). Điểm hay là systemd có khả năng tương thích ngược với Upstats, systemV. Và bài này đương nhiên tôi cũng chỉ nó về systemd thôi ae.

1. Systemd có gì hay ho mà đòi thay thế Upstart và SystemV?

Phần này thực sự là giải thích cặn cẽ cần phải viết rất dài mà tôi không muốn viết dài. Qua tham khảo từ blog của mấy ông cha đẻ của systemd tôi chỉ xin liệt kê vài ý, vài lý do chính ở đây để nếu nhỡ có bị hỏi (vd khi đi pv) ae còn có cái để chém gió :)

  • Khả năng hoạt động song song: Với các init system cũ như upstart hay systemV thì khi OS khởi chạy các module, serivce sẽ được load/start tuần tự dẫn tới boot lâu. systemd thì không làm như vậy các công việc của nó được thực hiện // nên rút ngắn t/g hơn rất nhiều :)

  • Cung cấp dependence service (điểm mới): Anh em hẳn đã quen khái niệm dependence package kiểu là khi package B denpendence vào A thì cần phải cài gói A trước nó mới cho cài. Ở đay tương tự thay bằng Serivce việc cài bằng running. systemd cung cấp công cụ cho ta làm việc này (nếu cần) :)

  • Cung cấp Watchdong hardware (điểm mới): systemd cung cấp cơ chế cho ta/OS lắng nghe hardware để làm gì đó theo ý ta. (Cái này cao cấp phết, chắc gt sau :d )

  • Và còn nhiều cái hay ho nữa (Link ở trên đóa)

Nói chung khi bị hỏi lôi mấy cái này ra chém thôi ae là được rùi :)

2. Có gì trong nhà của systemd

Có lẽ đây mới là nội dung mà ae cần chú ý nè. Kiểu như ae tán gái phải hiểu tâm lý gái thì mới bắt chuyện được chứ ông nói gà bà nói vịt thất bại cmnl,

Search được cái hình làm ae sẽ “đau đầu” coi. Nhưng không sao, khoan hãy bỏ đi, tôi sẽ giải thích cho ae từ từ và sẽ nhừ :)

Component

  • Đầu tiên ae ngó vào cái ô màu tím thủy chung systemd Deamon : Ô này là các service chính trong systemd. Tất cả cuối đều có chữ d (Viết tắt của deamon - Linux nó hay gọi serivce là deamon). Xem nào ở đây có:
    • logind: Chuyên phụ trách việc login của người dùng (VD: sinh, quản lý session id)
    • systemd: Thực sử quản lý hoạt động của hệ thống/services
    • journald: Quản lý việc lưu log (Thay thế syslog/rsyslog)
    • networkd: Quản lý network của hệ thống
    • user-session: Quản lý phiên người dùng. Chi tiết ae xem ở đây Nội dung người lớn - Click để xem …
  • Ô systemd Ultilities: Đây là tập các công cụ dạng dòng lệnh để ae giao tiếp với systemd Deamon. Ae hay dùng web vẫn gặp mô hình giao diện gọi api service bên dưới thì hình dung nó tương tự như thế. systemd ultilities là giao diện người dùng thân thiện gọi các systemd Deamon bên dưới, cần làm gì thì thằng systemd Deamon (tương ứng) nó phải làm theo vai trò mà vừa nêu ở trên đóa. Ở đây có vài loại ae sẽ dùng nhiều:
    • systemctl: Ae dùng vô cùng nhiều =)) trước hết để quản lý service
    • journalctl: Ae dùng để tra log của service.
    • Cò mấy cái nữa mà ít dùng nên ae tự đọc nha :)
  • Phần systemd Targets: Mô tả các target của systemd. Móa nói vậy mà cũng được, tui biết đọc mà má. Ae từ từ tui gt đây. Để tích hợp ngược với Upstats - Cái mà đặt trưng bởi 6 init mà ae hay dùng (hẳn ae đã từng xài init 0 để restart, init 5 để có GUI, init 3 để chạy console) bọn systemd này không có khải niệm init level như thế mà đưa ra sai khái niệm target. Cụ thể nó nêu ra sự t/ư như sau.

targets

Ok fine, vậy ae nên bỏ thói quen dùng init 0 khi làm việc với systemd đi thui không đúng bản chất chút nào, đúng chuẩn phải như sau systemctl isolate poweroff.target

Liệt kê vài lệnh ae cần nhớ khi làm việc với target như sau

#systemctl list-units --type target   #List all target
#systemctl isolate <name.target>   #Change target
#systemctl get-default   #Get default target when os boot
  • Systemd Core: Ae ạ, mỗi đối tượng (Object) được systemd quản lý mấy ổng định nghĩa nó là 1 Unit (VD mount point, các user serivce (docker, nginx), …).

    • Có 12 kiểu Unit tức 12 loại Object mà systemd nó hỗ trợ manage. Đã có bài viết tiếng việt ở đây rồi tôi không thèm viết lại nữa ae đọc ở link này nha Nội dung người lớn. Click để hiển thị

    • Mỗi Unit được cấu hình trong một file. Theo chuẩn các file cấu hình đặt ở các vị trí sau

/etc/systemd/system: các file config do người dùng thêm

/lib/systemd/system: các unit file do các phần mềm cài vào (VD cài NGINX, nếu package NGINX có chứa file unit thì nó sẽ được cho vào đây)

/run/systemd/system: runtime units

ae thử bật máy cd và vi mấy file ra coi nó có chi nha :)

Quan trọng nhất là Unit kiểu Serivce chắc ae sẽ dùng rất nhiều :) cái này tôi sẽ viết chi tiết sau :d

3. #sysstemctl nhiều ae hay dùng ngỡ nó là systemd

Thật ra nó chỉ là một kiểu systemd Ultilities một dạng command line interface giúp ae giao tiếp với systemd (Cái này tui vừa giải thích ỏ trên mừ ae đừng quên đó). Nếu trâu code và thích ae cũng có thể tự code một cái GUI chỉ dùng chuột click giao tiếp với systemd thay systemctl phải gõ lệnh sml coi, nếu hứng thú =)) - Đoán mò: chắc nó chỉ dùng file socket thui nên ko quá khó ae nhỉ :). vì systemctl ae quá là hay dùng nên tôi tách hẳn ra một phần để viết nó đóa ae :)

Nói chung cái này không có gì là kỹ thuật khó hiểu ở đây, tôi chỉ xin liệt kê thui ae

systemctl list-units # Liệt kê toàn bộ các unit
systemctl -t <unit_type> # Liệt kê toàn bộ các unit theo kiểu
systemctl start <service_name> # Start một serivce
systemctt stop <service_name> # Stop một service
systemctl status <unit_name>  # Xem trạng thái của một service
systemctl enable <unit_name>  # Cấu hình service auto start khi OS boot
systemctl disable <unit_name> # Cấu hình service không auto start khi OS boot
systemctl cat  <unit_name> # Xem nội dung file cấu hình của một Unit
systemctl show <unit_name> # Xem nội dung file unit theo cấu trúc key=value
systemctl daemon-reload # Reload lại systemd deamon khi thay đổi Unit file

Chi tiết ae tham khảo tut này họ giải thích khá rõ dịch lại mất công quá Nội dung người lớn - Click để hiển thị

Ở nội dung này có vài command mà tôi muốn nói chi tiết hơn chút :) vì hôm nọ tập câu hỏi Nếu không có systemctl thì disable service auto start cùng pc ntn? -> Câu hỏi hay phết he he.

systemctl enable <unit_name>  # Cấu hình service auto start khi OS boot
systemctl disable <unit_name> # Cấu hình service không auto start khi OS boot

Bản chất của 2 lệnh này là tạo đường link unit file service vào các thư mục target tương ứng trong /etc/systemd/system/

Thật vậy để chứng minh tôi làm như sau:

  • Ban đầu tôi enable nginx bằng lệnh systemctl enable nginx.service Do đang ở target multi user nên tôi kiểm tra thư mục /etc/systemd/system/multi-user.target.wants/ Thì thấy có 1 soft link tới /lib/systemd/system/nginx.service

  • Sau đó tôi disable nginx bằng lệnh systemctl disable nginx.serivce Vào thư mục /etc/systemd/system/multi-user.target.wants/ không thấy link nữa :)

lik

4. Tự tạo một Unit kiểu Serivce

Phần này chỗ nào cũng viết rồi, tôi không viết lại nữa :) ae tham khảo tiếng việt ở đây nha Link không che

Dài nhất trong ls. Cảm ơn ae nếu ae đã đọc tới đây :)

Tham khảo:

https://www.freedesktop.org

https://www.linode.com/docs/quick-answers/linux-essentials/introduction-to-systemctl/

https://www.digitalocean.com/community/tutorials/how-to-use-systemctl-to-manage-systemd-services-and-units

https://techtalk.vn/](https://techtalk.vn/blog/posts/systemd-la-gi

https://viblo.asia/p/tim-hieu-va-van-dung-systemd-de-quan-ly-he-thong-linux-phan-co-ban-WAyK8kN65xX

https://en.wikipedia.org/wiki/Systemd