วิธีการยกเลิกการโหลดโมดูลเคอร์เนล 'nvidia-drm'?


28

ฉันพยายามติดตั้งไดรเวอร์ NVIDIA ที่ทันสมัยที่สุดใน Debian Stretch ฉันดาวน์โหลดNVIDIA-Linux-x86_64-390.48.runมาจากที่นี่แต่เมื่อฉันพยายามจะทำ

sudo sh ./NVIDIA-Linux-x86_64-390.48.run

ตามที่แนะนำข้อความแสดงข้อผิดพลาดจะปรากฏขึ้น

ERROR: An NVIDIA kernel module 'nvidia-drm' appears to already be loaded in your kernel.  This may be because it is in use (for example, by an X server, a CUDA program, or 
         the NVIDIA Persistence Daemon), but this may also happen if your kernel was configured without support for module unloading.  Please be sure to exit any programs    
         that may be using the GPU(s) before attempting to upgrade your driver.  If no GPU-based programs are running, you know that your kernel supports module unloading,   
         and you still receive this message, then an error may have occured that has corrupted an NVIDIA kernel module's usage count, for which the simplest remedy is to     
         reboot your computer.

เมื่อฉันพยายามค้นหาว่าใครกำลังใช้nvidia-drm(หรือnvidia_drm) ฉันไม่เห็นอะไรเลย

~$ sudo lsof | grep nvidia-drm
lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs
      Output information may be incomplete.
~$ sudo lsof -e /run/user/1000/gvfs | grep nvidia-drm
~$

และเมื่อฉันพยายามที่จะลบมันก็บอกว่ามันถูกใช้

~$ sudo modprobe -r nvidia-drm
modprobe: FATAL: Module nvidia_drm is in use.
~$ 

ฉันรีบูตและเริ่มต้นในโหมดข้อความเท่านั้น (โดยกด Ctrl + Alt + F2 ก่อนที่จะให้ชื่อผู้ใช้ / รหัสผ่าน) แต่ฉันได้รับข้อผิดพลาดเดียวกัน

นอกจากนี้ฉันจะ "รู้ได้อย่างไรว่าเคอร์เนลของฉันรองรับการยกเลิกการโหลดโมดูล"

ฉันได้รับคำเตือนเล็กน้อยเกี่ยวกับการบูทอัพที่เกี่ยวข้องกับ nvidia แต่ก็ไม่ทราบว่ามันเกี่ยวข้องกันอย่างไร:

Apr 30 00:46:15 debian-9 kernel: nvidia: loading out-of-tree module taints kernel.
Apr 30 00:46:15 debian-9 kernel: nvidia: module license 'NVIDIA' taints kernel.
Apr 30 00:46:15 debian-9 kernel: Disabling lock debugging due to kernel taint
Apr 30 00:46:15 debian-9 kernel: NVRM: loading NVIDIA UNIX x86_64 Kernel Module  375.82  Wed Jul 19 21:16:49 PDT 2017 (using threaded interrupts)

คุณสามารถลองทำมันในโหมดช่วยเหลือได้หรือไม่?
vfbsilva

ดูปัญหานี้ใน github : systemctl stop systemd-logindก่อนที่จะยกเลิกการโหลดโมดูล
GAD3R

@ vfbsilva โหมดช่วยเหลือของฉันแปลกมันวนซ้ำตลอดไประบุอุปกรณ์ USB ทั้งหมดซ้ำแล้วซ้ำอีก ฉันจัดการกด Enter ให้รหัสผ่านรูทและรับพรอมต์ แต่ไม่มี / dev ดังนั้นจึงไม่สามารถเมาต์ดิสก์ได้
Rodrigo

@ GAD3R ทั้งหมดที่ฉันมีอยู่systemctl stop systemd-logind.serviceแต่สิ่งนี้จะปิดหน้าจอและพาฉันกลับไปที่การเข้าสู่ระบบกราฟิกซึ่งฉันต้องทำ Ctrl + Alt + F2 อีกครั้ง
Rodrigo

