ฉันจะค้นหาไฟล์ที่ใช้ใน insmod ใน Linux ได้อย่างไร?


3

ฉันกำลังทำงานกับสคริปต์ที่ทำงานบนเซิร์ฟเวอร์ CentOS / Redhat ประเภทต่างๆที่ต้องการค้นหาว่าไฟล์ใดที่ถูกโหลดลงในเคอร์เนล การรัน lsmod ทำให้ฉันมีชื่อของโมดูล (ซึ่งอาจถูกตั้งค่าโดยใช้ -o ในการเรียกไปยัง insmod) แต่ไม่ใช่ไฟล์ที่ถูกโหลด

มีอยู่แล้วเพื่อค้นหาไฟล์ที่ถูกโหลดลงในเคอร์เนลเป็นโมดูล? มีความสามารถในการอ้างอิงข้ามกับชื่อตามที่ปรากฏใน lsmod หรือไม่

ขอบคุณ!

คำตอบ:


2

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

ชื่อโมดูลfoo, modprobe -l fooแสดงให้เห็นถึงสิ่งที่ไฟล์จะถูกโหลดถ้าโมดูลfooได้รับการร้องขอ แต่ถ้าถูกใช้ในการโหลดโมดูลชื่อโมดูลเริ่มต้นไม่ได้บันทึกไว้เท่านั้นmodprobe -o barbar


ฉันมาจากพื้นหลังของ Windows - ซึ่งปกติแล้วไฟล์ดังกล่าวจะระบุได้ง่ายและมักจะถูกล็อคเพื่อการเข้าถึง (การย้ายการเปลี่ยนชื่อ ฯลฯ ) เคอร์เนลมีตัวอธิบายไฟล์ใด ๆ กับไฟล์ที่โหลด (หลังจากโหลด) หรือไม่? หรืออาจบันทึกตามค่าเริ่มต้นว่าไฟล์ใดถูกโหลดและอยู่ภายใต้ชื่อใด
Yon

@Yon: เคอร์เนลไม่เคยเปิดไฟล์ insmodและmodprobeทำงานโดยการโหลดรหัสจาก.koไฟล์ลงในหน่วยความจำและส่งสำเนานั้นในหน่วยความจำไปยังเคอร์เนล จากนั้นเคอร์เนลจะเก็บสำเนารหัสของตนเอง หากคุณต้องการข้อมูลนี้คุณจะต้องเก็บบันทึกของคุณเอง (และตรวจสอบให้แน่ใจว่าคุณไม่ได้ลบหรือย้ายไฟล์โมดูลตัวอย่างเช่นทำการอัพเกรดเคอร์เนล) โปรดทราบว่านี่เป็นปรัชญาทั่วไปในโลกยูนิกซ์: การเปลี่ยนชื่อหรือลบไฟล์ควรทำงานได้ตลอดเวลาและไม่ก่อให้เกิดปัญหาเว้นแต่จะมีบางอย่างพยายามเปิดไฟล์ในภายหลัง
Gilles

ขอบคุณสำหรับสิ่งนี้. เราจะพบทางออกอื่น ตามระเบียบของเว็บไซต์นี้คือคำตอบที่ว่า "การที่เป็นไปไม่ได้" ถือว่าเป็นคำตอบที่ดีสำหรับคำถาม (ถ้ามันเป็นคำตอบจริงหรือไม่?
Yon

@ ยอน: ฉันแทบจะไม่สามารถตอบคำถามนี้ได้เพราะฉันเป็นบุคคลที่มีความสนใจ ตรวจสอบคำถามที่พบบ่อยเกี่ยวกับคำตอบที่ได้รับการยอมรับและหากคุณยังไม่สามารถตัดสินใจได้ดูที่เมตาและเมตา SOหรือถามเกี่ยวกับเมตา
Gilles

ดีตามคำถามที่พบบ่อยมันควรจะเป็นคำตอบที่ "มีประโยชน์มากที่สุด"
Yon

0

ฉันเล่นมาแล้วและพบคำสั่งต่อไปนี้

$ lsmod | cut -d " " -f 1

จะส่งออกรายการของโมดูลที่โหลด

$ modinfo modulename -n

จะส่งออกชื่อไฟล์ของโมดูล

$ list=`lsmod | cut -d " " -f 1`; echo "$list" | while read line; do echo $line; echo -e `modinfo $line -n`\\n; done;

จะส่งออกรายการของโมดูลเคอร์เนลพร้อมกับเส้นทางของไฟล์


1
แต่modinfoไม่ช่วยถ้าโมดูลถูกโหลดด้วยชื่อสำรองด้วยmodprobe -oหรือถ้าไฟล์โมดูลนั้นถูกเปลี่ยนชื่อ
Gilles

@Gilles True, +1
BloodPhilia

@Gilles และนั่นคือสถานการณ์ที่นี่ดังนั้นหลังจากการทดสอบสิ่งที่ @BloodPhilia แนะนำเรายังคงไม่มีคำตอบ
Yon

0
cat /proc/modules

ให้รายการ (รายละเอียด) ของโมดูลที่โหลด (RedHat, Ubuntu, ฉันเดาว่ามันใช้งานได้กับ CentOS ที่ใช้ Redhat เป็นพื้นฐาน)


@ ring0: นั่นเป็นวิธีที่ง่ายในการค้นหาโมดูลที่จำแนกตามชื่อที่โหลดไว้ modprobe -oแต่มันก็ไม่ได้ช่วยถ้าชื่อโหลดไม่ตรงกับชื่อไฟล์เนื่องจากการใช้งานของ
Gilles

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.