Làm thế nào (công thức) để xây dựng chỉ một mô-đun hạt nhân?


35

Tôi có một lỗi trong mô-đun hạt nhân Linux khiến cho hạt nhân Ubuntu 14.04 bị lỗi (sập).

Đó là lý do tại sao tôi muốn chỉnh sửa / nguồn của mô-đun hạt nhân duy nhất đó để thêm một số đầu ra gỡ lỗi bổ sung. Các mô-đun hạt nhân trong câu hỏi là mvsasvà không cần thiết để khởi động. Vì lý do đó, tôi không thấy cần phải cập nhật bất kỳ hình ảnh initrd nào.

Tôi đã đọc rất nhiều thông tin (như hình bên dưới) và tìm thấy sự nhầm lẫn trong quá trình thiết lập và xây dựng. Tôi cần hai công thức:

  1. để thiết lập / cấu hình môi trường xây dựng một lần
  2. Các bước cần thực hiện sau khi chỉnh sửa bất kỳ tệp nguồn nào của mô-đun hạt nhân này ( .c.h) và chuyển đổi chỉnh sửa đó thành mô-đun hạt nhân mới ( .ko)

Các nguồn đã được sử dụng là:



có lẽ bài viết này cũng sẽ có ích: stackoverflow.com/questions/8744087/ mẹo
Oleg Kokorin

Câu trả lời:


33

Công thức để xây dựng một mô-đun tùy chỉnh có thể cần phải được chia thành ba phần.

Cài đặt một lần

$ cd ~
$ apt-get source linux-source-3.13.0 

Tôi quá lười biếng để sao chép các tập tin nguồn trình điều khiển cụ thể của mvsas; chỉ cần sao chép tất cả vào thư mục làm việc hiện tại của bạn. Nếu apt-getkết quả là thông báo lỗi về các URI nguồn bị thiếu thì hãy xem ghi chú số 4 ở phía dưới.

$ cd linux-3.13.0
$ make oldconfig
$ make prepare
$ make scripts

Điều này sẽ chuẩn bị một số tệp cần thiết để xây dựng một mô-đun hạt nhân.

Mỗi phiên bản kernel

$ apt-get install linux-headers-$(uname -r)

Điều này sẽ cài đặt các tiêu đề và tệp cấu hình kernel Ubuntu cho phiên bản kernel đó trong / lib / mô-đun.

$ cd ~/linux-3.13.0
$ cp -v /usr/src/linux-headers-$(uname -r)/Module.symvers .

Điều này để ngăn thông báo " không có phiên bản ký hiệu cho module_layout " khi tải mô-đun bằng insmod hoặc modprobe.

$ mv -v /lib/modules/$(uname -r)/kernel/drivers/scsi/mvsas/mvsas.ko /lib/modules/$(uname -r)/kernel/drivers/scsi/mvsas/mvsas.ko.backup

Điều này sẽ đổi tên mô-đun hạt nhân (bản dựng Ubuntu) ban đầu để đảm bảo rằng mô-đun được vá tùy chỉnh sẽ tải.

Mỗi lần chỉnh sửa

$ cd ~/linux-3.13.0/drivers/scsi/mvsas
$ nano mv_sas.h
$ nano mv_sas.c

Đây là cho các chỉnh sửa.

$ make -C /lib/modules/$(uname -r)/build M=$(pwd) modules

Điều này sẽ biên dịch và xây dựng .kotệp mô-đun hạt nhân bằng cách sử dụng cấu hình kernel từ bản phân phối Ubuntu stock của bạn như được lưu trữ trong /lib/modules/$(uname -r)/.

$ make -C /lib/modules/$(uname -r)/build M=$(pwd) modules_install

Điều này sẽ cài đặt mô-đun hạt nhân /lib/modules/$(uname -r)/extra/, không ghi đè mô-đun phân phối trong trường hợp bạn không đổi tên tệp mô-đun hạt nhân phân phối. Trong trường hợp mvsas này, nó cũng sẽ chạy depmod .

$ lsmod | grep mvsas

