คำสั่ง Linux / Unix: insmod

คำสั่ง Linux / Unix insmod จะติดตั้งโมดูลที่สามารถโหลดได้ ในเคอร์เนลที่รัน insmod พยายามเชื่อมโยงโมดูลกับเคอรเนตที่รันโดยการแกไขสัญลักษณทั้งหมดจากตารางสัญลักษณที่เอ็กซ์ปอร์ตของเคอรเนล

หากชื่อไฟล์โมดูลมีให้โดยไม่มีไดเรกทอรีหรือส่วนขยาย insmod จะค้นหาโมดูลในไดเร็กทอรีเริ่มต้นทั่วไปบางแห่ง ตัวแปรสภาพแวดล้อม MODPATH สามารถใช้แทนที่ค่าดีฟอลต์นี้ได้ ถ้าไฟล์การกำหนดค่าโมดูลเช่น /etc/modules.conf มีอยู่จะแทนที่เส้นทางที่กำหนดไว้ใน MODPATH

ตัวแปรสภาพแวดล้อม MODULECONF สามารถใช้เพื่อเลือกแฟ้มการกำหนดค่าอื่นจากไฟล์เริ่มต้น /etc/modules.conf (หรือ /etc/conf.modules (deprecated)) ตัวแปรสภาพแวดล้อมนี้จะแทนที่คำจำกัดความทั้งหมดข้างต้น

เมื่อตั้งค่าตัวแปร environment UNAME_MACHINE แล้ว modutils จะใช้ค่าแทนฟิลด์ machine จาก unysame () syscall ซึ่งส่วนใหญ่ใช้งานเมื่อคุณคอมไพล์โมดูล 64 บิตในพื้นที่ผู้ใช้ 32 บิตหรือในทางกลับกันให้ตั้งค่า UNAME_MACHINE เป็นประเภทของโมดูล modutils ปัจจุบันไม่สนับสนุนโหมดการสร้างข้ามเต็มสำหรับโมดูล แต่จะ จำกัด ให้เลือกระหว่างสถาปัตยกรรมโฮสต์รุ่น 32 บิตและ 64 บิต

ตัวเลือก

-e persist_name , --persist = persist_name

ระบุตำแหน่งที่จะอ่านข้อมูลแบบถาวรสำหรับโมดูลจากเมื่อโหลดและเขียนเมื่อมีการยกเลิกการโหลดโมดูลโมดูลนี้ ตัวเลือกนี้ถูกละเลยในกรณีที่โมดูลไม่มีข้อมูลถาวร ข้อมูลแบบถาวรจะถูกอ่านโดย insmod ถ้าตัวเลือกนี้มีอยู่โดยค่าเริ่มต้น insmod ไม่ประมวลผลข้อมูลแบบถาวร

เป็น รูปแบบชวเลข "-e" " (สตริงเปล่า) ถูกแปลโดย insmod เป็นค่าของ persistdir ตามที่กำหนดไว้ใน modules.conf ตามด้วยชื่อไฟล์ของโมดูลที่สัมพันธ์กับเส้นทางการค้นหาโมดูลที่พบใน ต่อท้าย ".gz", ".o" หรือ ".mod" ถ้า modules.conf ระบุ " persistdir = " (เช่น persistdir เป็นช่องว่าง) แล้วแบบชวเลขนี้จะถูกเพิกเฉยอย่างเงียบ ๆ (ดู modules.conf (5))

-f , --force

ลองโหลดโมดูลแม้ว่ารุ่นของเคอร์เนลที่ใช้งานอยู่และเวอร์ชันของเคอร์เนลที่โมดูลได้รวบรวมไว้ไม่ตรงกัน การดำเนินการนี้จะแทนที่การตรวจสอบเวอร์ชันของเคอร์เนลเท่านั้น แต่จะไม่มีผลต่อการตรวจสอบชื่อสัญลักษณ์ หากชื่อสัญลักษณ์ในโมดูลไม่ตรงกับเคอร์เนลไม่มีวิธีใดที่จะบังคับให้โหลดโมดูล insmod

