Чиним AMD Reset Bug.
Вступление
Под самый конец года я все же разродился на статью. Будет она не абы про что, а аж про видеокарту амуде, которая последние 3 недели года хорошенько помотала мне нервы. Но, в прошлом году стоит оставить все плохое, и я надеюсь этот баг тоже уйдет в прошлое вместе с 2024 годом. Но перейдем к статье.
Для начала считаю нужным рассказать что такое amd reset bug.
Большинство современных видеокарт AMD страдают от ошибки сброса AMD: карта не может быть корректно сброшена, поэтому ее можно использовать только один раз за одно включение хоста. При второй попытке использования карты Linux попытается выполнить ее сброс, но не сможет, что приведет к сбою запуска виртуальной машины или зависанию гостевой, хостовой системы или обеих сразу.
Эта проблема особенно критична, если в системе установлена только одна видеокарта, так как она становится основной GPU и инициализируется UEFI хоста во время загрузки. В результате это делает ее непригодной для проброса даже один раз.
Но бегать перезапускать хост — далеко не лучшее решение, особенно если нужна какая-никакая отказоустойчивость системы. Поэтому здесь я расскажу, как заставить всё работать даже с этим багом.
Часть 1. Патч vendor-reset.
Для начала можно попробовать использовать патч ядра «vendor-reset». Устанавливается он следующими командами
apt install pve-headers-$(uname -r)
apt install git dkms build-essential
git clone https://github.com/gnif/vendor-reset.git
cd vendor-reset
dkms install .
echo "vendor-reset" >> /etc/modules
update-initramfs -u
shutdown -r now
После чего нам надо получить ID нашей видеокарты, делаем мы это командой
lspci -nn | grep 'AMD'
ID имеет вид ХХХХ:ХХ:ХХ.Х, его нам надо скопировать, после чего этой командой создайте службу vreset. 0000:01:00.0 замените на ID своей видеокарты.
cat << EOF >> /etc/systemd/system/vreset.service
[Unit]
Description=AMD GPU reset method to 'device_specific'
After=multi-user.target
[Service]
ExecStart=/usr/bin/bash -c 'echo device_specific > /sys/bus/pci/devices/0000:01:00.0/reset_method'
[Install]
WantedBy=multi-user.target
EOF
systemctl enable vreset.service && systemctl start vreset.service
Так же вы можете создать эту службу так
cd /etc/systemd/system
nano vreset.service
Вставить вот этот текст, заменив id на свой
[Unit]
Description=AMD GPU reset method to 'device_specific'
After=multi-user.target
[Service]
ExecStart=/usr/bin/bash -c 'echo device_specific > /sys/bus/pci/devices/0000:01:00.0/reset_method'
[Install]
WantedBy=multi-user.target
и исполнить эту команду
systemctl enable vreset.service && systemctl start vreset.service
После чего проверьте запустился ли сервис командой
systemctl status vreset.service
Должно быть как то так:
Доказательства работы патча можно увидеть в dmesg, и выглядит оно как то так:
И по идее теперь всё должно стать нормально, но если не стало, то переходим ко второй части.
Часть 2. Проброс только одной функции.
Если ваша проблема не решилась, то пробросьте в ВМ только одну функцию, ту которая не HDMI аудио.
Снимите галочку с «All functions», чтобы пробросить только функцию GPU.
Завершение
Эта инструкция возможно будет дополняться, но по идее методы выше помогут решить проблему с этим багом. Пишите комментарии, если у вас есть что добавить/спросить/предложить, всех с наступающим 2025 годом!
Если вам помогла эта статья — поддержите ее по ссылке — https://www.donationalerts.com/r/cyanred