LINUX.ORG.RU

NixOS + bumblebee - ставит сразу две конфликтующие версии Nvidia!

 , , ,


0

1

Суть проблемы.

Имею ноутбук с Nvidia Optimus.

Соответственно пытаюсь настроить bumblebee на NixOS.

Драйверы - проприетарные nvidia, legacy 390.

Проблема в том, что почему-то ставятся одновременно и legacy, и последние 495 драйверы. Ничего не работает, возможно причина и не в этом, возможно в этом. Надо изолировать.

Как делаю. Вот это в configuration.nix

boot.kernelPackages = pkgs.linuxPackages.extend (self: super: {
    nvidia_x11 = super.nvidia_x11_legacy390;
  });

hardware.bumblebee.enable = true;

Как определить, кто именно тянет 495 драйвер? Как сделать чтобы он не тянулся?

В деривации bumblebee вот что - сразу в зависимостях деривации и старых, и новых дров

("/nix/store/hs77la9dd897ya584xj2q6fmw5cyyssp-nvidia-x11-390.143.drv",["out"])
("/nix/store/j6lyk6lfhj271znz33p3zxvbqjqv8w0s-nvidia-x11-495.44-5.10.84.drv",["bin","out"])
James_Holden ★★★
() автор топика
Ответ на: комментарий от quantum-troll

И чего?

Эта опция не выбирает пакет драйвера. Она выбирает название «nvidia» либо «nouveau». Два варианта.

James_Holden ★★★
() автор топика
Ответ на: комментарий от eternal_sorrow

Что вы накинулись? Как будто от циферек в календаре программы сами себя переписывают. Ну включите голову.

James_Holden ★★★
() автор топика
Ответ на: комментарий от quantum-troll

Пробую оверрайдить вот так

boot.kernelPackages = pkgs.linuxPackages.extend (self: super: {
    nvidia_x11 = super.nvidia_x11_legacy390;
    nvidia_x11_i686 = super.nvidia_x11_legacy390_i686;
  });

  nixpkgs.config.packageOverrides = pkgs: {
    # make sure x11 will use the correct package as well
    nvidia_x11 = pkgs.nvidia_x11_legacy390;
    nvidia_x11_i686 = pkgs.nvidia_x11_legacy390_i686;
  };

  hardware.bumblebee.enable = true;

Не помогает - все равно тянет и старую, и новую версию.

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

James_Holden ★★★
() автор топика
Ответ на: комментарий от Tsukasa

Offload mode не, как там предлагают?

Не работает на моем железе, легаси драйвер же. Нужен именно bumblebee.

И что у тебя в hardware.nvidia.package

Ничего, вообще это не прописывал. Сейчас что-нибудь попробую.

James_Holden ★★★
() автор топика
Ответ на: комментарий от Tsukasa
hardware.nvidia.package = config.boot.kernelPackages.nvidiaPackages.legacy_390

Все то же самое, это не влияет.

James_Holden ★★★
() автор топика
Ответ на: комментарий от quantum-troll

Там уже несколько ровно таких же issue, закрытых по причине «мы плюнули слюной, не получается». Думаю что создавать еще одну смысла нет. Надежда только на ЛОРовцев.

James_Holden ★★★
() автор топика
Ответ на: комментарий от quantum-troll

Сузим задачу.

Есть вот такой пакет

linuxKernel.packages.linux_5_10.nvidia_x11

Как его переопределить, чтобы он стал

linuxKernel.packages.linux_5_10.nvidia_x11_legacy390

Через overridePackages пробую так и эдак, ничего не выходит.

James_Holden ★★★
() автор топика
Ответ на: комментарий от James_Holden

Через overridePackages пробую так и эдак, ничего не выходит.

Подробно как Орбит яперезвоню.

Через оверлей тогда попробуй для разнообразия: https://nixos.wiki/wiki/Overlays

t184256 ★★★★★
()
Ответ на: комментарий от James_Holden

Я смотрю код .nix файлов и не могу понять откуда там это лезет.

Впендюрь в нежелательный derivation ассерт или пометь как broken, --show-trace тебе все расскажет. Или вообще файл с ним грохни, если лень синтаксис курить =D

t184256 ★★★★★
()
Последнее исправление: t184256 (всего исправлений: 1)
Ответ на: комментарий от quantum-troll

