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: {

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

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

Ответ на: комментарий от Minona

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

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

Ну как бы тут совсем разный процесс создания окружения для разработки. С ядром вообще все сильно зависит от конкретики - какая архитектура там и там, какое именно ядро на целевой системе.

В случае если действительно нужно и то и то - это самое проблемное. Конечно кроссдистрибутивность тут отпадает, и придется городить образ целевой системы. Тем более что пихать Nix на железяку само по себе сомнительно. Смотря какая железяка. Может она такая что туда NixOS впихивается, может нет.

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

Ну как-то так. А вообще тут сложно обсуждать без конкретики. Разное сильно бывает.

Я на arm железяке прямо собираю и отлаживаю проект для нее же. Но это частная ситуация.

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

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

Спасибо за развёрнутый ответ задач, которые ты пытаешься решать.

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

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

получение максимальной производительности и контроля.

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

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

а для железок и всяких IoT штук, есть Ubuntu Core + твой софт в snap-пакете.
кстати, подход убунты вышеназванный принцип не нарушает.
мухи отдельно, котлеты отдельно.

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

Я имел в виду - практический смысл пихать именно в файл конфигурации. Если задача раздувается, то видимо (по моему мнению сейчас, я ведь только изучаю NixOS и могу быть тут совсем не прав) лучше сделать пакет ядра без initrd и добавить как оверлей.

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

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

мухи отдельно, котлеты отдельно.

Можно конкретнее, что именно отдельно? Система и приложения?

Вот недавно обсуждали Anbox, и оказалось что поставляется он как snap, но при установке этого snap надо предварительно ставить модули ядра для Anbox. Отдельно, не через snap.

Как ты предложишь решать эту проблему на атомарном иммутабельном хосте?

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

К сожалению. А вот образы для докера мы успешно собираем этим самым Nix. Брат жив и волосы у него гладкие и шелковистые, как в рекламе шампуня.

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

А мы диалекты LISP юзаем, DSL свой. Nix для наших задач кривоват.

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

ну например, ты производишь какой-то адаптер.
и тебе нужно поставлять в бинарном виде драйвер в виде модуля ядра для Debian, Ubuntu, RedHat и FreeBSD😏.
еще добавим сюда системный демон, с зависимостью, как минимум от libc.
как ты в Nix будешь создавать сборочное окружение?

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

и тебе нужно поставлять в бинарном виде драйвер в виде модуля ядра для Debian, Ubuntu, RedHat и FreeBSD😏. еще добавим сюда системный демон, с зависимостью, как минимум от libc.

Честно говоря странновато что тут вообще понадобился прямо модуль ядра. Ну допустим.

Далее, поскольку FreeBSD, скорее всего придется делать образы целевых систем. То есть Nix тут не поможет.

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

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

как ты в Nix будешь создавать сборочное окружение?

Да ваще легко. Скачиваешь этим самым никсом образ CentOS (Debian, etc) и для него собираешь. Можно тот же докер тут задействовать, чтобы с чрутами не задрачиваться. Нашёл тут блин чем пугать!

У Nix на самом деле до жопы проблем, но то что ты тут пытаешься притянуть – не одна из них.

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

Можно конкретнее

я и написал конкретно: «Ubuntu Core + твой софт в snap-пакете.»
система отдельно от приложений.
и все это обновляется само через snapd.

Вот недавно обсуждали Anbox

это какая-то странная солянка из модулей ядра, собирающихся dkms (компилятор на конечном устройстве это бред, даже если это десктоп), snap-пакета и еще каких-то тулзов, устанавливающихся через пакетных менеджер.

Как ты предложишь решать эту проблему на атомарном иммутабельном хосте?

собрать два snap-пакета - модули ядра и приложение.
snap-пакет с модулями для каждого дистра естественно свой.
хотя.. а нафига сие поделие на «иммутабельном хосте»?

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

собрать два snap-пакета - модули ядра и приложение.

Тогда получается не «собрать», а собИрать на каждое обновление системы, и не дай Бог не успеют обновить твой «снап с драйверами» при обновлении системы.

Тогда вопрос - а зачем такой snap, который намертво прибит к системе?

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

хотя.. а нафига сие поделие на «иммутабельном хосте»?

Это просто пример. ну любое приложение с модулями возьмем - то же самое.

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

Хороший вопрос, присоединяюсь к нему. Ну может как-то и умеет, хотя я смутно себе представляю как. Но я про snap ничего не знаю, ничего не утверждаю.

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

Не забыл. Просто FreeBSD умерло и не нужно. Хватит насиловать труп уже.

К слову, интересно как ты предлагаешь snap на FreeBSD использовать.

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

стоп.
например: есть CentOS 7, у него kernel-3.10.х
есть snap-пакет с модулями для этого ядра.
в ядре что-то пофиксили и оно стало 3.10.х+1
ABI не менялось, зачем пересобирать модули?

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

Ну это частный случай. Может и поменяться ABI.

А как вообще модули через snap ставятся, можешь рассказать?

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

вообще - хз.
но если он может обновлять саму Ubuntu Core, то и кастомные модули ядра должен уметь ставить.

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

Да блин, Ubuntu Core он как монолит обновляет. Сразу весь образ. Как ты через другой snap туда модули добавишь, в образ монолитный? Тебе надо модифицировать snap самого Ubuntu Core.

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

Потому что Линус так сказал. Если ты попробуешь в одно ядро загрузить модули от другого, ядро тебя пошлёт. Там есть флаг -f, конечно, но так делать лучше не стоит.

DKMS не от хорошей жизни изобрели.

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

Потому что Линус так сказал

«Папа» всегда прав?😏

DKMS не от хорошей жизни изобрели

я в курсе, это костыль, потому что не могут не ломать ABI.
повторяю - место компилятора - на машине девелопера и только там.

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

К слову, интересно как ты предлагаешь snap на FreeBSD использовать

где я предлагал это?

Просто FreeBSD умерло и не нужно

на этом беседу с тобой можно закончить.

ЗЫ:
наш производственный софт работает под OpenVMS.
чот никто не подрывается его переписывать на божественный линукс.😏

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

Так это просто интерфейс к хостовой системе, который позволяет ЕЕ модули вставлять. Не из самого снапа. Модули все равно в основном, системном снапе уже должны быть добавлены.

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

«Папа» всегда прав?

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

повторяю - место компилятора - на машине девелопера и только там.

Почему? Не, твою позицию я понимаю, просто в условиях лялекса она крайне тупая. Линукс в принципе не очень поддерживает сторонние модули ядра. Разработчики на это клали огромный и толстый. Поэтому все попытки распространять их вырождаются в различные костыли, из которых DKMS — не самый ужасный.

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

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

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

То есть, ваша поделка нужна буквально единицам, которые при этом гоняют древнюю ОС на не менее древнем железе (порт на x86_64 появился лишь недавно), и при этом ваши чуваки вообще не думают о расширении рынка и поиске новых клиентов. Окей. Наверняка очень нужная вещь.

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

Это всё было бы так, только есть лицензионные ограничения, из-за которых модули под отличной от GPL лицензией ставятся через DKMS. Убанта, которая так делает, это наверняка не очень user friendly дистр по твоим меркам.

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

ты, видимо, читать не умеешь - я не говорил что этот софт делаем мы.
так что всё мимо. 😏

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

Убанта, которая так делает, это наверняка не очень user friendly дистр

к сожалению, нет идеала в мире...

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