หน้าเว็บ

วันเสาร์ที่ 31 กรกฎาคม พ.ศ. 2553

วิธี Compile Linux kernel 2.6 บน Ubuntu 10.04

ในบางคราวเราอาจจะต้องคอมไพล์ Linux Kernel เพื่อเพิ่มฟังก์ชันอะไรบางอย่าง หรือเพื่ออยากรู้อยากลองก็มีวิธีการดังต่อไปนี้ครับ (ผมทำบน Ubuntu 10.04)
1. ดาวน์โหลด source code ของ kernel มาก่อน โดยสามารถดาวน์โหลดได้ที่ http://www.kernel.org/ โดยที่ผมทำจะใช้เป็นรุ่น 2.6.34.1 ครับ
แตกไฟล์แล้วเอาโฟลเดอร์ linux-2.6.34.1 ไปไว้ใน /usr/src ซึ่งเป็นโฟลเดอร์ที่นิยมใช้เก็บ source ของ kernel

2. เตรียมเครื่องมือ ได้แก่ kernel-package, fakeroot, ncurses (อันไหนมีแล้วก็ไม่ต้องโหลดเพิ่ม แต่ถ้าอันไหนมันฟ้องว่ายังขาดก็โหลดเพิ่มนะครับ :P)
sudo apt-get install kernel-package fakeroot libncurses5-dev

3. ทำการ configure kernel
ไปที่โฟลเดอร์ source ของเรา /usr/src/linux-2.6.34.1 แล้วสั่ง configure โดยสั่งได้ 3 รูปแบบ
วิธีแรกเป็นแบบ text-based
make menuconfig

วิธีที่สองถ้ามี Qt
make xconfig

วิธีที่สามถ้ามี Gtk
make gconfig

ก็เลือกตามสะดวกครับ ถ้าคิดไม่ออกก็เลือกวิธีแรกก็ได้
โดยใน menu สำหรับ configure นั้นจะมีอะไรให้เราเลือกมากมายครับก็เลือกตามที่ต้องการ แต่ถ้าไม่แน่ใจว่าคืออะไรก็ปล่อยเป็นค่า default ก็ได้ครับ

4. Compile Kernel
ในกรณีถ้าเครื่องมีหลาย cpu และต้องการให้คอมไพล์เร็วขึ้นให้สั่ง
export CONCURRENCY_LEVEL=3
โดยตัวเลขให้ใช้ จำนวนcpuที่มี + 1 (ในกรณีนี้ผมมี 2 cpu (2 core) เลยเป็น 3)

แล้วสั่ง
make-kpkg clean
fakeroot make-kpkg --initrd --append-to-version=-some-string-here kernel-image kernel-headers

โดย -some-string-here ใส่เป็นอะไรก็ได้เพื่อบอก version ของเรา เช่นของผมจะใส่ว่า -ping2p (ต้องขึ้นต้นด้วยเครื่องหมาย - และห้ามมีเว้นวรรค)

แล้วก็รอมันคอมไพล์ไป ระหว่างนี้ก็ไปอาบน้ำ อ่านหนังสือ กินข้าว รอจนกว่ามันจะเสร็จนะครับ ถ้าเสร็จแล้วลองดูที่โฟลเดอร์ /usr/src จะมีไฟล์ 2 ไฟล์คือ linux-image-2.6.34.1-ping2p_2.6.34.1-ping2p-10.00.Custom_i386.deb และ linux-headers-2.6.34.1-ping2p_2.6.34.1-ping2p-10.00.Custom_i386.deb (ในกรณีที่ compile แล้ว error เพราะ permission denied ให้ลองเปลี่ยน permission ของโฟลเดอร์ /usr/src ให้สามารถ write ได้ แล้วลองคอมไพล์ใหม่อีกรอบ (แต่จะใช้เวลาไม่นานเหมือนครั้งแรก เพราะหลายๆอย่างคอมไพล์เสร็จแล้ว))

