Sunday, August 5, 2007

การ compile และ install kernel ของ FreeBSD 6.x

*** อันนี้เขียนไว้นานแล้ว แหละก็ไปแปะไว้ที่อื่น (ตอนนั้นยังไม่มี blog) ดังนั้นถ้าเคยเห็นอ่านแล้วก็อย่าแปลกใจนะ

ต้องบอกก่อนว่าเนื้อหาที่เขียนขึ้นมา หรืออาจจะเรียกว่าแปลก็ได้ เอามาจาก FreeBSD Handbook ทั้งหมด หัวข้อยังชื่อเหมือนกันเลย แต่จะพูดแบบสรุป และก็วิธีนี้สำหรับ FreeBSD 6.x นะ

Why Build a Custom Kernel?

โดยปกติ default kernel ที่มาจากแผ่น (GENERIC หรืออาจเป็น SMP) จะ support hardware จำนวนมาก การสร้าง kernel ของตัวเองนั้นส่วนมากจะให้ kernel ที่สร้างใหม่ support เฉพาะ hardware ที่มีอยู่ในเครื่อง ซึ่งจะมีข้อดีที่เห็นได้หลักๆ คือ
- boot เร็วขึ้น เพราะว่า kernel ทำการ probe hardware เฉพาะที่มันรู้จัก หรือเฉพาะที่อยู่ในเครื่อง
- ใช้ memory น้อยลง ซึ่งเหมาะกับระบบที่มี RAM น้อย
- ให้ support hardware เพิ่มเติมได้ เช่น sound cards, การทำ polling เป็นต้น

Building and Installing a Custom Kernel

directory ทั้งหมดที่เกี่ยวกับการสร้าง kernel นั้นจะอยู่ใน /usr/src/sys ซึ่งสามารถเข้าได้จาก /sys (เป็น soft link ชี้ไปยัง /usr/src/sys) และ subdirectories ที่สำคัญ ที่คุณต้องเข้าไปแก้ไข configuration file และ compile คือ arch/conf โดย arch คือ architecture ของเครื่องคุณ โดย FreeBSD จะมี i386, alpha, amd64, ia64, powerpc, sparc64, และ pc98

ในการสร้าง custom kernel จะสมมติว่าเครื่องของคุณเป็น i386 architecture และ default kernel คือ GENERIC ถ้าเครื่องของคุณเป็น architecture อื่น ต้องแก้ directory path ของ architecture ให้ตรงกับเครื่องของคุณ

ถ้าคุณไม่พบ /usr/src/sys ในเครื่องของคุณ แสดงว่าคุณยังไม่ได้ install kernel source ให้ install โดยทำตามขั้นตอนต่อไปนี้
- สั่ง sysinstall ด้วย root user จาก shell prompt
- เลือก Configure -> Distributions -> src
- เลือก base กับ sys
- เลือก OK ไปเรื่อยๆ แล้วเลือกว่าจะให้ลงจากที่ไหน (แนะนำให้ใช้จาก CD ที่ลง FreeBSD)
* การลง kernel source ยังมีอีกหลายวิธีนะ

ต่อไปจะเป็นการ copy configuration file ของ kernel โดยผมแนะนำให้เก็บตัวไว้ใน home directory ของคุณ ดังนี้
# cd /usr/src/sys/i386/conf
# cp GENERIC /root/MYKERNEL
# ln -s /root/MYKERNEL

โดยทั่วไป ชื่อ configuration file ของ kernel จะใช้ตัวใหญ่ทั้งหมด ซึ่งในที่นี้จะใช้ชื่อว่า MYKERNEL

ขั้นตอนต่อไป คือการแก้ไข MYKERNEL ตามที่ต้องการ โดยใน configuration file นั้นแต่ละบรรทัดจะมี keyword และค่าของมัน และอักษรที่ตามหลังเครื่องหมาย # จะหมายถึง comment

ใน configuration บรรทัดที่คุณต้องแก้ไขคือค่า ident ให้ตรงกับชื่อ kernel ที่คุณตั้ง เช่นในกรณีนี้คือ MYKERNEL ก็แก้เป็น
ident MYKERNEL

เกี่ยวกับค่าอื่นๆ และรายละเอียดเพิ่มเติมเกี่ยวกับ configuration file สามารถดูได้ที่ http://www.freebsd.org/doc/handbook/kernelconfig-config.html

หลังจากที่ได้ทำการแก้ไข configuration file ให้ทำการ compile และ install kernel ตัวใหม่ดังนี้
# cd /usr/src
# make buildkernel KERNCONF=MYKERNEL
# make installkernel KERNCONF=MYKERNEL

* ถ้าคุณตั้งชื่อ KERNEL เป็นชื่ออื่น ให้แก้ MYKERNEL ไปตามชื่อที่คุณตั้ง

หลังจาก install kernel เสร็จ kernel ตัวใหม่จะอยู่ที่ /boot/kernel และตัวเก่าจะอยู่ที่ /boot/kernel.old เนื่องจากถ้ามีการ install kernel ใหม่อีกครั้ง kernel.old จะถูกทับ แนะนำให้ทำการเก็บ kernel เก่าไว้ดังนี้
# mv /boot/kernel.old /boot/kernel.GENERIC

ต่อไป ก็คือ restart เครื่อง
# shutdown -r now

If Something Goes Wrong

ปัญหาที่พบส่วนมากจากการ compile kernel ใหม่เอง สามารถดูรายละเอียดได้จาก http://www.freebsd.org/doc/handbook/kernelconfig-trouble.html

ในที่นี้จะขอเอามาเฉพาะเมื่อไม่สามารถ boot ด้วย kernel ตัวใหม่ได้ หรืออาจจะมีปัญหากับ kernel ตัวใหม่ต้องการกลับไปใช้ตัวเก่า

เมื่อไม่สามารถ boot ด้วย kernel ตัวใหม่ให้ทำต่อไปนี้
- ที่ boot loader ให้เลือก option ที่ 6 "Escape to loader prompt"
- เมื่อได้ prompt ให้พิมพ์ unload kernel
- แล้วพิมพ์ boot /boot/kernel.old/kernel (ถ้าทำตามข้างบนคือเปลี่ยน kernel เก่าเป็น kernel.GENERIC ก็ใช้ boot /boot/kernel.GENERIC/kernel)

หลังจาก boot ด้วย kernel ตัวเก่า คุณสามารถดู error ได้จาก boot ที่ /var/log/messages แล้วแก้ไข configuration file และ compile kernel ใหม่ หรือถ้าคุณต้องการกลับมาใช้ kernel ตัวเก่า สามารถทำได้ดังนี้
# mv /boot/kernel /boot/kernel.bad
# mv /boot/kernel.good /boot/kernel

โดยแทนที่ kernel.good ด้วย kernel path ของตัวเก่าที่เก็บไว้

13 May 2007

Reference:
[1] FreeBSD Handbook :Chapter 8 Configuring the FreeBSD Kernel
, http://www.freebsd.org/

No comments:

Post a Comment