-h , --help

แสดงสรุปตัวเลือกและออกจากระบบทันที

-k , --autoclean

ตั้งค่าแฟล็กอัตโนมัติในโมดูล ธงนี้จะถูกใช้โดย kerneld (8) เพื่อลบโมดูลที่ไม่ได้ใช้ในบางช่วงเวลา - โดยปกติจะใช้เวลาหนึ่งนาที

-L , - ล็อค

ใช้ ฝูง (2) เพื่อป้องกันการโหลดพร้อมกันของโมดูลเดียวกัน

-m , --map

เอาต์พุตแผนที่โหลดบน stdout ทำให้ง่ายต่อการตรวจแก้จุดบกพร่องของโมดูลในกรณีที่เกิดความตื่นตระหนกของเคอร์เนล

-n , --noload

ทำงาน Dummy ทำทุกอย่างยกเว้นโหลดโมดูลลงในเคอร์เนล หากมีการร้องขอโดย -m หรือ -O การดำเนินการจะสร้างแผนที่หรือไฟล์หยด เนื่องจากไม่ได้โหลดโมดูลที่อยู่โหลดเคอร์เนลจริงจึงไม่เป็นที่รู้จักดังนั้นไฟล์แผนที่และไฟล์หยดจะขึ้นอยู่กับที่อยู่ที่โหลดโดยพลการของ 0x12340000

-o ชื่อ โมดูล , --name = module_name

ระบุชื่อโมดูลอย่างชัดเจนมากกว่าการสืบทอดชื่อจากชื่อฐานของไฟล์ออบเจกต์ต้นทาง

-O blob_name , --blob = blob_name

บันทึกวัตถุไบนารีใน blob_name ผลลัพธ์คือไบนารีหยด (ไม่มีส่วนหัว ELF) แสดงสิ่งที่ถูกโหลดลงในเคอร์เนลหลังจากการจัดการและการย้ายส่วน ขอแนะนำให้เลือก -m เพื่อขอรับแผนที่ของวัตถุ

-p , - probe

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

-P prefix , --prefix = prefix

ตัวเลือกนี้สามารถใช้ได้กับโมดูลที่มีการกำหนดรุ่นสำหรับ SMP หรือ bigmem kernel เนื่องจากโมดูลดังกล่าวมีคำนำหน้าเสริมในชื่อสัญลักษณ์ ถ้าเคอร์เนลถูกสร้างขึ้นด้วยเวอร์ชันสัญลักษณ์ insmod จะดึงข้อมูลคำนำหน้าจากคำจำกัดความของ "get_module_symbol" หรือ "inter_module_get" โดยอัตโนมัติซึ่งหนึ่งในนั้นจะต้องมีอยู่ในเคอร์เนลใด ๆ ก็ตามที่สนับสนุนโมดูล ถ้าเคอร์เนลไม่มีรูปแบบสัญลักษณ์ แต่โมดูลถูกสร้างขึ้นด้วยรูปแบบสัญลักษณ์แล้วผู้ใช้ต้องจัดหา -P

-q , - เงียบสงบ

อย่าพิมพ์รายการสัญลักษณ์ที่ยังไม่ได้แก้ไข อย่าบ่นเกี่ยวกับเวอร์ชันที่ไม่ตรงกัน ปัญหาจะปรากฏเฉพาะในสถานะทางออกของ insmod

-r , - root

ผู้ใช้บางรายคอมไพล์โมดูลภายใต้ userid ที่ไม่ใช่ root จากนั้นติดตั้งโมดูลเป็น root กระบวนการนี้สามารถปล่อยให้โมดูลที่เป็นของ userid ที่ไม่ใช่ root ได้แม้ว่าไดเรกทอรี root จะเป็นของ root ก็ตาม หากผู้ใช้ที่ไม่ใช่ root ถูกบุกรุกผู้บุกรุกสามารถเขียนทับโมดูลที่มีอยู่ซึ่งเป็นของ userid และใช้การเปิดรับนี้เพื่อบูตระบบได้สูงสุด

