This is G o o g l e's cache of http://www.debianclub.com/node/20 as retrieved on 17 Feb 2007 15:53:32 GMT.
G o o g l e's cache is the snapshot that we took of the page as we crawled the web.
The page may have changed since that time. Click here for the current page without highlighting.
This cached page may reference images which are no longer available. Click here for the cached text only.
To link to or bookmark this page, use the following url: http://www.google.com/search?hl=en&q=cache%3Ahttp%3A%2F%2Fwww.debianclub.com%2Fnode%2F20&btnG=Search


Google is neither affiliated with the authors of this page nor responsible for its content.

User login

Links

debianclub.com
debian.org
ubuntuclub.com
blognone.com

Syndicate

Syndicate content

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

ตามที่คุยกันใน กระทู้ เกี่ยวกับ 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

* เอกสาร


ขอบคุณครับ..

เดเบียนนี่ ... ทำอะไรหลาย ๆ อย่างที่ดูยาก ให้ง่ายขึ้นเยอะเลยครับผม

พี่เทพครับ ... ผมขออนุญาต เขียนเรื่อง m-a นะครับ :)


**********************
Key ID: D4CEFD37
Fingerprint: 1ED3 27F6 48C8 5C9D 4285 F24D D64E C0AF D4CE FD37
**********************

เชิญครับ

จะรออ่านเรื่อง m-a นะครับ :)

ขอบคุณเช่นกัน

ขอบคุณเช่นกันครับ :)

RE

ขอบคุณมากครับ

ที่ผ่านๆมา ใช้แต่วิธีลูกทุ่ง (make menuconfig; make all; cp arch/i386/boot/bzImage /boot/bzImage; blabla...)

จะใช้วิธีที่ถูกหลักของ debian ก็ทำไม่เป็น งงครับ

หลังจากอ่านบทความนี้แล้ว จะหาเวลาไปลองดูครับ ขอบคุณมากๆ ;)

ขอบคุณมากครับ

เป็นประโยชน์มากครับ