5. Install
คราวนี้ก็จะทำการ Install kernel ใหม่นี้ โดยทำเป็น Option ให้เลือกตอน boot เผื่อเกิดอะไรผิดพลาดจะได้เรียกของเก่ากลับมาได้
ไปที่โฟลเดอร์ /usr/src จะพบ kernel ใหม่ที่เราคอมไพล์ แล้วให้ทำการติดตั้งดังนี้
sudo dpkg -i linux-image-2.6.34.1-ping2p_2.6.34.1-ping2p-10.00.Custom_i386.deb
sudo dpkg -i linux-headers-2.6.34.1-ping2p_2.6.34.1-ping2p-10.00.Custom_i386.deb


*** ในกรณี Ubuntu 10.04 จะมี bug โดยไม่ยอม initramfs มาให้ ให้สร้างเอง โดยในโฟลเดอร์ /usr/src ให้สั่ง sudo update-initramfs -c -k 2.6.34.1-ping2p (ใส่ version และชื่อตามรุ่นที่เราคอมไพล์และตั้งชื่อไว้ตอนแรก) เสร็จแล้วให้ลองตรวจสอบใน /boot ดูจะมีไฟล์ initrd.img2.6.34.1-ping2p, System.map-2.6.34.1-ping2p และ vmlinuz-2.6.34.1-ping2p ออกมา

6. ตรวจสอบ Bootloader
เพื่อให้แน่ใจว่าตอน boot แล้วจะมี kernel ใหม่ให้เลือก ให้ลองตรวจสอบ bootloader ดู ซึ่งแล้วแต่ว่า bootloader เป็น grub หรือ lilo
ในกรณีของผมเป็น grub2 ก็ไปดูที่ไฟล์ /boot/grub/grub.cfg (แต่ถ้าเป็น grub 1 จะอยู่ใน /boot/grub/menu.lst) จะมี kernel ใหม่อยู่

*** ลองตรวจสอบว่าตรงรายการ kernel ใหม่นั้นมีบรรทัด initrd /boot/initrd.img-2.6.34.1-ping2p อยู่หรือไม่ ถ้าไม่มีให้ใส่เพิ่มเข้าไป (ตัวที่เป็น recovery mode ก็เช่นกันให้ใส่เข้าไปด้วย) ส่วนบรรทัดที่ขึ้นต้นด้วย linux /boot/vmlinuz-2.6.34.1-ping2p ให้ลองเปลี่ยนค่า root=/dev/sda5 เป็น root=UUID=..... โดยค่า UUID ให้ใช้ค่าที่อยู่ใน option --fs-uuid --set .... ที่อยู่ในบรรทัดข้างบน เช่นของผมจะเป็น
menuentry 'Ubuntu, with Linux 2.6.34.1-ping2p' --class ubuntu --class gnu-linux --class gnu --class os {
recordfail
insmod ext2
set root='(hd0,5)'
search --no-floppy --fs-uuid --set 54c8e93d-971f-4197-8a08-b9e131d1becf
linux /boot/vmlinuz-2.6.34.1-ping2p root=UUID=54c8e93d-971f-4197-8a08-b9e131d1becf ro quiet splash
initrd /boot/initrd.img-2.6.34.1-ping2p
}


เป็นอันเรียบร้อยครับ ลอง reboot ดู ตัว bootloader ของเราจะมี option kernel ตัวใหม่ของเราอยู่ด้วย

ระบบที่ทดสอบ
OS: Ubuntu 10.04
Kernel: Linux 2.6.34.1

อ้างอิง
http://www.howtoforge.com/kernel_compilation_ubuntu
http://linuxtweaking.blogspot.com/2010/05/how-to-compile-kernel-on-ubuntu-1004.html
http://www.cyberciti.biz/tips/compiling-linux-kernel-26.html

ไม่มีความคิดเห็น: