Все об Arch Linux

Arch Linux будет тем, что вы из него сделаете!

make menuconfig на Arch: как настроить ядро безопасно

make menuconfig на Arch безопасен, если запускать его в собственном дереве исходников ядра и собирать результат через makepkg. Схема простая: получи исходники, сгенерируй стартовый конфиг из /proc/config.gz, открой меню, сохрани изменения и собери пакет командой makepkg -e. Рабочее ядро при этом не трогается, пока новое не готово.

Зачем вообще нужен make menuconfig?

Дистрибутивное ядро Arch собрано с широким набором модулей, но не со всеми. Иногда нужной опции в нём нет: драйвер для конкретного устройства выключен, или модуль собран как built-in, а тебе нужен именно модуль. В таких случаях ядро пересобирают.

make menuconfig это текстовый интерфейс конфигурации ядра на базе ncurses. Он показывает все опции Kconfig и позволяет переключать их без ручного редактирования .config. Это самый наглядный способ: дерево опций, поиск по имени символа, подсказки прямо в интерфейсе.

Когда это реально нужно:

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

Перед тем как пересобирать ядро, проверь, что нужного модуля действительно нет. Команда modinfo <имя> покажет, установлен ли модуль в системе. Иногда модуль уже есть, просто не загружается, и тогда ядро пересобирать не нужно. А если драйвер поставляется отдельным пакетом, например через DKMS, хватит установить его. Подробнее про динамические модули есть в статье «DKMS: динамические модули».

Полный процесс сборки своего ядра разобран в статье «Сборка своего ядра за 5 шагов». Здесь фокус на самом menuconfig и на том, как не потерять конфиг. Если ещё не решил, какое ядро брать за основу, посмотри «Какое ядро выбрать: linux, lts, zen, hardened».

Что нужно подготовить перед запуском?

Главное правило: никогда не запускай menuconfig в дереве исходников, которое ты не собираешь сам. Если просто распаковать исходники в /tmp и открыть меню, изменения никуда не денутся, но пользы от них ноль: собрать ядро из этого дерева ты не сможешь, а конфиг потеряется при очистке.

Нужно дерево, из которого ты реально соберёшь пакет. Два пути:

  1. Экспорт PKGBUILD из репозитория Arch:
sudo pacman -S asp
asp export linux
cd linux
  1. Скачивание тарбола с kernel.org и ручное создание PKGBUILD.

Первый путь проще: ты получаешь готовый PKGBUILD от пакета linux, а значит, сборка пройдёт по проверенным правилам: правильные флаги, правильные имена файлов, правильный prepare().

Также понадобятся base-devel и зависимости сборки ядра:

sudo pacman -S base-devel

Как получить стартовый конфиг?

Никогда не начинай с пустого конфига. В нём сотни опций, вручную их не перебрать. Возьми за основу конфиг текущего ядра Arch:

zcat /proc/config.gz > .config

Это работает, если в ядре включён CONFIG_IKCONFIG_PROC. В стандартном ядре Arch он включён, так что файл будет. Если /proc/config.gz пустой или отсутствует, собери конфиг по умолчанию:

make defconfig

defconfig даст базовый конфиг, но он сильно беднее конфига Arch. Лучше раздобыть именно конфиг Arch: он лежит в /usr/src/linux/config после установки пакета linux-headers, либо в дереве исходников после asp export.

Файл .config это обычный текст: строки вида CONFIG_ИМЯ=значение. Его можно читать и править вручную, но menuconfig удобнее: он показывает описание каждой опции и не даёт опечататься в имени символа.

Важно: конфиг должен лежать в корне дерева исходников и называться .config. Именно этот файл читает menuconfig.

Как работать с make menuconfig?

Запуск:

make menuconfig

Откроется ncurses-интерфейс. Навигация: стрелки двигают курсор, Enter открывает подменю, пробел переключает состояние опции, Esc выходит на уровень выше.

Состояния опции:

  • Y: встроить в ядро (built-in);
  • M: собрать как модуль;
  • пусто: выключить.

Когда выбирать Y, а когда M? Встроенные драйверы нужны для того, что загружается до монтирования корня: контроллер диска, файловая система корневого раздела, сеть для NFS-корня. Всё остальное лучше собирать как модули: они подгружаются по требованию и не раздувают ядро. Если сомневаешься, оставляй значение из конфига Arch.

Поиск по символу запускается клавишей /. Например, чтобы найти опцию NVMe, нажми /, введи NVME и Enter. Поиск покажет, где опция находится и в каком она состоянии. Это удобно, когда не знаешь, в каком подменю прячется нужный драйвер.

После изменений выбери Save и подтверди имя файла .config. Без сохранения изменения пропадут.

Если ncurses-интерфейс неудобен, есть альтернатива: make nconfig, тот же конфигуратор, но с другим оформлением. Логика та же: те же опции, тот же файл .config.

Как собрать ядро с новым конфигом через makepkg?

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

Шаг 1. Подготовь дерево и конфиг:

asp export linux
cd linux
zcat /proc/config.gz > .config

Шаг 2. Запусти makepkg без сборки:

makepkg -o

Флаг -o означает «только fetch и prepare». Исходники скачаются, prepare() выполнится, но компиляция не начнётся. Внутри prepare() PKGBUILD пакета linux копирует свой конфиг в .config, поэтому твой конфиг перезапишется. Это нормально: дальше ты откроешь menuconfig уже в готовом дереве.

Шаг 3. Открой menuconfig в каталоге исходников:

cd src/linux-*   # версия может отличаться
make menuconfig

Внеси изменения и сохрани.

Шаг 4. Собери пакет, пропустив prepare:

cd ../..
makepkg -e