คำตอบ:


27

ฉันคิดว่าคุณต้องการหยุดตัวจัดการการแสดงผลซึ่งเป็นสิ่งที่ฉันสงสัยว่าจะใช้ไดรเวอร์ของ Nvidia

หลังจากเปลี่ยนเป็นคอนโซลข้อความ (กดCtrl+ Alt+ F2) และเข้าสู่ระบบในฐานะ root ให้ใช้คำสั่งต่อไปนี้เพื่อปิดการใช้งานเป้าหมายกราฟิกซึ่งเป็นสิ่งที่ทำให้ตัวจัดการจอแสดงผลทำงานอยู่:

# systemctl isolate multi-user.target

ณ จุดนี้ฉันคาดว่าคุณจะสามารถยกเลิกการโหลดไดรเวอร์ Nvidia โดยใช้modprobe -r(หรือrmmodโดยตรง):

# modprobe -r nvidia-drm

เมื่อคุณจัดการเพื่อแทนที่ / อัปเกรดแล้วและคุณพร้อมที่จะเริ่มสภาพแวดล้อมแบบกราฟิกอีกครั้งคุณสามารถใช้คำสั่งนี้:

# systemctl start graphical.target

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

4
สิ่งนี้ใช้ได้สำหรับฉันโดยไม่มีmodprobeขั้นตอน
Don Kirkby

1
ใช่ฉันไม่ต้องการmodprobeขั้นตอนใดเลย
David Jung

ฉันไม่สามารถลบ nvidia-drm แม้ในคอนโซลข้อความ มีความคิดใดที่ฉันสามารถบังคับให้นำมันออกได้?
addison

@addison โปรดทราบว่ามันไม่เพียงพอที่จะอยู่บนคอนโซลข้อความคุณต้องหยุด X11 หรือ Wayland หรืออะไรก็ตามที่ใช้ไดรเวอร์ nvidia จากเคอร์เนล จุดสำคัญของsystemctl isolateคำสั่งคือการทำเช่นนั้น แต่เป็นไปได้ว่าระบบของคุณไม่ได้รับการกำหนดค่าอย่างถูกต้อง ... ตรวจสอบps -efและดูว่าคุณสามารถมองเห็นสิ่งที่อาจใช้ไดรเวอร์อยู่หรือไม่จากนั้นหยุดกระบวนการนั้น ที่ควรให้คุณยกเลิกการโหลดไดรเวอร์
filbranden

5

lsofแสดงรายการไฟล์ใด ๆ ที่ใช้งานโดยกระบวนการ userspace แต่nvidia_drmเป็นโมดูลเคอร์เนลดังนั้นจึงlsofไม่จำเป็นต้องดูว่ามีการใช้จริงหรือไม่ (ไฟล์โมดูลจะไม่สามารถเปิดได้เนื่องจากเคอร์เนลโหลดเรียบร้อยแล้วลงใน RAM แต่โมดูลอาจให้บริการแก่ userspace หรือส่วนประกอบเคอร์เนลอื่น ๆ และนั่นคือสิ่งที่ป้องกันการยกเลิกการโหลดโมดูล)

เรียกใช้lsmod | grep nvidia.drmและดูหมายเลขทางด้านขวาของnvidia_drmชื่อโมดูล หมายเลขแรกเป็นเพียงขนาดของโมดูล ที่สองคือการนับการใช้งาน เพื่อให้สามารถลบโมดูลได้สำเร็จจำนวนการใช้จะต้องเป็น 0 ก่อน

หากเซิร์ฟเวอร์ X11 กำลังทำงานและใช้งานnvidiaไดรเวอร์nvidia_drmโมดูลเคอร์เนลจะใช้งานได้อย่างมั่นใจที่สุด อย่างน้อยที่สุดคุณจะต้องเปลี่ยนเป็นคอนโซลข้อความและปิดเซิร์ฟเวอร์ X11 โดยปกติจะสามารถทำได้โดยหยุดบริการ X Display Manager ที่คุณใช้อยู่ (ขึ้นอยู่กับสภาพแวดล้อมเดสก์ท็อปที่คุณใช้)

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


