การเปิดเซอร์วิสตอนบู๊ตเครื่องของ CentOS 6

หลังจากที่ติดตั้งโปรแกรม คอนฟิกค่าต่างๆ แล้วทดสอบการเปิด ปิดเซอร์วิสด้วยคำสั่ง service ได้ผลตามที่ต้องการแล้ว

หากต้องการให้เมื่อบู๊ตเครื่องทุกครั้ง ให้เปิด (start) เซอร์วิสนี้ขึ้นมาด้วย หรือทุกครั้งที่เรียกคำสั่งปิดเครื่อง (shutdown) ให้ปิด (stop) เซอร์วิสนี้ก่อน

สามารถทำได้โดยแก้ไขไฟล์ที่อยู่ใน /etc/rc.d/rcX.d/ โดย X เป็นตัวเลขแสดง runlevel แสดงถึงสถานะของเครื่อง

ในไฟล์ /etc/inittab จะอธิบายความหมายของตัวเลขค่า runlevel ที่กำหนดไว้

บางส่วนของไฟล์ /etc/inittab

[root@cent6 ~]# tail /etc/inittab
# Default runlevel. The runlevels used are:
# 0 - halt (Do NOT set initdefault to this)
# 1 - Single user mode
# 2 - Multiuser, without NFS (The same as 3, if you do not have networking)
# 3 - Full multiuser mode
# 4 - unused
# 5 - X11
# 6 - reboot (Do NOT set initdefault to this)
#
id:3:initdefault:

การบู๊ตเครื่อง

ในเบื้องต้นขออธิบายคร่าวๆ เกี่ยวกับการบู๊ตเครื่อง runlevel และการรันเซอร์วิสดังนี้

  • เมื่อบู๊ตเครื่องขึ้นมาทุกครั้ง หลังจากที่โหลด kernel เรียบร้อย init จะเป็นโปรเซสแรกที่ถูกรันขึ้นมา
  • init จะอ่านไฟล์ /etc/inittab เพื่อหาบรรทัดที่มีคอนฟิก “initdefault” เพื่อกำหนดค่า runlevel เริ่มต้น โดยส่วนใหญ่แล้วจะเป็น 3 (runlevel 5 จะคล้ายกับ 3 ทุกอย่างยกเว้นจะมีการรันเซอร์วิส X Window ขึ้นมาด้วย)
  • สมมติว่าเข้าสู่ runlevel 3 จะมีการรันสคริปต์ไฟล์ต่างๆ ที่อยู่ใน /etc/rc.d/rc3.d/ โดยจะรันเฉพาะชื่อไฟล์ที่ขึ้นต้นด้วยตัวอักษร “S” (เอสตัวใหญ่) เรียงตามลำดับชื่อไฟล์ (ตัวเลข)

ตัวอย่างสคริปต์ไฟล์ที่มีชื่อไฟล์ขึ้นต้นด้วยตัวอักษร “S” สังเกตว่าแต่ละไฟล์จะเป็นลิ้งค์ไฟล์แบบ soft link ชี้ไปยังสคริปต์ไฟล์จริงๆ ที่อยู่ใน ../init.d/ หรือพาธเต็มๆ คือ /etc/rc.d/init.d/ ที่มาพร้อมกับการติดตั้งโปรแกรมจากไฟล์ rpm นั่นเอง

[root@cent6 ~]# cd /etc/rc.d/rc3.d/
[root@cent6 rc3.d]# ls -l S*
lrwxrwxrwx. 1 root root 17 Mar 24 13:46 S01sysstat -> ../init.d/sysstat
lrwxrwxrwx. 1 root root 22 Mar 24 13:46 S02lvm2-monitor -> ../init.d/lvm2-monitor
lrwxrwxrwx. 1 root root 19 Mar 24 13:45 S08ip6tables -> ../init.d/ip6tables
lrwxrwxrwx. 1 root root 18 Mar 24 13:44 S08iptables -> ../init.d/iptables
lrwxrwxrwx. 1 root root 17 Mar 24 13:45 S10network -> ../init.d/network
...

สมมติว่าเราติดตั้งเว็บเซิร์ฟเวอร์ Apache จากไฟล์ rpm ที่อยู่ในแผ่นติดตั้ง CentOS 6

