Nối tiếp phần 1, 1Hosting giới thiệu phần 2 của loạt series tìm hiểu về Centos 7 với việc đi sâu chi tiết hơn về những thay đổi trong hệ thống, đó là systemd.
Có thể nói đây là sự thay đổi lớn trong Centos 7. Trước tiên ta tìm hiểu các kỹ thuật cũ về hệ thống khởi động trên các phiên bản trước của Centos:
+ init – là process đầu tiên được load và sẽ nằm ở đó cho đến khi hệ thống (họ nhà Red Hat, Centos ) shutdown. Múc đích của nó là sử dụng các run levels để quyết định daemons nào được start và tương tác để điều khiển chúng. Tuy nhiên điểm cố hữu ” chết người” của init là ở chỗ nó khởi động các process theo thứ tự lần lượt, các tác vụ chỉ được khởi động khi tác vụ trước đó đã hoàn thành. Vì thế sẽ mất nhiều thời gian hơn và nếu một tác vụ bị failed, quá trình khởi động sẽ dừng lại ở đó cho đến khi nó tìm được cách xử lý.
+ Upstart – là sự thay thế cho init, chủ yếu sử dụng trên Ubuntu và dành cho mục đích khởi động các process không đồng thời, điều này làm tăng tốc độ boot và mức ổn định của hệ thống.
Ở Centos 7 systemd cũng làm nhiệm vụ tương tự init và là tiến trình đầu tiên khi khởi động, có pid =1. systemd không phải là một process đơn thuần mà nó còn chứa các gói, các thư viện và các công cụ trong đó. Có thể nhìn sơ qua cấu trúc của systemd như sau:
Khác hoàn toàn với init, systemd khởi động các process song song, không còn phụ thuộc vào nhau nên giảm thiểu thời gian khởi động và tăng tính ổn định khi một process failed sẽ không ảnh hưởng đến toàn bộ quá trình khởi động. Không chỉ khởi động các chương trình core, systemd còn khởi động các hoạt động khác trên hệ thống như network stack, bộ cron job scheduler, user login….
Ta sẽ xem các ví dụ về việc sử dụng systemd như sau:
File cấu hình chung của systemd nằm trong thư mục /etc/systemd
File cấu hình các service thì nằm trong /usr/lib/systemd
Các file custome config thì đặt trong /etc/systemd/system, đặc biệt đôi khi thư mục /run/systemd/system cũng đc sử dụng
Để xem phiên bản của systemd hiện tại, sử dụng lệnh:
# systemctl --version systemd 208 +PAM +LIBWRAP +AUDIT +SELINUX +IMA +SYSVINIT +LIBCRYPTSETUP +GCRYPT +ACL +XZ
Nhiệm vụ chính của systemd là quản lý các boot process và cung cấp thông tin về nó, ta dùng lệnh sau:
# systemd-analyze Startup finished in 422ms (kernel) + 2.722s (initrd) + 9.674s (userspace) = 12.820s
Để xem các service trong quá trình boot của nó, ta sử dụng lệnh như sau:
# systemd-analyze blame 7.029s network.service 2.241s plymouth-start.service 1.293s kdump.service 1.156s plymouth-quit-wait.service 1.048s firewalld.service 632ms postfix.service 621ms tuned.service 460ms iprupdate.service 446ms iprinit.service 344ms accounts-daemon.service ... 7ms systemd-update-utmp-runlevel.service 5ms systemd-random-seed.service 5ms sys-kernel-config.mount
systemd cho phép hiển thị những process quan trọng nhất trong khi khởi động hệ thống với tùy chọn critical chain
# systemd-analyze critical-chain The time after the unit is active or started is printed after the "@" character. The time the unit takes to start is printed after the "+" character. multi-user.target @6.167s └─mariadb.service @2.661s +3.505s └─network.target @2.649s └─network.service @2.168s +478ms └─NetworkManager.service @1.993s +174ms └─firewalld.service @826ms +1.162s └─basic.target @822ms └─sockets.target @821ms └─dbus.socket @820ms └─sysinit.target @813ms └─systemd-update-utmp.service @806ms +6ms └─auditd.service @747ms +58ms └─local-fs.target @742ms └─boot.mount @709ms +32ms └─systemd-fsck@dev-disk-by\x2duuid-497a43ab\x2d33b0\x2 └─dev-disk-by\x2duuid-497a43ab\x2d33b0\x2d4153\x2d9f
hay critical chain với 1 service cụ thể
# systemd-analyze critical-chain firewalld.service The time after the unit is active or started is printed after the "@" character. The time the unit takes to start is printed after the "+" character. firewalld.service +1.162s └─basic.target @822ms └─sockets.target @821ms └─dbus.socket @820ms └─sysinit.target @813ms └─systemd-update-utmp.service @806ms +6ms └─auditd.service @747ms +58ms └─local-fs.target @742ms └─boot.mount @709ms +32ms └─systemd-fsck@dev-disk-by\x2duuid-497a43ab\x2d33b0\x2d4153\x2d9 └─dev-disk-by\x2duuid-497a43ab\x2d33b0\x2d4153\x2d9f8d\x2d7788
Để xem sự phụ thuộc (dependencies) của các services
# systemctl list-dependencies default.target ├─abrt-ccpp.service ├─abrt-oops.service ... ├─tuned.service ├─basic.target │ ├─firewalld.service │ ├─microcode.service ... ├─getty.target │ ├─getty@tty1.service │ └─serial-getty@ttyS0.service └─remote-fs.target
Và xem dependencies của 1 services cụ thể:
# systemctl list-dependencies sshd.service
Trong Centos 7, systemd sẽ xử lý sự kiện thông qua một công cụ của nó trong systemd Utilities là Journald, đây là một tính năng rất hay và đáng giá. Chẳng hạn, để xem tất cả các sự kiện liên quan đến sshd process, ta dùng lệnh:
# journalctl /sbin/sshd
hoặc # journalctl --unit=sshd
Để hiển thị tất cả các sự kiện trong lần boot cuối cùng:
# journalctl -b
hay chỉ là của ngày hôm nay:
# journalctl --since=today
hoặc các sự kiện liên quan đến lỗi
# journalctl -p err
Mặc đinh, Journald logs được lưu trong thư mục /run/log/journal và sẽ biến mất sau quá trình khởi động. Để lưu Journald logs cho mục đích xem lại ta làm như sau:
# mkdir /var/log/journal
# echo "SystemMaxUse=50M" >> /etc/systemd/journald.conf
# systemctl restart systemd-journald
Để quản lý các services, systemd sử dụng systemctl thay thế cho các lệnh chkconfig và service trước đây của Centos 6.
Ví dụ để active ntp services lúc khởi động thay cho chkconfig
# systemctl enable ntpd (thay vì chkconfig ntpd on)
Chú ý 1: Cú pháp chuẩn phải là ntpd.service nhưng mặc định .service sẽ tự động được thêm vào.
Chú ý 2: nếu là đường dẫn, .mount sẽ được thêm vào.
Chú ý 3: Nếu là thiết bị, .device sẽ được thêm vào.
Để deactivate, start, stop một services:
# systemctl disable ntpd (thay vì chkconfig ntpd off) # systemctl start ntpd (thay vì services ntpd start) # systemctl stop ntpd (thay vì services ntpd stop)
Kiểm tra NTP service có được active lúc khởi động:
# systemctl is-enabled ntpd enabled
Kiểm tra NTP service có hoạt động:
# systemctl is-active ntpd inactive
Lấy trạng thái của sshd services :
# systemctl status sshd sshd.service - OpenSSH server daemon Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled) Active: active (running) since Sun 2016-04-17 15:39:19 ICT; 42min ago Docs: man:sshd(8) man:sshd_config(5) Main PID: 714 (sshd) CGroup: /system.slice/sshd.service └─714 /usr/sbin/sshd -D
Systemd sử dụng các targets. Một target là một kỹ thuật ghép nhóm cho phép nhiều services khởi động cùng lúc. Các services này được kết hợp với một target cụ thể và được lưu trong thư mục cùng tên với tên target. Hiểu theo một cách nào đó, target thay thế các run levels (level 3 chế độ dòng lệnh hay level 5 chế độ đồ họa). File /etc/inittab sẽ không còn được sử dụng để set default run level nữa và vì thế việc thay đổi nó sẽ không còn tác dụng trong Centos 7.
Chẳng hạn để đưa Centos 7 vào chế độ maintenance mode:
# systemctl rescue
Để chuyển sang level 3:
# systemctl isolate runlevel3.target
hay
# systemctl isolate multi-user.target
Để chuyển sang chế độ đồ họa:
# systemctl isolate graphical.target
hay chế độ không dùng GUI:
# systemctl set-default multi-user.target
Kiểm tra run level đang chạy của hệ thống
# systemctl get-default graphical.target
Phần này sẽ được 1Hosting giới thiệu chi tiết tại bài viết này.