Powered by Drupal, an open source content management system

การประยุกต์ใช้งาน Embedded Linux Computer (ตอนที่ 7 - ชุบชีวิต)

สำหรับตอนนี้จะว่าถึงเรื่องที่สำคัญสองอย่าง
1. วิธีการกู้ชีพของRouterของเราในกรณีที่พลาดท่าBrickไป และวิธีเดียวกันนี้ยังใช้สำหรับการเปลี่ยนFirmwareได้ด้วย ไม่ว่าจะเป็นการอัพเกรดFirmware ของ OpenWrt ไปเป็นตัวใหม่ หรือ แปลงร่างจากOpenWrtกลับไปเป็นLinksys Firmware

2. การเซ็ทอัพให้WRT54Gของเราติดต่อกับระบบเน็ทเวิร์คหลักในบ้านผ่านWireless (จำได้ไม๊ครับ โจทย์ผมคือจะเอาWRT54Gไปใช้ในโรงรถซึ่งผมไม่ต้องการเดินสายเน็ทระโยงระยาง และต้องการติดต่อจากโลกภายนอกผ่านอินเตอร์เน็ทจากเครือข่ายอินเตอร์เน็ทในบ้านที่ผมมีอยู่แล้ว ด้วยเหตุนี้จึงได้เลือก Wireless Router มาเป็นตัวหลัก)

 
มาเข้าใจโครงสร้างหน่วยความจำกันสักนิด
 
ก่อนที่เราจะขยับต่อไป ลองมาทำความเข้าใจโครงสร้างของหน่วยความจำที่ใช้บนบอร์ดกันสักนิดนะครับ หลักๆบอร์ดตัวนี้จะประกอบไปด้วย Flash Memory และ RAM   สำหรับRAMไม่มีอะไรมากครับ ทำหน้าที่เหมือน RAM ในระบบ Embeded Systemทั่วไป แต่ที่สำคัญและน่าสนใจคือ Flash memory
Embedded Linux ไม่ได้มอง Flash memory เหมือนอย่าง Embedded System ทั่วไป แต่จะมองผ่านซอฟแวร์ตัวนึงที่ทำหน้าที่เป็น Device Driver ทำให้การมอง Flash Memory เป็นเหมือนฮาร์ดดิสตัวนึงที่มีการแบ่งส่วนเป็น Partition ซอฟแวร์ที่ว่าคือ MTD (Memory Technology Device) สามารถหาอ่านรายละเอียดเพิ่มเติมได้จาก http://www.linux-mtd.infradead.org/faq/general.html
ผมคงไม่ไปลงในรายละเอียดว่า mtd คือยังไง เพราะหาอ่านได้จากลิงค์ข้างต้น แต่สำหรับเราเอาเป็นว่าด้วย mtd เรามอง Flash Memory เหมือน ฮาร์ดดิสก็แล้วกันนะครับ เราสามารถตรวจสอบได้ด้วยคำสั่ง
 
root@OpenWrt:/# cat /proc/mtd
 
Tips สำหรับมือใหม่หัดขับ
cat - concatenate files and print on the standard output เป็นคำสั่งคล้าย type ของ Dos
proc เป็น directoty ที่บรรจุข้อมูลเกี่ยวกับ อุปกรณ์ต่างๆที่เชื่อมต่อกับระบบ โดยจะเปลี่ยนแปลงไปตามอุปกรณ์ที่มาต่อกับระบบ
 
ซึ่งปรากฏผลดังนี้
dev:    size   erasesize  name
mtd0: 00040000 00010000 "cfe"
mtd1: 003b0000 00010000 "linux"
mtd2: 00166000 00010000 "rootfs"
mtd3: 00010000 00010000 "nvram"
mtd4: 001d0000 00010000 "rootfs_data"
 
 
Flash memory จะถูกแบ่งเป็น 5 partitions ดังนี้
- cfe (Common Firmware Environment) จะเป็น Boot Loader ของระบบ เรายังติดต่อกับ cfe ไม่ได้จนกว่าจะเพิ่ม Serial portให้กับ Router :) ปกติส่วนนี้จะถูกลีอกเอาไว้ ไม่ได้ลบหรือเขียนทับ เพื่อที่ว่าหากเราพลาดท่าไป ยังมี Boot Loader ให้กู้สิ่งต่างๆคืนมา
 