จะมีการสร้างลิ้งค์ไฟล์ใน /etc/rc.d/rc3.d/ ด้วย แต่โดยมาก ดีฟอลต์ของการติดตั้ง ชื่อลิ้งค์ไฟล์ที่ติดตั้งมา จะขึ้นต้นด้วยตัวอักษร “K”

[root@cent6 rc3.d]# ls -l *httpd
lrwxrwxrwx. 1 root root 15 Apr 6 17:16 K15httpd -> ../init.d/httpd

แปลว่าหากมีการบู๊ตเครื่องใหม่ Apache จะไม่ถูกรันขึ้นมาโดยอัตโนมัติ

หากต้องการแก้ไขให้รัน Apache ตอนบู๊ตเครื่องด้วย ก็สามารถทำได้โดยเปลี่ยนตัวอักษรขึ้นต้นจากตัวอักษร “K” ให้เป็นตัว “S”

ตัวอย่างการแก้ไข (ไม่แนะนำให้ทำแบบนี้) เช่น

[root@cent6 rc3.d]# mv K15httpd S15httpd
[root@cent6 rc3.d]# ls -l *httpd
lrwxrwxrwx. 1 root root 15 Apr 6 17:16 S15httpd -> ../init.d/httpd

หลังจากแก้ไขแล้ว ลองบู๊ตเครื่องดู ก็จะมีการพยายามรัน httpd ขึ้นมาเหมือนกัน

แต่ปัญหาของการแก้ไขเองแบบนี้ อาจทำให้การรันโปรแกรมหรือเซอร์วิสนี้มีปัญหาได้ ยกตัวอย่างเพิ่มอีกโปรแกรมคือ MySQL

ตัวอย่างลิ้งค์ไฟล์ที่สร้างจากการติดตั้งไฟล์ rpm

[root@cent6 rc3.d]# ls -l *mysqld
lrwxrwxrwx. 1 root root 16 Apr 1 10:34 K36mysqld -> ../init.d/mysqld

ถ้าเราต้องการให้รัน MySQL ตอนบู๊ตเครื่องด้วย

สมมติว่าเราแก้ไขด้วยคำสั่ง mv แล้วเปลี่ยนเฉพาะตัวอักษรหน้าจาก “K” ให้เป็น “S”

[root@cent6 rc3.d]# mv K36mysqld S36mysqld
[root@cent6 rc3.d]# ls -l *mysqld
lrwxrwxrwx. 1 root root 16 Apr 1 10:34 S36mysqld -> ../init.d/mysqld

เมื่อบู๊ตเครื่องใหม่ แล้วเข้าสู่ runlevel 3 เซอร์วิส Apache จะถูกรันขึ้นมาก่อน MySQL เพราะตัวเลขน้อยกว่า ซึ่งอาจทำให้เว็บโปรแกรมที่จำเป็นต้องเชื่อมต่อฐานข้อมูลมีปัญหาได้

วิธีการแก้ไขอย่างถูกต้อง และเป็นวิธีที่แนะนำสำหรับ CentOS 6  เพื่อให้มีการเปิดเซอร์วิสตอนบู๊ตเครื่อง หรือเข้าสู่ runlevel 3

ต้องใช้คำสั่ง chkconfig

ก่อนจะไปขั้นตอนต่อไป เปลี่ยนชื่อไฟล์ให้เหมือนเดิม

[root@cent6 rc3.d]# mv S15httpd K15httpd
[root@cent6 rc3.d]# mv S36mysqld K36mysqld

 

คำสั่ง chkconfig

ใช้คำสั่ง chkconfig ตามด้วยออปชั่น –list แล้วตามด้วยชื่อเซอร์วิสเช่น httpd เพื่อแสดงสถานะการรันเซอร์วิสในแต่ละ runlevel

[root@cent6 rc3.d]# chkconfig --list httpd
httpd 0:off 1:off 2:off 3:off 4:off 5:off 6:off

ตัวเลข 0-6 คือ runlevel ส่วน on, off จะเป็นคอนฟิกแสดงว่าให้เปิด หรือปิด เซอร์วิส เมื่อเข้าสู่ runlevel นั้นๆ

เช่น runlevel 3 ของ httpd คือ off หมายถึงไม่มีการรันเซอร์วิสนี้เมื่อเข้าสู่ runlevel 3

