Các mô-đun trình điều khiển được tải và tải tự động?


15

Trên Ubuntu 14.04, tôi thấy rằng khi tôi không cắm bộ điều hợp không dây bên ngoài, mô-đun của nó rt2800usbvẫn được hiển thị lsmod.

  1. Khi nào tự động tải một mô-đun trình điều khiển xảy ra? Là khi thiết bị được kết nối với máy tính, hay khi HĐH khởi động?

  2. Khi nào tự động dỡ một mô-đun trình điều khiển xảy ra? Có phải khi thiết bị bị ngắt kết nối với máy tính hoặc khi hệ điều hành tắt?

Câu trả lời:


13

Khi kernel phát hiện một thiết bị mới, nó sẽ chạy chương trình modprobevà chuyển cho nó một tên xác định thiết bị. Hầu hết các thiết bị được xác định thông qua các số đã đăng ký cho một nhà cung cấp và kiểu máy, ví dụ như số nhận dạng PCI hoặc USB . Các modprobechương trình tư vấn bảng mô-đun alias để tìm tên của tập tin có chứa các driver cho thiết bị cụ thể. Một nguyên tắc tương tự áp dụng cho trình điều khiển cho những thứ không phải là thiết bị phần cứng, chẳng hạn như hệ thống tệp và thuật toán mã hóa. Để biết thêm chi tiết, hãy xem Debian không phát hiện thẻ PCI nối tiếp sau khi khởi động lại/lib/modules/VERSION/modules.alias

Khi modprobe đã xác định tệp mô-đun nào ( .ko) chứa trình điều khiển được yêu cầu, nó sẽ tải tệp mô-đun vào kernel: mã mô-đun được tải động vào kernel. Nếu mô-đun được tải thành công, thì nó sẽ xuất hiện trong danh sách từ lsmod.

Việc tự động tải các mô-đun xảy ra khi kernel phát hiện phần cứng có thể cắm nóng mới, ví dụ như khi bạn kết nối thiết bị ngoại vi USB. Hệ điều hành cũng thực hiện việc liệt kê tất cả các phần cứng có trên hệ thống sớm trong quá trình khởi động, để tải trình điều khiển cho các thiết bị ngoại vi có mặt khi khởi động.

Cũng có thể yêu cầu tải mô-đun bằng lệnh modprobehoặc bằng tay insmod. Hầu hết các bản phân phối bao gồm một tập lệnh khởi động tải các mô-đun được liệt kê trong /etc/modules. Một cách khác để các mô-đun được tải là nếu chúng là phần phụ thuộc của mô-đun: nếu mô-đun A phụ thuộc vào mô-đun B, thì modprobe Atải B trước khi tải A.

Khi một mô-đun được tải, nó vẫn được tải cho đến khi được tải rõ ràng, ngay cả khi tất cả các thiết bị sử dụng trình điều khiển đó đã bị ngắt kết nối. Cách đây rất lâu, có một cơ chế tự động dỡ bỏ các mô-đun không sử dụng, nhưng nó đã bị xóa, nếu tôi nhớ chính xác, khi udev xuất hiện. Tôi nghi ngờ rằng việc dỡ bỏ mô-đun tự động không phải là một tính năng phổ biến vì các hệ thống có xu hướng cần nó hầu hết là các máy tính để bàn có nhiều bộ nhớ (theo thang đo mã trình điều khiển).


Cảm ơn. Tôi chưa sửa đổi /etc/modules. rt2800usblà ở đầu ra của lsmod, và điều đó có nghĩa là tôi đã kết nối thiết bị của nó với máy tính trước khi khởi động?
StackExchange cho tất cả

1
@Tim Nếu mô-đun được tải và bạn không tải nó một cách rõ ràng và nó không được liệt kê trong /etc/modulesđó, thì có lẽ, có lẽ lý do mô-đun được tải là do thiết bị đã có mặt tại một số điểm.
Gilles 'SO- ngừng trở nên xấu xa'

5

Các mô-đun được tải khi hệ thống khởi động thông qua Đĩa RAM ban đầu hay còn gọi là initrd . Phần Cơ sở lý luận nêu rõ:

Nhiều bản phân phối Linux gửi một hình ảnh hạt nhân Linux chung chung - một hình ảnh mà các nhà phát triển của bản phân phối tạo riêng để khởi động trên nhiều loại phần cứng. Các trình điều khiển thiết bị cho hình ảnh hạt nhân chung này được bao gồm dưới dạng các mô-đun hạt nhân có thể tải được vì biên dịch tĩnh nhiều trình điều khiển thành một nhân khiến hình ảnh hạt nhân lớn hơn nhiều, có lẽ quá lớn để khởi động trên các máy tính có bộ nhớ hạn chế. Điều này sau đó đặt ra vấn đề phát hiện và tải các mô-đun cần thiết để gắn hệ thống tệp gốc vào lúc khởi động, hoặc cho vấn đề đó, suy ra hệ thống tệp gốc ở đâu hoặc là gì.