- linux เก็บ Kernel ของ Linux
- rootfs เก็บ Linux Root File System
หมายเหตุ จำไฟล์ .bin หรือ .trx ที่เราสร้างในขั้นตอนการ make แล้วนำมา upload เพื่อเปลี่ยน firmware ได้ไม๊ครับ ไฟล์นั้นก็คือ linux + rootfs นี่เองครับ
 
- nvram เก็บค่าเซ็ทอัพต่างๆของระบบ
 
- rootfs_data เป็นเนื้อที่ใช้สอยคล้ายๆฮาร์ดิส เช่นเราสามารถสร้างเวบเพจ แล้วบันทึกลงไปในส่วนนี้ได้ เมื่อปิดแล้วเปิดเครื่อง ข้อมูลเวบเพจนั้นจะไม่หายไป
 
Tips
ระบบ Linux ประกอบด้วยสองส่วนใหญ่ๆที่สำคัญนั่นคือตัว Kernel ที่เปรียบเสมือนมันสมอง และ Root File System คือระบบไฟล์ต่างๆที่ประกอบรวมตัวกัน เปรียบเสมือนแขนขาร่างกาย ทั้งสองส่วนนี้จะขาดซึ่งกันและกันไม่ได้ ตัวKernelนั้นในแต่ละ Distributionจะแตกต่างกันไปไม่มาก แต่สิ่งที่ทำให้แต่ละDistributionแตกต่างกันไปเป็น Redhat, Debian, Ubuntu, Slackware อื่นๆอีกมากมาย ก็คือ Root File System นั่นเองครับว่าจะบรรจุอะไรลงไป เวลาวิ่งแล้วจะใช้ Window Managerตัวไหน
 
เอาล่ะครับ พอเข้าใจโครงสร้างของ Partition บน Flash แล้วนะครับ ต่อไปคือเรื่องที่สำคัญและควรทำเป็นอันดับแรกเมื่อมีการเปลี่ยน Firmware นั่นคือ จัดการกับ boot_wait !!!!
 
boot_wait นั้นสำคัญไฉน
 
 
ในการใช้งานตามปกติ เมื่อมีการจ่ายไฟให้กับระบบ cfe จะเริ่มทำงานก่อนเป็นอันแรกเนื่องจากเป็นบูทโหลดเดอร์ cfe จะทำการโหลด kernel จาก linux partition จากนั้น cfe ก็ส่งไม้ต่อให้กับ kernel ทำงาน สุดท้ายแล้ว kernel จะทำการเชื่อมต่อ root file system เข้ากับระบบ และส่งต่อไปให้โปรแกรมแรกของ linux ทำงาน นั่นก็คือ init จากนั้นกลไกทุกอย่างก็จะทำงานไปตามปกติ
 
หากมีความผิดปกติเกิดขึ้นกับ linux partition หรือ rootfs partition ที่อาจจะเกิดจากการแก้ไขไฟล์ที่สำคัญของระบบผิดพลาดไป หรือการ flash firmware ที่เสียเข้าไป หรือมีการ set ค่าบางอย่างใน nvram ให้ระบบทำงานผิดพลาดไป ก็จะทำให้เครื่องของท่านแน่นิ่งโคม่าไม่ตอบสนองใดๆทั้งสิ้น หรือที่เรียกว่า brick นั่นเอง
 
เมื่อเกิดเหตุการbrickขึ้น เราก็ต้องหาทางเอา image file ที่ดีใส่กลับเข้าไปใน linux และ rootfs partition วิธีการก็คือ ในขณะที่ cfe เริ่มทำงานในตอนแรกๆเราสามารถ set ให้ cfe มองหาว่ามีการส่งข้อมูลเข้ามาให้กับ ip address 192.168.1.1 จาก lan portด้วย tftp หรือเปล่า ถ้ามีก็ให้ทำการเอาข้อมูลนั้น flash เข้าไปยัง linux และ rootfs partitionก่อนทำงานในขั้นต่อไป แต่ cfe จะมองหา tftp ก็ต่อเมื่อต้อง set ค่าตัวนึงใน nvram นั่นก็คือ boot_wait นั่นเอง นอกจากนี้เราควรเซ็ท wait_time ด้วยคือบอกว่าจะให้รอนานเท่าไหร่ เมื่อแก้ไขแล้วก็ใช้คำสั่ง nvram commit เพื่อบันทึกลง nvram partition อย่างฐาวร ดังนั้นหากมีการเปลี่ยนแปลง firmware ใหม่ ให้ยืนยันด้วยสามคำสั่งนี้
 
