ชื่อผู้แจ้ง : ชื่อผู้แจ้งข่าว admin     สถานีฯ admin      เวลาที่แจ้งข่าว แจ้งวันที่ : 6 เมษายน 2562 เวลา 14:12:55      ถูกเปิดอ่านแล้ว 114 ครั้ง  114 / 0 ครั้ง   ลดขนาดตัวอักษร ลดขนาดตัวอักษร 
ประเภท : [ บทความ ]      Control System      Raspberry Pi      Raspberry Pi
ชื่อเรื่อง :

ตั้งค่าการบูต Raspberry Pi ให้ไวขึ้น



รูปที่ 1 แสดงลำดับการเริ่มต้นการทำงานของบอร์ด Raspberry Pi


โดยปกติแล้ว Raspberry Pi ที่ใช้ระบบปฎิบัติการ Debian Stretch ถ้าทำงานบนบอร์ด Raspberry Pi 3 Model B+ จะใช้เวลาบูตตั้งแต่เริ่มจ่ายไฟจนถึงหน้า login จะอยู่ที่ประมาณ 30 วินาที ซึ่งก็ถือเป็นความเร็วที่ยอมรับได้ในการใช้งานทั่วไป แต่ในงานใช้งานบางประเภท เราอยากได้การเริ่มทำงานของ Raspberry Pi ที่เร็วมากขึ้น เช่น งานประเภท Headless ทำงานบางประเภท เช่น หุ่นยนต์ หรือ กล้องถ่ายภาพ 

วิธีที่นิยมกันสำหรับมืออาชีพคือการ compile system ขึ้นมาใหม่โดยเราสามารถเลือกได้ว่าต้องการใช้งาน module อะไรบ้าง เพื่อตัดสิ่งที่ไม่จำเป็นออกไป เพื่อให้ระบบสามารถพร้อมทำงานได้เร็วที่สุด แต่ก็ต้องมีความยุ่งยากในการทำการ compile จึงอาจไม่เหมาะกับมือใหม่ 

ในบทความนี้จึงเสนอทางเลือกที่สอง คือ การตั้งค่าปรับแต่งจากระบบปฎิบัติการเดิม เพื่อตัดส่วนที่ไม่จำเป็นต่อการใช้งานออก ซึ่งเราจะมาลงมือวิเคราะห์กันเป็นข้อๆว่าจะทำอย่างไร เพื่อให้ Raspberry Pi ของเราเริ่มทำงานได้อย่างรวดเร็วที่สุด โดยในขั้นตอนแรกของการลงมือเราต้องทำความเข้าใจขั้นตอนการเริ่มทำงานของระบบปฎิบัติการอย่าง Debian Stretch ว่ามีขั้นตอนการทำงานอย่างไรบ้าง ซึ่งเมื่อเข้าใจแล้วจะได้ทำการไปลดเวลาในส่วนต่างๆลงได้ โดยเวลาในการเริ่มทำงานนั้นขึ้นกับตัวแปรดังต่อไปนี้

1. Hardware ในส่วนนี้คือประสิทธิภาพของ Hardware ทั้งความเร็วของ CPU ,RAM และ SD Card ซึ่งเราทำได้แค่หา SD Card ที่เร็วกว่า Class 4 มาใส่

2. Bootloader หลังจากจ่ายไฟให้กับ Raspberry Pi แล้ว การเริ่มทำงานจะเริ่มจาก firmware ที่ฝั่งอยู่ใน  ROM ที่อยู่บน SoC ของ Raspberry Pi เริ่มต้นการทำงานของบอร์ด เพื่อทำการ mount file system ไปยัง /boot เพื่ออ่านไฟล์ “/boot/bootcode.bin” เพื่อสั่งให้ GPU เริ่มทำงานโดยจะไปโหลด GPU firmware จากไฟล์  "start.elf หลังจากนั้นจึงไปทำงานส่วนของ user code ต่อไป ซึ่ง bootloader นั้นจะเป็นไฟล์ไบนารี่เราจึงไม่สามารถไปแก้ไขได้นอกจากในส่วนของ “/boot/config.txt” ที่เป็นส่วนของ configuration บางส่วนเท่านั้น

