คอมไพล์เคอร์เนลสไตล์เดเบียน
ตามที่คุยกันใน กระทู้ เกี่ยวกับ kernel ในเดเบียน ก็จะมาเขียนบันทึกเกี่ยวกับการคอมไพล์เคอร์เนลในแบบของเดเบียนนะครับ
เดเบียนมี kernel image คอมไพล์สำเร็จมาให้แล้ว ในแพกเกจ kernel-image-version-revision สำหรับ sarge หรือ linux-image-version-revision สำหรับ etch (เช่น linux-image-2.6.18-1-686) โดยจะเปิดตัวเลือกแบบครอบจักรวาล และ build module ทั้งหมด เพื่อให้ใช้ได้กับทุกเครื่อง แต่ถ้าคุณต้องการหรือจำเป็นต้องคอมไพล์ใช้เอง ก็จะมีวิธีคอมไพล์ในแบบฉบับของเดเบียน โดยสร้างเป็น deb package ที่สามารถใช้ติดตั้งซ้ำได้หลายครั้ง
* สรุปขั้นตอนการคอมไพล์และติดตั้ง
แพกเกจเครื่องมือคอมไพล์เคอร์เนลก็คือ kernel-package และถ้าคุณใช้ menuconfig ก็จะต้องการ libncurses-dev ด้วย
# aptitude install kernel-package libncurses-dev
สำหรับซอร์สของเคอร์เนล คุณสามารถติดตั้งจากแพกเกจของเดเบียน หรือจะดาวน์โหลดจาก kernel.org ก็ได้ แต่โดยทั่วไป คงใช้ของเดเบียนมากกว่า
# aptitude install linux-source-2.6.18
ซึ่งจะติดตั้งซอร์สในรูปของ tarball ไว้ที่ /usr/src เราก็ไปแตกซอร์สซะ:
$ cd /usr/src
$ tar xjf linux-source-2.6.18.tar.bz2
จากนั้น ก็ตั้งค่าเคอร์เนลตามปกติ โดยใช้ menuconfig (หรือถ้าเคยคอมไพล์มาแล้วในรุ่นก่อน ก็อาจจะ copy config มา แล้ว make oldconfig ตามแต่กรณี):
$ cd linux-source-2.6.18
$ make menuconfig
แล้วก็ลงมือคอมไพล์:
$ make-kpkg clean
$ fakeroot make-kpkg kernel_image
มันจะคอมไพล์และสร้าง linux-image-2.6.18_2.6.18-10.00.Custom_i386.deb ที่ไดเรกทอรีชั้นถัดขึ้นไป เราก็สามารถติดตั้งได้เลย
$ cd ..
$ su
# dpkg -i linux-image-2.6.18_2.6.18-10.00.Custom_i386.deb
จากนั้น ตรวจสอบว่าต้องอัปเดตเมนูของ bootloader หรือไม่ โดยถ้าใช้ grub ก็สั่ง:
# update-grub
หรือถ้าใช้ lilo:
# lilo
แล้วก็บูตเครื่องใหม่
* เกร็ดของคำสั่ง
เกร็ดของการสั่งคอมไพล์ที่ควรกล่าวถึง จะอยู่ตรงบรรทัดนี้:
$ fakeroot make-kpkg kernel_image
คำสั่ง fakeroot เป็นคำสั่งที่จำเป็นต้องใช้ในการ build deb โดยทั่วไป
ไม่เฉพาะแพกเกจของเคอร์เนล เนื่องจากในการสร้างแพกเกจ จะต้องมีการ chown
แฟ้มต่างๆ ให้เป็นของ root ก่อนที่จะแพ็ก ซึ่งการ chown ดังกล่าว
โดยปกติจะต้องการสิทธิ์ของ root (สังเกตว่า ตลอดกระบวนการคอมไพล์
ผมใช้สิทธิ์ผู้ใช้ปกติ โดยพรอมต์จะเป็น $ ไม่ใช่ #
แต่ถ้าคุณคอมไพล์ขณะเป็น root คำสั่ง fakeroot ก็ไม่จำเป็น แต่คุณก็รู้
ว่าใส่เสื้อเบอร์ S พร้อมกางเกงในทับข้างนอกตลอดเวลา
มันประเจิดประเจ้อแค่ไหน) แต่คำสั่ง fakeroot จะ override system call
บางตัว เช่น chown(), stat() เพื่อทำให้ดูเหมือน chown ได้ภายใน
environment ที่เรียก แต่ไม่ได้เกิดขึ้นจริงใน file system เช่น คุณสั่ง chown root.root x แฟ้ม x
ก็จะปรากฏใน environment ที่เรียกว่าเป็นของ root แต่ถ้าออกมาดูที่ file
system จริง จะไม่มีการ chown เกิดขึ้นแต่อย่างใด ดังนั้น
ไม่ต้องกลัวชื่อคำสั่ง
ที่ทำให้ดูเหมือนสร้างช่องโหว่ในระบบรักษาความปลอดภัย
ทุกอย่างยังอยู่ในการควบคุม สิ่งที่เกิดขึ้น
แค่ทำให้เพียงพอต่อการสร้างแพกเกจเท่านั้น
แน่นอนว่ามีอีกทางเลือกหนึ่งที่สามารถใช้แทน fakeroot ได้ คือ sudo ซึ่งจะเป็นการเปลี่ยนแปลงใน file system จริงๆ ก่อนแพ็ก ผลที่ได้ ก็ไม่ต่างกันมากนัก แต่ผมคิดว่า ใช้ fakeroot ปลอดภัยกว่า
ส่วนที่เหลือ คือการสั่ง make-kpkg ซึ่งมีตัวเลือกที่สามารถเพิ่มเติมได้ เช่น
--append-to-version foo- ใช้สำหรับเพิ่มส่วนต่อท้ายเวอร์ชันของเคอร์เนล ซึ่งจะปรากฏในคำสั่ง
uname -r --revision x- ใช้กำหนด revision ของ deb ที่จะสร้าง ซึ่งจะมีผลสำหรับการนับรุ่นแพกเกจเท่านั้น ไม่มีผลต่อ image ที่ติดตั้ง
--initrd- กำหนดว่าจะ build initial RAM drive (initrd) image ด้วย
ตัวอย่างเช่น ถ้าคุณสั่ง:
# fakeroot make-kpkg --append-to-version -686-smp --initrd \
--revision 10.01 kernel_image
คุณจะได้ linux-image-2.6.18-686-smp_2.6.18-10.01_i386.deb ออกมา ซึ่งเมื่อติดตั้งแล้ว ตรวจสอบรุ่นของเคอร์เนลด้วย uname -r จะได้ผลลัพธ์เป็น 2.6.18-686-smp
* สิ่งที่จะ build
นอกจาก kernel_image แล้ว make-kpkg ยังสามารถ build แพกเกจอื่นได้อีก โดยสั่งเป็นอาร์กิวเมนต์ในบรรทัดคำสั่ง เช่น
modules_image- ในกรณีที่ติดตั้งแพกเกจซอร์สของมอดูลของเคอร์เนล (เช่น sl-modem-source) ซึ่งเมื่อแตก tarball แล้ว จะติดตั้งตัวเองไว้ที่
/usr/src/modulesเมื่อสั่งmake-kpkg modules_imageจะไปคอมไพล์และสร้าง deb ของแพกเกจเหล่านั้น แต่หลังจากมีแพกเกจmodule-assistantแล้ว วิธีนี้เริ่มจะเลิกใช้กันแล้วเหมือนกัน kernel_headers- ใช้สร้างแพกเกจ
linux-headers-versionซึ่งจะติดตั้งเฉพาะ header สำหรับการคอมไพล์มอดูล แพกเกจนี้จำเป็นเมื่อคุณคอมไพล์เคอร์เนลแจกจ่ายชาวบ้านเท่านั้น ถ้าคุณคอมไพล์ใช้เอง การมีซอร์สของเคอร์เนลอยู่ ก็ถือว่าเหลือเฟือ kernel_source- ใช้สร้างแพกเกจ
linux-source-versionอาจจะได้ใช้เมื่อคุณคอมไพล์เคอร์เนลที่มีการแพตช์เพิ่มเพื่อแจกจ่ายชาวบ้าน แล้วอยากให้เขา build เองได้ด้วย
มีอีกเพียบ แต่โดยสรุปแล้ว เรามักได้ใช้อยู่สอง target คือ clean และ kernel_image
* การตั้งค่าการคอมไพล์
คุณสามารถตั้งค่าของการคอมไพล์ของ make-kpkg ได้ที่แฟ้ม /etc/kernel-pkg.conf หรือ ~/.kernel-pkg.conf ค่าที่น่าสนใจได้แก่:
maintainer- กำหนดชื่อผู้สร้างแพกเกจ ซึ่งคุณควรเปลี่ยนเป็นชื่อคุณ ถ้าจะ build package แจกจ่าย
email- ที่อยู่เมลของคุณ ซึ่งจะใช้กำกับต่อท้ายชื่อ maintainer
pgp- ชื่อของลายเซ็น PGP ของคุณ ในกรณีที่ต้องการเซ็นกำกับแพกเกจที่สร้าง
สำหรับค่าอื่นๆ อ่านรายละเอียดการตั้งค่าได้ที่ /usr/share/doc/kernel-package/README.gz
* เอกสาร
- Debian Reference หัวข้อ 2.7 และ บทที่ 7
- BuildYourOwnKernel จาก Debian Wiki
- make-kpkg (1)
-
/usr/share/doc/kernel-image/README.gz
ขอบคุณครับ..
เดเบียนนี่ ... ทำอะไรหลาย ๆ อย่างที่ดูยาก ให้ง่ายขึ้นเยอะเลยครับผม
พี่เทพครับ ... ผมขออนุญาต เขียนเรื่อง m-a นะครับ :)
**********************
Key ID: D4CEFD37
Fingerprint: 1ED3 27F6 48C8 5C9D 4285 F24D D64E C0AF D4CE FD37
**********************
RE
ขอบคุณมากครับ
ที่ผ่านๆมา ใช้แต่วิธีลูกทุ่ง (make menuconfig; make all; cp arch/i386/boot/bzImage /boot/bzImage; blabla...)
จะใช้วิธีที่ถูกหลักของ debian ก็ทำไม่เป็น งงครับ
หลังจากอ่านบทความนี้แล้ว จะหาเวลาไปลองดูครับ ขอบคุณมากๆ ;)









Recent comments
3 days 12 hours ago
4 days 4 hours ago
1 week 6 days ago
3 weeks 23 hours ago
4 weeks 7 hours ago
4 weeks 1 day ago
4 weeks 2 days ago
4 weeks 2 days ago
4 weeks 3 days ago
4 weeks 5 days ago