โมดูลไดรเวอร์ถูกโหลดและยกเลิกการโหลดโดยอัตโนมัติหรือไม่?


15

บน Ubuntu 14.04 ผมพบว่าเมื่อฉันไม่เสียบอะแดปเตอร์ไร้สายของฉันภายนอกโมดูลยังคงแสดงในrt2800usblsmod

  1. การโหลดโมดูลไดรเวอร์อัตโนมัติจะเกิดขึ้นเมื่อใด มันคือเมื่ออุปกรณ์เชื่อมต่อกับคอมพิวเตอร์หรือเมื่อระบบปฏิบัติการบูท?

  2. การยกเลิกการโหลดโมดูลไดรเวอร์จะเกิดขึ้นโดยอัตโนมัติเมื่อใด มันคือเมื่ออุปกรณ์ถูกตัดการเชื่อมต่อกับคอมพิวเตอร์หรือเมื่อระบบปฏิบัติการปิดตัวลง?

คำตอบ:


13

เมื่อเคอร์เนลตรวจพบอุปกรณ์ใหม่มันจะเรียกใช้โปรแกรมmodprobeและส่งผ่านชื่อที่ระบุอุปกรณ์นั้น อุปกรณ์ส่วนใหญ่จะถูกระบุผ่านหมายเลขที่ลงทะเบียนสำหรับผู้ขายและรุ่นเช่นตัวระบุPCIหรือUSB modprobeโปรแกรมให้คำปรึกษาตารางโมดูลนามแฝงเพื่อหาชื่อของไฟล์ที่มีโปรแกรมควบคุมสำหรับอุปกรณ์นั้น ๆ หลักการที่คล้ายกันนี้ใช้กับไดร์เวอร์สำหรับสิ่งที่ไม่ใช่อุปกรณ์ฮาร์ดแวร์เช่นระบบไฟล์และอัลกอริธึมการเข้ารหัส สำหรับรายละเอียดเพิ่มเติมดูDebian ไม่พบการ์ด PCI แบบอนุกรมหลังจากรีบูต/lib/modules/VERSION/modules.alias

เมื่อ modprobe ระบุว่าโมดูลไฟล์ใด ( .ko) มีไดรเวอร์ที่ร้องขอมันจะโหลดไฟล์โมดูลลงในเคอร์เนล: โค้ดโมดูลจะถูกโหลดแบบไดนามิกในเคอร์เนล lsmodถ้าโมดูลจะโหลดเสร็จเรียบร้อยแล้วก็จะปรากฏในรายชื่อจาก

การโหลดโมดูลโดยอัตโนมัติเกิดขึ้นเมื่อเคอร์เนลตรวจพบฮาร์ดแวร์ hotpluggable ใหม่เช่นเมื่อคุณเชื่อมต่ออุปกรณ์ต่อพ่วง USB ระบบปฏิบัติการยังผ่านการระบุฮาร์ดแวร์ทั้งหมดที่มีอยู่ในระบบก่อนระหว่างการเริ่มต้นเพื่อโหลดไดรเวอร์สำหรับอุปกรณ์ต่อพ่วงที่มีอยู่ในเวลาบูต

นอกจากนี้ยังสามารถร้องขอการโหลดโมดูลด้วยตนเองด้วยคำสั่งmodprobeหรือ insmodการกระจายมากที่สุด ได้แก่ /etc/modulesสคริปต์เริ่มต้นที่โหลดโมดูลที่ระบุไว้ใน อีกวิธีหนึ่งสำหรับโมดูลที่จะโหลดคือหากพวกเขาพึ่งพาโมดูล: หากโมดูล A ขึ้นอยู่กับโมดูล B แล้วmodprobe Aโหลด B ก่อนที่จะโหลด A

เมื่อโมดูลถูกโหลดมันจะยังคงโหลดจนกว่าจะยกเลิกการโหลดอย่างชัดเจนแม้ว่าอุปกรณ์ทั้งหมดที่ใช้ไดรเวอร์นั้นจะถูกตัดการเชื่อมต่อ นานมาแล้วมีกลไกที่จะยกเลิกการโหลดโมดูลที่ไม่ได้ใช้โดยอัตโนมัติ แต่มันถูกลบออกถ้าฉันจำได้อย่างถูกต้องเมื่อ udev เข้ามาในที่เกิดเหตุ ฉันสงสัยว่าการยกเลิกการโหลดโมดูลอัตโนมัติไม่ใช่คุณสมบัติทั่วไปเนื่องจากระบบที่มักต้องการเป็นเดสก์ท็อปพีซีส่วนใหญ่ที่มีหน่วยความจำจำนวนมากอยู่ดี (ตามมาตราส่วนรหัสไดรเวอร์)