# nvram set boot_wait=on
# nvram set wait_time=10
# nvram commit
 
วิธีที่ใช้ตรวจสอบว่าข้อมูลบันทึกถูกต้องหรือเปล่าโดยทำการรีบูทระบบสักรอบก่อนด้วยคำสั่ง
 
# reboot
 
หลังจากนั้นกลับเข้าไปใหม่ด้วยการ telnet 192.168.1.1 ใน DOS Prompt แล้วพิมพ์คำสั่ง
 
# nvram show
 
ซึ่งจะแสดงค่าทุกตัวที่ระบบเก็บไว้ หรือเราสามารถลดปริมาณข้อมูลที่จะแสดงได้ด้วยคำสั่ง
 
# nvram show | grep wait
 
จะมองหาresult จากการ nvram show เฉพาะบรรทัดที่มีคำว่า wait
หมายเหตุ ในบางกรณีที่ทำคำสั่ง nvram commit แล้วมี error (ส่วนตัวเจอเมื่อทำการ flash ไปมาระหว่าง firmware หลายๆยี่ห้อ เช่น linksys, openwrt, ddwrt) ให้ใช้คำสั่งนี้
 
# mtd -r erase nvram
 
เพื่อลบ nvram partition แล้วระบบจะทำการสร้าง nvram partitionใหม่ให้โดยอัตโนมัติ แล้วค่อยกลับเข้ามา set boot_wait อีกครั้งหนึ่ง
 
เอาล่ะครับ เรามีเครื่องกระตุ้นหัวใจยามโคม่าแล้ว ได้เวลาลองของกันเลยครับ ทำไมถึงกล่าวเช่นนั้น เพราะเนื่องจากว่าเราได้คอมไพล์ Image File โดยใช้ Linux kernel 2.6 โดยหวังว่าจะได้ใช้ของล้ำยุค เมื่อทำการ set up wireless connection กับระบบหลักของบ้าน ปรากฏว่าDevice Driverที่เกี่ยวกับ Wireless มีบั๊กและไม่มีเสถียรภาพในการใช้งาน หลังจากปลุกปล้ำกับมันมาหนึ่งคืน ปรากฏว่าฟลุ๊คๆต่อได้หนนึง และไม่รู้ว่าทำไมถึงได้ ผมเลยตัดสินใจจะย้ายกลับไปใช้ Kernel 2.4 ที่มีเสถียรภาพดีกว่า นอกจากนี้เมื่อไปตรวจสอบ Routerหลักในบ้านที่ใช้ต่อเน็ทรุ่น WRT310N ที่เปิดใช้งานตลอด 24 ชั่วโมงมาเป็นปีๆ โดยไม่มีปัญหาก็ปรากฏว่าใช้ kernel 2.4 ดังนั้นจึงขอย้ายกลับไปใช้ Kernel 2.4 ดีกว่า
 
ปฎิบัติการเปลี่ยนร่างOpenWrtจาก Kernel 2.6 ไปเป็น Kernel 2.4
 
เริ่มต้นเราก็ต้องCompile Kernelสร้าง Image กันใหม่ จำได้ไม๊ครับว่าทำยังไง จำไม่ได้ย้อนกลับไปดูตอนที่ 4 ประกอบนะครับ
1. Start VirtualBox แล้ววิ่ง Ubuntu แล้วเข้าโปรแกรม Terminal
2. ทำการ update source code และล้างระบบก่อนด้วย
 
$ cd ~/openwrt/kamikaze
$ svn update
$ make clean
 
3. แก้ไขสูตรการสร้าง Kernel ด้วย
 
$ make menuconfig
 
แล้วเลือก Target system เป็น 2.4 ดังภาพ
 
ออกจากโปรแกรมแล้วเลือก save config
 
4. เริ่มต้นการสร้าง Image file ใหม่อีกครั้งด้วยคำสั่ง make
 
 
เอาล่ะครับ สามชั่วโมงผ่านไปไวเหมือนโกหก เราก็จะได้ไฟล์ชุดใหญ่ๆภายใต้ ~/openwrt/kamikaze/bin/  เลือกไฟล์ที่เหมาะสมกับrouterของเราในกรณีนี้คือ openwrt-wrt54g-squashfs.bin ทำตามตอนที่ 5 เพื่อย้ายไฟล์นี้ไปยัง share directory ที่เราสร้างไว้
 
