มีโมดูลเคอร์เนลที่ใช้งานไม่ได้เนื่องจากที่ฉันไม่สามารถโหลดระบบปฏิบัติการได้ดังนั้นฉันจึงไม่สามารถลบหรือแก้ไขได้ เป็นไปได้ไหมที่จะข้ามโมดูลนี้ตอนบู๊ตโดยใช้พารามิเตอร์ของเคอร์เนลหรืออะไรบางอย่าง?
มีโมดูลเคอร์เนลที่ใช้งานไม่ได้เนื่องจากที่ฉันไม่สามารถโหลดระบบปฏิบัติการได้ดังนั้นฉันจึงไม่สามารถลบหรือแก้ไขได้ เป็นไปได้ไหมที่จะข้ามโมดูลนี้ตอนบู๊ตโดยใช้พารามิเตอร์ของเคอร์เนลหรืออะไรบางอย่าง?
คำตอบ:
การขึ้นบัญชีดำของโมดูลตามที่กล่าวไว้ในคำตอบก่อนหน้าเป็นวิธีที่ดีที่สุดในการหลีกเลี่ยงโมดูลเคอร์เนลอย่างสมบูรณ์ นอกเหนือจากการขึ้นบัญชีดำไม่มีวิธีทั่วไปในการปิดใช้งานโมดูล
ดิสทริบิวชัน Linux บางตัวมีพารามิเตอร์ของเคอร์เนลสำหรับบู๊ตเพื่อทำสิ่งนี้
load_modules=off
กองกำลัง udev จะข้ามอัตโนมัติโหลด สิ่งนี้จะช่วยให้คุณสามารถบูตโดยไม่ต้องโหลดโมดูลบัญชีดำที่เป็นสาเหตุของปัญหาและรีบูตตามปกติโดยไม่ต้องโหลดโมดูลที่มีปัญหาสำหรับข้อมูลเพิ่มเติมโปรดดูที่เอกสาร kernel พารามิเตอร์ มีพารามิเตอร์สำหรับปิดใช้งานระบบย่อยเฉพาะ ตัวอย่างเช่น:
nousb
ปิดใช้งานการสนับสนุนเคอร์เนล USBcgroup_disable=[name]
ปิดใช้งานคอนโทรลเลอร์เฉพาะ อย่างไรก็ตาม "หน่วยความจำ" เป็นเพียงตัวอย่างที่ได้รับการสนับสนุนโดยเฉพาะlibata.noacpi
ปิดใช้งานการใช้ ACPI ใน libata (ตัวควบคุม SATA) นี่เป็นตัวอย่างของการส่งพารามิเตอร์โมดูลผ่านเคอร์เนลการปิดใช้งานโมดูลที่เฉพาะเจาะจงเป็นไปได้จากบูตโหลดเดอร์ แต่ดูเหมือนว่าขึ้นอยู่กับ distro แน่นอน
ในอีกด้านหนึ่งสถานะเอกสารของพารามิเตอร์ของเคอร์เนล Linuxณ เดือนสิงหาคม 2559:
module_blacklist=
[KNL] อย่าโหลดรายการโมดูลที่คั่นด้วยเครื่องหมายจุลภาค มีประโยชน์สำหรับการดีบักโมดูลปัญหา
ในทางกลับกันตัวเลือกที่ทำงานกับฉันด้วย openSUSE 42.1 (Linux 4.1.31) นั้นได้อธิบายไว้ใน Arch Kernel modules wiki:
คุณสามารถขึ้นบัญชีดำได้จาก bootloader เพียงเพิ่ม
modprobe.blacklist=modname1,modname2,modname3
ถึงเคอร์เนลบรรทัด bootloader ของคุณดังอธิบายในพารามิเตอร์เคอร์เนล เมื่อคุณขึ้นบัญชีดำมากกว่าหนึ่งโมดูลโปรดทราบว่าพวกเขาจะถูกคั่นด้วยเครื่องหมายจุลภาคเท่านั้น ช่องว่างหรือสิ่งอื่นใดอาจสันนิษฐานได้ว่าทำลายไวยากรณ์
(ขอบคุณ @gertvdijk ที่ unix.SEสำหรับการชี้เรื่องนี้)
ด้วยมูลค่าการกล่าวถึงเป็นวิธีการต่อไปนี้ :
เพื่อป้องกันไม่ให้โมดูลบางอย่างถูกโหลดโดยเคอร์เนลโดยใช้บรรทัดคำสั่ง grub คุณจะต้องผ่านพวกเขาเป็นพารามิเตอร์ไปยังบรรทัดเคอร์เนลโดยใช้ไวยากรณ์ด้านล่าง
$module_name.blacklist=yes
ฉันไม่รู้ว่าพวกเขาได้สิ่งนั้นมาจากที่ไหน แต่ก็ไม่เจ็บเลยที่จะลองวิธีอื่นถ้าทุกอย่างล้มเหลว
คุณควรจะเพิ่มมันเข้าไปใน /etc/modprobe.d/blacklist หรือบัญชีดำ 'modulename'