ขอบคุณ /etc/modulesฉันยังไม่ได้มีการปรับเปลี่ยน rt2800usbอยู่ในผลลัพธ์ของlsmodและนั่นหมายความว่าฉันเชื่อมต่ออุปกรณ์กับคอมพิวเตอร์ของฉันก่อนนับตั้งแต่การบูท?
ทิม

1
@Tim หากโมดูลถูกโหลดและคุณไม่ได้โหลดอย่างชัดเจนและไม่ได้อยู่ในรายการ/etc/modulesใช่แล้วสันนิษฐานว่าเหตุผลที่โมดูลถูกโหลดนั้นเป็นเพราะอุปกรณ์มีอยู่ในบางจุด
Gilles 'หยุดความชั่วร้าย'

5

โมดูลจะถูกโหลดเมื่อบูทระบบผ่านทางRAM ดิสก์เริ่มต้นอาคา initrd รัฐมาตราเหตุผล:

ลีนุกซ์รุ่นดิสทริบิวชั่นจำนวนมากจัดส่งอิมเมจเคอร์เนล Linux ทั่วไปหนึ่งรายการซึ่งผู้พัฒนาของการจัดจำหน่ายสร้างขึ้นเฉพาะเพื่อบู๊ตบนฮาร์ดแวร์ที่หลากหลาย ไดรเวอร์อุปกรณ์สำหรับอิมเมจเคอร์เนลทั่วไปนี้รวมอยู่ในโมดูลเคอร์เนลที่โหลดได้เนื่องจากการรวบรวมไดรเวอร์จำนวนมากเป็นเคอร์เนลเดียวทำให้อิมเมจเคอร์เนลมีขนาดใหญ่กว่ามากบางทีใหญ่เกินไปที่จะบูตในคอมพิวเตอร์ที่มีหน่วยความจำ จำกัด สิ่งนี้จะทำให้เกิดปัญหาในการตรวจจับและโหลดโมดูลที่จำเป็นในการเมานต์ระบบไฟล์รูทเมื่อถึงเวลาบู๊ตหรือสำหรับเรื่องนั้นการลดตำแหน่งหรือระบบไฟล์รูทคืออะไร

อูบุนตูเหมือนกับดิสทริบิวชันอื่น ๆ เลือกที่จะโหลดไดรเวอร์อุปกรณ์ทั้งหมดลงใน initrd นี้โดยไม่คำนึงว่าจำเป็นต้องใช้ไดรเวอร์หรือไม่และไม่คำนึงว่าอุปกรณ์นั้นมีอยู่ในระบบหรือไม่ ตามที่ไจล์สชี้ให้เห็นสิ่งทั้งหมดจะถูกโหลดเข้าสู่ RAM จากนั้นโมดูลที่ใช้จะถูกตรวจพบเมื่อเริ่มต้นและโมดูลที่ไม่ได้ใช้จะถูกลบออกจาก RAM การใช้วิธีการนี้ช่วยให้มั่นใจได้ว่า Ubuntu จะเริ่มทำงานบนระบบใด ๆ เสมอ อูบุนตูกำลังเลียนแบบเคอร์เนลเสาหินโดยใช้ microkernel builds ดูสาเหตุของการทำงาน


  1. โมดูลrt2800usbจะถูกโหลดเมื่อทำการบูทเสมอเนื่องจากโมดูลนั้นรวมอยู่ในinitramfsที่ Gilles อ้างถึง initramfs เป็นตัวตายตัวแทนของ initrd lsmodดังนั้นมันจะถูกแสดงโดย โปรดทราบว่าคุณสามารถแทรกโมดูลที่คอมไพล์ใหม่ลงในเคอร์เนลโดยใช้modprobeตามด้วยชื่อโมดูล