Nếu điều này dẫn đến bất kỳ đầu ra nào, mô-đun mvsas cần dỡ tải với ( modprobe -r mvsas) trước.

$ sudo modprobe -v mvsas

Điều này sẽ tải mô-đun hạt nhân mới.

Kiểm tra đầu ra để xác minh rằng /lib/modules/.../extra/mvsas.kođang được tải.

Lỗi modprobe: không thể chèn

Trong một số trường hợp, bạn có thể gặp phải một modprobe: ERROR: could not insert 'xyz': Unknown symbol in module, or unknown parameter (see dmesg)thời gian trong đầu ra modbobe dài dòng mà bạn thấy insmodđang cố tải mô-đun từ vị trí mặc định của kernel. Ví dụ:

# insmod /lib/modules/3.17.0-031700rc7-generic/kernel/drivers/scsi/pm8001/pm80xx.ko
modprobe: ERROR: could not insert 'pm80xx': Unknown symbol in module, or unknown parameter (see dmesg)

Trong trường hợp đó, bạn cần chạy depmod theo cách thủ công và thử tải lại mô-đun:

# depmod
# sudo modprobe -v mvsas

Ghi chú

  1. Có thể xảy ra trường hợp các .kotệp mô-đun kết quả có kích thước lớn hơn (ví dụ 20 lần) so với các tệp mô-đun gốc được phân phối bởi Ubuntu; trong trường hợp đó, make preparebước có thể đã tạo ra một nhà phát triển Linux gỡ lỗi tệp cấu hình kernel và bạn đang xây dựng từ thư mục nguồn. -CParam của bạn có thể không hoạt động như mong đợi.
  2. Tôi đã thấy các hướng dẫn với các lệnh khác như make modules_preparemake M=scripts/modnhưng tôi không nghĩ rằng chúng là cần thiết cho trường hợp này.
  3. Bạn có thể sử dụng cấu hình gỡ lỗi của nhà phát triển Linux bằng cách thay thế -C /lib/modules/$(uname -r)/buildbằng-C /usr/src/linux-headers-$(uname -r)
  4. Trong một thiết lập mặc định, apt-get source linux-sourcessẽ trả về lỗi E: You must put some 'source' URIs in your sources.list. Để khắc phục sự cố này, bạn có thể sửa đổi tệp /etc/apt/sources.listbằng cách bỏ ghi chú (loại bỏ hàng đầu #khỏi) deb-srcdòng đầu tiên . Ví dụ cho Ubuntu 17.10 : deb-src http://ie.archive.ubuntu.com/ubuntu/ artful main restricted. chạy sudo apt-get update, và sau đó lệnh sẽ cung cấp nguồn cho bạn. Xem thêm câu hỏi này trong đó một phương thức GUI để làm điều này cũng được mô tả.

Tôi đã gặp lỗi: / bin / sh: arm-none-linux -gnueabi-gcc: không tìm thấy
Dr.jacky

$(uname-r)rõ ràng là sai ... Bạn cần gọi tích shellhợp sẵn:$(shell uname -r)
Albus Dumbledore

2
@AlbusDumbledore Tôi cũng thấy các trường hợp $(shell uname -r)không hoạt động . Tại sao $(uname -r)rõ ràng là sai?
Sao lưu chuyên nghiệp

Tôi cũng phải gọi echo "search extra built-in" | sudo tee /etc/depmod.d/00-extra.confđể depmodthấy tập tin mới được cập nhật .../extra.
Martin Pecka

1
Làm gì với lỗi ký mô-đun, làm thế nào để tránh nó? `` `INSTALL /home/envek/linux-4.10.0/drivers/hwmon/dell-smm-hwmon.ko Tại main.c: 158: - Lỗi SSL: 02001002: thư viện hệ thống: fopen: Không có tệp hoặc thư mục như vậy: bss_file.c: 175 - lỗi SSL: 2006D080: BIO thói quen: BIO_new_file: không có tập tin: bss_file.c: 178 đăng file: certs / signing_key.pem: không có tập tin hoặc thư mục `` `
Envek
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.