3. Kernel ในเริ่มต้นการทำงานของ Kernel นั้นจะทำการอ่านไฟล์ “/boot/cmdline.txt ” ซึ่งเป็นไฟล์ parameter สำหรับ kernel แบบ command line เพื่อกำหนดค่าการทำงานบางส่วนของ kernel ได้

4. Userspace หลังจาก kernel โหลดเรียบร้อยแล้วโปรแกรมและบริการต่างๆหลังจากนั้นคือส่วนของ user space ซึ่งในระบบปฎิบัติการก็จะมีบริการต่างๆให้เราเรียกใช้งานได้ ซึ่งเราสามารถเปิดปิดให้ตรงกับความต้องการได้





รูปที่ 2 แสดงการเพิ่มบรรทัดสำหรับตั้งค่าไฟล์ “/boot/config.txt”

หลังจากเราเข้าใจกระบวนการในการเริ่มการทำงานของระบบ แล้วเราจะมาพิจารณาว่าจะสามารถปรับแก้ในส่วนใดบ้าง เพื่อลดระยะเวลาในการเริ่มระบบของเรา ดังนี้

1. แก้ไขไฟล์ “/boot/config.txt” เพื่อปรับแต่งค่าในส่วนของ bootloader

###############################

# ปิดแสดงหน้าต่างสี่เหลี่ยมสีรุ้งระหว่างบูต
disable_splash=1

# ปิดการใช้งาน Bluetooth ถ้าจะใช้งานไม่ต้องพิมพ์บรรทัดนี้
dtoverlay=pi3-disable-bt

#ปิดการใช้งาน WiFi ถ้าจะใช้งานไม่ต้องพิมพ์บรรทัดนี้
dtoverlay=pi3-disable-wifi


# Overclock  SD Card จาก 50MHz เป็น 100MHz
# ใช้ได้กับ SD Card UHS Class 1 ขึ้นไป 
dtoverlay=sdtweak,overclock_50=100

# ตั้งค่า bootloader delay เป็น 0 วินาที. ถ้าไม่กำหนดค่าเริ่มต้นจะเป็น 1
boot_delay=0

# Overclock the raspberry pi ตรวจดูให้แน่ใจว่า Power supply สามารถจ่ายกระแสได้เพียงพอ
force_turbo=1

###############################





รูปที่ 3 แสดงการเพิ่มบรรทัดสำหรับตั้งค่าไฟล์ “/boot/cmdline.txt”


2. แก้ไขไฟล์ “/boot/cmdline.txt” เพื่อบอก Kernel ให้ไม่ต้องพิมพ์สถานะการทำงานระหว่างเริ่มทำงานออกทางหน้าจอ ด้วยการเพิ่ม parameter “quiet” และอื่นๆเข้าไปในไฟล์ ก่อน parameter rootwait

เพิ่มข้อความ ใส่ไว้หน้า rootwait
quiet loglevel=0 logo.nologo vt.global_cursor_default=0 





รูปที่ 4 แสดงการดูลำดับขั้นและเวลาการเริ่มทำงานของบริการต่างๆ

3. ทำการตรวจสอบบริการที่โหลดทั้งหมด เพื่อทำการวางแผนยกเลิกบริการที่ไม่ได้ใช้ ด้วยคำสั่ง

systemd-analyze blame 





รูปที่ 5 แสดงการดูรายละเอียดของบริการต่างๆ


4. หากต้องการคำอธิบายของบริการต่างๆสามารถใช้คำสั่ง systemctl list-units --all เพื่ออ่านรายละเอียดได้ดังนี้

systemctl list-units --all | grep service | more


5. ทำการยกเลิกบริการที่ไม่ได้ใช้ด้วยคำสั่ง sudo systemctl disable เช่น 

