LINUX.ORG.RU

NixOS: свой конфиг ядра

 


0

1

@t184256 @dan4ik

Я честно пытался осилить сам. Но… я не знаю, документация по NixOS это полный провал. Не знаю как это цензурно описать.

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

По этому поводу в NixOS Manual (https://nixos.org/manual/nixos/unstable/#sec-linux-config-customizing) вижу вот это:

custom-kernel = let base_kernel = linuxKernel.kernels.linux_4_9;
  in super.linuxKernel.manualConfig {
    inherit (super) stdenv hostPlatform;
    inherit (base_kernel) src;
    version = "${base_kernel.version}-custom";

    configfile = /home/me/my_kernel_config;
    allowImportFromDerivation = true;
};

Сразу вохникает вопрос. Что это? К чему это? Куда это пихать?

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

Ну ладно, по .super я догадываюсь что наверное это внутренности оверлея (но я честно не уверен). Делаю тогда так в configuration.nix:

boot.kernelPackages = pkgs.custom_kernel;
  nixpkgs.overlays = [(self: super: {
     custom_kernel = let base_kernel = pkgs.linuxKernel.kernels.linux_5_15;
       in super.linuxKernel.manualConfig {
         inherit (super) stdenv lib;
         inherit (base_kernel) src;
         version = "${base_kernel.version}-custom";

         configfile = ./config;
         allowImportFromDerivation = true;
     };
  }) ];

Как видно код не совпадает с тем что в Manual, потому что в том мануальном коде сразу возникает ряд ошибок - нет параметра lib, лишний параметр hostPlatform. Спрашивается, почему так? Не понятно.

В итоге с вот этим кодом выше - получаю ошибку:

error: attribute 'extend' missing

       at /nix/var/nix/profiles/per-user/root/channels/nixos/nixos/modules/system/boot/kernel.nix:40:31:

           39|       type = types.unspecified // { merge = mergeEqualOption; };
           40|       apply = kernelPackages: kernelPackages.extend (self: super: {
             |                               ^
           41|         kernel = super.kernel.override (originalArgs: {

что с этим делать?

Вот как для этой простейшей задачи (и очень распространенной) простейший пример из документации я должен применить? Я не понимаю…

Кажется я понял в чем моя ошибка - вместо набора пакетов я пихаю пакет. Вот так что-то продвинулось вроде:

boot.kernelPackages = pkgs.linuxPackages_latest.extend (self: super: {
    kernel = pkgs.custom_kernel;
  });

  nixpkgs.overlays = [(self: super: {
     custom_kernel = let base_kernel = pkgs.linuxKernel.kernels.linux_5_15;
       in super.linuxKernel.manualConfig {
         inherit (super) stdenv lib;
         inherit (base_kernel) src;
         version = "${base_kernel.version}-custom";

         configfile = ./config;
         allowImportFromDerivation = true;
     };
  })];
James_Holden ★★ ()
Ответ на: комментарий от Not_a_Troll

Не надо свою интеллектуальную неполноценность проецировать на окружающих. Если ты Nix не осилишь это не значит что он плохой. Это значит что ты неосилятор.

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

А если я гуру? Или гуро? Как правильно?

Теперь к задачам. Ты крутил что-то, окромя localhost? Как накрутишь, создавай тред успеха. Желательно через годик использования. Потом будем рассуждать о моей неполноценности.

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

Ты крутил что-то, окромя localhost?

Конечно. Например асинхронные электродвигатели при помощи мной же разработанных, изготовленных, запрограммированных и собранных силовых электронных преобразователей. Как накрутишь, создавай тред успеха.

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

Ахах, с пакетником Nix :) Спасибо тебе, мил человек. Я всё думаю, кто так радостно упарывается по маргинальным направлениям, а вот оно как.

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

Это я к чему, потанцевал ты с дистрибутивом, железо у тебя однотипное - Clonezilla и готово. Красота. Надо тебе настройки по умолчанию, skeleton свой один раз написал, новый пользователь подтягивает.

Тут мы и подходим к вопросу, что тебе даёт Nix в проде.
Можешь что-то рассказать? Что даёт?
Сколько там ему годков? А когда они научилсь делать вот это? https://www.opennet.ru/opennews/art.shtml?num=55362

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

Ты душный, и слабо накидываешь. Тебя не про прод спрашивали, к чему твои нелепости в тех разделе?

А когда они научилсь делать вот это? https://www.opennet.ru/opennews/art.shtml?num=55362

Когда захотели, ибо не нужно. Никто nixos не будет с исошки ставить, а для своего конфига в гите оно не нужно.

shpinog ★★★ ()

Пример мне кажется переусложненным. Думаю, можно сделать что-то вроде

  boot.kernelPackages.kernel = pkgs.linuxKernel.manualConfig {
    inherit (pkgs) stdenv lib;
    inherit (pkgs.linux) src; # change here if you want a different version
    version = "${pkgs.linux.version}-custom-config";
    configfile = ./config;
  };
balsoft ★★ ()
Ответ на: комментарий от shpinog

а смысл накидывать. Вот человека посмотреть, последние темы про Nix. Пытается разобраться. А потом будет с умным видом рассказывать, как оно в NixOS жызня.

https://rtaibah.com/assets/images/content/blog/cowsay-head-in-cow-2.png

Not_a_Troll ()
Ответ на: комментарий от balsoft

А можно это пояснить? Не совсем я понимаю. Вот тут определили boot.kernelPackages.kernel, а остальное в boot.kernelPackages тогда будет откуда? По дефолту? А если другое ядро делать?

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

как оно в NixOS жызня.

Да и пусть разбирается, токсить зачем, как будто он в твоей заднице ковыряется, а не в nix

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

Ты какой-то странный. Я же тебе написал уже, что именно я кручу. Двигатели. Для разработки и проектирования под эти задачи NixOS отлично подходит. У меня такой прод.

Плюс я в теме про звук ссылку давал. Для разработки такого софта тоже NixOS прекрасно подходит. Вот такой тоже прод. А тем что ты называешь «прод» лично я не занимаюсь и никогда не буду заниматься, мне это нафиг не нужно. Как и твои повторяемые ISO образы. Я еще не под грибами чтобы в 2021 что-то с ISO образов ставить.

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

Вот смотри какая по твоей ссылке штука. Примера как собрать ядро на своем .config там вообще нет. Есть только как сделать этот .config. А куда дальше его совать - ничего.

В NixOS Manual есть нужный мне пример, но неполный и нерабочий, об этом в основном посте.

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

Остальное там не будет :)

Если тебе все модули нужны, то тогда оберни в linuxPackagesFor, вот так:

  boot.kernelPackages.kernel = pkgs.linuxPackagesFor (pkgs.linuxKernel.manualConfig {
    inherit (pkgs) stdenv lib;
    inherit (pkgs.linux) src; # change here if you want a different version
    version = "${pkgs.linux.version}-custom-config";
    configfile = ./config;
  });

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

Прости, очепятка.

  boot.kernelPackages = pkgs.linuxPackagesFor (pkgs.linuxKernel.manualConfig {
    inherit (pkgs) stdenv lib;
    inherit (pkgs.linux) src; # change here if you want a different version
    version = "${pkgs.linux.version}-custom-config";
    configfile = ./config;
  });

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

Получается вот что:

error: attribute 'boot.kernelPackages' already defined at /etc/nixos/configuration.nix:34:3

       at /etc/nixos/configuration.nix:50:1:

           49|
           50| boot.kernelPackages = pkgs.linuxPackagesFor (pkgs.linuxKernel.manualConfig {
             | ^
           51|     inherit (pkgs) stdenv lib;

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

Ну, у тебя уже есть boot.kernelPackages = <...> в твоём конфиге, в строке 34 :)

В сообщении об ошибке именно это и написано…

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

Заработало, но - надо добавить еще allowImportFromDerivation = true; иначе какая-то фигня происходит. И собирает ядро 5.10, а как сделать 5.15 пока я не понял.

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

Вот так получилось

boot.kernelPackages = pkgs.linuxPackagesFor (pkgs.linuxKernel.manualConfig {
    inherit (pkgs) stdenv lib;
    inherit (pkgs.linuxKernel.kernels.linux_5_15) src; # change here if you want a different version
    version = "${pkgs.linuxKernel.kernels.linux_5_15.version}-custom";
    configfile = ./config;
    allowImportFromDerivation = true;
  });
James_Holden ★★ ()
Ответ на: комментарий от anonymous

Так он явно оттудова, в соседней теме доказывает что если ffmpeg пересобрать то получится прирост производительности уххх как у нас в 2005-ом. И процы у нас до сих пор i686 на которых действительно можно было получить такой эффект. В 2005-ом.

Мозги заспиртовал человек видимо.

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

Тебе ничего не мешает провести тест. Я пишу то, в чём разбираюсь. А ты? А ты будешь создавать такие темы. Тебя же в google забанили.

Можно спросить, ты умеешь в английский? Что мешает не тратить день на решение , а спросить в Libre.chat? Надо быть special. «Это тех раздел, детка»!

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

Тебе ничего не мешает провести тест

Как и тебе. Только совсем непохоже что ты его проводил позже 2005-го.

Я пишу то, в чём разбираюсь

Совсем не заметно. Ты несешь сплошную дичь во всех темах.

А ты?

А я в данном случая спрашиваю то чего не знаю. И мне помогают.

Тебя же в google забанили.

Нет, забанили тебя. Иначе ты бы убедился что в гугле это не находится. Но ты даже не пытался смотреть.

Что мешает не тратить день на решение

Ты дурак? Тема в 19.49 создана, помечена как решенная в 20.14. То есть я потратил 25 минут на решение. У тебя день 25 минут длится?

«Это тех раздел, детка»!

И поэтому ты тут недоумка из себя решил строить, в давно решенной теме техраздела? Отлично позоришься.

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

А ты кто-то? Илитка? Впечатляет. Ошибки не может читать, великий программист. нет, с большой - Программист. И тут все кланяются.

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

Ошибки не может читать

Ну и что, я не могу читать ошибку ночью запарившись за день, а ты вообще ничего читать не можешь по жизни (иначе почему ты такой недоумок?). Что лучше?

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

а почему ты меня оскорбляешь? Я же тебя не оскорблял. Что с тобой? Ты непоноценно живёшь, у тебя проблемы, ты одинок, тебя никто не понимает? Смирись, это навсегда.

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

а почему ты меня оскорбляешь?

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

Что с тобой? Ты непоноценно живёшь, у тебя проблемы, ты одинок, тебя никто не понимает?

Нет конечно. Даже в интернете, в моих тредах, посмотри сколько людей понимает и помогает. А вот ты тут выглядишь явно инородно, как какой-то алкаш с манерой речи начала нулевых. Вот что с тобой - это вопрос.

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

Чего не помочь изучателю Nix

Судя по тому что ты по теме до сих пор ничего не написал я могу только сделать вывод что помочь в изучении Nix ты нмчем не можешь.

Тем более что треды про звук где ты на меня наезжал, этот тред, тред nix vs flatpak явно показали что ты читать и понимать написанное не способен.

В звуковом треде ты не осилил основной пост, тут не осилил птичку решено и первые три поста. В nix vs flatpak вообще ничего не осилил. Ну и зачем ты тут нужен?

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

Я алкаш, а ты анона отшил, илитарный. Главное, пинимают тебя люди ;)))) Я читал твои высказывания по многим темам. Ох и весело было. Даже здесь ты не можешь остановиться.

