BLOG

LEVEL51 Cloud Boot

จะเยี่ยมขนาดไหน ถ้าคุณสามารถบูตเครื่องเพื่อแก้ไขปัญหาหรือลงเครื่องใหม่ได้จากทุกที่ ที่มีอินเตอร์เนตและสาย LAN ?

ความท้าทายอีกอย่างหนึ่งของการทำ LEVEL51 นอกจากการประกอบเครื่องแล้ว ก็คือการที่เราจะต้องหาทางติดตั้งเครื่องพร้อมๆ กันให้ได้เร็วที่สุด ใช้แรงงานเราน้อยที่สุด เพื่อรองรับกรณีที่เครื่องมาถึงพร้อมกันเป็นจำนวนมาก (มากที่สุดที่เราเคยได้รับมาใน 1 วันคือ 9 เครื่องครับ) แต่อย่างที่ทุกท่านทราบกันดีว่า ทีมงานเราจริงๆ มีกันอยู่แค่สองคน (ถ้าไม่นับรวมพาร์ทเนอร์ของเราที่ก็เป็นทีมงานที่ช่วยดูแลเรื่องสต็อกเครื่องให้เรากลายๆ ที่สิงคโปร์ และกลุ่มนักลงทุนด้วยนะ) และส่วนหนึ่งก็คือ เพื่อหาทางที่ดีกว่า ที่จะอำนวยความสะดวกให้กับลูกค้าของเรา เวลาต้องการติดตั้งวินโดวส์ใหม่ด้วยครับ

แค่ลง Windows กับ Flash BIOS มันยากตรงไหน?

ถ้าพูดถึงการลง Windows หรือ Flash BIOS/Firmware หลายๆ ท่านก็คงนึกภาพถึงการสร้างแผ่นบูตด้วย RuFus จากนั้น Copy ตัวติดตั้ง Windows ลงไป แล้วบูต แต่ถ้าในสภาพแวดล้อมจริงๆ ที่จะต้องติดตั้งเครื่องจำนวนมาก การทำแบบนี้ย่อมเป็นไปได้ยากมากครับ เริ่มตั้งแต่การมี USB Drive หลายอัน ให้ต้องคอยเก็บ และอัพเดทไฟล์ข้างในให้เป็นตัวล่าสุดแล้ว (x2 เข้าไปด้วย เพราะว่าต้องมีชุดสำหรับ Flash BIOS อีกชุด) ยังมีประเด็นของโอกาสที่อาจจะเกิดรอยขีดข่วนรอบช่อง USB เวลาที่เสียบ USB Drive ได้อีกต่างหาก 

ต้องขอขอบคุณตัวเองเมื่อเกือบ 10 ปีที่แล้ว ที่ตัดสินใจเข้าไปฝึกงานกับห้อง Network Operation Center (NOC) ที่คณะวิทยาศาสตร์มหาวิทยาลัยอัสสัมชัญ ตอนสมัยเรียนปริญญาตรี ทำให้รู้จักกับเรื่องพวกนี้ เพราะว่าเราจะต้องทำการลง Windows ใหม่ ให้กับเครื่องในห้องแล็บที่ใช้ในการเรียนการสอนหลายๆ เครื่องพร้อมกันทุกเทอม ซึ่งสมัยนู้น Windows XP ยังติดตั้งผ่าน Network ค่อนข้างยาก ต้องทำเครื่องต้นฉบับขึ้นมา ทดลองกับโปรแกรมต่างๆ ที่จะใช้สอน จากนั้นเราก็ต้องมี Hard Disk ต้นฉบับกันคนละลูก เดินไปเสียบช่อง IDE บูตด้วยแผ่นดิสก์ 3.5" ทีละเครื่องๆ ใช้โปรแกรม GHOST ก็อปปี้ข้อมูลจากตัวต้นฉบับไป กว่าจะเสร็จก็เสียเวลาทั้งวัน

ภาพ 1: บรรยากาศตอนเราไปติดตั้งเครื่อง PC ให้มหาวิทยาลัยธรรมศาสตร์ ซึ่งไม่ได้เดิน LAN ไว้ ต้องบูตด้วย USB ให้ความรู้สึกเดิมๆ แต่อย่างน้อยก็เร็วกว่า เพราะ USB3.0 ครับ (ใช้ Sandisk Ultra Fit - อ่าน 130MB/s)

