Tôi có một mô-đun hạt nhân Linux mà tôi đã biên dịch động. Làm thế nào nó được thêm vào khởi động? Có rất nhiều .ko
tập tin trong /lib/modules
. Làm thế nào là ưu tiên được thiết lập để tải các mô-đun?
Tôi có một mô-đun hạt nhân Linux mà tôi đã biên dịch động. Làm thế nào nó được thêm vào khởi động? Có rất nhiều .ko
tập tin trong /lib/modules
. Làm thế nào là ưu tiên được thiết lập để tải các mô-đun?
Câu trả lời:
Chúng không được tải tự động khi khởi động hoặc bất kỳ lúc nào khác, mặc dù rất nhiều trong số chúng cuối cùng được tải trong khi khởi động. Có ba cơ chế khác nhau để điều này xảy ra:
Yêu cầu không gian người dùng: Bao gồm mọi thứ, từ các dịch vụ init đến udev đến dòng lệnh. Ban đầu hoặc udev có lẽ là phương tiện đơn giản nhất nếu bạn muốn tải một mô-đun cụ thể khi khởi động.
Thiết bị cắm nóng: Khi bạn kết nối một cái gì đó với, ví dụ như USB hoặc PCI, hạt nhân phát hiện điều này và yêu cầu một mô-đun thích hợp dựa trên cách thiết bị tự nhận dạng.
Giao thức cần thiết hoặc thực hiện khác : Khi kernel cần làm gì đó, chẳng hạn như đọc một hệ thống tập tin và phát hiện ra nó thiếu kiến thức để làm như vậy, nó sẽ yêu cầu một mô-đun.
Lưu ý rằng trong hai lần cuối tôi đã sử dụng cụm từ "yêu cầu một mô-đun" - điều này là do hạt nhân thực sự tải thông qua một daemon không gian người dùng, kmod
thực thi /sbin/modprobe
. Theo Wolfgang Mauerer trong Linux Kernel Architecture , chỉ có ~ 100 điểm khác nhau trong kernel 2.6 nơi nó gọi là một request_module()
hàm bên trong .
modprobe
sử dụng cơ sở dữ liệu của MODULE_ALIAS đã cài đặt. Chúng được chỉ định rõ ràng trong mã nguồn mô-đun hoặc xuất phát từ MODULE_DEVICE_TABLE, đây là danh sách ID thiết bị OEM mà dịch vụ mô-đun cung cấp.
Nhiều hệ thống được thiết lập để sử dụng initrd hoặc initramfs . Đây là những hình ảnh hệ thống tập tin được tải bởi bộ tải khởi động và được cung cấp cho kernel trước khi nó gắn kết phân vùng gốc. Điều này cho phép các trình điều khiển cần thiết để gắn phân vùng gốc (trình điều khiển đĩa, trình điều khiển hệ thống tệp, trình ánh xạ thiết bị hoặc trình điều khiển âm lượng logic, bằng cách) được biên dịch thành các mô-đun và được tải từ initrd / initramfs.
Các tập lệnh khởi động trên initrd ( /linuxrc
) hoặc initramfs ( /init
) thường tải một số mô-đun và định vị hệ thống tập tin gốc. Mỗi bản phân phối có thiết lập riêng. Ubuntu sử dụng một initramfs được tập hợp từ các thành phần trong initramfs-tools
gói và được tạo lại cho mỗi kernel dựa trên các trình điều khiển cần thiết để gắn hệ thống tập tin gốc.
Sau khi hệ thống tập tin gốc được gắn kết, trong quá trình khởi động hệ thống, các mô-đun được liệt kê trong /etc/modules
(Debian, ') hoặc /etc/modules.conf
(Red Hat, Arch, cám) được tải. Tập tin này thường liệt kê một vài mô-đun nếu có. Hầu hết các mô-đun được tải theo yêu cầu.
Khi kernel phát hiện một số phần cứng mà nó thiếu trình điều khiển hoặc một số thành phần khác như giao thức mạng hoặc thuật toán mã hóa, nó sẽ gọi /sbin/modprobe
để tải mô-đun. Đối với trình điều khiển phần cứng, hạt nhân chuyển các tên mã hóa id PCI, id USB hoặc chỉ định hệ thống khác của phần cứng. Có một bảng trong /lib/modules/$VERSION/modules.alias
đó ánh xạ các chỉ định có hệ thống này sang tên mô-đun. Bảng này được tạo bởi depmod
và đọc bởi modprobe
.
Nếu bạn có một mô-đun hạt nhân bổ sung mà bạn đã biên dịch thủ công cho thiết bị phần cứng, hãy thả nó vào /lib/modules/$VERSION/local
(tạo local
thư mục con nếu nó không tồn tại) và chạy depmod -a
để tạo lại cơ sở dữ liệu bí danh. Nếu mô-đun dành cho một số tính năng bất thường mà hạt nhân không thể tự động phát hiện, hãy thả nó vào /lib/modules/$VERSION/local
, chạy depmod -a
để phân tích các phụ thuộc của nó và thêm tên mô-đun vào /etc/modules
.
/lib/modules/…
. Chỉ cần tạo local
thư mục con (duyệt depmod
qua /lib/module/$VERSION
đệ quy).
/var/lib/modules
cũng không phải/lib/modules/*/local
, tôi cũng không thể tìm thấy bất kỳ đề cập nào về điều này trên Google hoặc trongdepmod
trang người đàn ông. Đã xem trong CentOS 6.4, 7.4 và Ubuntu 19.04.