«Алдуин взлетает!»: как мне удалось запустить Skyrim на ноутбуке 2012 года с NVIDIA Optimus под Linux Mint

Прокомментировать Просмотры: 0

Skyrim на ноутбуке 2012 года.

TL;DR: На Avito я купил ASUS N56VZ 2012 года с процессором i7-3630QM и видеокартой GT 650M за 6800 ₽. После восстановления ноутбука, пострадавшего от чужого «ремонта», установил Linux Mint 22.3 и столкнулся с NVIDIA Optimus. Собрал драйвер 470 с патчами из репозитория joanbm для ядра 6.14.0-37, устранил чёрный экран, настроил PRIME Render Offload и DXVK, добился обнаружения NVIDIA в Vulkan и запустил Skyrim. Девять дней, бесполезный nvidia-xconfig и восторженное «АЛДУИН ЛЕТИТ!».

Это не руководство с единственно верным рецептом, а рассказ о моём опыте: что я пробовал, где ошибался и какое решение в итоге сработало. В конце есть краткая пошаговая выжимка — если нужна только она, сразу переходите туда. А если интересно, почему обычная установка драйвера NVIDIA в Linux растянулась почти на неделю, читайте дальше.

Я не разработчик ядра, а обычный энтузиаст. За девять дней, однако, научился разбираться в логах, быстро осваивать незнакомые темы с помощью поиска и нейросетей, не пугаться исходников и делать резервную копию перед каждым рискованным действием. Описанные шаги можно повторить на таком же оборудовании и программном обеспечении. Для других версий ядра и драйвера патчи, скорее всего, придётся адаптировать.

Оборудование и ПО

  • Ноутбук: ASUS N56VZ (2012), Core i7-3630QM, Intel HD 4000 + NVIDIA GT 650M (2 ГБ), 6 ГБ ОЗУ (4+2), SSD WD Green 480 ГБ

  • ОС: Linux Mint 22.3, ядро 6.14.0-37

  • Драйвер: NVIDIA 470.256.02 — последний выпуск legacy-ветки 470 для Kepler. Более новые ветки GT 650M уже не поддерживают

  • Игра: Skyrim SE 2011, Wine + Lutris, DXVK 1.10.3

Скриншот терминала с информацией о системе
Терминал показывает конфигурацию системы

Дни 1–2. Покупка и разборка

Я задумал подарок другу. Он давно мечтал об игровом компьютере, и я решил помочь этой мечте осуществиться. Бюджет был очень ограничен: чем меньше расходы, тем лучше. Приставки я сразу исключил: одно неудачное действие с прошивкой Nintendo Switch — и можно получить дорогой кирпич за 15 тысяч. Для обычного настольного ПК дома не нашлось бы места, поэтому оставался ноутбук. Критерии выбора определились быстро.

Первым делом важна была ремонтопригодность: оплатить сервис я не мог, значит, чинить пришлось бы самому. Хотелось, чтобы разбирать устройство было не слишком сложно. Поэтому MacBook, при всей их привлекательности, отпал сразу — и по двум причинам. Первая связана с конструкцией. У меня самого MacBook Pro 2018 года, поэтому я знаю, каково это — даже просто чистить его от пыли или менять термопасту: руки дрожат, а в голове крутится «не порвал ли шлейф?» и «все ли винты на месте?». Без специальных инструментов внутрь лучше не лезть, а ремонт порой обходится дороже самого компьютера. Вторая причина — macOS. Из-за закрытой системы многие игры, которые нужны другу, на MacBook попросту не запустить. Да и зная друга, клавиатуру «бабочка» он бы вывел из строя за пару дней. Красиво и впечатляюще с инженерной точки зрения, но мне требовалась техника, ремонт которой будет по силам и по карману.

Второе условие — достаточно производительное железо: никаких Pentium и Celeron, которые сегодня с трудом справляются даже с Word. Желательно, чтобы была и дискретная видеокарта. Друг любит Resident Evil, Skyrim, Warcraft, Undertale, The Witcher и Hearts of Iron, так что ноутбуку предстояло справляться с целой коллекцией игр.

Искал только на Avito: там иногда встречаются настоящие находки. Опыт покупок на подобных площадках у меня уже был — я не раз приобретал там технику и комплектующие. За неделю поисков я выучил характеристики ноутбуков почти наизусть и составил таблицу для сравнения цены и производительности. Объявления в основном попадались трёх типов: «как новые», начищенные до блеска, но слабые устройства; полностью разобранные на запчасти ноутбуки без экрана или клавиатуры, с треснувшим корпусом; и рабочие офисные Lenovo, за которые продавцы не уступали, а цена от 10 тысяч уже превышала бюджет.

Когда я почти потерял надежду, попалось невзрачное объявление о пыльном старом ноутбуке. Открыл характеристики без особых ожиданий — и обомлел: Intel Core i7 с четырьмя ядрами и восемью потоками, экран Full HD диагональю 15,6 дюйма и, главное, дискретная NVIDIA GeForce GT 650M. ASUS N56VZ, 2012 год. Внутри уже стояли SSD на 480 ГБ и 6 ГБ оперативной памяти. В объявлении был указан HDD, поэтому, обнаружив при разборке SSD, я чуть не запрыгал от радости. Владелец сообщал: «рабочий, но без зарядки, возможен торг».

Скриншот объявления с моей "находкой"
Объявление о моей «находке»

Проверить ноутбук на месте было нельзя: зарядного устройства не было, а батарея после долгого простоя полностью разрядилась. Уже при покупке я заметил, что петли экрана болтаются, но решил, что их достаточно подтянуть.

Я понимал, что устройство может оказаться неисправным, но этот доисторический монстр уже возглавил мою таблицу. Задал продавцу множество вопросов, сторговал пару тысяч и договорился о встрече.

Собрал 6800 ₽ наличными, захватил спортивную сумку и отправился на другой конец города за котом Шрёдингера. Ещё по дороге домой заказал зарядное устройство на маркетплейсе — нужная модель оставалась в наличии последней.

Вскрываем старичка

Дома я сразу принялся за разборку. Термопаста, комплект отвёрток, изопропиловый спирт и сжатый воздух у меня уже были. Раньше я чистил свой Mac и примерно представлял, что меня ждёт. Но одно дело — разбирать инженерное изделие, созданное за миллиарды долларов, с тончайшими шлейфами, и совсем другое — вскрывать ноутбук, в котором, похоже, последним ковырялся школьник на уроке труда.

N56VZ устроен необычно. На днище нет отдельного люка, за которым аккуратно расположены компоненты: почти все внутренности закреплены на верхней половине корпуса, где находится клавиатура. Чтобы добраться до них, приходится целиком снять эту часть, предварительно отключив ОЗУ, аккумулятор, SSD и дисковод. Затем нужно приоткрыть конструкцию и через узкие щели отсоединить шлейфы матрицы, модуля Wi-Fi/Bluetooth и клавиатуры. Инженеров, придумавших эту конструкцию, я вспоминаю до сих пор — и не всегда добрым словом. Разборка шла примерно так: выкрутил винт, поддел корпус пластиковой картой, начал открывать — и вдруг всё защёлкнулось обратно. Причина обнаружилась не сразу: рядом был ещё один винт, меньшего размера, который застрял в пазу и сверху был совершенно незаметен. Когда мне наконец удалось вскрыть этого гиганта, в лицо вылетело облако пыли, а ноутбук едва не отправился на пол. Под YouTube-туториал мы продолжили знакомство со старичком.

Пыль внутри разобранного ноутбука
Пыльные внутренности разобранного ноутбука

Следы чужого «ремонта»

До меня ноутбук уже пытались «чинить» — настолько небрежно, что я несколько раз пожалел о покупке. Одна за другой обнаруживались неприятные детали:

  • винты перепутали, превратив разборку в головоломку;

  • крепления петель вырваны из основания корпуса вместе с пластиком — поэтому экран и шатался с самого начала;

  • на материнской плате местами были грязь, жвачка и непонятная краска;

  • шлейф дочерней платы с VGA-разъёмом перекрутили;

  • термопаста оказалась не только на кристаллах, но и вокруг них. Сняв вентилятор, я, мягко говоря, растерялся.

Я не специалист, но и без специальных знаний понятно: термопасту наносят на кристалл процессора и видеокарты, а не вокруг них. Её не выдавило при эксплуатации — пасту изначально толстым слоем размазали по кристаллам и рядом. Шлейф дочерней платы VGA я выбросил, а саму плату установил обратно как заглушку: к материнской плате она не подключена, да и VGA мне сейчас не нужен.

Кулер и радиаторы я чистил на балконе. Пыли набралось на целый стакан — не спрашивайте, зачем я это измерял. Затем очистил материнскую плату и обработал каждый разъём. К вечеру спина ныла, а руки просили передышки, зато результат меня порадовал. Я вернул компоненты на место, нанёс свежую MX-4 и закрутил каждый винт в предназначенное для него отверстие. Отдельно осмотрел экран: заметных повреждений не нашёл, только трещины на рамке и те самые разболтанные петли.

Ремонтируем петли

С петлями всё оказалось совсем плохо. На новый корпус денег пока не было, а экран нужно было как-то закрепить. Тут я вспомнил о незавершённом дипломе по реставрации живописи и придумал временное решение. В пластиковый обломок на основании корпуса положил кусочек ваты, пропитал его клеем «Кристалл» и, пока состав схватывался, вернул на место штатное медное крепление. Затем таким же образом заполнил ватой с клеем пустой паз под винт. По сути, получился композит, который после высыхания стал похож на пластик. Проверил — держится намертво. Для аккуратности, насколько это было возможно, закрыл место ремонта чёрной изолентой.

Теперь с каждой стороны экран удерживают два из трёх винтов. Они вкручены в медные крепления, закреплённые ватой, клеем и верой в лучшее. Выглядит неидеально, зато работает: несколько циклов открывания и закрывания прошли успешно. Если обращаться с ноутбуком бережно, конструкция должна продержаться до замены корпуса. Тем же композитом я укрепил треснувшую перемычку у слота CD/DVD-привода. Для временного ремонта выглядит вполне прилично.

Петли и крепления до ремонта
Петли и крепления до ремонта
Петли и крепления после ремонта
Петли и крепления после ремонта
Восстановленная перегородка в слоте CD/DVD-привода
Перегородка в слоте CD/DVD-привода после ремонта

Первый запуск

Я защёлкнул корпус, подключил оставшиеся шлейфы и установил на место ОЗУ, SSD и дисковод. Аккумулятор пока решил не подключать — на всякий случай запустил ноутбук от сети. Подсоединил зарядное устройство и услышал тихий шум вентилятора. Через пару секунд на экране появился логотип ASUS. Ноутбук оказался жив.

Дни 3–4. Mint и первая игра

До экрана входа в Windows 10 Home ноутбук загружался около десяти минут. Я проверил клавиатуру, звук и USB-порты — всё работало — после чего выключил систему. Пароля от учётной записи прежнего владельца я не знал, поэтому решил не заглядывать в его данные и полностью очистить SSD.

Переустановить систему я решил по нескольким причинам:

  • мне был неизвестен пароль;

  • хотелось попробовать какой-нибудь дистрибутив Linux;

  • Linux занимает меньше места, чем Windows, а судя по долгой загрузке, прежней системе ноутбук давался тяжело.

Последнее предположение подтвердилось: после переустановки ноутбук стал заметно быстрее реагировать на действия.

Я выбрал Linux Mint 22.3 — дружелюбный и надёжный вариант для новичка. Другого компьютера дома не было, поэтому ISO-образ я скачал на свой Mac и с помощью BalenaEtcher записал на внешний жёсткий диск, который временно заменил флешку. Позже этот диск пригодился для резервных копий. Дальше всё прошло просто: загрузился с него, запустил установщик и переустановил систему на внутренний SSD.

Затем настроил интерфейс в стиле macOS. Да, я поклонник Apple, и мне приятно, когда рабочая среда выглядит привычно. Сторонние темы не устанавливал: ограничился стандартными настройками, поменял цвет и прозрачность, расположение и поведение панелей. У меня их две — верхняя и нижняя. Вместе они напоминают привычные док и строку меню.

Сравнение Mint с настроенным интерфейсом и моего MacBook
Linux Mint с настроенным интерфейсом рядом с MacBook для сравнения

Для первичной проверки установил s-tui и нагрузил процессор. Температуры оставались нормальными, троттлинга не было. На этом этапе мне хватило: основное железо работало.

Первая игра: проверяем систему на Undertale

Мне нужно было не просто оживить ноутбук, но и подготовить его для друга как рабочую игровую машину. Первой проверочной игрой стала Undertale: с её помощью можно было проверить звук, изображение, дисковод, плавность работы и отзыв клавиатуры. Ну и просто потому, что я люблю эту игру. У меня есть коллекционное издание с дисками игры и саундтреков. На игровом диске лежат версии для Linux, macOS и Windows. Версия для Linux представляла собой готовую папку с исполняемым файлом. Я вставил диск в привод и скопировал папку целиком. Оставалось разрешить запуск файла и запустить игру:

chmod +x UNDERTALE
./UNDERTALE

Игра сообщила, что ей не хватает 32-битных библиотек. Для начала я включил поддержку архитектуры i386:

sudo dpkg --add-architecture i386
sudo apt update
sudo apt install libglu1-mesa:i386

Здесь я ошибся с названием пакета: в Mint нужная библиотека называется libglu1-mesa:i386, а не libglu1:i386. При каждом запуске появлялась новая ошибка, но терминал подсказывал, какого компонента не хватает. Сначала не нашлась libopenal.so.1 — проблему решил такой командой:

sudo apt install libopenal1:i386

Затем игре потребовалась libcrypto.so.1.0.0 — библиотека из OpenSSL 1.0, которой уже нет в современных репозиториях. Я скачал старый 32-битный пакет libssl1.0.0 из архива Ubuntu и установил его через dpkg -i. После этого Undertale наконец запустилась.

Запущенная Undertale
Undertale успешно запущена

Восьмибитная графика почти не нагружала систему, поэтому я решил, что с ноутбуком всё в порядке. Тогда я ещё не знал, что в нём две видеокарты, и что Undertale запускалась на встроенной графике, а не на NVIDIA, которую я считал единственным графическим адаптером. Обнаружил это, когда перешёл к Skyrim. Тут-то и началось самое интересное.

День 4. Skyrim и неожиданное открытие: видеокарт две

Skyrim создана для Windows, а в Linux работает через Wine. Это название расшифровывается как Wine Is Not an Emulator: речь не об эмуляторе, а о слое совместимости, который преобразует вызовы Windows в Linux-вызовы. Для запуска я выбрал Bottles — графическую оболочку для Wine. В ней каждое приложение помещается в отдельную «бутылку»: изолированную среду со своей версией Wine, настройками и зависимостями. В самом Wine такие среды называются префиксами. Я запустил установщик игры.

Первая «бутылка» и разрядность

Установка останавливалась на 17% с ошибкой isDone.dll. Я создал новую бутылку в 64-битном режиме, и ошибка исчезла. Вероятно, 32-битный процесс упирался в ограничение адресуемой памяти при распаковке. Для 14-летнего ноутбука такой предел был ни к чему. Кроме того, сама Special Edition — 64-битная, поэтому соответствующая бутылка всё равно была необходима.

Игра установилась, но совсем не запускалась. Я установил дополнительные зависимости. В моей версии Bottles некоторые пункты списка упорно не отмечались, поэтому я прошёл его целиком — все 112 позиций. После этого игра стала запускаться без вылетов, но изображение выглядело ужасно: Skyrim превратилась в Minecraft.

Когда я говорю, что Skyrim стала похожа на Minecraft, это не преувеличение. Вместо дыма и снега в меню загрузки появились ломаные плитки, а шрифт рассыпался на белые прямоугольники — прочитать что-либо было невозможно. Но игра хотя бы запустилась, и тогда я уже считал это успехом.

Меню загрузки: вместо дыма видны плитки
Меню загрузки с плитками вместо дыма
Шрифт распался на белые прямоугольники
Текст превратился в набор прямоугольников

В самой игре ситуация была не лучше: изображение целиком заливал синий оттенок, словно поверх наложили фильтр, повозка дёргалась, анимация обновлялась отдельными кадрами. Получилось настоящее слайд-шоу.

Начало игры: повозка и заметный "синий фильтр"
Начало игры: повозка под синим фильтром

Ищем источник проблемы

Сначала я решил, что дело в Wine или DXVK. DXVK преобразует вызовы DirectX в Vulkan, и версия, подходящая одному компьютеру, на другом может работать некорректно. Я попробовал переключить рендерер на OpenGL, но игра вылетела ещё на этапе лаунчера. Вернулся к DXVK и начал перебирать версии. Сработала 1.10.3: игра запускалась и проходила первую кат-сцену до конца, но плавнее от этого не стала.

Несколько часов я ходил по кругу. Собралось много информации: логи бутылки и десятки страниц Google с описанием похожих проблем. Сам я не мог связать факты, поэтому отправил всё нейросети. Среди большого объёма текста она заметила строку, которую я пропустил: игра использует встроенную графику. Я был уверен, что в ноутбуке только NVIDIA, и тут же стал выяснять, откуда взялась встроенная видеокарта. Ответ дала команда:

lspci -k | grep -EA3 ‘VGA|3D‘

Вывод показал два графических адаптера:

  • Intel HD 4000 — встроенная видеокарта, на которой до этого рендерилась игра.

  • NVIDIA GeForce GT 650M — дискретная. В строке Kernel driver in use значился открытый драйвер nouveau.

Примечание: фильтр VGA|3D полезен потому, что во многих ноутбуках с Optimus дискретная карта отображается не как VGA, а как «3D controller». Если искать только одно из этих обозначений, её легко пропустить. В моём случае она была указана как VGA, но лучше использовать оба варианта.

В терминале обнаружились две видеокарты
Вывод команды показал две видеокарты

Я был ошеломлён: покупал ноутбук ради GT 650M — и ещё из любопытства к процессору i7, — а видеокарта простаивала и не оправдывала потраченных 6800 рублей. Несколько часов я запускал тяжёлую 3D-графику на встроенном адаптере и обвинял Wine.

Optimus: что это и почему с ним непросто в Linux

NVIDIA Optimus — технология, в которой две видеокарты работают вместе: Intel обслуживает повседневную графику и экономит заряд, а NVIDIA используется для ресурсоёмких задач. В Windows переключение обычно происходит незаметно, а в Linux схема устроена сложнее. Экран физически подключён к Intel, поэтому NVIDIA может отрисовать кадр, а затем передать его встроенной видеокарте для вывода. Такой режим называется PRIME Render Offload.

Стало понятно и то, почему nouveau не помог. Это открытый драйвер, который разработчики создают, изучая поведение оборудования без доступа к документации производителя. Он распознаёт видеокарту, но не умеет эффективно управлять её частотами и для игр не подходит. Нужен проприетарный драйвер NVIDIA. Кроме того, чтобы конкретное приложение использовало дискретный адаптер, ему нужно передать соответствующие переменные окружения.

Сначала требовалось установить драйвер. Этим я занялся на следующий день.

Дни 5–6. Драйвер 470 против ядра 6.14: неудачная ручная сборка

Skyrim по-прежнему работала на встроенной графике, поэтому мне требовался драйвер для GT 650M. Тут и выяснилось, что всё не так просто. Карта построена на архитектуре Kepler, а последняя поддерживающая её ветка драйверов — 470. Более новые выпуски эту модель уже не распознают. Ветка появилась в 2021 году, нужная мне версия 470.256.02 вышла в июне 2024-го, а на ноутбуке стоял Mint 22.3 с ядром 6.14, выпущенным в 2025 году.

Менеджер драйверов Mint ничего для моей видеокарты не предложил. Позже я выяснил, что пакет nvidia-driver-470 в репозитории есть, но готовые модули доступны лишь для ядер до 6.11, тогда как у меня установлено 6.14. Я скачал официальный NVIDIA-Linux-x86_64-470.256.02.run, но установка завершилась ошибкой. Пришлось распаковать архив и вручную исправлять исходники.

Устанавливать драйвер из работающего графического сеанса нельзя, поэтому я переключился в текстовую консоль tty2 сочетанием Ctrl+Alt+F2, остановил lightdm командой sudo systemctl stop lightdm и запустил установщик из скачанного файла .run.

Из чего состоит проприетарный драйвер

Драйвер NVIDIA закрытый, однако его файлы можно открыть, например, в nano. Внутри .run находятся две составляющие:

  • закрытая часть — готовый бинарный блоб nv-kernel.o_binary со всей логикой видеокарты; прочитать его содержимое нельзя;

  • открытая часть — исходный код прослойки, которая связывает блоб с конкретной версией ядра Linux. Она компилируется непосредственно на компьютере.

Редактировать можно только эту прослойку — с ней я и работал. За сборку отвечает DKMS: система, которая автоматически пересобирает модули после обновления ядра. Она берёт исходники из /usr/src/, собирает их в /var/lib/dkms/ и помещает готовый модуль в каталог модулей ядра.

Ошибки одна за другой

Сборка несколько раз останавливалась на разных проблемах:

  • Порядок const и static в nv-kthread-q.c. GCC 13 выдавал ошибку из-за устаревшего порядка ключевых слов: вместо const static требуется static const. Я нашёл три таких места и исправил их в nano.

  • implicit declaration of function ‘follow_pfn’. В новых версиях ядра функцию переименовали в unsafe_follow_pfn, удалив прежнее имя. Я добавил в os-mlock.c заглушку return -EINVAL. Это не полноценное исправление, а отключение части операций с памятью. Для моей задачи сработало, но решение компромиссное.

  • Поля .date и .output_poll_changed в drm_driver. Эти поля удалили из ядра. Я закомментировал их в nvidia-drm-drv.c, снова отключив соответствующие возможности.

  • nv_node_end_pfn. Функции больше не существовало, поэтому я заменил вызов на return 0. Ещё одна заглушка.

Каждый раз всё повторялось: открывал make.log, вносил правку, запускал сборку заново — и она останавливалась на следующей ошибке с Error 2.

Проблема с линковкой

Последний сбой возник на этапе линковки: линкер сообщил ld: cannot find ./nvidia/nv-kernel.o: No such file or directory. Не хватало закрытого блоба. Я вручную создавал символьные ссылки, копировал nv-kernel.o_binary по каталогам /usr/src/ и /var/lib/dkms/ и снова запускал сборку DKMS. Выяснилось, что DKMS копирует исходники в собственный каталог и обращается к ним по относительным путям, поэтому созданные мной ссылки ломались на каждом этапе. В Kbuild я нашёл строку ln -sf, создававшую неверный путь, но полностью разобраться с DKMS так и не смог.

На эти попытки ушло несколько часов в tty2. Вывод оказался простым: вручную собрать проприетарный модуль под неподдерживаемое ядро возможно, но это не «пара правок», а бесконечное противостояние изменениям в ядре. Даже успешно собранный модуль DKMS может перестать работать после очередного обновления: патчи рассчитаны на конкретные версии.

Я сделал паузу и стал искать, как проблему решили другие. На GitHub нашёл репозиторий joanbm/nvidia-470xx-linux-mainline с патчами для новых ядер и установочным скриптом. Сравнил собственные изменения с патчами из репозитория и увидел, что мои «уникальные» заглушки там уже реализованы аккуратнее и с учётом устройства ядра. Оказалось, я не первый, кто проходил этот путь.

Дни 7–8. joanbm, чёрный экран и новая попытка

Первая установка

Для начала выполнил шаги из README репозитория:

sudo systemctl stop lightdm ## сначала остановка графики!
sudo apt install git wget build-essential linux-headers-generic libglvnd-dev dkms
git clone https://github.com/joanbm/nvidia-470xx-linux-mainline
cd nvidia-470xx-linux-mainline
./install --dkms

Скрипт самостоятельно скачал .run, применил патчи и запустил установщик с поддержкой DKMS.

DKMS собирает модуль: процесс на отметке 5 %
Сборка модуля DKMS остановилась на отметке 5 %

В самом конце установщик предложил запустить nvidia-xconfig. Не раздумывая, я согласился. Это было ошибкой.

Установщик спрашивает, запускать ли nvidia-xconfig
Запрос установщика о запуске nvidia-xconfig

Чёрный экран

После перезагрузки дисплей остался чёрным. Насколько я понял, nvidia-xconfig создал конфигурацию X, которая направляла вывод изображения на NVIDIA. Но в ноутбуках с Optimus экран физически подключён к Intel, поэтому NVIDIA не может вывести картинку напрямую.

С помощью Ctrl+Alt+F2 я перешёл в консоль и выбрал радикальный способ: удалил и свои наработки, и неудачную установку joanbm, после чего поставил всё заново — на этот раз ответив «Нет».

sudo dkms remove -m nvidia -v 470.256.02 --all
sudo rm -rf /usr/src/nvidia-470.256.02
sudo rm -rf /var/lib/dkms/nvidia
sudo rm -f /etc/X11/xorg.conf
sudo rm -f /etc/X11/xorg.conf.d/20-nvidia.conf

Если при выполнении инструкции вы добавляли blacklist для nouveau, стоит также удалить соответствующий файл из /usr/lib/modprobe.d/.

Вторая попытка

Я снова клонировал репозиторий и запустил ./install —dkms. Когда установщик опять спросил про nvidia-xconfig, на этот раз я уверенно выбрал «Нет».

Установка завершена: драйвер успешно собран
Установка завершена — драйвер собран успешно

После перезагрузки графическая среда запустилась через Intel, чёрного экрана не было. Я выполнил заветную команду nvidia-smi — и видеокарта отозвалась: GeForce GT 650M, драйвер 470.256.02, 2000 MiB видеопамяти. Затем проверил dkms status — модуль собран для ядра 6.14; lsmod | grep nvidia — модуль загружен; modinfo nvidia — используется проприетарный драйвер, а не nouveau. Команда lspci -k теперь показывала Kernel driver in use: nvidia.

nvidia-smi показывает температуру 44 °C в простое
В простое nvidia-smi показывает 44 °C

Драйвер установился, но радость оказалась преждевременной: Skyrim всё ещё запускалась на Intel.

День 9. Lutris, Vulkan и первый дракон

Переменные окружения и смена программы

Чтобы приложение использовало дискретную видеокарту, это нужно указать через переменные окружения. Для PRIME Render Offload NVIDIA рекомендует две стандартные переменные:

__NV_PRIME_RENDER_OFFLOAD=1

__GLX_VENDOR_LIBRARY_NAME=nvidia

В Bottles они помогли лишь частично: FPS немного вырос, но Vulkan так и не заработал как следует. Предполагаю, что дело было в изоляции Flatpak: песочнице требуется NVIDIA-расширение, соответствующее точной версии драйвера. Проверять это я не стал, а перешёл на нативный Lutris, который напрямую использует системные библиотеки. Это решило проблему.

Настройка Vulkan ICD

В логах очередного неудачного запуска появилось предупреждение MESA-INTEL: warning: Ivy Bridge Vulkan support is incomplete — ещё один намёк на то, что в работе участвует Intel. Файл nvidia_icd.json нашёлся в /etc/vulkan/icd.d/, но отсутствовал в /usr/share/vulkan/icd.d/. Я решил просто скопировать его:

ls /usr/share/vulkan/icd.d/
sudo cp /etc/vulkan/icd.d/nvidia_icd.json /usr/share/vulkan/icd.d/

Без копии игра не запускалась, после копирования — заработала. Почему так произошло, я не выяснил: согласно документации, загрузчик Vulkan проверяет оба каталога. Теперь vulkaninfo обнаруживает обе видеокарты с поддержкой Vulkan 1.2, а NVIDIA отображается дважды — вероятно, из-за дублирующего файла:

apiVersion = 1.2.318   deviceName = Intel(R) HD Graphics 4000 (IVB GT2)
apiVersion = 1.2.175   deviceName = NVIDIA GeForce GT 650M
apiVersion = 1.2.175   deviceName = NVIDIA GeForce GT 650M

DXVK

DXVK преобразует вызовы DirectX в Vulkan. У меня заработала только версия 1.10.3: выпуски 2 и 3 вылетали и в Bottles, и в Lutris. Причина, по-видимому, в требованиях к Vulkan: DXVK 2.x нужен Vulkan 1.3, а DXVK 3.x, согласно описанию релиза, — 1.4. GT 650M с драйвером 470 поддерживает Vulkan 1.2.175. Lutris предлагал обновить DXVK до версии 3, но я отказался и оставил 1.10.3.

Устанавливаем Skyrim в Lutris и задаём переменные

Я переустановил Skyrim SE через Lutris. Снова столкнулся с той же проблемой: 32-битный префикс и ошибка isDone.dll. Но теперь уже знал решение и сразу создал 64-битный префикс.

Skyrim успешно установлена
Skyrim успешно установлена

Сначала я добавил переменные в Lutris одной строкой в формате ИМЯ=значение и поместил её в столбец Value, оставив Key пустым. Lutris хранит переменные как пары «ключ — значение», поэтому все три записи оказались привязаны к одному пустому ключу, и сохранилась лишь последняя. Правильный формат такой: в поле Key — __NV_PRIME_RENDER_OFFLOAD, в поле Value — 1. В настройках Lutris был и переключатель «Включить NVIDIA Prime Render Offload», но тогда я его не заметил — слишком устал.

(Обновление спустя месяц: по какой-то причине 3D-игры вообще не реагируют на этот переключатель, тогда как переменные работают. Лучше задавать их.)

Алдуин

Игра запустилась. Я позвал друга — теперь уже владельца ноутбука — и сел рядом. Он нажал «Новая игра», началась заставка, повозка тронулась. Та самая сцена, которая прежде превращалась в синее слайд-шоу, теперь шла плавно: лошадь, снег, голоса пленников. Игра не вылетела и дошла до следующей кат-сцены.
А затем появился Алдуин. Друг выкрикнул: «АЛДУИН ЛЕТИТ!», а я едва не свалился со стула. Экран дрожал от рёва дракона, а трава, камни и чешуя были видны в деталях. Игра шла в разрешении 1920×1080, с ультранастройками, выбранными в лаунчере Skyrim, и сглаживанием TAA. Фразу «Я УМИРАЮ!» я тоже услышал вживую — сидя рядом.

Это был лучший отзыв на мою работу. Жаль, не успел сделать скриншот.

Главное меню: чёткий шрифт и корректно отображающийся дым
Главное меню с нормальным шрифтом и дымом
Исследование игрового мира: графика отображается без артефактов
В игровом мире дымка больше не распадается на пиксели
Растительность отображается корректно, в отличие от прежних графических артефактов
Даже цветы отображаются как надо: раньше вместо травы было сплошное месиво