โดยค่าเริ่มต้น modutils จะปฏิเสธความพยายามที่จะใช้โมดูลที่ไม่ได้เป็นของ root การระบุ -r จะสลับการตรวจสอบและอนุญาตให้ root โหลดโมดูลที่ไม่ได้เป็นของ root หมายเหตุ: ค่าเริ่มต้นสำหรับการตรวจสอบ root สามารถเปลี่ยนแปลงได้เมื่อกำหนดค่า modutils

การใช้ -r เพื่อปิดใช้งานการตรวจสอบ root หรือการตั้งค่าเริ่มต้นเป็น "no root check" ที่เวลากำหนดค่าคือการรักษาความปลอดภัยที่สำคัญและไม่แนะนำให้ใช้

-s , - syslog

ส่งข้อมูลทั้งหมดไปยัง syslog (3) แทนที่จะเป็นเทอร์มินัล

-S , - kallsyms

บังคับให้โหลดโมดูลมีข้อมูล kallsyms แม้ว่าเคอร์เนลจะไม่รองรับก็ตาม ตัวเลือกนี้ใช้สำหรับระบบขนาดเล็กที่มีการโหลดเคอร์เนลโดยไม่มีข้อมูล kallsyms แต่โมดูลที่เลือกจำเป็นต้องมี kallsyms สำหรับการดีบัก ตัวเลือกนี้เป็นค่าดีฟอลต์สำหรับ Red Hat Linux

-v , --verbose

พูดอย่างละเอียด

-V , --version

แสดงเวอร์ชัน insmod

-X , --export ; -x , --noexport

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

-Y , --ksymoops ; -y , --noksymoops

ทำและอย่าเพิ่มสัญลักษณ์ ksymoops ไปยัง ksyms สัญลักษณ์เหล่านี้ถูกใช้โดย ksymoops เพื่อให้ดีบั๊กถ้ามีอ๊ะในโมดูลนี้ ค่าดีฟอลต์คือสำหรับสัญลักษณ์ ksymoops ที่จะกำหนด ตัวเลือกนี้ไม่ขึ้นอยู่กับตัวเลือก -X / -x

สัญลักษณ์ ksymoops เพิ่มประมาณ 260 ไบต์ต่อโมดูลที่โหลด จนกว่าคุณจะสั้น ๆ เกี่ยวกับพื้นที่เคอร์เนลและกำลังพยายามลดขนาดของ ksyms ให้เหลือน้อยที่สุดให้ใช้ค่าดีฟอลต์และได้รับการแก้จุดบกพร่องอย่างแม่นยำมากขึ้น สัญลักษณ์ ksymoops จำเป็นต้องใช้เพื่อบันทึกข้อมูลโมดูลแบบถาวร

-N , - numeric เท่านั้น

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

พารามิเตอร์ของโมดูล

โมดูลบางโมดูลยอมรับพารามิเตอร์เวลาโหลดเพื่อกำหนดการทำงานของตนเอง พารามิเตอร์เหล่านี้มักเป็นพอร์ต I / O และหมายเลข IRQ ที่แตกต่างกันไปในแต่ละเครื่องและไม่สามารถระบุได้จากฮาร์ดแวร์

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

ในกรณีของจำนวนเต็มค่าทั้งหมดอาจเป็นทศนิยม, เลขฐานแปดหรือเลขฐานสิบหก a la C: 17, 021 หรือ 0x11 องค์ประกอบอาร์เรย์ถูกระบุโดยคั่นด้วยเครื่องหมายจุลภาค องค์ประกอบสามารถข้ามได้โดยละเว้นค่า