Если хочется на русском и без формальностей, то у @balsoft был канал в телеге с каким-то запредельным количеством пользователей, кстати.

t184256 ★★★★★
()
Ответ на: комментарий от James_Holden

В предположении, что у тебя NixOS, configuration.nix, нет flakes, ничего не намудрено и ничего не наворочено:

  1. git clone https://github.com/NixOS/nixpkgs --depth=1
  2. в nixpkgs/pkgs/os-specific/linux/nvidia-x11/default.nix да и вообще где угодно в nixpkgs удаляешь упоминания неугодной тебе версии
  3. либо nix-build nixpkgs/nixos -A system --show-trace, либо NIX_PATH=nixpkgs=./nixpkgs nixos-rebuild build --show-trace (оба варианта непроверенные, но вроде так)
  4. смотришь на стектрейс
t184256 ★★★★★
()
Последнее исправление: t184256 (всего исправлений: 2)
Ответ на: комментарий от t184256

Ай, ты ж не на unstable скорей всего, тебе нужен будет release-… бранч вместо master

Думаю что это по барабану. Там годами эта хрень.

В общем, трейсом пришел к вот этому куску в all-packages.nix

bumblebee = callPackage ../tools/X11/bumblebee {
    nvidia_x11 = linuxPackages.nvidia_x11;
    nvidia_x11_i686 = if stdenv.hostPlatform.system == "x86_64-linux"
      then pkgsi686Linux.linuxPackages.nvidia_x11.override { libsOnly = true; }
      else null;
    libglvnd_i686 = if stdenv.hostPlatform.system == "x86_64-linux"
      then pkgsi686Linux.libglvnd
      else null;
  };

Насколько я понял, мне надо переопределить linuxPackages.nvidia_x11 на linuxPackages.nvidia_x11_legacy390, чего у меня конечно же нет до сих пор, отсюда и новые дрова видимо тянутся.

У меня прописано

boot.kernelPackages = pkgs.linuxPackages.extend (self: super: {
    nvidia_x11 = super.nvidia_x11_legacy390;
    nvidia_x11_i686 = super.nvidia_x11_legacy390_i686;
  });

Я правильно понимаю, что это - переопределяет в boot.kernelPackages, но не в основных pkgs, поэтому пакет bumblebee протолжает тянуть не переопределенные дрова?

Пробую сделать так

nixpkgs.overlays = [ pkgs.linuxPackages.extend (self: super: {
    nvidia_x11 = super.nvidia_x11_legacy390;
    nvidia_x11_i686 = super.nvidia_x11_legacy390_i686;
  }) ];

и получаю бесконечную рекурсию…

James_Holden ★★★
() автор топика
Ответ на: комментарий от James_Holden

ИМХО это даже по «размерности» не проходит. Давай разбираться.

Оверлеем должна быть функция, self -> super -> pkgs: self: super: { linuxPackages = ...; }.

nixpkgs.overlays должен быть списком таких функций, то бишь получаем

nixpkgs.overlays = [
  (self: super: { linuxPackages = ...; } )
]

Зафиксировали, теперь формулируем троеточие. Троеточие у нас будет модифицированным linuxPackages, взятым из super: ... = super.linuxPackages.extend ляляля.

В вопросе написания ляляля, в свою очередь, я доверюсь тебе и предположу, что это функция из self и super в аттрсет подлежащих модификации атрибутов linuxPackages:

self: super: {
  nvidia_x11 = super.nvidia_x11_legacy390;
  nvidia_x11_i686 = super.nvidia_x11_legacy390_i686;
}

Ну а теперь подставляем ляляля в ..., ... дальше в то выражение, внутренние self и super заштрихуем на всякий случай, и получаем

nixpkgs.overlays = [
  (self: super: {
    linuxPackages = super.linuxPackages.extend ( self': super': {
      nvidia_x11 = super'.nvidia_x11_legacy390;
      nvidia_x11_i686 = super'.nvidia_x11_legacy390_i686;
    });
  })
]

Такое работает?

t184256 ★★★★★
()
Последнее исправление: t184256 (всего исправлений: 1)
Ответ на: комментарий от t184256

Все собралось как положено, bumblebee сразу заработало.

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

Для «потомков» - вот полный кусок из configuration.nix который включает bumblebee на legacy драйвере