เป็นการทดสอบรีบูตระบบของคุณด้วยอะแดปเตอร์ไร้สายของคุณถอดปลั๊ก หากทุกอย่างเป็นไปด้วยดีโมดูลจะไม่ถูกแสดงในlsmodเอาต์พุต s เนื่องจากในระหว่างการบูทกระบวนการตรวจสอบเริ่มต้นโดย initramfs และ init sstem ไม่พบอุปกรณ์ในระหว่างการตรวจสอบและโมดูลถูกลบออกจาก RAM

  1. ในการลบโมดูลในขณะที่ระบบกำลังทำงานคุณสามารถใช้คำสั่งเช่นrmmodหรือmodprobe -rตามด้วยชื่อโมดูล ในการบู๊ตครั้งต่อไปโมดูลจะถูกโหลดใหม่ ดูด้านบน. ในกรณีส่วนใหญ่โมดูลจะไม่ถูกลบแบบไดนามิกเช่นนี้จะปิดการใช้งาน hotplugging คือเมื่อโมดูลถูกลบอุปกรณ์ที่ใช้มันไม่สามารถตรวจพบอีกครั้งเมื่อเสียบเข้า

เพื่อที่จะลบโมดูลออกlsmodคุณจะต้องลบมันออกจากอิมเมจ initramfs ที่สร้างขึ้นโดยการคอมไพล์เคอร์เนลใหม่โดยไม่ต้องใช้โมดูลที่เลือกแล้วสร้างภาพขึ้นใหม่ การทำเช่นนี้จะปิดใช้งานการตรวจหาโมดูลดังกล่าวทั้งหมด


3
คุณกำลังสับสนในการโหลดไฟล์ลงใน RAM ซึ่งเป็นส่วนหนึ่งของดิสก์ RAM และการโหลด (เช่นการลิงก์แบบไดนามิก) โมดูลลงในเคอร์เนลที่กำลังทำงานอยู่ โมดูลถูกโหลดเข้าสู่หน่วยความจำชั่วคราว - ไม่ใช่ลงในเคอร์เนล - จาก initrd (โดยทางเทคนิคแล้วเป็น initramfs ทุกวันนี้) แต่จะถูกลบออกจากหน่วยความจำหลังจากติดตั้งรูทจริง โมดูลจะถูกโหลดเข้าสู่เคอร์เนลเฉพาะเมื่อตรวจพบอุปกรณ์ที่ใช้พวกเขา (มีข้อยกเว้นเล็กน้อย)
Gilles 'หยุดความชั่วร้าย'

ขณะที่ฉันเห็นด้วยที่นี่เขากำลังพูดถึงการยกเลิกการโหลดและโหลดหนึ่งโมดูลซึ่งไม่สามารถทำได้เว้นแต่เขาเลือกที่จะตั้งค่า Ubuntu RAM Disk ใหม่ซึ่งไม่แนะนำเนื่องจาก Ubuntu เลือกที่จะโหลดโมดูลทั้งหมดลงใน RAM ทุกการอัปเดตเคอร์เนล โมดูลทั้งหมดจะถูกโหลดทุกครั้งที่มันไม่ได้ถูกใช้ทั้งหมด
eyoung100

2
ไม่คำถามเกี่ยวกับการโหลดและการยกเลิกการโหลดโมดูลลงในเคอร์เนล ทั้งคำตอบดั้งเดิมและคำตอบที่แก้ไขของคุณไม่ได้ระบุว่า initramfs นั้นไม่เกี่ยวข้อง (หรือเกี่ยวข้องกับอุปกรณ์ต่อพ่วงส่วนใหญ่) สำหรับคำถามนี้
Gilles 'หยุดความชั่วร้าย'

@Gilles ดีขึ้นไหม?
eyoung100

1
@ eyoung100 ฉันเห็นด้วยกับ Gilles การอภิปรายของ initramfs ไม่เกี่ยวข้องกับคำถาม โดยทั่วไปโมดูลจะโหลดโดยการแจกแจงอุปกรณ์/sysและโหลดไดรเวอร์สำหรับอุปกรณ์ที่พบในระบบ สิ่งนี้เกิดขึ้นไม่ว่าอุปกรณ์นั้นจะมีอยู่ตอนบู๊ตหรือเสียบเข้าที่ร้อนในภายหลัง udevมีอะไรที่เกี่ยวข้องกับมันมากกว่าที่ initramfs / initrd ทำและไม่ว่าจะทั้งหมดหรือบางส่วนส่วนใหญ่หรือมีเพียงบางโมดูลเท่านั้นที่ถูกคัดลอกลงใน initramfs (ตัวเลือกการกำหนดค่าใน/etc/initramfs-tools/initramfs.conf) ไม่เกี่ยวข้องโดยเฉพาะ
Celada
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.