Ну вот, прошло время, как ты стал изучать Nix. И практиковать. Расскаи, что тебе понравилось и не понравилось. Буквально пару вещей. Какое ты видишь применение данного подхода?

Можешь ли ты описать в конфигурационном файле сборку ядра без initrd, а добавить ucode?

Not_a_Troll ()

Вообще вопрос «куда это пихать» возникает на каждом первом примере по Nix.

Это особенность конфигурации Nix-а. У тебя есть простая задача с понятной последовательностью действий. Затем ты пытаешься замаскировать её через недокументированный набор заклинаний под функциональный подход никса. Затем смотришь, как Nix их интерпретировал и какие действия он сделал на самом деле.

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

Расскаи, что тебе понравилось и не понравилось

Интересно, а почему ты так упорно спрашиваешь моего мнения, если тебе «весело» и судя по всему оно тебе просто не может быть интересно, ты же гуру а я кроме локалхоста ничего не крутил?

Ну ладно, мало ли.

Какое ты видишь применение данного подхода?

Лучше всего подходит для сборки среды разработки под проект. Это вообще большая проблема - обычные ПМ типа apt предлагают ставить dev пакеты прямо в систему (а нужны то они только для одного проекта), естественно это все тянет обычные пакеты, устанавливаемые в систему. Далее это тянет невозможность иметь версии библиотек для проекта, отличные от тех что в дистрибутиве. Или ломай систему.