nixpkgs.overlays = [
    (self: super: {
      linuxPackages = super.linuxPackages.extend ( self': super': {
        nvidia_x11 = super'.nvidia_x11_legacy390;
        nvidia_x11_i686 = super'.nvidia_x11_legacy390_i686;
      });
    })
  ];

hardware.bumblebee.enable = true;

При этом надо

services.xserver.videoDrivers = [ "intel" ];

nvidia сюда пихать не нужно.

Виват @t184256! Ты настоящий спец.

James_Holden ★★★
() автор топика
Последнее исправление: James_Holden (всего исправлений: 1)
Ответ на: комментарий от James_Holden

Прекрасно. Далее еще есть задание со звездочкой, починить оригинальную причину в nixpkgs для следующего приключенца. Звучит как то, что не все места учитывают config.hardware.nvidia.package, например вот это место смущает: https://github.com/NixOS/nixpkgs/blob/71f906f1cf7b2d674d2e178076ccf1b86c5b95a2/nixos/modules/hardware/video/bumblebee.nix#L80

t184256 ★★★★★
()
Ответ на: комментарий от t184256

kernel.nvidia_x11.bin

Ааааа, вот этот bin там и фигурировал в новом драйвере.

James_Holden ★★★
() автор топика
Ответ на: комментарий от t184256

Только я пока не разобрался, как определить в конкретном месте что оно берет из config.hardware.nvidia.package.

James_Holden ★★★
() автор топика
Ответ на: комментарий от t184256

Вот какой с этой строчкой облом!

Теперь я вместо дефолтного ядра включаю xanmod.

boot.kernelPackages = pkgs.linuxPackages_xanmod;

и снова тянутся две версии драйвера!

Пробую по твоему методу, на сломанном nixpkgs и вот что

error: attribute 'nvidia_x11' missing

       at /home/curufinwe/test/nixpkgs/nixos/modules/hardware/video/bumblebee.nix:80:91:

           79|     boot.kernelModules = optional useBbswitch "bbswitch";
           80|     boot.extraModulePackages = optional useBbswitch kernel.bbswitch ++ optional useNvidia kernel.nvidia_x11.bin;
             |                                                                                           ^
           81|

прямо строка о которой ты писал тянет.

kernel как я понял это config.boot.kernelPackages. И в них подмена не происходит.

Тогда задача-минимум - сделать замену там. Вот как теперь это сделать, даже по аналогии сообразить не могу.

И еще вот что не понимаю в упор. Вот тут

https://search.nixos.org/packages?channel=unstable&from=100&size=50&buckets=%7B%22package_attr_set%22%3A%5B%22linuxKernel%22%5D%2C%22package_license_set%22%3A%5B%5D%2C%22package_maintainers_set%22%3A%5B%5D%2C%22package_platforms%22%3A%5B%5D%7D&sort=relevance&type=packages&query=nvidia_x11

одни названия пакетов, а точнее все вот эти linuxKernel.packages.linux_4_19., а в nixpkgs совсем другое, как оно друг с другом сочетается?

James_Holden ★★★
() автор топика
Ответ на: комментарий от t184256

В итоге, переопределил добавив это

boot.kernelPackages = pkgs.linuxPackages.extend (self: super: {
    nvidia_x11 = super.nvidia_x11_legacy390;
    nvidia_x11_i686 = super.nvidia_x11_legacy390_i686;
  });

но дрова не собираются с xanmod 5.15. Но это уже другая история.

James_Holden ★★★
() автор топика
Ответ на: комментарий от James_Holden

все вот эти linuxKernel.packages.linux_4_19., а в nixpkgs совсем другое, как оно друг с другом сочетается?

Алиасы какие-то небось, не думаю, что это важно.

Важно, что они разные совсем. Один из них, присвоенный config.boot.kernelPackages, используется потом где попало, в том числе в той строке. Если ты в простом linuxPackages что-то напереопределял, то в linuxPackages_xanmod все осталось как было.

Тогда задача-минимум - сделать замену там. Вот как теперь это сделать, даже по аналогии сообразить не могу.

Буквально заменой linuxPackages на linuxPackages_xanmod в определении оверлея?

Но это все пляски вокруг настоящей проблемы, уже пора чинить ту самую бажную строку, чтобы она тянула выбранную версию.

t184256 ★★★★★
()
Ответ на: комментарий от t184256

Совместно с твоим оверлеем оказывается работает. Но видимо я перемудрил

