kernel

Build openvz kernel บน 2.6.32

มีความจำเป็นต้อง build debian kernel ไว้ใช้เอง เพราะใช้ OpenVZ โชคดีที่ sid ใช้ 2.6.32 ที่ OpenVZ ออกมาด้วยพอดี เนื่องจาก openvz ยังไม่ได้เป็น feature มาตรฐาน เลยต้องมี patch ออกมาเป็นระยะ

ความจริงใน 2.6.32-11 (package linux-image-2.6.32-4) มี openvz แล้วแต่ว่ามีบั๊กติดมาด้วย กรณีที่ใช้ linux-image-2.6.32-4-openvz-amd64 (Bug #574598) ทาง debian ไม่แก้ เพราะเป็นบั๊กของ openvz พอ openvz แก้บั๊กนี้แล้ว ก็ใจร้อนไม่อยากรอ debian เลยต้อง build เอง ดังนี้

$ apt-get source  linux-image-2.6.32-4-openvz-amd64

สร้าง source

$ make -f debian/rules source-all

หลังจากนั้นจะแพตช์อะไรก็ไปทำที่ debian/build/source_amd64_openvz แล้วก็:

$ DEBIAN_KERNEL_JOBS=8 CONCURRENCY_LEVEL=9 \
  fakeroot make -f debian/rules.gen binary-arch_amd64_openvz

เพื่อ build amd64_openvz

lenny: แก้ปัญหา waiting for root file system

ช่วงนี้ติดตั้งเครื่องหลายเครื่องด้วย lenny พบปัญหาบูตไม่ขึ้นด้วยข้อความว่า "waiting for root file system" ค้นกูเกิลดูพบว่าเป็นปัญหาของแพกเกจ initramfs (เป็นทั้งรุ่น 0.92a และ 0.92b) ที่ตีความฮาร์ดดิสก์เป็น sda

ทางแก้มีหลายทาง เช่น กำหนดชื่อ (label) ให้พาร์ทิชัน หรือใช้ uuid แต่รู้สึกว่ายุ่งยากไปหน่อย เพราะเคยมึนกับเรื่อง uuid มาทีนึงแล้ว เลยคิดว่าลองกลับไปคบกับ yaird แทน ซึ่งดูจะมีปัญหานี้น้อยกว่า

ตอนนี้ yaird บน lenny ไม่รู้หายไปไหน ก็เลยต้องไปดาวน์โหลดของ sid มาแทน เวลาติดตั้งด้วยคำสั่ง dpkg -i เขาจะแจ้งว่าติดดีเพนเดนซีที่แพกเกจไหนบ้าง ก็ลงไปตามนั้นจนจบ

มีต้องแก้ไฟล์นิดนึงคือไฟล์ kernel-img.conf ให้มาใช้ของ yaird

$ sudo vi /etc/kernel-img.conf
...
#ramdisk = /usr/sbin/mkinitrd /usr/sbin/mkinitramfs
ramdisk = /usr/sbin/mkinitrd.yaird

การติดตั้ง nvidia closed driver กับ kernel ที่เปิดคุณสมบัติ Paravirtualization

สำหรับท่านที่ใช้การ์ดแสดงผลของ nvidia และใช้ closed driver ของ nvidia ใน kernel ของ debian ตั้งแต่ version 2.6.20 เป็นต้นมา อาจพบปัญหาการติดตั้ง nvidia driver ดังนี้

FATAL: modpost: GPL-incompatible module nvidia.ko uses GPL-only symbol ‘paravirt_ops’

สาเหตุจากการเปิดคุณสมบัติ Paravirtualization ของตัว kernel โดย module nvidia.ko นั้นมีการเรียกฟังก์ชัน paravirt_ops ผ่านทางฟังก์ชั่น udelay อีกที ปัญหาคือ paravirt_ops นั้นถูกกำหนดให้เป็น GPL-only นั่นคือยอมให้เรียกจาก driver ที่เป็น GPL เท่านั้น ก็เลยเป็นเรื่องครับ ( ความเป็นมาอ่านจากนี่)

เรามีทางเลือกอะไรบ้าง
ผมเสนอทางเลือก 2 วิธีคือ (จริงๆ แล้วมีมากกว่านี้ครับ)

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

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