ฉันจะสร้างโมดูลเคอร์เนลแบบ in-tree เดียวได้อย่างไร


36

linux-source -... มีโมดูลซึ่งถูกปิดใช้งานใน config /boot/config-3.4-trunk-686-pae ดังนั้นจึงไม่ได้เป็นส่วนหนึ่งของ linux-image -... (นี่คือ Debian แต่ วิธีการแก้ปัญหาควรจะเหมือนกันสำหรับ Ubuntu หรือ?) เช่น

# CONFIG_CAN_PEAK_USB is not set

หนึ่งจะรวบรวมโมดูลเคอร์เนลนั้นเพื่อให้สามารถใช้กับเคอร์เนลกระจายได้อย่างไร

แพ็คเกจ linux-source -... นั้นได้รับการติดตั้งแล้วไม่มีการบีบอัดและเชื่อมโยงกับ / usr / src / linux /boot/config-3.4-trunk-686-pae ถูกคัดลอกไปยัง /usr/src/linux/.config และแก้ไขด้วย

CONFIG_CAN_PEAK_USB=m

กับ

make
make modules

มันเป็นไปได้ที่จะรวบรวมเคอร์เนลและโมดูลทั้งหมด แต่จะมีวิธีรวบรวมเพียงโมดูลเดียวที่เฉพาะเจาะจงได้อย่างไร

(หมายเหตุ: นอกจากนี้ยังมีความต้องการเคอร์เนลที่จะรวบรวมก่อนมิฉะนั้นคุณจะได้รับข้อผิดพลาดต่อไปนี้: no symbol version for module_layout)


โปรดปิดซ้ำซ้อนกับ 14627 คำตอบของผู้ใช้ 'Radu C' ตอบคำถาม
mab

คุณเคยลองdepmod -aมาก่อนmodbrobeหรือไม่
นาเดีย

1
พิจารณาบทความต่อไปนี้ด้วย: stackoverflow.com/questions/8744087/ …
Oleg Kokorin

คำตอบ:


37

ผมมีปัญหาเหมือนกัน. ฉันคิดว่าคุณไม่เพียง แต่ต้องคัดลอก. config แต่ยัง Module.symvers

ขั้นตอนของฉันในการรวบรวมโมดูล ft1000 (รัน Debian Wheeze 7.1.0; kernel 3.2.0-4-686-pae):

aptitude install linux-headers-3.2.0-4-686-pae
aptitude install linux-source-3.2
cd /usr/src/
tar xjf linux-source-3.2.tar.bz2
cd /usr/src/linux-source-3.2
cp ../linux-headers-3.2.0-4-686-pae/Module.symvers .
make oldconfig # it copies .config to ./
vi .config # enable ft1000 module: CONFIG_FT1000=m
make prepare # setup FT1000 as module
make modules_prepare
make SUBDIRS=scripts/mod
make SUBDIRS=drivers/staging/ft1000/ft1000-usb modules
cp drivers/staging/ft1000/ft1000-usb/ft1000.ko /lib/modules/3.2.0-4-686-pae/kernel
/drivers/staging/
depmod
modprobe ft1000

4
ฉันไม่แน่ใจว่า SUBDIRS ยังคงถูกต้องอยู่หรือไม่ มันถูกละเว้นสำหรับฉัน หลังจากอ่านkernel.org/doc/Documentation/kbuild/modules.txtฉันลองใช้make M=/path/to/moduleซึ่งดูเหมือนจะทำงานได้
อันตรายเมื่อ

ฉันกำลังพยายามแก้ไขโมดูลอื่น (เพิ่งเพิ่ม USB ID ไปยังโมดูลที่มีอยู่) เมื่อฉันคอมไพล์ฉันไม่ได้รับข้อผิดพลาด แต่เมื่อฉันใส่มันฉันได้รับรูปแบบโมดูลไม่ถูกต้องทำไม?
Zibri

13

จากภายในไดเรกทอรีต้นทางระดับบนสุดให้สร้างพา ธ ไปยังชื่อโมดูลหรือไดเรกทอรีโมดูลเช่น:

make drivers/net/can/usb/peak_usb/

หรือตัวอย่างที่ง่ายกว่า (ไดรเวอร์ Intel e1000 Ethernet):

make drivers/net/ethernet/intel/e1000/e1000.ko

เพิ่งทำ: make drivers/net/can/usb/peak_usb/pcan_usb.koสร้างเพียง pcan_usb.o ทำmake drivers/net/can/usb/peak_usb/ && make drivers/net/can/usb/peak_usb/pcan_usb.kocompiles แต่ insmod Error: could not insert module drivers/net/can/usb/peak_usb/peak_usb.ko: Invalid module formatบ่น dmesg:peak_usb: no symbol version for module_layout
mab

คุณใช้เคอร์เนลเฉพาะนั้นและคุณได้รวบรวมเคอร์เนลหนึ่งครั้งแล้วหรือยัง? โปรดลองmodprobeยัง
ish

ฉันกำลังใช้เคอร์เนลที่แพ็กเกจ รวบรวมงานเคอร์เนลที่สมบูรณ์ แต่ฉันพยายามที่จะไม่รวบรวมเคอร์เนลที่สมบูรณ์เพียงแค่โมดูลเคอร์เนลที่เฉพาะเจาะจง มีเป้าหมายทำให้ที่ 'เตรียม' รวบรวมโมดูลเดียว? modprobe แสดงข้อผิดพลาดเดียวกัน
mab

6
ตามstackoverflowคุณสามารถใช้make modules SUBDIRS=drivers/net/can/usb/peak_usbหรือ subdir อื่น ๆ มันใช้งานได้ดีที่นี่
Treviño

0

ง่ายเหมือน: (ตัวอย่างนี้แสดงให้เห็นถึงโปรแกรมควบคุม ft1000 ซึ่งควรใช้เวลาเพียงไม่กี่นาทีหากไม่ใช่ instants)

cd /usr/src/kernel-sources
make SUBDIRS=drivers/staging/ft1000/ft1000-usb modules
# Enable the ft1000 module: CONFIG_FT1000=m  on the config with 
make xconfig # or "make menuconfig" then save
make prepare
make modules_prepare
make SUBDIRS=scripts/mod
make SUBDIRS=drivers/staging/ft1000/ft1000-usb modules
make SUBDIRS=drivers/staging/ft1000/ft1000-usb modules_install

จากนั้นคุณสามารถโหลดโมดูลได้modprobeหลังจากdepmod

หมายเหตุ: ขึ้นอยู่กับการพึ่งพาโมดูลคุณอาจต้องสร้างเคอร์เนลใหม่ทั้งหมด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.