James_Holden ★★★
() автор топика
Ответ на: комментарий от t184256

Короче, вот так

nixpkgs.overlays = [
    (self: super: {
      linuxPackages_xanmod = super.linuxPackages_xanmod.extend ( self': super': {
        nvidia_x11 = super'.nvidia_x11_legacy390;
        nvidia_x11_i686 = super'.nvidia_x11_legacy390_i686;
      });
    })
  ];

не работает! Тянет новые дрова. Работает твой код + то что я писал выше. Ну и хрен с ним, это все равно затычки временные, надо фиксить пакет конечно.

Осталось понять как должно быть.

James_Holden ★★★
() автор топика
Ответ на: комментарий от James_Holden

А вот нельзя весь этот огород разобрать и тупо в той проблемной строке написать boot.extraModulePackages = optional useBbswitch kernel.bbswitch ++ optional useNvidia config.hardware.nvidia.package.bin;? Или я их путаю?

t184256 ★★★★★
()
Ответ на: комментарий от t184256

Похоже что так и надо. Буду пробовать.

Тут очередной нубский вопрос.

Допустим я поправил этот .nix файл. Как теперь его подсунуть кошерно, куда поместить и как прописать?

James_Holden ★★★
() автор топика
Ответ на: комментарий от James_Holden

«.nix-файл» это довольно-таки произвольное выражение и внутри nixpkgs они весьма взаимозависимы.

Предлагаю смотреть на это иначе: поправил ты не файл, а nixpkgs. Для flake их происхождение задаётся явно, для традиционного подхода есть несколько вариантов: можешь теперь либо собирать из них явно, либо через NIX_PATH их подсунуть (см. выше по треду), либо вообще nix-channel натравить на свой форк.

t184256 ★★★★★
()
Последнее исправление: t184256 (всего исправлений: 1)
Ответ на: комментарий от James_Holden

Тебе все равно из него надо разок собраться перед тем, как PR открыть, а дальше можно обратно пересаживаться на костылики =)

t184256 ★★★★★
()
Ответ на: комментарий от t184256

Ну если так то ладно.

Тут параллельно еще выясняется, что на legacy nvidia драйверы патчи под последние ядра не наложены (в арче например патчи есть и все компиляется).

Спрошу в образовательных целях - можно как-то поверх всего этого на пакет nvidia_x11 теперь патч наложить?

James_Holden ★★★
() автор топика
Ответ на: комментарий от James_Holden

Конечно, просто можно пойти ещё на уровень глубже: в том оверлее сделать замену не просто на старый nvidia_x11, а ещё приписать к нему .overrideAttrs(oldAttrs: { patches = ...; } или что ты там захотел подправить.

По сути у nixpkgs два интерфейса: один будет дописать прямо в nixpkgs что тебя там не устроило; второй, спелеологический — просунуть ту же правку через оверлеи, override’ы и прочие extend’ы. Второй интерфейс не такой эргономичный, но то, что до любых гланд можно дотянуться, впечатляет уже само по себе.

t184256 ★★★★★
()
Ответ на: комментарий от t184256

Бхахахуха хахухаха

Пусти LFS-ника в огород!

Итог - переопределил nvidia на nvidia_legacy два раза (!), добавил патч от Арча, переопределил тарбол исходников на тот, который подходит к патчу (мухахахуха!) два раза (!).

После сборки - ставится два экземпляра одного и того же драйвера, один собран под ядро xanmod, второй под штатное (причина - кривой пакет bumblebee).

ВСЁ РАБОТАЕТ.

P. S. а в issues лет пять bumblebee завести не могут. Делов-то - переопределить все нахрен!

James_Holden ★★★
() автор топика
Ответ на: комментарий от James_Holden

{ nvidiaPackages.stable = generic { version = «455.38»; sha256_64bit = «0x6w2kcjm5q9z9l6rkxqabway4qq4h3ynngn36i8ky2dpxc1wzfq»; settingsSha256 = «1hk4yvbb7xhfwm8jiwq6fj5m7vg3w7yvgglhfyhq7bbrlklfb4hm»; persistencedSha256 = «00mmazv8sy93jvp60v7p954n250f4q3kxc13l4f8fmi28lgv0844»; };

это бы выглядело примерно так, только правильно задать в overlays и все.

dan4ik
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.