Воспроизвести созданную таким образом систему повторно вообще сложно. Я например задолбался писать мануалы с перечнем deb пакетов которые надо поставить для сборки проекта. Составить такой перечень из своей системы та еще задача, тем более если у меня не deb-based дистрибутив.

Поэтому родились подходы, которые позволяют вести разработку независимо от основной системы - это Nix, и контейнеры типа docker, flatpak.

Сначала я пытался адаптировать под эту задачу flatpak. Основная проблема - не удобно собирать сами флатпаки, потому что пакетной системы нет, надо писать конфиг сборки каждого контейнера с нуля вручную, ну или выдирая код из других конфигов. Готовые Sdk для разработки есть - но их пока мало, и постоянно надо что-то кстомное. С кастомизацией там проблема.

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

В идеале нужен аналог питонового virtualenv. Вошел в окружение - и у тебя локально установленный набор библиотек, тулчейн. Вышел - ничего нет, нормальная пользовательская система.

И тут я вспомнил про Nix, который уже немного ковырял раньше. Он является именно вот этим.

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

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

Можешь ли ты описать в конфигурационном файле сборку ядра без initrd, а добавить ucode?

Лично я - сейчас нет, а вообще можно. Но скорее всего будет много кода пихнутого в конфигурационный файл, и в чем практический смысл этого я не понимаю.

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

В NixOS весь софт свежий.
А что ты будешь делать, если тебе нужно опакетить твой проект для Debian 10 или CentOS 7 - как ты затащишь в Nix-окружение сборки версии библиотек, используемые в целевых ОС?

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

Плюсую комментатора выше.

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

В NixOS весь софт свежий.

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

James_Holden ★★ ()
Последнее исправление: James_Holden (всего исправлений: 1 )
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.