สิ่งหนึ่งที่เปลี่ยนไปใน CentOS 7 หรือ Red Hat Enterprise 7 คือเปลี่ยนมาใช้ systemd ในการบริหารจัดการโปรเซสและอีกหลายสิ่งบนลีนุกซ์ แทนที่การใช้ init หรือ upstart ในเวอร์ชั่นก่อน
ผลที่เห็นอย่างชัดเจนคือทำให้เครื่องบู๊ตได้เร็วมากขึ้น เพราะ systemd จะจัดการให้แต่ละโปรเซสหรือเซอร์วิสสตาร์ตได้พร้อมๆ กัน แทนที่จะรันทีละโปรเซส
แม้จะมีคนไม่เห็นด้วยกันหลายคนถึงความซับซ้อนในตัวระบบ systemd เอง แต่ก็เริ่มมีลีนุกซ์หลายดิสทริบิวชั่น (Linux Distribution) เปลี่ยนมาใช้ systemd กันบ้างแล้ว โดยเริ่มจาก Fedora ตั้งแต่เวอร์ชั่น 15, RedHat Enterprise 7, CentOS 7 และล่าสุด ณ ตอนที่เขียนบทความนี้ (11 ตุลาคม 2557) Ubuntu 14.10 ก็มีข่าวว่าจะรองรับ systemd ด้วย แต่ยังไม่แน่ว่าจะเป็นดีฟอลต์ตอนบู๊ตหรือไม่
ในที่นี้ลองมาดูการเปลี่ยนแปลงคร่าวๆ กัน
ใช้คำสั่ง ps -ef เพื่อดูโปรเซส สังเกตว่าโปรเซสแรก PID=1 จะรันโดย systemd แทนที่จะเป็น init
[root@cent7 ~]# ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 20:46 ? 00:00:01 /usr/lib/systemd/systemd --switched-root --system --deserialize 23 root 2 0 0 20:46 ? 00:00:00 [kthreadd] root 3 2 0 20:46 ? 00:00:00 [ksoftirqd/0] root 5 2 0 20:46 ? 00:00:00 [kworker/0:0H] ...
หรือถ้าดูไฟล์คอนฟิก /etc/inittab ก็จะเห็นว่าไม่ได้ใช้ไฟล์นี้แล้ว พร้อมคำอธิบายเพิ่มเติม
[root@cent7~]# cat /etc/inittab # inittab is no longer used when using systemd. # # ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM. # # Ctrl-Alt-Delete is handled by /etc/systemd/system/ctrl-alt-del.target # # systemd uses 'targets' instead of runlevels. By default, there are two main targets: # # multi-user.target: analogous to runlevel 3 # graphical.target: analogous to runlevel 5 # # To set a default target, run: # # ln -sf /lib/systemd/system/<target name>.target /etc/systemd/system/default.target #
เพื่อความเข้าใจง่าย จะติดตั้ง Apache (httpd) สำหรับการทดสอบการรันเซอร์วิส
[root@cent7 ~]# yum install httpd
จริงๆ แล้ว การจัดการหรือการคอนฟิก systemd ต้องใช้คำสั่ง systemctl แต่สำหรับผู้ที่ยังไม่คุ้นเคย เราสามารถใช้คำสั่ง service หรือ chkconfig ได้เหมือนที่เคยใช้ในเวอร์ชั่นเก่าได้ จะสามารถจัดการหรือคอนฟิกเซอร์วิสได้ แต่ผลจะมีการแสดงตัวอย่างการใช้ systemctl พร้อมออปชั่นที่ให้ผลลัพธ์ที่เหมือนกันการรันที่เหมือนกัน
ตัวอย่างการใช้คำสั่ง service เพื่อรัน (start) เซอร์วิส httpd
[root@cent7 ~]# service httpd start
Redirecting to /bin/systemctl start httpd.service
ใช้คำสั่ง ps เพื่อดูโปรเซส httpd ที่รัน
[root@cent7 ~]# ps -ef | grep httpd root 3179 1 0 22:12 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 3180 3179 0 22:12 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 3181 3179 0 22:12 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 3182 3179 0 22:12 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 3183 3179 0 22:12 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 3184 3179 0 22:12 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
ดูสถานะของเซอร์วิส httpd
[root@cent7 ~]# service httpd status
Redirecting to /bin/systemctl status httpd.service
httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled)
Active: active (running) since Sat 2014-10-11 22:12:42 ICT; 17s ago
Process: 3163 ExecStop=/bin/kill -WINCH ${MAINPID} (code=exited, status=0/SUCCESS)
Main PID: 3179 (httpd)
Status: "Total requests: 0; Current requests/sec: 0; Current traffic: 0 B/sec"
CGroup: /system.slice/httpd.service
├─3179 /usr/sbin/httpd -DFOREGROUND
├─3180 /usr/sbin/httpd -DFOREGROUND
├─3181 /usr/sbin/httpd -DFOREGROUND
├─3182 /usr/sbin/httpd -DFOREGROUND
├─3183 /usr/sbin/httpd -DFOREGROUND
└─3184 /usr/sbin/httpd -DFOREGROUND
Oct 11 22:12:42 cent7 systemd[1]: Starting The Apache HTTP Server... Oct 11 22:12:42 cent7 systemd[1]: Started The Apache HTTP Server.
ตัวอย่างการใช้คำสั่ง service เพื่อหยุดการรัน (stop) เซอร์วิส httpd
[root@cent7 ~]# service httpd stop
Redirecting to /bin/systemctl stop httpd.service
[root@cent7 ~]# service httpd status
Redirecting to /bin/systemctl status httpd.service
httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled)
Active: inactive (dead) since Sat 2014-10-11 22:13:21 ICT; 1s ago
Process: 3210 ExecStop=/bin/kill -WINCH ${MAINPID} (code=exited, status=0/SUCCESS)
Process: 3179 ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND (code=exited, status=0/SUCCESS)
Main PID: 3179 (code=exited, status=0/SUCCESS)
Status: "Total requests: 0; Current requests/sec: 0; Current traffic: 0 B/sec"
Oct 11 22:12:42 cent7 systemd[1]: Starting The Apache HTTP Server... Oct 11 22:12:42 cent7 systemd[1]: Started The Apache HTTP Server. Oct 11 22:13:20 cent7 systemd[1]: Stopping The Apache HTTP Server... Oct 11 22:13:21 cent7 systemd[1]: Stopped The Apache HTTP Server.
ตัวอย่างการใช้ systemctl ในการรัน และหยุดการรันเซอร์วิส httpd
[root@cent7 ~]# systemctl start httpd.service
[root@cent7 ~]# ps -ef | grep httpd root 3228 1 0 22:13 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 3229 3228 0 22:13 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 3230 3228 0 22:13 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 3231 3228 0 22:13 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 3232 3228 0 22:13 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 3233 3228 0 22:13 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
[root@cent7 ~]# systemctl stop httpd.service
[root@cent7 ~]# ps -ef | grep httpd [root@cent7 ~]#
ตัวอย่างการคอนฟิกให้สตาร์ตเซอร์วิส httpd ด้วยตอนบู๊ตเครื่อง
[root@cent7 ~]# chkconfig httpd on
Note: Forwarding request to 'systemctl enable httpd.service'.
ln -s '/usr/lib/systemd/system/httpd.service' '/etc/systemd/system/multi-user.target.wants/httpd.service'
ไฟล์ที่ใช้ในการสตาร์ตแต่ละเซอร์วิส ซึ่งแต่เดิมส่วนใหญ่จะเป็น shell script แต่ใน systemd จะใช้เป็นไฟล์คอนฟิกแทน ทำให้เซอร์วิสที่ต้องการใช้ systemd ด้วย ต้องเปลี่ยนไฟล์สตาร์ตใหม่
ตัวอย่างไฟล์คอนฟิก systemd ที่ใช้ในการรันเซอร์วิส httpd
[root@cent7 ~]# cat /etc/systemd/system/multi-user.target.wants/httpd.service [Unit] Description=The Apache HTTP Server After=network.target remote-fs.target nss-lookup.target
[Service] Type=notify EnvironmentFile=/etc/sysconfig/httpd ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND ExecReload=/usr/sbin/httpd $OPTIONS -k graceful ExecStop=/bin/kill -WINCH ${MAINPID} # We want systemd to give httpd some time to finish gracefully, but still want # it to kill httpd after TimeoutStopSec if something went wrong during the # graceful stop. Normally, Systemd sends SIGTERM signal right after the # ExecStop, which would kill httpd. We are sending useless SIGCONT here to give # httpd time to finish. KillSignal=SIGCONT PrivateTmp=true
[Install] WantedBy=multi-user.target
ดูเซอร์วิสและโปรเซสที่จะรันตอนบู๊ตเครื่อง (enabled)
[root@cent7 ~]# systemctl list-unit-files | grep enabled auditd.service enabled avahi-daemon.service enabled crond.service enabled dbus-org.fedoraproject.FirewallD1.service enabled dbus-org.freedesktop.Avahi.service enabled dbus-org.freedesktop.NetworkManager.service enabled dbus-org.freedesktop.nm-dispatcher.service enabled firewalld.service enabled getty@.service enabled httpd.service enabled irqbalance.service enabled kdump.service enabled lvm2-monitor.service enabled microcode.service enabled NetworkManager-dispatcher.service enabled NetworkManager.service enabled postfix.service enabled rsyslog.service enabled sshd.service enabled systemd-readahead-collect.service enabled systemd-readahead-drop.service enabled systemd-readahead-replay.service enabled tuned.service enabled avahi-daemon.socket enabled dm-event.socket enabled lvm2-lvmetad.socket enabled default.target enabled multi-user.target enabled remote-fs.target enabled
ข้อมูลอ้างอิง
- รีวิวการติดตั้ง CentOS 7
- Wikipedia – systemd
- Ubuntu Wiki – systemd
- Red Hat Enterprise Linux 7 – System Administrator’s Guide – Managing Services with systemd