Ubuntu giống như nhiều bản phân phối khác, chọn tải mọi trình điều khiển thiết bị vào initrd này, bất kể trình điều khiển có cần thiết hay không, và bất kể thiết bị có hiện diện trên hệ thống hay không. Như Giles đã chỉ ra, toàn bộ mọi thứ được tải vào RAM, và sau đó các mô-đun đã sử dụng được phát hiện khi khởi động và những mô-đun không sử dụng được xóa khỏi RAM. Sử dụng phương pháp này đảm bảo rằng Ubuntu sẽ luôn khởi động trên mọi hệ thống bất kể thiết lập. Ubuntu đang bắt chước một hạt nhân nguyên khối bằng cách sử dụng các cấu trúc vi hạt. Xem lý do công việc này


  1. Mô-đun rt2800usbsẽ luôn được tải khi khởi động vì mô-đun được bao gồm trong initramfs mà Gilles đã đề cập. Các initramfs là một sự kế thừa của initrd, do đó nó sẽ luôn được hiển thị bởi lsmod. Lưu ý rằng bạn có thể chèn một mô-đun mới được biên dịch vào kernel bằng cách sử dụng modprobetheo sau là tên mô-đun.

Khi kiểm tra khởi động lại hệ thống của bạn với bộ điều hợp không dây được rút ra. Nếu mọi việc suôn sẻ, mô-đun sẽ không được liệt kê trong lsmodđầu ra của s vì trong quá trình khởi động, quá trình phát hiện được bắt đầu bởi initramfs và init sstem không tìm thấy thiết bị trong quá trình thăm dò và mô-đun đã bị xóa khỏi RAM.

  1. Để xóa mô-đun trong khi hệ thống đang chạy, bạn có thể sử dụng các lệnh như rmmodhoặc modprobe -rtheo sau là tên mô-đun. Ở lần khởi động tiếp theo, mô-đun sẽ được tải lại. Xem ở trên. Trong hầu hết các trường hợp, một mô-đun không được gỡ bỏ một cách linh hoạt, vì điều này sẽ vô hiệu hóa việc cắm nóng, tức là một khi mô-đun bị loại bỏ, thiết bị sử dụng nó không thể được phát hiện lại khi được cắm lại.

Để xóa mô-đun khỏi lsmod, bạn phải xóa mô-đun khỏi hình ảnh initramfs được tạo bằng cách biên dịch lại kernel mà không có mô-đun đã chọn và sau đó xây dựng lại hình ảnh. Làm điều này sẽ vô hiệu hóa tất cả các phát hiện của mô-đun nói.


3
Bạn đang bối rối khi tải một tệp vào RAM như một phần của đĩa RAM và tải (tức là liên kết động) một mô-đun vào kernel đang chạy. Các mô-đun được tải tạm thời vào bộ nhớ - không phải vào kernel - từ initrd (về mặt kỹ thuật là initramfs ngày nay), nhưng sau đó chúng bị xóa khỏi bộ nhớ sau khi root thực sự được gắn. Các mô-đun chỉ được tải vào kernel khi phát hiện thấy một thiết bị sử dụng chúng (với một vài ngoại lệ).
Gilles 'SO- ngừng trở nên xấu xa'

Trong khi tôi đồng ý ở đây, anh ta đã nói về việc dỡ và tải một mô-đun không thể thực hiện được trừ khi anh ta chọn cấu hình lại đĩa RAM Ubuntu, điều này không được khuyến khích vì Ubuntu chọn tải tất cả các mô-đun vào RAM mỗi lần cập nhật kernel. Tất cả các mô-đun được tải mỗi lần, chúng chỉ không được sử dụng.
Eyoung100

2
Không, câu hỏi là về việc tải và dỡ bỏ một mô-đun vào kernel. Không phải câu trả lời ban đầu của bạn cũng không phải câu trả lời sửa đổi của bạn giải quyết điều đó. Các initramfs không liên quan (hoặc nhiều nhất là liên quan đến ngoại vi) cho câu hỏi này.
Gilles 'SO- ngừng trở nên xấu xa'

@Gilles Có tốt hơn không ??
Eyoung100

1
@ eyoung100, tôi đồng ý với Gilles. Một cuộc thảo luận về initramfs không liên quan đến câu hỏi. Các mô-đun thường được tải bằng cách liệt kê các thiết bị vào /sysvà tải trình điều khiển cho các thiết bị thực sự được tìm thấy trong hệ thống. Điều này xảy ra cho dù thiết bị có mặt khi khởi động hoặc cắm nóng sau đó. udevcó nhiều thứ để làm với nó hơn initramfs / initrd, và liệu tất cả, hoặc chỉ một số mô-đun được sao chép vào initramfs (một tùy chọn cấu hình trong /etc/initramfs-tools/initramfs.conf) không đặc biệt phù hợp.
Celada
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.