จนเราได้ริเริ่มพัฒนามาเป็น GHOST แบบ Multicast ที่ยังต้องเสียบแผ่นบูตอยู่ (ต้องขอขอบคุณเว็บ http://www.nu2.nu/bootdisk/ มาก แต่ตอนนี้เขาเอาหน้านี้ลงแล้ว เพราะมันไม่ทันสมัยแล้วครับ) แต่ว่าพอทุกเครื่องบูตแล้ว GHOST พร้อมกัน ผ่าน LAN ซึ่งตอนนั้นเราเป็น Gigabit แล้วนะ ใช้ Switch ของ Cisco ตัวละเกือบแสน เทพมาก และเสต็ปสุดท้าย ที่ผมยังทำไม่สำเร็จตอนที่ยังอยู่ห้อง NOC มาได้ทำเอาตอน LEVEL51 นี้ คือการบูตผ่านแลน หรือที่เรียกว่า PXE ครับ 

สำหรับระบบปัจจุบันของเรา ซึ่งเป็นเวอร์ชั่นที่ 3 แล้ว หน้าตาเป็นแบบนี้ แต่เรื่องของ PXE ไม่ใช้ประเด็นของโพสนี้ครับ (อ้าว!) เดี๋ยวคงจะมาเขียนในโอกาสต่อไป

ความท้าทายใหม่: Flash BIOS ในโหมด UEFI

สาเหตุหลักเลย ที่เราต้องทำระบบบูตเวอร์ชั่นที่ 3 นี้ขึ้นมา ก็เพราะว่า Firmware ของเครื่องปี 2017 นี้ (ซึ่งต่อไปนี้คงจะเรียกว่า "BIOS" ไม่ได้แล้ว เพราะว่ามันไม่ใช่ "BIOS" อีกแล้วครับ :P) จะต้อง Flash ในโหมด UEFI เท่านั้นครับ ทำให้ระบบบูตเดิมของเรา ซึ่งใช้ syslinux+WDS ไม่สามารถใช้ได้อีกต่อไป เพราะว่า Memdisk ของ syslinux สามารถใช้งานได้ในโหมด BIOS เท่านั้น ระบบที่เราทำไว้ก็คือ ถ้าเครื่องอยู่โหมด Legacy (BIOS) มันก็จะถูกบูตด้วย Syslinux โดยใช้ Memdisk โหลดไฟล์ Disk Image จาก Server ไปบูต ซึ่งภายในก็มี FreeDos และโปรแกรมสำหรับ Flash BIOS อยู่ และถ้าเครื่องอยู่ในโหมด UEFI ก็จะได้รับคำสั่งให้บูตผ่าน Bootloader ของ WDS (Windows Deployment Service) แทน เพื่อเข้า MDT LiteTouch (Microsoft Deployment Toolkit) สำหรับติดตั้ง Windows

เกริ่นเล็กน้อย เรื่องของ BIOS และ (U)EFI (Universal Extensible Firmware Interface: คงจะแปลได้ว่า "ระบบกลางสำหรับติดต่อกับ Firmware ที่ทุกคนเอาไปใช้ได้") ก็คือ ทั้งสองตัวเป็น Firmware ที่ติดตั้งอยู่บนเมนบอร์ด คำว่า Firmware หมายถึง โปรแกรมที่ไม่เปลี่ยนบ่อย (Firm) อีกชื่อหนึ่งของมันก็คือ ROM นั่นแหละครับ สำหรับ UEFI เป็นเทคโนโลยีใหม่กว่า ทำอะไรได้เยอะกว่า มาแทน BIOS ที่มีอายุเก่าแก่เกือบ 20 ปีแล้ว โดยเครื่องที่ออกจากเราไป จะถูกตั้งค่าให้ทำงานในโหมด UEFI ทั้งหมดอยู่แล้วครับ

ความเก๋ของ UEFI คือ มันมีลักษณะเป็นเหมือนระบบปฏิบัติการณ์ในตัวของมันเองเลย แต่ว่ามันไม่มีส่วน User Interface (Shell) หน้าจอดำๆ แบบที่แอดมินระบบทั่วไปคุ้นเคยกัน (เข้าใจว่า หน้า "BIOS" ของเครื่อง ก็คือ Shell ตัวหนึ่งแล้วแหละ) เราแค่ไปหา Shell ที่สร้างมาเพื่อใช้กับระบบ EFI มา ที่เป็นนามสกุล .efi จากนั้น Copy ไฟล์วางไว้ใน USB ที่ Format แบบ FAT32 เปลี่ยนชื่อเป็น Shell.efi แล้วเข้ากด F2 เพื่อเข้า BIOS แล้วเลือก "Launch UEFI Shell From File System Device" เพื่อโหลด UEFI Shell ขึ้นมา ก็สามารถเรียกโปรแกรม Flash BIOS จากโหมด UEFI ได้แล้ว

ภาพ: (u)EFI Shell สำหรับ Flash Firmware ที่เราได้มาจาก CLEVO ครับ ลองใช้ตัวอื่นแล้ว ใช้ไม่ได้ซะงั้น! (ไหนว่า Universal...)

แต่ปัญหาอยู่ตรงที่ วิธีนี้ ไม่ได้แก้ปัญหาของเรา ที่ไม่ต้องการจะใช้ USB เดินไปเสียบตามเครื่องทีละเครื่อง เพื่อ Flash Firmware หรือลง Windows น่ะสิ ผมจึงต้องออกตามหาอีกครั้ง และไปพบกับ iPXE เข้า ศึกษาอยู่ประมาณสองวัน ร่วมกับการเขียน ASP.NET Web Page (ไฟล์ cshtml) นิดหน่อย ก็สามารถทำระบบบูต เพื่อ Flash Firmware ผ่าน UEFI ได้แล้ว


ภาพ: iPXE ทำงานร่วมกับ ASP.NET บน Web Server เพื่อปล่อยไฟล์สำหรับ Flash BIOS มาไว้ใน Virtual Disk ของ iPXE

เดี๋ยวนะ? iPXE ทำงานร่วมกับ ASP.NET บน Web Server ?

ใช่แล้วครับ ความเก๋ของ iPXE นี้ก็คือ มันสามารถดูดโหลดไฟล์ผ่านโปรโตคอล HTTP มาบูตได้ครับ! เป็นการทำลายข้อจำกัดหลายๆ อย่างของ PXE แบบเดิม และตัว Syslinux เองด้วย (สำหรับ Syslinux นั้น ตัวมันจะสามารถอ่านไฟล์ผ่านโปรโตคอล TFTP ได้เท่านั้น) นั่นก็หมายความว่า ผมสามารถทำอะไรแผลงๆ มากกว่านั้นได้อีกน่ะสิ!

ประสบการณ์ใหม่ : บูตและลงวินโดวส์ผ่าน Cloud

ผมจึงประยุกต์ต่อไปอีกครับ โดยการสร้าง Image ของ iPXE จาก Rom-o-matic เพื่อให้ iPXE ติดต่อมาที่ Azure Blob Storage ของ LEVEL51 (สนับสนุนโดย Microsoft BizSpark ขอบคุณมากครับ) เพื่ออ่าน Script จาก Azure Blob Storage นี้เลย


ภาพ 2: iPXE ทำการดาวน์โหลดไฟล์สำหรับบูตผ่าน Cloud! ขั้นตอนการบูตใช้เวลาประมาณ 1 นาที 30 วินาที โดยได้ความเร็วประมาณ 20Mbps ครับ (Internet 3BB 200Mbps)

และใน Windows PE นั้น ผมก็ได้ใส่ Driver HTTPDisk จากโพสที่แล้ว พร้อมทั้งแก้ไข BCD ให้สามารถใช้งานได้เอาไว้เรียบร้อย และมี Script สำหรับ Map Drive ให้พร้อมสรรพ ดังนั้น เราก็สามารถทำอะไรแผลงๆ แบบนี้ได้ ก็คือ เปิดแผ่น ISO ผ่านอินเตอร์เน็ต โดยไม่ต้องดาวน์โหลดมาก่อนครับ

ภาพ: ไฟล์ ISO ของ Windows ถูก Map เป็น Drive M จาก Azure Blob Storage!

และที่แผลงที่สุดแล้ว เราสามารถ ติดตั้ง Windows โดยใช้ DISM โดยสั่งให้มันอ่าน .wim จาก ISO ที่เปิดมาได้โดยตรงเลย (ถ้าเป็น SSD/HDD ว่าง จะต้องรันคำสั่ง diskpart /s x:\diskpart-disk0.txt ก่อน สำหรับเครื่องที่ใช้ SSD Sata และ diskpart /s x:\diskpart-disk1.txt สำหรับเครื่องที่เป็น SSD NVMe ครับ สามารถตรวจสอบได้โดยใช้ diskpart และพิมพ์คำสั่ง list disk)

ภาพ: ติดตั้ง Windows ผ่าน Cloud ด้วย DISM สังเกตว่า ได้ความเร็วประมาณ 20Mbps (น่าจะอยู่ที่ข้อจำกัดของ Driver HTTPDisk ด้วย)

หรือวา่ จะรันโปรแกรม Setup Windows เลยก็ยังได้ (พิมพ์ว่า m:\setup.exe) มีหน้าจอกราฟฟิกให้ใช้งานง่าย แต่ว่าจะใช้เวลาในการโหลดนานกว่าสั่ง DISM เอง จริงๆ แล้ว Windows Setup ก็เป็นแค่หน้าจอเก็บข้อมูล แล้วมันมาเรียกให้ DISM ทำงานอีกทีหนึ่งครับ

แต่น่าเสียดายที่ มีบางครั้ง ยังมีโอกาสเกิด BSOD ได้ (NMI_HARDWARE_FAILURE - ทดสอบบน VM) น่าจะเพราะว่าตัว Driver ด้วยส่วนหนึ่งครับ

UPDATE: BSOD น่าจะเกิดจากผมใส่แรมใน VM ไว้น้อยเกินไป หรือว่าเปิด Dynamic Memory ไว้มากกว่าครับ ลองกับเครื่องจริงๆ สามารถติดตั้งได้จนจบ และใช้งานได้ครับ

อยากทำ/อยากใช้บ้างต้องทำอย่างไร?

ถ้าติดตามอ่านอย่างตั้งใจ ผมได้โพส Link ที่เกี่ยวข้องไว้เกือบทั้งหมดแล้ว น่าจะสามารถลองประยุกต์ได้ แต่ว่า เดี๋ยวอาจจะเขียนอีกโพสหนึ่งแยก เพื่ออธิบายวิธีการทำครับ (เราไม่สามารถแจกไฟล์ iPXE ได้ เพราะว่าตัว iPXE นี้จะไปดาวน์โหลดไฟล์ Windows PE ของเรามา ซึ่งว่ากันตามตรงแล้วคือห้ามการแผยแพร่ครับ และนอกจากนี้ ก็มีการเก็บไฟล์ ISO เอาไว้สำหรับติดตั้ง ซึ่งไฟล์ ISO ก็น่าจะห้ามแผยแพร่ต่อเหมือนกัน และแน่นอนว่า ถ้าลิงค์หลุดไป ทุกคนจะต้องมาถล่มดาวน์โหลดจาก Blob Storage ของเราแน่เยย)

สำหรับเครื่อง LEVEL51 ตั้งแต่เดือน ก.พ. เป็นต้นไป ทีมงานจะใส่ iPXE ที่เรา Customize ให้สามารถบูตผ่าน Internet แบบนี้ได้เอาไว้ให้เลยครับ สำหรับกรณีฉุกเฉิน ที่ต้องการลง Windows ใหม่แต่ไม่มีเครื่องที่สำรองสำหรับดาวน์โหลดแผ่น หรือเปิดใช้งาน Windows PE เพื่ออ่านไฟล์กรณีเข้า Windows ไม่ได้ครับ โดยเพียงแค่เข้า BIOS (กด F2) แล้วเลือก Launch UEFI Shell From File System Device ก็จะขึ้นเมนู LEVEL51 Boot System ตามภาพ 2 และบูตเข้า Windows PE ผ่านอินเตอร์เนตได้เลยครับ

สำหรับลูกค้าทุกท่าน สามารถหลังไมค์มาขอไฟล์ iPXE ตัวนี้ได้ครับ

เอาละครับ ขอขอบคุณมากที่ติดตามอ่านมาถึงตรงนี้ หวังว่าข้อมูลนี้ จะจุดประกายให้ลองไปทำเล่นดูเองบ้างที่บ้าน หรือที่ออฟฟิศนะครับ ;)

BLOG