คอมไพล์เคอร์เนลสไตล์เดเบียน

เดเบียนมี kernel image คอมไพล์สำเร็จมาให้แล้ว ในแพกเกจ linux-image-version-revision-cpu (เช่น linux-image-2.6.22-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.22
ซึ่งจะติดตั้งซอร์สในรูปของ tarball ไว้ที่ /usr/src เราก็ไปแตกซอร์สซะ:
$ cd /usr/src
$ tar xjf linux-source-2.6.22.tar.bz2
จากนั้น ก็ตั้งค่าเคอร์เนลตามปกติ โดยใช้ menuconfig (หรือถ้าเคยคอมไพล์มาแล้วในรุ่นก่อน ก็อาจจะ copy config มา แล้ว make oldconfig ตามแต่กรณี):
$ cd linux-source-2.6.22
$ make menuconfig
แล้วก็ลงมือคอมไพล์:
$ make-kpkg clean
$ fakeroot make-kpkg kernel_image
มันจะคอมไพล์และสร้าง linux-image-2.6.22_2.6.22-10.00.Custom_i386.deb ที่ไดเรกทอรีชั้นถัดขึ้นไป เราก็สามารถติดตั้งได้เลย
$ su
# dpkg -i ../linux-image-2.6.22_2.6.22-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 ปลอดภัยกว่า sudo ส่วนที่เหลือ คือการสั่ง 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.22-686-smp_2.6.22-10.01_i386.deb ออกมา ซึ่งเมื่อติดตั้งแล้ว ตรวจสอบรุ่นของเคอร์เนลด้วย uname -r จะได้ผลลัพธ์เป็น 2.6.22-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

เอกสาร

Comments

ผมเคยลองคอมไพล์ครั้งหนึ่งแล้วไม่สามารถใช้งานได้ เพราะเอาตัวอย่างหลาย ๆ ที่มาประกอบทำดู ตอนนี้จะลองวิธีนี้บ้างน่าจะทำงานได้ แต่อยากให้มีวิธีการเอาเคอร์เนลเก่าออกด้วยครับ และเพิ่มเติมผมอยากให้มีวิธีการอัพเดท gnome เป็นเวอร์ชั่นใหม่ด้วยครับ

การลบเคอร์เนลเก่า คิดว่าไม่ซับซ้อนอะไรน่ะครับ แค่ใช้ apt-get หรือ aptitude ลบแพกเกจของเคอร์เนลเก่าเท่านั้นเอง

ส่วนการอัปเดต GNOME เป็นเวอร์ชันใหม่.. ถ้าเป็นคำถามเดียวกับที่ GNOME ไทย ก็คงตอบง่าย ๆ ว่าใช้การอัปเดตปกติ หรือถ้าต้องการใหม่กว่านั้นก็อาจลองใช้แพกเกจจาก experimental ซึ่งตรงนั้นคงเอาไว้พูดถึงการใช้ experimental แบบรวม ๆ ละกันครับ

ที่โพสต์ไว้หมายถึงใหม่ถอดด้ามเลยครับ จาก www.gnome.org เลยน่ะครับ ไม่ใช่อัพเดทตาม debian ปกติน่ะครับ :)

ในกรณีนั้น คงตอบที่ GNOME ไทยดีกว่านะครับ (อย่างที่บอกที่โน่น ว่าจะหาเวลาเขียนอยู่ครับ)

ตอบที่นั่นแล้วนะครับ

Creative Commons License ลิขสิทธิ์ของบทความเป็นของเจ้าของบทความแต่ละชิ้น
ผลงานนี้ ใช้สัญญาอนุญาตของครีเอทีฟคอมมอนส์แบบ แสดงที่มา-อนุญาตแบบเดียวกัน 3.0 ที่ยังไม่ได้ปรับแก้