ในโมดูลชุด 2.0 ค่าที่ไม่ได้ขึ้นต้นด้วยตัวเลขถือว่าเป็นสตริง เริ่มต้นใน 2.1 ข้อมูลประเภทของพารามิเตอร์จะระบุว่าจะตีความค่าเป็นสตริง ถ้าค่าเริ่มต้นด้วยเครื่องหมายคำพูดสองครั้ง ( " ) สตริงจะถูกตีความเช่นเดียวกับใน C ลำดับการหลบหนีและทั้งหมดอย่าสังเกตว่าจากเชลล์พรอมต์คำพูดอาจจำเป็นต้องได้รับการปกป้องจากการแปลความหมายของเชลล์

GPL Modensed Modules และสัญลักษณ์

เริ่มต้นด้วยเคอร์เนล 2.4.10 โมดูลควรมีสตริงสิทธิ์การใช้งานซึ่งกำหนดโดยใช้ MODULE_LICENSE () หลายสายได้รับการยอมรับว่าเป็น GPL compatible; สายการอนุญาตใด ๆ หรือไม่มีใบอนุญาตเลยหมายความว่าโมดูลนี้ถือว่าเป็นกรรมสิทธิ์

ถ้าเคอร์เนลรองรับ / proc / sys / kernel / flag เสีย แล้ว insmod จะหรือแฟล็กเสียด้วย '1' เมื่อโหลดโมดูลโดยไม่มีใบอนุญาต GPL มีการแจ้งเตือนหากเคอร์เนลสนับสนุนการสลบและโหลดโมดูลโดยไม่มีใบอนุญาต มีคำเตือนสำหรับโมดูลที่มี MODULE_LICENSE () ที่ไม่สามารถใช้ร่วมกับ GPL ได้แม้กระทั่งในเมล็ดที่เก่ากว่าที่ไม่สนับสนุนการสลบ ซึ่งจะลดคำเตือนเมื่อมีการใช้ modutils ใหม่ในเมล็ดที่มีอายุมาก

โหมด insmod -f (force) จะเป็นแบบ OR flag เสียด้วย '2' บนเมล็ดที่รองรับการ tainting มีการเตือนเสมอ

นักพัฒนาเคอร์เนลบางคนต้องการให้มีการส่งออกสัญลักษณ์ตามรหัสของตนโดยใช้โมดูลที่มีใบอนุญาต GPL สัญลักษณ์เหล่านี้จะถูกเอ็กซ์พอร์ตโดย EXPORT_SYMBOL_GPL แทน EXPORT_SYMBOL ปกติ สัญลักษณ์ GPL ที่ส่งออกโดยเคอร์เนลและโมดูลอื่น ๆ จะปรากฏเฉพาะกับโมดูลที่มีสิทธิการใช้งานร่วมกับ GPL สัญลักษณ์เหล่านี้จะปรากฏใน / proc / ksyms พร้อมกับคำนำหน้าของ ' GPLONLY_ ' insmod ละเว้นคำนำหน้าของ GPLONLY_ ในสัญลักษณ์ขณะโหลดโมดูลที่ได้รับอนุญาตของ GPL ดังนั้นโมดูลจึงใช้ชื่อสัญลักษณ์ตามปกติโดยไม่มีคำนำหน้า เฉพาะสัญลักษณ์ GPL ไม่สามารถใช้งานได้กับโมดูลที่ไม่มีใบอนุญาต GPL ซึ่งรวมถึงโมดูลที่ไม่มีใบอนุญาตเลย

การช่วยเหลือ Ksymoops

เพื่อช่วยในการดีบักเคอร์เนลโอ๊ะเมื่อใช้โมดูลค่าดีฟอลต์ insmod เพื่อเพิ่มสัญลักษณ์บางส่วนให้กับ ksyms ดูที่ตัวเลือก -Y สัญลักษณ์เหล่านี้เริ่มต้นด้วย __insmod_modulename_ ชื่อ โมดูล ต้องใช้เพื่อทำให้สัญลักษณ์เป็นเอกลักษณ์ เป็นไปตามกฎหมายที่จะโหลดวัตถุเดียวกันมากกว่าหนึ่งครั้งภายใต้ชื่อโมดูลที่แตกต่างกัน ปัจจุบันสัญลักษณ์ที่กำหนดคือ:

__insmod_modulename_Oobjectfile_Mmtime_Vversion

objectfile คือชื่อของไฟล์ที่โหลดจากวัตถุ เพื่อให้แน่ใจว่า ksymoops สามารถจับคู่รหัสกับวัตถุที่ถูกต้องได้ mtime คือ timestamp ที่แก้ไขล่าสุดในไฟล์ดังกล่าวในรูป hex, zero ถ้า stat ล้มเหลว version คือเคอร์เนลเวอร์ชั่นที่โมดูลถูกคอมไพล์ไว้, -1 ถ้าไม่มี version. สัญลักษณ์ _O มีที่อยู่เริ่มต้นเหมือนกับส่วนหัวของโมดูล

__insmod_modulename_Ssectionname_Llength

สัญลักษณ์นี้ปรากฏขึ้นเมื่อเริ่มต้นของส่วน ELF ที่เลือกอยู่ในปัจจุบัน .text, .rodata, .dat, .bss และ .sbss จะปรากฏเฉพาะในกรณีที่ส่วนนั้นมีขนาดที่ไม่ใช่ศูนย์ sectionname คือชื่อของส่วน ELF ความยาว คือความยาวของส่วนในทศนิยม สัญลักษณ์เหล่านี้ช่วยให้ ksymoops map address ไปยังส่วนต่างๆเมื่อไม่มีสัญลักษณ์ใด ๆ

__insmod_modulename_Ppersistent_filename

สร้างขึ้นโดย insmod ถ้าโมดูลมีพารามิเตอร์อย่างน้อยหนึ่งรายการที่ถูกทำเครื่องหมายว่าเป็นข้อมูลที่มีอยู่ถาวรและมี ชื่อไฟล์เพื่อบันทึกข้อมูลแบบถาวร (ดู -e อยู่ด้านบน) พร้อมใช้งาน

ปัญหาอื่น ๆ กับการดีบั๊กเคอร์เนลโอ๊ะโอในโมดูลคือเนื้อหาของ / proc / ksyms และ / proc / modules สามารถเปลี่ยนระหว่าง Oops และเมื่อคุณประมวลผลไฟล์บันทึก เพื่อช่วยแก้ปัญหานี้ถ้าไดเร็กทอรี / var / log / ksymoops มีอยู่แล้ว insmod และ rmmod จะคัดลอก / proc / ksyms และ / proc / modules ไปที่ / var / log / ksymoops ด้วยคำนำหน้าของ `date +% Y% m % d% H% M% S` ผู้ดูแลระบบสามารถบอก ksymoops ซึ่งไฟล์ snapshot ที่จะใช้เมื่อแก้จุดบกพร่องอ๊ะ ไม่มีสวิตช์เพื่อปิดใช้งานการทำสำเนาอัตโนมัตินี้ ถ้าคุณไม่ต้องการให้เกิดขึ้นอย่าสร้าง / var / log / ksymoops หากไดเรกทอรีนั้นมีอยู่ควรเป็นของ root และเป็นโหมด 644 หรือ 600 และคุณควรเรียกใช้สคริปต์นี้ทุกวันหรือมากกว่า สคริปต์ด้านล่างมีการติดตั้งเป็น insmod_ksymoops_clean

ข้อมูลพื้นฐานที่ควรรู้

ชื่อ

insmod - ติดตั้งโมดูลเคสที่ใส่ได้

สรุป

insmod [-fhkLmnpqrsSvVxXyYN] [-e persist_name ] [-o module_name ] [-O blob_name ] โมดูล [-P prefix ] [ สัญลักษณ์ = มูลค่า ... ]