หลังจาก Ctrl + Alt + F2, lsmodจะบอกฉันมี 1 nvidia_drmขั้นตอนการใช้ ฉันก็sudo /etc/init.d/gdm3 stopเลยokหยุดไปแล้ว แต่ก็ยังคง 1 lsmodในกระบวนการ ตอนนี้ภายใน Gnome, ps aux | grep nvidiaการแสดง[irq/129-nvidia]และแต่ไม่มี[nvidia] nvidia-persistencedนอกจากนี้ที่นี่lsmodแสดงให้เห็น 2 nvidia_drmกระบวนการใช้ ผมติดอยู่.
Rodrigo

3

ฉันมีปัญหาที่คล้ายกัน

* เหตุผล: แพ็คเกจ nvidia.drm ถูกใช้งานอยู่


ฉันแก้ไขโดยกำจัดแพ็คเกจ NVIDIA ทั้งหมด

ลบการติดตั้ง NVIDIA ก่อนหน้าทั้งหมดด้วยคำสั่ง 2 เหล่านี้:


$ sudo apt-get purge nvidia*
$ sudo apt-get autoremove

ควรลบโมดูลออก

รีบูตแล้วออกไป


ขอขอบคุณ! นี้อาจมามีประโยชน์หากฉันต้องการที่จะจัดรูปแบบอีกครั้ง ...
โรดริโก

2

คุณรายงานในความคิดเห็นที่การหยุดบริการ systemd-logind จะนำคุณกลับสู่การเข้าสู่ระบบกราฟิก หากคุณมีการเข้าสู่ระบบแบบกราฟิกแล้ว X กำลังทำงานอยู่ดังนั้นไดรเวอร์วิดีโอจึงถูกโหลดและใช้งานอยู่ สิ่งนี้มีแนวโน้มมากที่จะอธิบายในส่วนที่ว่าทำไมโมดูล nvidia-drm ใช้งานอยู่

นอกจากนี้คุณหักหลังความเข้าใจผิดที่เห็นได้ชัดเมื่อคุณพูด

ฉันรีบูตและเริ่มต้นในโหมดข้อความเท่านั้น (โดยกด Ctrl + Alt + F2 ก่อนที่จะให้ชื่อผู้ใช้ / รหัสผ่าน) แต่ฉันได้รับข้อผิดพลาดเดียวกัน

การกด Ctrl + Alt + F2 จะเปลี่ยนเป็นเทอร์มินัลเสมือน # 2 ซึ่งอาจได้รับการกำหนดค่าสำหรับการเข้าสู่ระบบโหมดข้อความ แต่นั่นเป็นหนทางไกลจาก "การเริ่มต้นในโหมดข้อความ" หากคุณมีหน้าจอเข้าสู่ระบบแบบกราฟิกบนเทอร์มินัลเสมือนที่เป็นค่าเริ่มต้น X จะทำงานและการสลับไปใช้ VT อื่นจะไม่เปลี่ยนแปลง คุณเพิ่งเข้าสู่เซสชันที่ไม่ใช่ X

สิ่งแรกและสิ่งที่ง่ายที่สุดที่ควรลองคือการปิดเซิร์ฟเวอร์ X วิธีการแบบเก่าในการทำเช่นนี้คือการเข้าสู่เซสชันข้อความของคุณและดำเนินการคำสั่ง

telinit 3

เพื่อเปลี่ยนเป็น runlevel 3 ซึ่งควรทำงานกับ systemd ด้วยเช่นกัน แต่วิธีดั้งเดิมของ systemd คือให้เรียกใช้แทน

systemctl isolate multi-user.target

แน่นอนว่าทั้งสองอย่างนี้ต้องการสิทธิ์พิเศษดังนั้นคุณจะต้องใช้sudoหรือทำให้คุณรูท

