Wednesday, December 26, 2018

ประสพการณ์ แก้ปัญหา Server Boot ไม่ขึ้น เพราะ Bug ของ BIOS (และ Hardware Vendor)


เรื่องนี้เกิดขึ้นเมื่อเที่ยงๆ วันอาทิตย์ที่ผ่านมา ผมได้รับโทรศัพท์จากลูกค้า ซึ่งเป็นพี่ที่คุ้นเคยกันเป็นอย่างดี ว่าเค้าได้ลอง reboot เครื่อง Linux Server (CentOS 6.x) แล้วพบว่า boot กลับขึ้นมาไม่ได้ ช่วยแก้ปัญหาให้หน่อย  หลังจากที่ฟังดูอาการแล้ว ปัญหาเหมือนอยู่ที่ disk คือ อยู่ในขั้นตอนการ boot   Linux Server และ Linux พยายาม mount filesystem ทั้งหมดที่อยู่ใน config file ที่ชื่อ /etc/fstab แต่ปรากฏว่า บาง filesystem mount ไม่ได้  ระบบจะหยุด boot และ ให้เราแก้ปัญหาเอง  โดยที่จอ console จะมีการขึ้น prompt ให้เราป้อน root password และเรียกใช้คำสั่งเพื่อซ่อม filesystem ที่มีปัญหา (Linux จะแนะนำว่าให้ใช้คำสั่งอะไร)

ผมได้แนะนำลูกค้าท่านนี้ให้ทำตามขั้นตอนที่ระบบแนะนำ  และลอง reboot ใหม่อยู่หลายรอบ แต่ไม่สำเร็จ เลยต้องรีบทานเข้ากลางวันและบิ่งไปหาลูกค้าโดยเร็ว หลังจากไปถึงก็ได้ลองซ่อม filesystem ดูตามที่ Linux แนะนำ แต่ไม่สำเร็จ ตามรูป


วิเคราะห์ปัญหาและแนวทางการแก้ไข 
Server เครื่องนี้ ค่อนข้างจะพิเศษคือนอกจาก disk ปกติแล้ว จะมี Solid State Card (SSC) อยุ่สองใบ (เป็น card เสียบเลยครับ ไม่ใช้ Harddisk) ใช้เก็บข้อมูล และลูกค้าอยากให้ SSC สองใบนี้ทำ mirror กัน ที่นี้จะทำที่ Bios ก็ไม่ได้ คาดว่า Raid Software บน Bios ทำ Raid กับ SS Card ไม่ได้ ทางเลือกที่เหลือคือผมทำ Raid Mirror โดยใช้ Software Raid บน Linux  เสร็จแล้ว ก็สร้าง Logical Volume (LV) บน Raid SS Card อีกที เพื่อ disk  เต็มจะได้เพิ่ม Disk เข้าไปใน Logical Volume ได้โดยไม่ต้อง Backup & Restore disk 
ซึ่งพอผมนั่งดู error โดยละเอียด เปรียบเทียบกับข้อมูลที่เคยเก็บไว้ พบว่า lv device /dev/vgdata/lvol0 ที่มีปัญหาคือ คือ  LV  นี้ถูกสร้างอยู่บน Solid State Card นี้เอง  สิ่งแรกที่ผมตัดสินใจลอง คือทำการแก้ไขไฟล์ /etc/fstab ให้ไม่ให้ mount filesystem ของ lv ที่มีปัญหานี้  

แก้ปัญหา boot Linux ด้วย Rescue Mode
ที่นี้ถึงแม้ เราตอนนี้จะเข้า prompt ได้แต่อยู่ใน mode พิเศษ ซึ่งแก้ไขไฟล์บนเครื่องไม่ได้เลย ซึ่งรวมถึง  file /etc/fstab  ด้วย  จะ boot ปกติ ก็ไม่ได้ วิธีที่เหลือคือ ใช้ install DVD ของเครื่องนี้ ทำการ Boot แทน และเข้า Rescue Mode  ซึ่งในกรณีนี้ file /etc/fstab จะอยู่ที่ /mnt/sysimage/etc/fstab 