sudo systemctl disable ntp.service
sudo systemctl disable dphys-swapfile.service
sudo systemctl disable keyboard-setup.service
sudo systemctl disable apt-daily.service
sudo systemctl disable wifi-country.service
sudo systemctl disable hciuart.service
sudo systemctl disable raspi-config.service
sudo systemctl disable avahi-daemon.service
sudo systemctl disable triggerhappy.service
sudo systemctl disable dhcpcd.service
sudo systemctl disable networking.service
sudo systemctl disable ssh.service





รูปที่ 6 แสดงการเปิดบริการต่างๆที่อาจถูกปิดไว้


6. หากต้องการเริ่มการบริการใดๆที่ยกเลิกไป สามารถทำได้ด้วยคำสั่ง sudo systemctl enable เช่น 

sudo systemctl enable ssh.service
sudo systemctl enable dhcpcd.service
sudo systemctl enable networking.service





รูปที่ 7 แสดงการดูเวลาการทำงานหลังจากยกเลิกบริการที่ไม่จำเป็นออกไปแล้ว


7. หลังจากสั่ง reboot raspberry pi แล้วสามารถตรวจสอบเวลาในการเริ่มต้นการทำงานได้ด้วยคำสั่ง systemd-analyze 

sudo systemd-analyze





รูปที่ 8 แสดงการยกเลิกการ mount /boot partition


8. เนื่องจาก /boot partition นั้นใช้เฉพาะในการเริ่มต้นการทำงานของระบบเท่านั้น จึงไม่ควร mount ในระบบอีกเราสามารถไปยกเลิกได้ด้วยการเข้าไปยังไฟล์  /etc/fstab แล้วทำการ comment ด้วยการใส่เครื่องหมาย # หน้าบรรทัดของ /boot  แล้วทำการเริ่มการทำงานเพื่อดูระยะเวลาการเริ่มทำงานอีกครั้ง





รูปที่ 9 แสดงการดูเวลาการทำงานหลังจากปรับลดการทำงานที่ไม่จำเป็นออกไปแล้ว


9. ทำการ remove package plymouth เพื่อ disable systemd init messages

sudo apt-get purge --remove plymouth


10. หลังจากขั้นตอนที่ผ่านมาทั้งหมดนั้น เมื่อทดสอบด้วยคำสั่ง systemd-analyze บน Raspberry Pi 3 Model B+ จะพบว่าระยะเวลาเริ่มทำงานของระบบปฎิบัติการจะลดลงมาต่ำมากในระดับน้อยกว่า 5 วินาที แต่ต้องแลกมาด้วยการปิด บริการต่างๆลงไปจำนวนมาก 





รูปที่ 10 แสดงการตั้งค่าเครือข่ายด้วยตัวเองหลังจากปิดบริการ DHCP ลงไป


    โดยสุดท้ายนี้จะขอฝากเกร็ดความรู้อีกเล็กน้อยสำหรับคนที่ทำตามแล้ว ต้องการใช้งานเครือข่ายอยู่ เนื่องจากเราปิดบริการ DHCP Client ไปแล้วหากเราต้องการใช้งานเครือข่ายเราสามารถเข้าไปเพิ่มหมายเลข IP ของเราเองได้ในไฟล์ /etc/network/interfaces ดังเช่นตัวอย่างนี้


iface eth0 inet static

address 192.168.1.100 //หมายเลข IP ของ Raspberry Pi

netmask 255.255.255.0

network 192.168.1.0 //หมายเลขเครือข่าย แก้ให้ตรงกันหมายเลข IP 3 ชุดหน้าแก้ให้ตรงกับ Pi

broadcast 192.168.1.255 // แก้ตัวเลขสามชุดหน้าให้ตรงกับ Pi

gateway 192.168.1.1 // แก้ตัวเลขสามชุดหน้าให้ตรงกับ Pi

dns-nameservers 10.0.0.1 8.8.8.8




จัดทำโดย คณะเจ้าหน้าที่บริษัท อสมท จำกัด ( มหาชน ) ผู้มีโอกาสเข้าร่วมอบรมเทคโนโลยีดิจิตอล ณ ประเทศญี่ปุ่น