จากบทความเรื่อง "การติดตั้ง NTP บน CentOS" เป็นการเซ็ตเวลา (Time) บน Linux โดยการดึงเวลามาจาก Time Server แต่บทความนี้ผมจะแนะนำวิธีการเซ็ต System Time โดยใช้คำสั่ง "date" และเซ็ต Hardware Clock โดยใช้คำสั่ง "hwclock"
ในเครื่องคอมพิวเตอร์ทุกเครื่องที่เราใช้งานกันอยู่ทุกวันนี้นะครับ ไม่ว่าจะเป็น Windows หรือว่า Linux หรือว่า Mac หรือว่า OS อะไรก็แล้วแต่ จะมีเวลา (Time) อยู่ด้วยกัน 2 ส่วน คือ "เวลาที่เก็บอยู่ในฮาร์ดแวร์เครื่อง" ซึ่งก็คือ BIOS นั่นเองครับ บางคนก็เรียกเวลานี้ว่า "Hardware clock" หรือ "BIOS clock" หรือ "CMOS clock" นะครับ และจะมีแบ็ตเตอรี่แบ็คอัพไว้อยู่ ถ้าแบ็ตไม่เสื่อมหล่ะก็เวลาที่เซ็ตไว้ก็จะไม่หายไปไหนครับ
เวลาอีกส่วนหนึ่งเป็นเวลาที่ระบบปฏิบัติการในเครื่องใช้ครับ เรียกว่า "System clock" โดยเมื่อเราบู๊ตเครื่อง เจ้า OS ก็จะไปเช็คเวลาจาก Hardward clock แล้วเอามาทำเป็น "System clock"
กรณีของระบบปฏิบัติการ Linux เราต้องเลือกว่าจะใช้ Hardward clock ในรูปแบบไหนระหว่าง "UTC/GMT time" หรือว่า "Local time" ผมแนะนำว่าควรเลือกเป็นแบบ "UTC/GMT time" ดีกว่านะครับ เพราะมันจะมีเรื่องของ DST (Daylight Saving Time) หรือการปรับเปลี่ยนเวลาเข้ามาเกี่ยวข้องด้วย เรื่องของเรื่องก็คือ ถ้าเราใช้แบบ UTC/GMT แล้วเซอร์เวอร์ของเราติดตั้งอยู่ในประเทศที่ต้องมีการปรับเวลาด้วย (DST) เช่นแถบประเทศสหรัฐอเมริกา ระบบก็จะปรับเวลาให้เองโดยอัตโนมัติ โดยเราไม่ต้องทำอะไร แต่ประเทศไทยไม่มี DST นะครับ ไม่ต้องมีการปรับเวลา
แต่การเซ็ต Hardward clock ให้เป็นแบบ UTC/GMT ก็มีข้อเสียอยู่เหมือนกันนะครับ แต่ว่าไม่น่าจะมีผลต่อเรา ข้อเสียที่ว่าก็คือ ถ้าเราติดตั้ง Linux ด้วย และ DOS ด้วยบนเครื่องเดียวกัน เวลาบน DOS จะไม่ตรงเพราะ DOS ต้องการ Hardward clock แบบ Local time นะครับ
การเซ็ต Timezone
เราเซ็ต Timezone บน Linux โดยการทำ Symbolic Link จาก /etc/localtime ไปยัง /usr/share/zoneinfo ซึ่งจะมีไดเร็คตอรีย่อยๆที่สอดคล้องกับ Timezone ที่เราอยู่ ยกตัวอย่างเช่น ผมอยู่ที่กรุงเทพ ประเทศไทย ผมต้องทำ Symbolic Link จาก /etc/localtime ไปยัง /usr/share/zoneinfo/Asia/Bangkok ด้วยคำสั่งนี้
- โค้ด: เลือกทั้งหมด
rm -f /etc/localtime
ln -s /usr/share/zoneinfo/Asia/Bangkok /etc/localtime
การเซ็ต Hardware clock ให้อยู่ในรูปแบบ UTC/GMT time หรือ Local time
ในขณะที่ Linux กำลังบู๊ตเครื่อง งานอย่างหนึ่งของมันก็คือรันสคริปต์ /sbin/hwclock เพื่อก๊อบปี้เวลาใน Hardware clock แล้วนำไปใช้เป็น System clock โดยโปรแกรมสคริปต์ hwclock จะสมมติเอาว่า Hardware clock เซ็ตเป็นรูปแบบ Local time เว้นแต่ว่าเรารัน /sbin/hwclock และมี --utc ต่อท้ายด้วย แบบนี้นะครับ "/sbin/hwclock --utc" แต่การจะไปแก้ไขสคริปต์ก็ใช่ที่ ถ้าเราใช้ Red Hat หรือว่า CentOS ให้แก้ไขไฟล์ /etc/sysconfig/clockแทน แก้ไขบรรทัด UTC ให้เป็น true
- โค้ด: เลือกทั้งหมด
UTC=true
แล้วเซฟไฟล์
การเซ็ต System Clock
บน Linux ใช้คำสั่ง date เช่น ถ้าต้องการเซ็ตวันที่และเวลาปัจจุบันให้เป็น 7 กันยายน 2010 เวลา 15:55:25 ก็ใช้คำสั่งนี้
- โค้ด: เลือกทั้งหมด
date -s "09/07/2010 15:55:25"
มีเครื่องหมาย "" ด้วยนะครับ
การเช็คเวลาเวลาปัจจุบันบน Linux
ใช้คำสั่ง date ไม่ต้องมีอะไรต่อท้าย
- โค้ด: เลือกทั้งหมด
date
การเซ็ต Hardware clock
ปกติวิธีการที่ผมใช้คือเซ็ต System Clock ก่อน จากนั้นค่อยเซ็ต Hardware clock จาก System clock โดยการรันคำสั่ง
เซ็ตในรูปแบบ Local time
- โค้ด: เลือกทั้งหมด
/sbin/hwclock --systohc
เซ็ตในรูปแบบ UTC/GMT time
- โค้ด: เลือกทั้งหมด
/sbin/hwclock --systohc --utc
เช็ค Hardware clock
- โค้ด: เลือกทั้งหมด
hwclock
ถ้าเป็นแบบ UTC/GMT แล้วต้องการดูเวลาที่เทียบเท่ากับ Local time
- โค้ด: เลือกทั้งหมด
hwclock --utc
ถ้าเวลาในโปรแกรมไม่ตรง
ถ้าเราใช้คำสั่ง date พบว่าเวลาตรง แต่โปรแกรมอื่นแสดงเวลาไม่ตรง แก้ไขโดยการสร้าง Symbolic Link จาก /usr/lib/zoneinfo ไปยัง /usr/share/zoneinfo
- โค้ด: เลือกทั้งหมด
ln -s /usr/share/zoneinfo /usr/lib/zoneinfo