หลังจาก boot ด้วย Recuse Mode เรียบร้อยแล้ว ผมเลยลอง comment บรรทัด ที่ mount device  /dev/vgdata/lvol0  ออกก่อน (โดยการใส่เครื่องหมาย # ที่ต้นบรรทัด) และลอง reboot ใหม่ คราวนี้ Linux Server สามารถ Boot ผ่าน สามารถใช้งานได้เกือบเหมือนปกติ แปลว่าปัญหาอยู่ที่ ตัว device /dev/vgdata/lvol0 นี้จริงๆ 


 ถึงตรงนี้ ที่ผมสงสัยคือ หลังจาก setup เสร้จ เราก็ reboot เครื่องนี้หลายครั้ง ไม่เคยเจอปัญหาเลย ทำไมครั้งนี้ถึงเจอ ซึ่งจากการคุย ลูกค้าได้เล่าว่าระหว่างที่ boot อยู่ขั้นตอนของ BIOS มี error ขึ้นที่จอ Console ตามนี้



ลูกค้าผมก็โทรไปถาม Vendor เจ้าของ Server เครื่องนี้ ซึ่ง Technical support ของ Vendor เค้าบอกว่าควรกด (R) ทำการ Repair ซึ่งลูกค้าผมก็ทำตามคำแนะนำ เลยเกิดปัญหา   ( โดน Hardware Vendor แอบวาง bug ซะแล้ว ) ซึ่งปกติถ้าไม่สนใจ สักพัก Bios มันจะ Skip ข้ามขั้นตอนนี้ไป นี่คือเหตุผลทำไม่ก่อนหน้านี้ ไม่มีปัญหา  เดียวกลับมาเรื่องนี้ใหม่ ขอข้ามไปก่อน
แก้ปัญหาหลังจาก boot ได้ปกติ
พอ boot Linux ตามปกติได้ สิ่งที่เหลือคือ ต้อง mount  device /dev/vgdata/lvol0 ให้ได้ ซึ่ง device นี้เก็บข้อมูลหลักขององค์กร ไม่งั้นก็ต้อง เอาข้อมูลจาก tape backup ลงซึ่งเป็นมาตรการสุดท้าย ซึ่งยังไงผมก็ขอลองแก้ให้ถึงที่สุดก่อน

พอลองตรวจสอบดู พบว่า Linux มองเห็น ตัว Solid State Card Device ทั้งสองตัว (nvme0n1, nvme1n1) ตามรูป



 แต่ ตัว Linux Raid Software มองไม่เห็น device ที่เคยถูก config ใช้คำสั่ง (cat /proc/mdstat)  และ config ของ software raid  (/etc/mdadm.conf) ก็ยังอยู่


 หลังจากค้นหาข้อมูล มีคนเคยเจอปัญหาใกล้เคียงกัน วิธีแก้คือ Create software raid ขึ้นมาใหม่ โดยใช้คำสั่งเดิมที่เคยใช้ในตอนติดตั้ง ซึ่งปกติผมจะบันทึกเก็บไว้ทั้งหมด  ที่เหลือก็ต้องรอลุ้นว่า ถ้าสร้าง software raid ขึ้นมาใหม่ data ของเดิมจะหายหรือเปล่า ซึ่งผมได้ลองคุยกับลูกค้าแล้ว ตามที่บอกคือมี backup อยู่

ดังนั้นสิ่งทีต้องทำคือสร้าง  software raid ใหม่ โดยใช้คำสั่ง mdadm ตามรูป พร้อมกับสร้าง config ของ software raid ใหม่ (mdadm --detail --scan > /etc/mdadm.conf) โดยไม่ลืมเก็บ config file ของเดิมไว้ด้วย กันพลาด



หลังจากนั้น ก็ลองตรวจสอบว่า software raid ทำงานหรือไม่ (cat /proc/mdstat) สรุปว่าเริ่มทำงานแล้วครับ
ทดลอง Reboot อีกหนึ่งคร้ง โดยไม่ repair ตาม warning ใน BIOS เพื่อดูว่า device file /dev/vgdata/vol0 จะกลับมาหรือไม่ ซึ่งโชคดี กลับมาครับ ถึงจุดนี้ สามารถทดลอง mount filesystem  /dev/vgdata/vol0 ได้ ตรวจสอบข้อมูล อยู่ครบครับ โชคดีไป

พอแน่ใจแล้ว ก็ edit ไฟล์  /etc/fstab และลบ comment ที่ใส่ไว้ก่อนหน้านี้ออก เพื่อให้ระบบทำการ mount filesystem อัตโนมัติ ตอน reboot

วิเคราะห์และทดสอบ หาสาเหตุที่แท้จริง 
คำถามที่คาใจผมกับลูกค้าคือ การสั่งให้ Bios ของเครื่องนี้ทำการซ่อม GPT ที่มีปัญหา (Repair GPT corruption) เป็นต้นเหตุของปัญหาทั้งมวล จริงหรือไม่ เราเลยทำการ Reboot อีกสองรอบ รอบแรกลองไม่ Repair   เครื่อง Server ก็ทำงานได้ พอ reboot รอบสอง ลอง Repair  เกิดปัญหาเหมือนเดิมเลย

จากการวิเคราะห์สาเหตุของปัญหา ผมคาดว่า ตัว Software Raid เก็บข้อมูลว่าจะทำ Raid บน  disk ลูกไหน โดยอ้างอิง Disk UID พอเราสั่ง Repair เลยทำให้ Disk UID เปลี่ยน โดยดูจาก  ค่า UUID ของ  Disk ที่เก็บไว้ใน /etc/mdadm.conf ก่อนและหลังการ repair GPT Corruption ตามรูป


พอ disk UUID เปลี่ยนทำให้ไม่สามารถสร้าง Software Raid disk ตามที่ระบบ คาดหวังซึ่งส่งผลไม่มี filesystem บน Software Raid และทำให้การ boot มีปัญหาที่สุด

ลูกค้าได้บอกว่า การที่อยู่ๆ เกิด GPT Corruption นี้เป็น Bug ของ Bios ครับ ถ้า update Bios แล้วจะหาย ก็คงต้องมาดูกันต่อไปครับ ว่า ปัญหาจะหายหรือไม่


No comments:

Post a Comment