หากต้องการให้รันเซอร์วิสนี้ ให้ใช้คำสั่ง chkconfig ตามด้วยชื่อ service แล้วตามด้วย on ตัวอย่างเช่น

[root@cent6 rc3.d]# chkconfig httpd on
[root@cent6 rc3.d]# chkconfig --list httpd
httpd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
[root@cent6 rc3.d]# ls -l *httpd
lrwxrwxrwx. 1 root root 15 Apr 7 16:05 S85httpd -> ../init.d/httpd

จะเห็นว่าสถานะของ runlevel 2,3,4,5 ของ httpd เปลี่ยนเป็น on แปลว่าถ้าเข้าสู่ runlevel เหล่านี้ รวมทั้ง 3 (บู๊ตเครื่อง) จะมีการรันเซอร์วิสนี้ด้วย

เมื่อใช้คำสั่ง ls -l เพื่อดูลิ้งค์ไฟล์ ชื่อไฟล์ก็จะเปลี่ยนเป็นขึ้นต้นด้วย “S” พร้อมทั้งตัวเลขก็เปลี่ยนไปด้วย

ลองเปลี่ยนคอนฟิกให้รัน MySQL ขึ้นมาตอนบู๊ตเครื่องด้วย

[root@cent6 rc3.d]# chkconfig --list mysqld
mysqld 0:off 1:off 2:off 3:off 4:off 5:off 6:off
[root@cent6 rc3.d]# chkconfig mysqld on
[root@cent6 rc3.d]# chkconfig --list mysqld
mysqld 0:off 1:off 2:on 3:on 4:on 5:on 6:off
[root@cent6 rc3.d]# ls -l *mysqld
lrwxrwxrwx. 1 root root 16 Apr 7 16:08 S64mysqld -> ../init.d/mysqld

ตอนนี้ทุกครั้งที่มีการบู๊ตเครื่องเข้าสู่ runlevel 2,3,4,5 จะมีการรัน MySQL ขึ้นมาด้วย สังเกตตัวเลข 64 แปลว่า MySQL จะถูกรันขึ้นมาก่อน Apache ซึ่งมีตัวเลข 85

ตัวเลขลำดับในการรันของแต่ละเซอร์วิส จะถูกกำหนดอยู่ในสคริปต์ไฟล์ เช่น

[root@cent6 ~]# cat /etc/rc.d/init.d/httpd
#!/bin/bash
#
# httpd Startup script for the Apache HTTP Server
#
# chkconfig: - 85 15
...

จะอยู่ในบรรทัดที่มีคำว่า chkconfig จะมีอยู่สองตัวเลข คือ 85 และ 15

ตัวเลขแรก 85 คือลำดับที่ในการเปิด (start) เซอร์วิส

ตัวเลขที่สอง 15 คือลำดับที่ในการปิด (stop) เซอร์วิส

[root@cent6 ~]# cat /etc/rc.d/init.d/mysqld
#!/bin/sh
#
# mysqld This shell script takes care of starting and stopping
# the MySQL subsystem (mysqld).
#
# chkconfig: - 64 36
...

ส่วนของ mysqld ตัวแรกแรกคือ 64 ตัวเลขที่สองคือ 36

โดยสรุปแล้ว ระหว่าง httpd (Apache) และ mysqld (MySQL)

ตอนเปิดเครื่อง mysqld(64) จะถูกเปิด (start) ขึ้นมาก่อน httpd(85)

ตอนปิดเครื่อง httpd(15) จะถูกปิด (stop) ก่อน mysqld(36)
หากต้องการยกเลิก หรือไม่ต้องการให้รันเซอร์วิสตอนบู๊ตเครื่องแล้ว ก็สามารถใช้คำสั่ง chkconfig ตามด้วยชื่อ และตามด้วยคำว่า off

เช่น ไม่ต้องการให้ httpd และ mysqld รันขึ้นมาตอนบู๊ตเครื่อง

[root@cent6 ~]# chkconfig httpd off
[root@cent6 ~]# chkconfig mysqld off
[root@cent6 ~]# chkconfig --list httpd
httpd 0:off 1:off 2:off 3:off 4:off 5:off 6:off
[root@cent6 ~]# chkconfig --list mysqld
mysqld 0:off 1:off 2:off 3:off 4:off 5:off 6:off

 

ข้อมูลอ้างอิง

Leave a Reply

Your email address will not be published.