Flash router ด้วย cfe
 
เอาล่ะครับ ได้เวลาflash ด้วย cfe กันเสียที อันที่จริงผมชอบวิธีนี้มากกว่าวิธีใดๆ เนื่องจากการแฟลชทำได้เร็วกว่าวิธีอื่นๆ
 
1. ปิด wifi ของเครื่องคอมพ์ ปลดตัวเองออกจากระบบเน็ทเวิร์คใดๆในบ้าน
2. ต่อสายเน็ทจากตัวคอมพ์เข้ากับ port 1-4 อันใดอันหนึ่งโดยตรง
3. เข้า DOS Prompt แล้วพิมพ์ ipconfig
4. ตรวจสอบว่า ip address ของ Local Area Connection เริ่มต้นด้วย 192.168.1 หาก  ip address ของคอมพิวเตอร์ไม่เริ่มต้นด้วย 192.168.1 ให้ลองทำดังนี้
 
คลิ๊ก Start/Control panel แล้ว double click ตรง  Network Connections จากนั้นมองหา Local Area Connection แล้ว Double Click จะปรากฏหน้าต่าง Local Area Connection Status ให้คลิ๊ก Properties
Double click ตรง Internet Protocol แล้วกำหนด ip address ให้กับ card ในกรณีของผม ผมเลือกใช้ 192.168.1.7
 
 
 
แล้วคลิ๊ก OK สองหน แล้วก็ Close
 
5. เปิดหน้าต่าง DOS Prompt สองตัวพร้อมกันแล้วพิมพ์คำสั่งในหน้าต่างแรกโดยยังไม่ต้อง enter ดังนี้
 
ping -t -w 10 192.168.1.1
 
ในหน้าต่างที่สอง ให้ไปยัง directory ที่เก็บ Image file openwrt-wrt54g-squashfs.bin ที่เราจะใช้ flash (ในกรณีของผมคือ c:\openwrt\bin24) แล้วพิมพ์คำสั่งดังนี้รอไว้โดยยังไม่กด enter
 
tftp -i 192.168.1.1 PUT openwrt-wrt54g-squashfs.bin
 
 
 
 
6. ให้ถอดไฟออกจาก Router แล้วรอสิบวินาที จากนั้น
6.1 ให้กด Enter ยังหน้าต่างแรก
6.2 คลิ๊กเมาส์เลือกหน้าต่างที่สองรอไว้ แต่อย่าเพิ่งกด Enter
6.3 เสียบไฟเข้ากับ Router รอจังหวะวินาทีที่ท่านเห็น Reply from 192.168.1.1 ให้กด Enter ในหน้าต่างที่สองอย่างรวดเร็วปานกามนิตหนุ่ม 
6.4 ถ้าท่านทำสำเร็จ ท่านจะเห็นข้อความ Transfer Successful ให้รอโดยไม่ต้องทำอะไรสักครู่ เพราะ Router จะทำการเขียนแฟลชใหม่ จัดระบบต่างๆใหม่ ในระหว่างนี้อย่าปิดไฟที่จ่ายหรือทำอะไรกับrouterอย่างเด็ดขาด!!!
6.5 หากท่านไม่เห็นข้อความในข้อ 6.4 แสดงว่าท่านไม่ไวพอ ก็กลับไปเริ่มต้นใหม่ที่ข้อ 5 ครับ
 
 
7. รอจนไฟที่แผงหน้าปัดหยุดกระพริบแล้วลองติดต่อ router ด้วยคำสั่งใน DOS Promt
telnet 192.168.1.1
ควรจะได้ดังภาพ
 
 
ใช้คำสั่ง
 
# uname -r
ควรจะเห็นตัวเลข 2.4.37.5 ซึ่งเป็น version ของ kernel ก็ยินดีด้วยครับที่ประสบความสำเร็จในการแปลงร่าง
 
ดึกแล้วคุณขา..... ขอยกยอดการต่อWireless เข้ากับระบบอินเตอร์เน็ทหลักไว้ตอนหน้าครับ อ้ออย่าลืม set boot_wait ให้ on ไว้นะครับตามสูตรที่ให้ไว้ .....