Чему меня научили эти девять дней

  • Optimus в Linux можно настроить. Главное — не запускать nvidia-xconfig на ноутбуке с Optimus.

  • Логи полезнее бесконечных поисков на форумах. lspci -k, lsmod, make.log, vulkaninfo и логи Wine помогали находить ответы быстрее Google.

  • Ручная адаптация модуля ядра — это не «пара строк». Мои заглушки return -EINVAL и return 0 отключают функции, а не переносят их на новую версию ядра. Для разового эксперимента сгодится, но не для повседневной системы.

  • DKMS полезен, но требует внимания. После обновления ядра сборку устаревшего драйвера придётся проверять заново.

  • Сообщество экономит время. Репозиторий joanbm/nvidia-470xx-linux-mainline избавил меня от нескольких дней работы. Самостоятельное «изобретение велосипеда» оказалось полезным разве что как учебный опыт.

  • Flatpak и драйвер NVIDIA, похоже, не всегда хорошо работают вместе. Нативный Lutris оказался проще Bottles, хотя его интерфейс показался мне менее дружелюбным к новичку.

  • Прежде чем менять настройки Wine, сначала проверьте, на какой видеокарте выполняется рендеринг.

Что стоило сделать по-другому

  • Сразу выполнить lspci -k, а не обнаруживать вторую видеокарту только на четвёртый день.

  • Не соглашаться на запуск nvidia-xconfig. А если уж запустил — удалить xorg.conf, не переустанавливая весь драйвер.

  • С самого начала выбрать Lutris, а не Bottles.

  • Сначала изучать логи, а уже потом менять настройки.

Краткая инструкция для тех, кто хочет повторить

Ноутбук с NVIDIA Optimus и видеокартой на архитектуре Kepler, Linux Mint 22.3 и ядро 6.14. На других версиях патчи, вероятно, потребуется адаптировать.

1. Определите, какие видеокарты установлены. Сначала проверьте оборудование физически: откройте корпус и выясните, где расположены адаптеры, как они установлены на плате и какая карта подключена к экрану. Затем проверьте систему программно. Дискретная видеокарта может отображаться как «3D controller»:

lspci -k | grep -EA3 'VGA|3D'

2. Установите драйвер 470 из репозитория сообщества. Перейдите в текстовую консоль сочетанием Ctrl+Alt+F2 и остановите графическую среду — иначе установка не запустится и появится ошибка:

sudo systemctl stop lightdm
sudo apt install git wget build-essential linux-headers-generic libglvnd-dev dkms
git clone https://github.com/joanbm/nvidia-470xx-linux-mainline
cd nvidia-470xx-linux-mainline
sudo systemctl stop lightdm
./install --dkms

3. На вопрос о nvidia-xconfig отвечайте «Нет». Если согласились и после перезагрузки получили чёрный экран, откройте консоль через tty и удалите /etc/X11/xorg.conf.

4. После перезагрузки убедитесь, что драйвер работает:

nvidia-smi
dkms status
lspci -k | grep -EA3 'VGA|3D'

В выводе должны появиться название видеокарты, модуль, собранный для текущего ядра, и строка Kernel driver in use: nvidia.

5. Настройте обнаружение NVIDIA в Vulkan. В моём случае без этого игра не запускалась:

sudo cp /etc/vulkan/icd.d/nvidia_icd.json /usr/share/vulkan/icd.d/
vulkaninfo --summary | grep deviceName

6. Добавьте переменные окружения в Lutris. Каждую указывайте на отдельной строке: имя — в столбце Key, значение — в Value. Если ввести всю строку «ИМЯ=значение» в поле Value, сохранится только последняя переменная:

Key

Value

__NV_PRIME_RENDER_OFFLOAD

1

__GLX_VENDOR_LIBRARY_NAME

nvidia

7. Для Kepler с драйвером 470 используйте DXVK 1.10.3. У меня версии 2.x и новее завершались с ошибкой.

8. Создайте 64-битный Wine-префикс и не полагайтесь на автоматический выбор разрядности: иногда он подводит. Так мне удалось устранить ошибку isDone.dll при установке.

9. После обновления ядра проверяйте dkms status и, если нужно, пересобирайте модуль.

Благодарности

Спасибо автору репозитория joanbm, создателям инструкций по Optimus и авторам документации NVIDIA. Без вашей работы я бы, вероятно, до сих пор разбирался с чёрным экраном.

 

Источник

Похожие статьи

Поиск по играм, новостям и статьям…

Введите не менее двух символов

Введите не менее двух символов