หากนั่นไม่ได้ลบโมดูลหรืออย่างน้อยก็ทำให้คุณสามารถทำได้ด้วยตนเองดังนั้นทางออกที่ดีที่สุดของคุณต่อไปคือการบูตระบบเข้าสู่ runlevel 3 (เป้าหมายผู้ใช้หลายคน) หรืออาจเป็น runlevel 1 (เป้าหมายกู้ภัย) ฉันมักจะทำเช่นนี้โดยการเพิ่ม "3" (หรือ "1") ที่ส่วนท้ายของรายการอาร์กิวเมนต์เคอร์เนลในเวลาบูตผ่าน bootloader นอกจากนี้คุณยังสามารถเปลี่ยนเป้าหมายบูตเริ่มต้นที่อธิบายไว้ในบทความนี้

โปรดทราบว่าไดรเวอร์ nVidia มีอยู่ในแพ็คเกจที่สร้างไว้ล่วงหน้าสำหรับ Linux distros ส่วนใหญ่ มีเพียงไม่กี่แพ็คเกจที่บรรจุอยู่ใน repos มาตรฐานของพวกเขาเองเพราะไดรเวอร์นั้นเป็นกรรมสิทธิ์ แต่คุณสามารถหา repo ของบุคคลที่สามที่มีชื่อเสียงได้ ฉันขอแนะนำอย่างยิ่งให้ใช้แพ็คเกจดังกล่าวแทนการเรียกใช้ตัวติดตั้งโดยตรง แต่เพื่อให้ได้ตำแหน่งที่คุณอยู่ตอนนี้คุณอาจต้องถอนการติดตั้งไดร์เวอร์ด้วยตนเองก่อน


ฉันจัดการเพื่อถอนการติดตั้ง (โดยใช้คำตอบของ Filipe) และติดตั้งเวอร์ชันใหม่จนถึงจุดที่ไม่มีโหมดกราฟิกที่ใช้งานได้อีกต่อไป ฉันต้องฟอร์แมตพีซีและติดตั้ง Debian อีกครั้ง ตอนนี้เป็นชุดของข้อบกพร่องที่แตกต่างอย่างสิ้นเชิง ... ทั้งหมดนี้แค่เห็น "GPU" เป็นตัวเลือกในการเรนเดอร์ใน Blender และฉันก็ยังไม่เห็นมัน ไดรเวอร์ที่เป็นกรรมสิทธิ์ครับ!
Rodrigo

@Rodrigo ฉันขอโทษคุณมีประสบการณ์ที่ไม่ดี แต่ปัญหาดังกล่าวเป็นตัวอย่างของสาเหตุที่ฉันแนะนำให้ใช้แพ็คเกจแทนการติดตั้งด้วยตนเอง
John Bollinger

ใช่ฉันชอบที่จะใช้แพ็คเกจ แต่ฉันได้อ่านที่ไหนสักแห่งว่าตัวเลือก GPU ใน Blender นั้นไม่ได้เปิดใช้งานอาจเป็นเพราะไดรเวอร์ที่ล้าสมัย ...
Rodrigo

2

การติดตั้ง CUDA

1) ดาวน์โหลดชุดเครื่องมือ CUDAล่าสุด

2) เปลี่ยนเป็น tty3 โดยกด Ctl + Alt + F3

3) ยกเลิกการโหลด nvidia-drm ก่อนดำเนินการต่อ

3a) แยก multi-user.target

sudo systemctl isolate multi-user.target

3b) โปรดทราบว่าขณะนี้มีการใช้งาน nvidia-drm

lsmod | grep nvidia.drm

3c) ยกเลิกการโหลด nvidia-drm

sudo modprobe -r nvidia-drm

4d) โปรดทราบว่า nvidia-drm ไม่ได้ใช้งานอีกต่อไป

lsmod | grep nvidia.drm

5) ไปที่โฟลเดอร์ดาวน์โหลดของคุณและเรียกใช้การติดตั้ง cuda

sudo sh cuda_10.1.168_418.67_linux.run

6) ตอบคำถามใด ๆ ระหว่างการติดตั้ง