Флаг -e (--existing) говорит makepkg: каталог src уже готов, не выполняй prepare заново, используй то, что там лежит. Твой .config останется нетронутым, и сборка пойдёт с ним.

Это ключевой момент. Если запустить makepkg без -e, prepare() снова перезапишет .config конфигом по умолчанию, и все твои изменения из menuconfig пропадут. Поэтому порядок всегда такой: makepkg -o, потом правка конфига, потом makepkg -e.

Полная сборка ядра занимает от десяти минут до часа в зависимости от процессора. Поэтому и нужен makepkg -e: он не пересобирает то, что уже готово, и не трогает твой конфиг.

Альтернатива: прописать конфиг прямо в PKGBUILD через переменную _config. В PKGBUILD пакета linux есть строка _config=config, которая указывает на файл конфига в каталоге пакета. Можно заменить этот файл своим и не трогать menuconfig вовсе. Но для разовых экспериментов menuconfig удобнее.

Как сохранить конфиг, чтобы он попал в пакет?

Сборка ядра использует файл .config в корне дерева исходников. Но в пакет linux конфиг попадает не сам по себе: prepare() копирует его в нужное место, а после сборки он устанавливается как /usr/src/linux/config.

Если ты менял конфиг вручную после prepare(), убедись, что файл называется именно .config и лежит в корне дерева src/linux-*. Именно его make читает при сборке.

Ещё один момент: имя конфига. В PKGBUILD пакета linux переменная _config указывает на файл config (без точки) в каталоге пакета. Это исходник конфига, из которого prepare() делает .config. Если хочешь зафиксировать свой конфиг надолго, скопируй его в этот файл:

cp src/linux-*/.config config

Тогда даже полная пересборка с prepare() не потеряет твои настройки.

Чтобы отличать своё ядро от стандартного, добавь суффикс в CONFIG_LOCALVERSION. В menuconfig это General setupLocal version. Например, -custom. Тогда uname -r покажет что-то вроде 6.12.1-arch1-1-custom, и ты сразу поймёшь, какое ядро загружено.

Что делать после установки?

Когда makepkg -e закончил работу, в каталоге появится пакет linux-6.x.x-x-x86_64.pkg.tar.zst. Установи его:

sudo pacman -U linux-*.pkg.tar.zst

Пакет сам пересоберёт initramfs через mkinitcpio при установке. Но grub.cfg лучше перегенерировать вручную:

sudo grub-mkconfig -o /boot/grub/grub.cfg

Перезагрузись и проверь, что загрузилось именно твоё ядро:

uname -a

Проверь, что нужный модуль доступен:

modinfo <модуль> | head

И что опция реально включена в конфиг:

zgrep CONFIG_<ИМЯ> /proc/config.gz

Значение y: встроено, m: модуль, пусто: выключено.

Если система не загрузилась, не паникуй. В меню GRUB выбери предыдущее ядро из списка и загрузи старое. После этого разберёшься, что пошло не так: посмотри journalctl -b -1 для прошлой загрузки.

Как откатиться, если что-то пошло не так?

Откат простой: переустанови стандартный пакет:

sudo pacman -S linux

Он вернёт штатное ядро, а твоё останется в /boot до следующей очистки. Как чистить старые ядра, описано в статье «Чистка старых ядер и initramfs». Если хочешь держать два ядра рядом постоянно, смотри «Двойная установка: общее ядро».

Частые вопросы

Можно ли сломать систему через make menuconfig?

Само меню ничего не ломает: оно только правит .config. Опасность в сборке и установке. Если новое ядро не загрузится, старое останется в /boot, и ты вернёшься к нему через меню GRUB. Поэтому перед экспериментом не удаляй старые ядра.

Почему makepkg -e пропускает prepare?

Флаг -e (--existing) говорит makepkg: каталог src уже готов, не выполняй prepare и не пересобирай зависимости. Это экономит время и, главное, не трогает твой .config. Без -e prepare() перезапишет конфиг значением по умолчанию.

Что делать, если /proc/config.gz пустой?

Значит, в ядре выключен CONFIG_IKCONFIG_PROC. Возьми конфиг из /usr/src/linux/config (ставится с linux-headers) или используй make defconfig. Для большинства задач defconfig хватит, но он не повторяет настройки Arch.

Нужно ли пересобирать initramfs после установки?

Пакет linux делает это сам через mkinitcpio при установке. Если ты менял встроенные драйверы, от которых зависит загрузка (например, драйвер корневого диска), проверь, что initramfs собрался без ошибок. Подробности про хуки есть в статье «mkinitcpio подробно: хуки и модули».

Как узнать, включена ли опция в текущем ядре?

zgrep CONFIG_ИМЯ /proc/config.gz

Значение y: встроено, m: модуль, пусто: выключено.

Полезные ресурсы

  • Kernel/Kernel build на ArchWiki: официальное руководство по сборке ядра.
  • Makepkg на ArchWiki: все флаги и переменные makepkg.

Заключение

make menuconfig на Arch безопасен, если соблюдать три правила: работать в собственном дереве исходников, начинать с конфига текущего ядра и собирать через makepkg -e, чтобы prepare не перезаписал твои изменения. Сохраняй конфиг в файл config из PKGBUILD, добавляй CONFIG_LOCALVERSION, чтобы отличать своё ядро, и держи под рукой стандартный пакет linux для отката. Тогда эксперименты с ядром превращаются из лотереи в предсказуемый процесс.



Не получилось? Поможем настроить

Задай вопрос в чате — отвечаем быстро, по делу и без воды.

Читайте также

Комментарии

Загрузка…

Откроется GitHub: создайте новый issue с вашим комментарием (кнопка «Submit new issue»). После отправки обновите эту страницу — комментарий появится ниже.

Telegram Max