การติดตั้ง 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 วิธีคือ (จริงๆ แล้วมีมากกว่านี้ครับ)
1. ปิด คุณสมบัติ Paravirtualization ใน kernel ซะ วิธีนี้ ต้อง compile kernel ใหม่ครับ อ่านวิธี compile kernel แบบ debian ได้จากบทความก่อนหน้านี้ จากนั้น ติดตั้ง nvidia closed driver ตามปกติ

2. แก้ไข LDFLAGS ในการติดตั้ง nvidia closed driver เล็กน้อย จากนั้น ติดตั้ง nvidia closed driver ตามปกติ วิธีนี้ ไม่ต้อง compile kernel ใหม่ครับ

บทความนี้จะแสดงวิธีที่ 2 ครับ เริ่มกันเลย

ขั้นแรกต้องจัดการขยาย driver ออกมาก่อน

$  ./NVIDIA-Linux-x86-1.0-9631-pkg1.run -x

จะได้ directory ของ driver ออกมา สมมติว่า ชื่อ NVIDIA-Linux-x86-1.0-9631
จากนั้นแก้ NVIDIA-Linux-x86-1.0-9631/usr/src/nv/Makefile.kbuild

   $ cd  NVIDIA-Linux-x86-1.0-9631/usr/src/nv
   $ vi Makefile.kbuild

ค้นหาบรรทัดที่มีข้อความประมาณนี้

   EXTRA_CFLAGS += -Wall -Wimplicit -Wreturn-type...

เพิ่ม 2 บรรทัด ข้างล่างนี้ต่อเข้าไปครับ

PARAVIRT_OPS := $(shell grep "D paravirt_ops" /boot/System.map-$(shell uname -r) | colrm 9)
EXTRA_LDFLAGS := --defsym paravirt_ops=0x$(PARAVIRT_OPS)

บันทึกและออกจาก vi
จากนั้นก็ติดตั้ง nvidia closed driver โดย

   $ cd ../../../
   $ sudo ./nvidia-installer

จากนั้น startx ตามปกติครับ หรือเพื่อความแน่นอน restart ก่อน 1 ครั้งครับ

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