7) เมื่อการติดตั้งเสร็จสิ้นให้ยืนยันว่าเวอร์ชั่น CUDA ได้รับการอัพเดตแล้ว

nvidia-smi

8) เริ่ม GUI อีกครั้ง

sudo systemctl start graphical.target

0

พบปัญหาเดียวกันกับ Debian Stretch เมื่อพยายามติดตั้งไดรเวอร์ของ Nvidia เมื่อแก้ไขข้อความในโซลูชันเดียวของฉันคือการลบไดรเวอร์ติดตั้ง gdm และ gnome-shell ฉันรู้ว่ามันเป็นวิธีการแก้ปัญหาที่งุ่มง่าม แต่ฉันจำได้ว่าฉันลองแก้ไข gnome-shell ก่อนแล้วจึงลบไดรเวอร์ Nvidia และติดตั้ง GDM ใหม่เท่านั้น กลับกลายเป็นว่ามันง่ายกว่ามากเพียงแค่ติดตั้งเชลล์ใหม่ทั้งหมด


ฉันคิดว่าฉันจะรอวิธีแก้ปัญหาที่เงอะงะน้อยลงถ้ามีปรากฏขึ้น
Rodrigo

0

ฉันยังพบปัญหาเดียวกัน สาเหตุของข้อผิดพลาดคือฉันบังเอิญเลือก "ติดตั้งไดรเวอร์ nvidia" ในระหว่างการติดตั้ง cuda

ดังนั้นในระหว่างการติดตั้ง CUDA เมื่อคุณพบตัวเลือกต่อไปนี้:

ติดตั้งไดรเวอร์กราฟิกเร่ง NVIDIA สำหรับ Linux-x86_64 384.81? (y) ES / (n) o / (Q) uit:

โปรดเลือกqปัญหาจะได้รับการแก้ไข


แล้วคุณพูดว่าอะไร ทางออกเดียวคือติดตั้งใหม่? เห็นได้ชัดว่าไม่ใช่ทางออกเดียว คำตอบอื่น ๆ ได้รับการโพสต์
Scott

0

สิ่งที่ใช้ได้ผลสำหรับฉันคือการเปลี่ยนระบบให้เป็นข้อความมากขึ้น

systemctl set-default runlevel3.target

จากนั้นรีสตาร์ทและติดตั้งไดรเวอร์ nvidia cuda เมื่อเสร็จแล้วคุณอาจต้องการเปลี่ยนระบบให้เริ่มในโหมดกราฟิกอีกครั้ง

systemctl set-default runlevel5.target

0

หยุดsystemd-logindแก้ไขให้ฉัน:

sudo systemctl stop systemd-logind

นี่เป็นข้อเสนอแนะเพื่อเป็นวิธีแก้ปัญหาในปัญหา GitHub นี้ในหน้า github nvidia-xrun:

ข่าวดีพวก systemd-logind เป็นผู้ร้ายที่นี่ วิธีแก้ปัญหาปัจจุบันคือการเรียกใช้คำสั่งต่อไปนี้หลังจากออกจากเซสชัน "nvidia-xrun" sudo systemctl หยุด systemd-logind

จากนั้นคุณจะต้องลบโมดูล nvidia อื่น ๆ ด้วยตนเองและปิด DGPU ด้วยตนเอง นี่คือข้อมูลโค้ดที่ทำงานหลังจากที่คุณออกจากระบบ "เซสชั่น" nvidia-xrun "

echo 'Unloading nvidia_drm module' 
execute "sudo rmmod nvidia_drm"

echo 'Unloading nvidia_modeset module' 
execute "sudo rmmod nvidia_modeset"

echo 'Unloading nvidia module' 
execute "sudo rmmod nvidia"

echo 'Turning off nvidia GPU' 
execute "sudo tee /proc/acpi/bbswitch <<<OFF"

echo -n 'Current state of nvidia GPU: ' 
execute "cat /proc/acpi/bbswitch"

ปัญหา Systemd บน Github

ลิงค์อ้างอิงจากพอร์ทัล Nvidia Linux Developers

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